diff options
Diffstat (limited to 'arch/s390/kernel/entry.S')
-rw-r--r-- | arch/s390/kernel/entry.S | 51 |
1 files changed, 13 insertions, 38 deletions
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 27b07730b7b8..b2448487854c 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -2,8 +2,7 @@ | |||
2 | * arch/s390/kernel/entry.S | 2 | * arch/s390/kernel/entry.S |
3 | * S390 low-level entry points. | 3 | * S390 low-level entry points. |
4 | * | 4 | * |
5 | * S390 version | 5 | * Copyright (C) IBM Corp. 1999,2006 |
6 | * Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation | ||
7 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | 6 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), |
8 | * Hartmut Penner (hp@de.ibm.com), | 7 | * Hartmut Penner (hp@de.ibm.com), |
9 | * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), | 8 | * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), |
@@ -50,9 +49,10 @@ SP_ILC = STACK_FRAME_OVERHEAD + __PT_ILC | |||
50 | SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP | 49 | SP_TRAP = STACK_FRAME_OVERHEAD + __PT_TRAP |
51 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE | 50 | SP_SIZE = STACK_FRAME_OVERHEAD + __PT_SIZE |
52 | 51 | ||
53 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING | \ | 52 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | _TIF_NEED_RESCHED | \ |
54 | _TIF_RESTART_SVC | _TIF_SINGLE_STEP ) | 53 | _TIF_MCCK_PENDING | _TIF_RESTART_SVC | _TIF_SINGLE_STEP ) |
55 | _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING) | 54 | _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK | _TIF_NEED_RESCHED | \ |
55 | _TIF_MCCK_PENDING) | ||
56 | 56 | ||
57 | STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER | 57 | STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER |
58 | STACK_SIZE = 1 << STACK_SHIFT | 58 | STACK_SIZE = 1 << STACK_SHIFT |
@@ -251,8 +251,8 @@ sysc_work: | |||
251 | bo BASED(sysc_mcck_pending) | 251 | bo BASED(sysc_mcck_pending) |
252 | tm __TI_flags+3(%r9),_TIF_NEED_RESCHED | 252 | tm __TI_flags+3(%r9),_TIF_NEED_RESCHED |
253 | bo BASED(sysc_reschedule) | 253 | bo BASED(sysc_reschedule) |
254 | tm __TI_flags+3(%r9),_TIF_SIGPENDING | 254 | tm __TI_flags+3(%r9),(_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK) |
255 | bo BASED(sysc_sigpending) | 255 | bnz BASED(sysc_sigpending) |
256 | tm __TI_flags+3(%r9),_TIF_RESTART_SVC | 256 | tm __TI_flags+3(%r9),_TIF_RESTART_SVC |
257 | bo BASED(sysc_restart) | 257 | bo BASED(sysc_restart) |
258 | tm __TI_flags+3(%r9),_TIF_SINGLE_STEP | 258 | tm __TI_flags+3(%r9),_TIF_SINGLE_STEP |
@@ -276,12 +276,11 @@ sysc_mcck_pending: | |||
276 | br %r1 # TIF bit will be cleared by handler | 276 | br %r1 # TIF bit will be cleared by handler |
277 | 277 | ||
278 | # | 278 | # |
279 | # _TIF_SIGPENDING is set, call do_signal | 279 | # _TIF_SIGPENDING or _TIF_RESTORE_SIGMASK is set, call do_signal |
280 | # | 280 | # |
281 | sysc_sigpending: | 281 | sysc_sigpending: |
282 | ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP | 282 | ni __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP |
283 | la %r2,SP_PTREGS(%r15) # load pt_regs | 283 | la %r2,SP_PTREGS(%r15) # load pt_regs |
284 | sr %r3,%r3 # clear *oldset | ||
285 | l %r1,BASED(.Ldo_signal) | 284 | l %r1,BASED(.Ldo_signal) |
286 | basr %r14,%r1 # call do_signal | 285 | basr %r14,%r1 # call do_signal |
287 | tm __TI_flags+3(%r9),_TIF_RESTART_SVC | 286 | tm __TI_flags+3(%r9),_TIF_RESTART_SVC |
@@ -397,30 +396,6 @@ sys_rt_sigreturn_glue: | |||
397 | l %r1,BASED(.Lrt_sigreturn) | 396 | l %r1,BASED(.Lrt_sigreturn) |
398 | br %r1 # branch to sys_sigreturn | 397 | br %r1 # branch to sys_sigreturn |
399 | 398 | ||
400 | # | ||
401 | # sigsuspend and rt_sigsuspend need pt_regs as an additional | ||
402 | # parameter and they have to skip the store of %r2 into the | ||
403 | # user register %r2 because the return value was set in | ||
404 | # sigsuspend and rt_sigsuspend already and must not be overwritten! | ||
405 | # | ||
406 | |||
407 | sys_sigsuspend_glue: | ||
408 | lr %r5,%r4 # move mask back | ||
409 | lr %r4,%r3 # move history1 parameter | ||
410 | lr %r3,%r2 # move history0 parameter | ||
411 | la %r2,SP_PTREGS(%r15) # load pt_regs as first parameter | ||
412 | l %r1,BASED(.Lsigsuspend) | ||
413 | la %r14,4(%r14) # skip store of return value | ||
414 | br %r1 # branch to sys_sigsuspend | ||
415 | |||
416 | sys_rt_sigsuspend_glue: | ||
417 | lr %r4,%r3 # move sigsetsize parameter | ||
418 | lr %r3,%r2 # move unewset parameter | ||
419 | la %r2,SP_PTREGS(%r15) # load pt_regs as first parameter | ||
420 | l %r1,BASED(.Lrt_sigsuspend) | ||
421 | la %r14,4(%r14) # skip store of return value | ||
422 | br %r1 # branch to sys_rt_sigsuspend | ||
423 | |||
424 | sys_sigaltstack_glue: | 399 | sys_sigaltstack_glue: |
425 | la %r4,SP_PTREGS(%r15) # load pt_regs as parameter | 400 | la %r4,SP_PTREGS(%r15) # load pt_regs as parameter |
426 | l %r1,BASED(.Lsigaltstack) | 401 | l %r1,BASED(.Lsigaltstack) |
@@ -604,15 +579,16 @@ io_work: | |||
604 | lr %r15,%r1 | 579 | lr %r15,%r1 |
605 | # | 580 | # |
606 | # One of the work bits is on. Find out which one. | 581 | # One of the work bits is on. Find out which one. |
607 | # Checked are: _TIF_SIGPENDING, _TIF_NEED_RESCHED and _TIF_MCCK_PENDING | 582 | # Checked are: _TIF_SIGPENDING, _TIF_RESTORE_SIGMASK, _TIF_NEED_RESCHED |
583 | # and _TIF_MCCK_PENDING | ||
608 | # | 584 | # |
609 | io_work_loop: | 585 | io_work_loop: |
610 | tm __TI_flags+3(%r9),_TIF_MCCK_PENDING | 586 | tm __TI_flags+3(%r9),_TIF_MCCK_PENDING |
611 | bo BASED(io_mcck_pending) | 587 | bo BASED(io_mcck_pending) |
612 | tm __TI_flags+3(%r9),_TIF_NEED_RESCHED | 588 | tm __TI_flags+3(%r9),_TIF_NEED_RESCHED |
613 | bo BASED(io_reschedule) | 589 | bo BASED(io_reschedule) |
614 | tm __TI_flags+3(%r9),_TIF_SIGPENDING | 590 | tm __TI_flags+3(%r9),(_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK) |
615 | bo BASED(io_sigpending) | 591 | bnz BASED(io_sigpending) |
616 | b BASED(io_leave) | 592 | b BASED(io_leave) |
617 | 593 | ||
618 | # | 594 | # |
@@ -636,12 +612,11 @@ io_reschedule: | |||
636 | b BASED(io_work_loop) | 612 | b BASED(io_work_loop) |
637 | 613 | ||
638 | # | 614 | # |
639 | # _TIF_SIGPENDING is set, call do_signal | 615 | # _TIF_SIGPENDING or _TIF_RESTORE_SIGMASK is set, call do_signal |
640 | # | 616 | # |
641 | io_sigpending: | 617 | io_sigpending: |
642 | stosm __SF_EMPTY(%r15),0x03 # reenable interrupts | 618 | stosm __SF_EMPTY(%r15),0x03 # reenable interrupts |
643 | la %r2,SP_PTREGS(%r15) # load pt_regs | 619 | la %r2,SP_PTREGS(%r15) # load pt_regs |
644 | sr %r3,%r3 # clear *oldset | ||
645 | l %r1,BASED(.Ldo_signal) | 620 | l %r1,BASED(.Ldo_signal) |
646 | basr %r14,%r1 # call do_signal | 621 | basr %r14,%r1 # call do_signal |
647 | stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts | 622 | stnsm __SF_EMPTY(%r15),0xfc # disable I/O and ext. interrupts |