diff options
| author | Brian Gerst <brgerst@gmail.com> | 2009-12-09 12:34:44 -0500 |
|---|---|---|
| committer | H. Peter Anvin <hpa@zytor.com> | 2009-12-10 19:41:31 -0500 |
| commit | df59e7bf439918f523ac29e996ec1eebbed60440 (patch) | |
| tree | a847eb0b7f0e3fe34a717999db0d441e7f7e7bd6 | |
| parent | f443ff4201dd25cd4dec183f9919ecba90c8edc2 (diff) | |
x86: Merge kernel_thread()
Signed-off-by: Brian Gerst <brgerst@gmail.com>
LKML-Reference: <1260380084-3707-6-git-send-email-brgerst@gmail.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
| -rw-r--r-- | arch/x86/kernel/process.c | 35 | ||||
| -rw-r--r-- | arch/x86/kernel/process_32.c | 36 | ||||
| -rw-r--r-- | arch/x86/kernel/process_64.c | 36 |
3 files changed, 35 insertions, 72 deletions
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index f3c1a6b3a65e..8705ccedd447 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -243,6 +243,41 @@ sys_clone(unsigned long clone_flags, unsigned long newsp, | |||
| 243 | return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); | 243 | return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | /* | ||
| 247 | * This gets run with %si containing the | ||
| 248 | * function to call, and %di containing | ||
| 249 | * the "args". | ||
| 250 | */ | ||
| 251 | extern void kernel_thread_helper(void); | ||
| 252 | |||
| 253 | /* | ||
| 254 | * Create a kernel thread | ||
| 255 | */ | ||
| 256 | int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | ||
| 257 | { | ||
| 258 | struct pt_regs regs; | ||
| 259 | |||
| 260 | memset(®s, 0, sizeof(regs)); | ||
| 261 | |||
| 262 | regs.si = (unsigned long) fn; | ||
| 263 | regs.di = (unsigned long) arg; | ||
| 264 | |||
| 265 | #ifdef CONFIG_X86_32 | ||
| 266 | regs.ds = __USER_DS; | ||
| 267 | regs.es = __USER_DS; | ||
| 268 | regs.fs = __KERNEL_PERCPU; | ||
| 269 | regs.gs = __KERNEL_STACK_CANARY; | ||
| 270 | #endif | ||
| 271 | |||
| 272 | regs.orig_ax = -1; | ||
| 273 | regs.ip = (unsigned long) kernel_thread_helper; | ||
| 274 | regs.cs = __KERNEL_CS | get_kernel_rpl(); | ||
| 275 | regs.flags = X86_EFLAGS_IF | 0x2; | ||
| 276 | |||
| 277 | /* Ok, create the new process.. */ | ||
| 278 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | ||
| 279 | } | ||
| 280 | EXPORT_SYMBOL(kernel_thread); | ||
| 246 | 281 | ||
| 247 | /* | 282 | /* |
| 248 | * sys_execve() executes a new program. | 283 | * sys_execve() executes a new program. |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index f2e8b05a4f02..ccf234266a2e 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -192,42 +192,6 @@ void show_regs(struct pt_regs *regs) | |||
| 192 | show_trace(NULL, regs, ®s->sp, regs->bp); | 192 | show_trace(NULL, regs, ®s->sp, regs->bp); |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | /* | ||
| 196 | * This gets run with %si containing the | ||
| 197 | * function to call, and %di containing | ||
| 198 | * the "args". | ||
| 199 | */ | ||
| 200 | extern void kernel_thread_helper(void); | ||
| 201 | |||
| 202 | /* | ||
| 203 | * Create a kernel thread | ||
| 204 | */ | ||
| 205 | int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | ||
| 206 | { | ||
| 207 | struct pt_regs regs; | ||
| 208 | |||
| 209 | memset(®s, 0, sizeof(regs)); | ||
| 210 | |||
| 211 | regs.si = (unsigned long) fn; | ||
| 212 | regs.di = (unsigned long) arg; | ||
| 213 | |||
| 214 | #ifdef CONFIG_X86_32 | ||
| 215 | regs.ds = __USER_DS; | ||
| 216 | regs.es = __USER_DS; | ||
| 217 | regs.fs = __KERNEL_PERCPU; | ||
| 218 | regs.gs = __KERNEL_STACK_CANARY; | ||
| 219 | #endif | ||
| 220 | |||
| 221 | regs.orig_ax = -1; | ||
| 222 | regs.ip = (unsigned long) kernel_thread_helper; | ||
| 223 | regs.cs = __KERNEL_CS | get_kernel_rpl(); | ||
| 224 | regs.flags = X86_EFLAGS_IF | 0x2; | ||
| 225 | |||
| 226 | /* Ok, create the new process.. */ | ||
| 227 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | ||
| 228 | } | ||
| 229 | EXPORT_SYMBOL(kernel_thread); | ||
| 230 | |||
| 231 | void release_thread(struct task_struct *dead_task) | 195 | void release_thread(struct task_struct *dead_task) |
| 232 | { | 196 | { |
| 233 | BUG_ON(dead_task->mm); | 197 | BUG_ON(dead_task->mm); |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index d49a9094f6f3..1a362c5bec37 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -229,42 +229,6 @@ void show_regs(struct pt_regs *regs) | |||
| 229 | show_trace(NULL, regs, (void *)(regs + 1), regs->bp); | 229 | show_trace(NULL, regs, (void *)(regs + 1), regs->bp); |
| 230 | } | 230 | } |
| 231 | 231 | ||
| 232 | /* | ||
| 233 | * This gets run with %si containing the | ||
| 234 | * function to call, and %di containing | ||
| 235 | * the "args". | ||
| 236 | */ | ||
| 237 | extern void kernel_thread_helper(void); | ||
| 238 | |||
| 239 | /* | ||
| 240 | * Create a kernel thread | ||
| 241 | */ | ||
| 242 | int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | ||
| 243 | { | ||
| 244 | struct pt_regs regs; | ||
| 245 | |||
| 246 | memset(®s, 0, sizeof(regs)); | ||
| 247 | |||
| 248 | regs.si = (unsigned long) fn; | ||
| 249 | regs.di = (unsigned long) arg; | ||
| 250 | |||
| 251 | #ifdef CONFIG_X86_32 | ||
| 252 | regs.ds = __USER_DS; | ||
| 253 | regs.es = __USER_DS; | ||
| 254 | regs.fs = __KERNEL_PERCPU; | ||
| 255 | regs.gs = __KERNEL_STACK_CANARY; | ||
| 256 | #endif | ||
| 257 | |||
| 258 | regs.orig_ax = -1; | ||
| 259 | regs.ip = (unsigned long) kernel_thread_helper; | ||
| 260 | regs.cs = __KERNEL_CS | get_kernel_rpl(); | ||
| 261 | regs.flags = X86_EFLAGS_IF | 0x2; | ||
| 262 | |||
| 263 | /* Ok, create the new process.. */ | ||
| 264 | return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL); | ||
| 265 | } | ||
| 266 | EXPORT_SYMBOL(kernel_thread); | ||
| 267 | |||
| 268 | void release_thread(struct task_struct *dead_task) | 232 | void release_thread(struct task_struct *dead_task) |
| 269 | { | 233 | { |
| 270 | if (dead_task->mm) { | 234 | if (dead_task->mm) { |
