diff options
Diffstat (limited to 'arch/arm/kernel/process.c')
| -rw-r--r-- | arch/arm/kernel/process.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 1585423699ee..56820cce91a4 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
| @@ -352,6 +352,23 @@ asm( ".section .text\n" | |||
| 352 | " .size kernel_thread_helper, . - kernel_thread_helper\n" | 352 | " .size kernel_thread_helper, . - kernel_thread_helper\n" |
| 353 | " .previous"); | 353 | " .previous"); |
| 354 | 354 | ||
| 355 | #ifdef CONFIG_ARM_UNWIND | ||
| 356 | extern void kernel_thread_exit(long code); | ||
| 357 | asm( ".section .text\n" | ||
| 358 | " .align\n" | ||
| 359 | " .type kernel_thread_exit, #function\n" | ||
| 360 | "kernel_thread_exit:\n" | ||
| 361 | " .fnstart\n" | ||
| 362 | " .cantunwind\n" | ||
| 363 | " bl do_exit\n" | ||
| 364 | " nop\n" | ||
| 365 | " .fnend\n" | ||
| 366 | " .size kernel_thread_exit, . - kernel_thread_exit\n" | ||
| 367 | " .previous"); | ||
| 368 | #else | ||
| 369 | #define kernel_thread_exit do_exit | ||
| 370 | #endif | ||
| 371 | |||
| 355 | /* | 372 | /* |
| 356 | * Create a kernel thread. | 373 | * Create a kernel thread. |
| 357 | */ | 374 | */ |
| @@ -363,7 +380,7 @@ pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | |||
| 363 | 380 | ||
| 364 | regs.ARM_r1 = (unsigned long)arg; | 381 | regs.ARM_r1 = (unsigned long)arg; |
| 365 | regs.ARM_r2 = (unsigned long)fn; | 382 | regs.ARM_r2 = (unsigned long)fn; |
| 366 | regs.ARM_r3 = (unsigned long)do_exit; | 383 | regs.ARM_r3 = (unsigned long)kernel_thread_exit; |
| 367 | regs.ARM_pc = (unsigned long)kernel_thread_helper; | 384 | regs.ARM_pc = (unsigned long)kernel_thread_helper; |
| 368 | regs.ARM_cpsr = SVC_MODE | PSR_ENDSTATE; | 385 | regs.ARM_cpsr = SVC_MODE | PSR_ENDSTATE; |
| 369 | 386 | ||
