mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	arm: switch to saner kernel_execve() semantics
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									22e2430d60
								
							
						
					
					
						commit
						9fff2fa0db
					
				
					 4 changed files with 7 additions and 29 deletions
				
			
		| 
						 | 
					@ -50,6 +50,7 @@ config ARM
 | 
				
			||||||
	select GENERIC_STRNLEN_USER
 | 
						select GENERIC_STRNLEN_USER
 | 
				
			||||||
	select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN
 | 
						select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN
 | 
				
			||||||
	select GENERIC_KERNEL_THREAD
 | 
						select GENERIC_KERNEL_THREAD
 | 
				
			||||||
 | 
						select GENERIC_KERNEL_EXECVE
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  The ARM series is a line of low-power-consumption RISC chip designs
 | 
						  The ARM series is a line of low-power-consumption RISC chip designs
 | 
				
			||||||
	  licensed by ARM Ltd and targeted at embedded applications and
 | 
						  licensed by ARM Ltd and targeted at embedded applications and
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -470,7 +470,6 @@
 | 
				
			||||||
#define __ARCH_WANT_SYS_SOCKETCALL
 | 
					#define __ARCH_WANT_SYS_SOCKETCALL
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#define __ARCH_WANT_SYS_EXECVE
 | 
					#define __ARCH_WANT_SYS_EXECVE
 | 
				
			||||||
#define __ARCH_WANT_KERNEL_EXECVE
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * "Conditional" syscalls
 | 
					 * "Conditional" syscalls
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,35 +86,14 @@ ENDPROC(ret_to_user)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
ENTRY(ret_from_fork)
 | 
					ENTRY(ret_from_fork)
 | 
				
			||||||
	bl	schedule_tail
 | 
						bl	schedule_tail
 | 
				
			||||||
 | 
						cmp	r5, #0
 | 
				
			||||||
 | 
						movne	r0, r4
 | 
				
			||||||
 | 
						movne	lr, pc
 | 
				
			||||||
 | 
						movne	pc, r5
 | 
				
			||||||
	get_thread_info tsk
 | 
						get_thread_info tsk
 | 
				
			||||||
	mov	why, #1
 | 
					 | 
				
			||||||
	b	ret_slow_syscall
 | 
						b	ret_slow_syscall
 | 
				
			||||||
ENDPROC(ret_from_fork)
 | 
					ENDPROC(ret_from_fork)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(ret_from_kernel_thread)
 | 
					 | 
				
			||||||
 UNWIND(.fnstart)
 | 
					 | 
				
			||||||
 UNWIND(.cantunwind)
 | 
					 | 
				
			||||||
	bl	schedule_tail
 | 
					 | 
				
			||||||
	mov	r0, r4
 | 
					 | 
				
			||||||
	adr	lr, BSYM(1f)	@ kernel threads should not exit
 | 
					 | 
				
			||||||
	mov	pc, r5
 | 
					 | 
				
			||||||
1:	bl	do_exit
 | 
					 | 
				
			||||||
	nop
 | 
					 | 
				
			||||||
 UNWIND(.fnend)
 | 
					 | 
				
			||||||
ENDPROC(ret_from_kernel_thread)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * turn a kernel thread into userland process
 | 
					 | 
				
			||||||
 * use: ret_from_kernel_execve(struct pt_regs *normal)
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
ENTRY(ret_from_kernel_execve)
 | 
					 | 
				
			||||||
	mov	why, #0			@ not a syscall
 | 
					 | 
				
			||||||
	str	why, [r0, #S_R0]	@ ... and we want 0 in ->ARM_r0 as well
 | 
					 | 
				
			||||||
	get_thread_info tsk		@ thread structure
 | 
					 | 
				
			||||||
	mov	sp, r0			@ stack pointer just under pt_regs
 | 
					 | 
				
			||||||
	b	ret_slow_syscall
 | 
					 | 
				
			||||||
ENDPROC(ret_from_kernel_execve)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	.equ NR_syscalls,0
 | 
						.equ NR_syscalls,0
 | 
				
			||||||
#define CALL(x) .equ NR_syscalls,NR_syscalls+1
 | 
					#define CALL(x) .equ NR_syscalls,NR_syscalls+1
 | 
				
			||||||
#include "calls.S"
 | 
					#include "calls.S"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -373,7 +373,6 @@ void release_thread(struct task_struct *dead_task)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
 | 
					asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
 | 
				
			||||||
asmlinkage void ret_from_kernel_thread(void) __asm__("ret_from_kernel_thread");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
copy_thread(unsigned long clone_flags, unsigned long stack_start,
 | 
					copy_thread(unsigned long clone_flags, unsigned long stack_start,
 | 
				
			||||||
| 
						 | 
					@ -388,13 +387,13 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start,
 | 
				
			||||||
		*childregs = *regs;
 | 
							*childregs = *regs;
 | 
				
			||||||
		childregs->ARM_r0 = 0;
 | 
							childregs->ARM_r0 = 0;
 | 
				
			||||||
		childregs->ARM_sp = stack_start;
 | 
							childregs->ARM_sp = stack_start;
 | 
				
			||||||
		thread->cpu_context.pc = (unsigned long)ret_from_fork;
 | 
					 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
 | 
							memset(childregs, 0, sizeof(struct pt_regs));
 | 
				
			||||||
		thread->cpu_context.r4 = stk_sz;
 | 
							thread->cpu_context.r4 = stk_sz;
 | 
				
			||||||
		thread->cpu_context.r5 = stack_start;
 | 
							thread->cpu_context.r5 = stack_start;
 | 
				
			||||||
		thread->cpu_context.pc = (unsigned long)ret_from_kernel_thread;
 | 
					 | 
				
			||||||
		childregs->ARM_cpsr = SVC_MODE;
 | 
							childregs->ARM_cpsr = SVC_MODE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						thread->cpu_context.pc = (unsigned long)ret_from_fork;
 | 
				
			||||||
	thread->cpu_context.sp = (unsigned long)childregs;
 | 
						thread->cpu_context.sp = (unsigned long)childregs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clear_ptrace_hw_breakpoint(p);
 | 
						clear_ptrace_hw_breakpoint(p);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue