diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-10 21:35:42 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-12 13:35:22 -0400 |
commit | 22e2430d60dbdfcdd732a086e9ef2dbd74c266d1 (patch) | |
tree | 687067fcaf2761015639178033ee16c8511703b8 /arch/um | |
parent | a74fb73c12398b250fdc5e333a11e15a9e3a84fc (diff) |
x86, um: convert to saner kernel_execve() semantics
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/um')
-rw-r--r-- | arch/um/include/asm/processor-generic.h | 2 | ||||
-rw-r--r-- | arch/um/include/shared/os.h | 1 | ||||
-rw-r--r-- | arch/um/kernel/exec.c | 5 | ||||
-rw-r--r-- | arch/um/kernel/process.c | 10 | ||||
-rw-r--r-- | arch/um/os-Linux/process.c | 13 |
5 files changed, 3 insertions, 28 deletions
diff --git a/arch/um/include/asm/processor-generic.h b/arch/um/include/asm/processor-generic.h index 5d9ab0c4f488..62435a00e70e 100644 --- a/arch/um/include/asm/processor-generic.h +++ b/arch/um/include/asm/processor-generic.h | |||
@@ -26,7 +26,6 @@ struct thread_struct { | |||
26 | jmp_buf *fault_catcher; | 26 | jmp_buf *fault_catcher; |
27 | struct task_struct *prev_sched; | 27 | struct task_struct *prev_sched; |
28 | unsigned long temp_stack; | 28 | unsigned long temp_stack; |
29 | jmp_buf *exec_buf; | ||
30 | struct arch_thread arch; | 29 | struct arch_thread arch; |
31 | jmp_buf switch_buf; | 30 | jmp_buf switch_buf; |
32 | int mm_count; | 31 | int mm_count; |
@@ -54,7 +53,6 @@ struct thread_struct { | |||
54 | .fault_addr = NULL, \ | 53 | .fault_addr = NULL, \ |
55 | .prev_sched = NULL, \ | 54 | .prev_sched = NULL, \ |
56 | .temp_stack = 0, \ | 55 | .temp_stack = 0, \ |
57 | .exec_buf = NULL, \ | ||
58 | .arch = INIT_ARCH_THREAD, \ | 56 | .arch = INIT_ARCH_THREAD, \ |
59 | .request = { 0 } \ | 57 | .request = { 0 } \ |
60 | } | 58 | } |
diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h index 89b686c1a3ea..25dbd372d322 100644 --- a/arch/um/include/shared/os.h +++ b/arch/um/include/shared/os.h | |||
@@ -191,7 +191,6 @@ extern int os_getpid(void); | |||
191 | extern int os_getpgrp(void); | 191 | extern int os_getpgrp(void); |
192 | 192 | ||
193 | extern void init_new_thread_signals(void); | 193 | extern void init_new_thread_signals(void); |
194 | extern int run_kernel_thread(int (*fn)(void *), void *arg, jmp_buf **jmp_ptr); | ||
195 | 194 | ||
196 | extern int os_map_memory(void *virt, int fd, unsigned long long off, | 195 | extern int os_map_memory(void *virt, int fd, unsigned long long off, |
197 | unsigned long len, int r, int w, int x); | 196 | unsigned long len, int r, int w, int x); |
diff --git a/arch/um/kernel/exec.c b/arch/um/kernel/exec.c index e427301f55d6..565ca396d83e 100644 --- a/arch/um/kernel/exec.c +++ b/arch/um/kernel/exec.c | |||
@@ -47,8 +47,3 @@ void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp) | |||
47 | #endif | 47 | #endif |
48 | } | 48 | } |
49 | EXPORT_SYMBOL(start_thread); | 49 | EXPORT_SYMBOL(start_thread); |
50 | |||
51 | void __noreturn ret_from_kernel_execve(struct pt_regs *unused) | ||
52 | { | ||
53 | UML_LONGJMP(current->thread.exec_buf, 1); | ||
54 | } | ||
diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index a1b50add48a2..94b0d8b9810b 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c | |||
@@ -135,14 +135,10 @@ void new_thread_handler(void) | |||
135 | arg = current->thread.request.u.thread.arg; | 135 | arg = current->thread.request.u.thread.arg; |
136 | 136 | ||
137 | /* | 137 | /* |
138 | * The return value is 1 if the kernel thread execs a process, | 138 | * callback returns only if the kernel thread execs a process |
139 | * 0 if it just exits | ||
140 | */ | 139 | */ |
141 | n = run_kernel_thread(fn, arg, ¤t->thread.exec_buf); | 140 | n = fn(arg); |
142 | if (n == 1) | 141 | userspace(¤t->thread.regs.regs); |
143 | userspace(¤t->thread.regs.regs); | ||
144 | else | ||
145 | do_exit(0); | ||
146 | } | 142 | } |
147 | 143 | ||
148 | /* Called magically, see new_thread_handler above */ | 144 | /* Called magically, see new_thread_handler above */ |
diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index 307f173e7f82..a04ec167a9c3 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c | |||
@@ -244,16 +244,3 @@ void init_new_thread_signals(void) | |||
244 | signal(SIGWINCH, SIG_IGN); | 244 | signal(SIGWINCH, SIG_IGN); |
245 | signal(SIGTERM, SIG_DFL); | 245 | signal(SIGTERM, SIG_DFL); |
246 | } | 246 | } |
247 | |||
248 | int run_kernel_thread(int (*fn)(void *), void *arg, jmp_buf **jmp_ptr) | ||
249 | { | ||
250 | jmp_buf buf; | ||
251 | int n; | ||
252 | |||
253 | *jmp_ptr = &buf; | ||
254 | n = UML_SETJMP(&buf); | ||
255 | if (n != 0) | ||
256 | return n; | ||
257 | (*fn)(arg); | ||
258 | return 0; | ||
259 | } | ||