diff options
| -rw-r--r-- | arch/um/include/os.h | 3 | ||||
| -rw-r--r-- | arch/um/os-Linux/process.c | 16 | ||||
| -rw-r--r-- | arch/um/sys-i386/ldt.c | 9 | 
3 files changed, 22 insertions, 6 deletions
diff --git a/arch/um/include/os.h b/arch/um/include/os.h index eb1710b8125..2a1c64d8d0b 100644 --- a/arch/um/include/os.h +++ b/arch/um/include/os.h @@ -179,8 +179,11 @@ extern void os_stop_process(int pid);  extern void os_kill_process(int pid, int reap_child);  extern void os_kill_ptraced_process(int pid, int reap_child);  extern void os_usr1_process(int pid); +extern long os_ptrace_ldt(long pid, long addr, long data); +  extern int os_getpid(void);  extern int os_getpgrp(void); +  extern void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int));  extern void init_new_thread_signals(int altstack);  extern int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr); diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index 7f5e2dac2a3..d261888f39c 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c @@ -19,6 +19,7 @@  #include "irq_user.h"  #include "kern_util.h"  #include "longjmp.h" +#include "skas_ptrace.h"  #define ARBITRARY_ADDR -1  #define FAILURE_PID    -1 @@ -100,6 +101,21 @@ void os_kill_process(int pid, int reap_child)  } +/* This is here uniquely to have access to the userspace errno, i.e. the one + * used by ptrace in case of error. + */ + +long os_ptrace_ldt(long pid, long addr, long data) +{ +	int ret; + +	ret = ptrace(PTRACE_LDT, pid, addr, data); + +	if (ret < 0) +		return -errno; +	return ret; +} +  /* Kill off a ptraced child by all means available.  kill it normally first,   * then PTRACE_KILL it, then PTRACE_CONT it in case it's in a run state from   * which it can't exit directly. diff --git a/arch/um/sys-i386/ldt.c b/arch/um/sys-i386/ldt.c index 1fa09a79a10..fe0877b3509 100644 --- a/arch/um/sys-i386/ldt.c +++ b/arch/um/sys-i386/ldt.c @@ -107,7 +107,7 @@ long write_ldt_entry(struct mm_id * mm_idp, int func, struct user_desc * desc,  		 * So we need to switch child's mm into our userspace, then  		 * later switch back.  		 * -		 * Note: I'm unshure: should interrupts be disabled here? +		 * Note: I'm unsure: should interrupts be disabled here?  		 */  		if(!current->active_mm || current->active_mm == &init_mm ||  		   mm_idp != ¤t->active_mm->context.skas.id) @@ -129,9 +129,7 @@ long write_ldt_entry(struct mm_id * mm_idp, int func, struct user_desc * desc,  			pid = userspace_pid[cpu];  		} -		res = ptrace(PTRACE_LDT, pid, 0, (unsigned long) &ldt_op); -		if(res) -			res = errno; +		res = os_ptrace_ldt(pid, 0, (unsigned long) &ldt_op);  		if(proc_mm)  			put_cpu(); @@ -181,8 +179,7 @@ static long read_ldt_from_host(void __user * ptr, unsigned long bytecount)  	 */  	cpu = get_cpu(); -	res = ptrace(PTRACE_LDT, userspace_pid[cpu], 0, -		     (unsigned long) &ptrace_ldt); +	res = os_ptrace_ldt(userspace_pid[cpu], 0, (unsigned long) &ptrace_ldt);  	put_cpu();  	if(res < 0)  		goto out;  |