mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +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 DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN
 | 
			
		||||
	select GENERIC_KERNEL_THREAD
 | 
			
		||||
	select GENERIC_KERNEL_EXECVE
 | 
			
		||||
	help
 | 
			
		||||
	  The ARM series is a line of low-power-consumption RISC chip designs
 | 
			
		||||
	  licensed by ARM Ltd and targeted at embedded applications and
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -470,7 +470,6 @@
 | 
			
		|||
#define __ARCH_WANT_SYS_SOCKETCALL
 | 
			
		||||
#endif
 | 
			
		||||
#define __ARCH_WANT_SYS_EXECVE
 | 
			
		||||
#define __ARCH_WANT_KERNEL_EXECVE
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * "Conditional" syscalls
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,35 +86,14 @@ ENDPROC(ret_to_user)
 | 
			
		|||
 */
 | 
			
		||||
ENTRY(ret_from_fork)
 | 
			
		||||
	bl	schedule_tail
 | 
			
		||||
	cmp	r5, #0
 | 
			
		||||
	movne	r0, r4
 | 
			
		||||
	movne	lr, pc
 | 
			
		||||
	movne	pc, r5
 | 
			
		||||
	get_thread_info tsk
 | 
			
		||||
	mov	why, #1
 | 
			
		||||
	b	ret_slow_syscall
 | 
			
		||||
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
 | 
			
		||||
#define CALL(x) .equ NR_syscalls,NR_syscalls+1
 | 
			
		||||
#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_kernel_thread(void) __asm__("ret_from_kernel_thread");
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
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->ARM_r0 = 0;
 | 
			
		||||
		childregs->ARM_sp = stack_start;
 | 
			
		||||
		thread->cpu_context.pc = (unsigned long)ret_from_fork;
 | 
			
		||||
	} else {
 | 
			
		||||
		memset(childregs, 0, sizeof(struct pt_regs));
 | 
			
		||||
		thread->cpu_context.r4 = stk_sz;
 | 
			
		||||
		thread->cpu_context.r5 = stack_start;
 | 
			
		||||
		thread->cpu_context.pc = (unsigned long)ret_from_kernel_thread;
 | 
			
		||||
		childregs->ARM_cpsr = SVC_MODE;
 | 
			
		||||
	}
 | 
			
		||||
	thread->cpu_context.pc = (unsigned long)ret_from_fork;
 | 
			
		||||
	thread->cpu_context.sp = (unsigned long)childregs;
 | 
			
		||||
 | 
			
		||||
	clear_ptrace_hw_breakpoint(p);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue