diff options
Diffstat (limited to 'arch/s390/kernel/entry64.S')
-rw-r--r-- | arch/s390/kernel/entry64.S | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 1f776f2edda..39c84e65f74 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -352,12 +352,22 @@ ENTRY(ret_from_fork) | |||
352 | la %r11,STACK_FRAME_OVERHEAD(%r15) | 352 | la %r11,STACK_FRAME_OVERHEAD(%r15) |
353 | lg %r12,__LC_THREAD_INFO | 353 | lg %r12,__LC_THREAD_INFO |
354 | tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ? | 354 | tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ? |
355 | jo 0f | 355 | je 1f |
356 | stg %r15,__PT_R15(%r11) # store stack pointer for new kthread | 356 | brasl %r14,schedule_tail |
357 | 0: brasl %r14,schedule_tail | ||
358 | TRACE_IRQS_ON | 357 | TRACE_IRQS_ON |
359 | ssm __LC_SVC_NEW_PSW # reenable interrupts | 358 | ssm __LC_SVC_NEW_PSW # reenable interrupts |
360 | j sysc_tracenogo | 359 | j sysc_tracenogo |
360 | 1: # it's a kernel thread | ||
361 | stg %r15,__PT_R15(%r11) # store stack pointer for new kthread | ||
362 | brasl %r14,schedule_tail | ||
363 | TRACE_IRQS_ON | ||
364 | ssm __LC_SVC_NEW_PSW # reenable interrupts | ||
365 | lmg %r9,%r11,__PT_R9(%r11) # load gprs | ||
366 | ENTRY(kernel_thread_starter) | ||
367 | la %r2,0(%r10) | ||
368 | basr %r14,%r9 | ||
369 | la %r2,0 | ||
370 | br %r11 # do_exit | ||
361 | 371 | ||
362 | # | 372 | # |
363 | # kernel_execve function needs to deal with pt_regs that is not | 373 | # kernel_execve function needs to deal with pt_regs that is not |