forked from mirrors/linux
		
	entry: Move syscall_enter_from_user_mode() to header file
To allow inlining of syscall_enter_from_user_mode(), move it to entry-common.h. Signed-off-by: Sven Schnelle <svens@linux.ibm.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20231218074520.1998026-4-svens@linux.ibm.com
This commit is contained in:
		
							parent
							
								
									caf4062e35
								
							
						
					
					
						commit
						221a164035
					
				
					 2 changed files with 26 additions and 33 deletions
				
			
		|  | @ -134,6 +134,9 @@ static __always_inline void enter_from_user_mode(struct pt_regs *regs) | ||||||
|  */ |  */ | ||||||
| void syscall_enter_from_user_mode_prepare(struct pt_regs *regs); | void syscall_enter_from_user_mode_prepare(struct pt_regs *regs); | ||||||
| 
 | 
 | ||||||
|  | long syscall_trace_enter(struct pt_regs *regs, long syscall, | ||||||
|  | 			 unsigned long work); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * syscall_enter_from_user_mode_work - Check and handle work before invoking |  * syscall_enter_from_user_mode_work - Check and handle work before invoking | ||||||
|  *				       a syscall |  *				       a syscall | ||||||
|  | @ -157,7 +160,15 @@ void syscall_enter_from_user_mode_prepare(struct pt_regs *regs); | ||||||
|  *     ptrace_report_syscall_entry(), __secure_computing(), trace_sys_enter() |  *     ptrace_report_syscall_entry(), __secure_computing(), trace_sys_enter() | ||||||
|  *  2) Invocation of audit_syscall_entry() |  *  2) Invocation of audit_syscall_entry() | ||||||
|  */ |  */ | ||||||
| long syscall_enter_from_user_mode_work(struct pt_regs *regs, long syscall); | static __always_inline long syscall_enter_from_user_mode_work(struct pt_regs *regs, long syscall) | ||||||
|  | { | ||||||
|  | 	unsigned long work = READ_ONCE(current_thread_info()->syscall_work); | ||||||
|  | 
 | ||||||
|  | 	if (work & SYSCALL_WORK_ENTER) | ||||||
|  | 		syscall = syscall_trace_enter(regs, syscall, work); | ||||||
|  | 
 | ||||||
|  | 	return syscall; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * syscall_enter_from_user_mode - Establish state and check and handle work |  * syscall_enter_from_user_mode - Establish state and check and handle work | ||||||
|  | @ -176,7 +187,19 @@ long syscall_enter_from_user_mode_work(struct pt_regs *regs, long syscall); | ||||||
|  * Returns: The original or a modified syscall number. See |  * Returns: The original or a modified syscall number. See | ||||||
|  * syscall_enter_from_user_mode_work() for further explanation. |  * syscall_enter_from_user_mode_work() for further explanation. | ||||||
|  */ |  */ | ||||||
| long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall); | static __always_inline long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall) | ||||||
|  | { | ||||||
|  | 	long ret; | ||||||
|  | 
 | ||||||
|  | 	enter_from_user_mode(regs); | ||||||
|  | 
 | ||||||
|  | 	instrumentation_begin(); | ||||||
|  | 	local_irq_enable(); | ||||||
|  | 	ret = syscall_enter_from_user_mode_work(regs, syscall); | ||||||
|  | 	instrumentation_end(); | ||||||
|  | 
 | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * local_irq_enable_exit_to_user - Exit to user variant of local_irq_enable() |  * local_irq_enable_exit_to_user - Exit to user variant of local_irq_enable() | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ static inline void syscall_enter_audit(struct pt_regs *regs, long syscall) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static long syscall_trace_enter(struct pt_regs *regs, long syscall, | long syscall_trace_enter(struct pt_regs *regs, long syscall, | ||||||
| 				unsigned long work) | 				unsigned long work) | ||||||
| { | { | ||||||
| 	long ret = 0; | 	long ret = 0; | ||||||
|  | @ -65,36 +65,6 @@ static long syscall_trace_enter(struct pt_regs *regs, long syscall, | ||||||
| 	return ret ? : syscall; | 	return ret ? : syscall; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static __always_inline long |  | ||||||
| __syscall_enter_from_user_work(struct pt_regs *regs, long syscall) |  | ||||||
| { |  | ||||||
| 	unsigned long work = READ_ONCE(current_thread_info()->syscall_work); |  | ||||||
| 
 |  | ||||||
| 	if (work & SYSCALL_WORK_ENTER) |  | ||||||
| 		syscall = syscall_trace_enter(regs, syscall, work); |  | ||||||
| 
 |  | ||||||
| 	return syscall; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| long syscall_enter_from_user_mode_work(struct pt_regs *regs, long syscall) |  | ||||||
| { |  | ||||||
| 	return __syscall_enter_from_user_work(regs, syscall); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| noinstr long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall) |  | ||||||
| { |  | ||||||
| 	long ret; |  | ||||||
| 
 |  | ||||||
| 	enter_from_user_mode(regs); |  | ||||||
| 
 |  | ||||||
| 	instrumentation_begin(); |  | ||||||
| 	local_irq_enable(); |  | ||||||
| 	ret = __syscall_enter_from_user_work(regs, syscall); |  | ||||||
| 	instrumentation_end(); |  | ||||||
| 
 |  | ||||||
| 	return ret; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| noinstr void syscall_enter_from_user_mode_prepare(struct pt_regs *regs) | noinstr void syscall_enter_from_user_mode_prepare(struct pt_regs *regs) | ||||||
| { | { | ||||||
| 	enter_from_user_mode(regs); | 	enter_from_user_mode(regs); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Sven Schnelle
						Sven Schnelle