diff options
Diffstat (limited to 'arch/s390/kernel/entry64.S')
-rw-r--r-- | arch/s390/kernel/entry64.S | 48 |
1 files changed, 19 insertions, 29 deletions
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 9c837c101297..4c17eece707e 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -39,6 +39,7 @@ __PT_R15 = __PT_GPRS + 120 | |||
39 | 39 | ||
40 | STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER | 40 | STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER |
41 | STACK_SIZE = 1 << STACK_SHIFT | 41 | STACK_SIZE = 1 << STACK_SHIFT |
42 | STACK_INIT = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE | ||
42 | 43 | ||
43 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | 44 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ |
44 | _TIF_MCCK_PENDING | _TIF_PER_TRAP ) | 45 | _TIF_MCCK_PENDING | _TIF_PER_TRAP ) |
@@ -124,10 +125,10 @@ _TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING) | |||
124 | srag %r14,%r14,\shift | 125 | srag %r14,%r14,\shift |
125 | jnz 1f | 126 | jnz 1f |
126 | CHECK_STACK 1<<\shift,\savearea | 127 | CHECK_STACK 1<<\shift,\savearea |
128 | aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) | ||
127 | j 2f | 129 | j 2f |
128 | 1: lg %r15,\stack # load target stack | 130 | 1: lg %r15,\stack # load target stack |
129 | 2: aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) | 131 | 2: la %r11,STACK_FRAME_OVERHEAD(%r15) |
130 | la %r11,STACK_FRAME_OVERHEAD(%r15) | ||
131 | .endm | 132 | .endm |
132 | 133 | ||
133 | .macro UPDATE_VTIME scratch,enter_timer | 134 | .macro UPDATE_VTIME scratch,enter_timer |
@@ -177,7 +178,7 @@ ENTRY(__switch_to) | |||
177 | lg %r4,__THREAD_info(%r2) # get thread_info of prev | 178 | lg %r4,__THREAD_info(%r2) # get thread_info of prev |
178 | lg %r5,__THREAD_info(%r3) # get thread_info of next | 179 | lg %r5,__THREAD_info(%r3) # get thread_info of next |
179 | lgr %r15,%r5 | 180 | lgr %r15,%r5 |
180 | aghi %r15,STACK_SIZE # end of kernel stack of next | 181 | aghi %r15,STACK_INIT # end of kernel stack of next |
181 | stg %r3,__LC_CURRENT # store task struct of next | 182 | stg %r3,__LC_CURRENT # store task struct of next |
182 | stg %r5,__LC_THREAD_INFO # store thread info of next | 183 | stg %r5,__LC_THREAD_INFO # store thread info of next |
183 | stg %r15,__LC_KERNEL_STACK # store end of kernel stack | 184 | stg %r15,__LC_KERNEL_STACK # store end of kernel stack |
@@ -203,10 +204,8 @@ sysc_stmg: | |||
203 | stmg %r8,%r15,__LC_SAVE_AREA_SYNC | 204 | stmg %r8,%r15,__LC_SAVE_AREA_SYNC |
204 | lg %r10,__LC_LAST_BREAK | 205 | lg %r10,__LC_LAST_BREAK |
205 | lg %r12,__LC_THREAD_INFO | 206 | lg %r12,__LC_THREAD_INFO |
206 | larl %r13,system_call | ||
207 | sysc_per: | 207 | sysc_per: |
208 | lg %r15,__LC_KERNEL_STACK | 208 | lg %r15,__LC_KERNEL_STACK |
209 | aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) | ||
210 | la %r11,STACK_FRAME_OVERHEAD(%r15) # pointer to pt_regs | 209 | la %r11,STACK_FRAME_OVERHEAD(%r15) # pointer to pt_regs |
211 | sysc_vtime: | 210 | sysc_vtime: |
212 | UPDATE_VTIME %r13,__LC_SYNC_ENTER_TIMER | 211 | UPDATE_VTIME %r13,__LC_SYNC_ENTER_TIMER |
@@ -217,6 +216,7 @@ sysc_vtime: | |||
217 | mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC | 216 | mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC |
218 | sysc_do_svc: | 217 | sysc_do_svc: |
219 | oi __TI_flags+7(%r12),_TIF_SYSCALL | 218 | oi __TI_flags+7(%r12),_TIF_SYSCALL |
219 | lg %r10,__TI_sysc_table(%r12) # address of system call table | ||
220 | llgh %r8,__PT_INT_CODE+2(%r11) | 220 | llgh %r8,__PT_INT_CODE+2(%r11) |
221 | slag %r8,%r8,2 # shift and test for svc 0 | 221 | slag %r8,%r8,2 # shift and test for svc 0 |
222 | jnz sysc_nr_ok | 222 | jnz sysc_nr_ok |
@@ -227,13 +227,6 @@ sysc_do_svc: | |||
227 | sth %r1,__PT_INT_CODE+2(%r11) | 227 | sth %r1,__PT_INT_CODE+2(%r11) |
228 | slag %r8,%r1,2 | 228 | slag %r8,%r1,2 |
229 | sysc_nr_ok: | 229 | sysc_nr_ok: |
230 | larl %r10,sys_call_table # 64 bit system call table | ||
231 | #ifdef CONFIG_COMPAT | ||
232 | tm __TI_flags+5(%r12),(_TIF_31BIT>>16) | ||
233 | jno sysc_noemu | ||
234 | larl %r10,sys_call_table_emu # 31 bit system call table | ||
235 | sysc_noemu: | ||
236 | #endif | ||
237 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) | 230 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
238 | stg %r2,__PT_ORIG_GPR2(%r11) | 231 | stg %r2,__PT_ORIG_GPR2(%r11) |
239 | stg %r7,STACK_FRAME_OVERHEAD(%r15) | 232 | stg %r7,STACK_FRAME_OVERHEAD(%r15) |
@@ -389,6 +382,7 @@ ENTRY(pgm_check_handler) | |||
389 | tm __LC_PGM_ILC+3,0x80 # check for per exception | 382 | tm __LC_PGM_ILC+3,0x80 # check for per exception |
390 | jnz pgm_svcper # -> single stepped svc | 383 | jnz pgm_svcper # -> single stepped svc |
391 | 0: CHECK_STACK STACK_SIZE,__LC_SAVE_AREA_SYNC | 384 | 0: CHECK_STACK STACK_SIZE,__LC_SAVE_AREA_SYNC |
385 | aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) | ||
392 | j 2f | 386 | j 2f |
393 | 1: UPDATE_VTIME %r14,__LC_SYNC_ENTER_TIMER | 387 | 1: UPDATE_VTIME %r14,__LC_SYNC_ENTER_TIMER |
394 | LAST_BREAK %r14 | 388 | LAST_BREAK %r14 |
@@ -398,8 +392,7 @@ ENTRY(pgm_check_handler) | |||
398 | tm __LC_PGM_ILC+2,0x02 # check for transaction abort | 392 | tm __LC_PGM_ILC+2,0x02 # check for transaction abort |
399 | jz 2f | 393 | jz 2f |
400 | mvc __THREAD_trap_tdb(256,%r14),0(%r13) | 394 | mvc __THREAD_trap_tdb(256,%r14),0(%r13) |
401 | 2: aghi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) | 395 | 2: la %r11,STACK_FRAME_OVERHEAD(%r15) |
402 | la %r11,STACK_FRAME_OVERHEAD(%r15) | ||
403 | stmg %r0,%r7,__PT_R0(%r11) | 396 | stmg %r0,%r7,__PT_R0(%r11) |
404 | mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC | 397 | mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC |
405 | stmg %r8,%r9,__PT_PSW(%r11) | 398 | stmg %r8,%r9,__PT_PSW(%r11) |
@@ -526,7 +519,6 @@ io_work: | |||
526 | # | 519 | # |
527 | io_work_user: | 520 | io_work_user: |
528 | lg %r1,__LC_KERNEL_STACK | 521 | lg %r1,__LC_KERNEL_STACK |
529 | aghi %r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE) | ||
530 | mvc STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11) | 522 | mvc STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11) |
531 | xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) | 523 | xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) |
532 | la %r11,STACK_FRAME_OVERHEAD(%r1) | 524 | la %r11,STACK_FRAME_OVERHEAD(%r1) |
@@ -678,8 +670,9 @@ ENTRY(mcck_int_handler) | |||
678 | UPDATE_VTIME %r14,__LC_MCCK_ENTER_TIMER | 670 | UPDATE_VTIME %r14,__LC_MCCK_ENTER_TIMER |
679 | LAST_BREAK %r14 | 671 | LAST_BREAK %r14 |
680 | mcck_skip: | 672 | mcck_skip: |
681 | lghi %r14,__LC_GPREGS_SAVE_AREA | 673 | lghi %r14,__LC_GPREGS_SAVE_AREA+64 |
682 | mvc __PT_R0(128,%r11),0(%r14) | 674 | stmg %r0,%r7,__PT_R0(%r11) |
675 | mvc __PT_R8(64,%r11),0(%r14) | ||
683 | stmg %r8,%r9,__PT_PSW(%r11) | 676 | stmg %r8,%r9,__PT_PSW(%r11) |
684 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) | 677 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
685 | lgr %r2,%r11 # pass pointer to pt_regs | 678 | lgr %r2,%r11 # pass pointer to pt_regs |
@@ -687,7 +680,6 @@ mcck_skip: | |||
687 | tm __PT_PSW+1(%r11),0x01 # returning to user ? | 680 | tm __PT_PSW+1(%r11),0x01 # returning to user ? |
688 | jno mcck_return | 681 | jno mcck_return |
689 | lg %r1,__LC_KERNEL_STACK # switch to kernel stack | 682 | lg %r1,__LC_KERNEL_STACK # switch to kernel stack |
690 | aghi %r1,-(STACK_FRAME_OVERHEAD + __PT_SIZE) | ||
691 | mvc STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11) | 683 | mvc STACK_FRAME_OVERHEAD(__PT_SIZE,%r1),0(%r11) |
692 | xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) | 684 | xc __SF_BACKCHAIN(8,%r1),__SF_BACKCHAIN(%r1) |
693 | la %r11,STACK_FRAME_OVERHEAD(%r1) | 685 | la %r11,STACK_FRAME_OVERHEAD(%r1) |
@@ -754,14 +746,12 @@ ENTRY(restart_int_handler) | |||
754 | * Setup a pt_regs so that show_trace can provide a good call trace. | 746 | * Setup a pt_regs so that show_trace can provide a good call trace. |
755 | */ | 747 | */ |
756 | stack_overflow: | 748 | stack_overflow: |
757 | lg %r11,__LC_PANIC_STACK # change to panic stack | 749 | lg %r15,__LC_PANIC_STACK # change to panic stack |
758 | aghi %r11,-__PT_SIZE # create pt_regs | 750 | la %r11,STACK_FRAME_OVERHEAD(%r15) |
759 | stmg %r0,%r7,__PT_R0(%r11) | 751 | stmg %r0,%r7,__PT_R0(%r11) |
760 | stmg %r8,%r9,__PT_PSW(%r11) | 752 | stmg %r8,%r9,__PT_PSW(%r11) |
761 | mvc __PT_R8(64,%r11),0(%r14) | 753 | mvc __PT_R8(64,%r11),0(%r14) |
762 | stg %r10,__PT_ORIG_GPR2(%r11) # store last break to orig_gpr2 | 754 | stg %r10,__PT_ORIG_GPR2(%r11) # store last break to orig_gpr2 |
763 | lgr %r15,%r11 | ||
764 | aghi %r15,-STACK_FRAME_OVERHEAD | ||
765 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) | 755 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
766 | lgr %r2,%r11 # pass pointer to pt_regs | 756 | lgr %r2,%r11 # pass pointer to pt_regs |
767 | jg kernel_stack_overflow | 757 | jg kernel_stack_overflow |
@@ -845,15 +835,14 @@ cleanup_system_call: | |||
845 | mvc __TI_last_break(8,%r12),16(%r11) | 835 | mvc __TI_last_break(8,%r12),16(%r11) |
846 | 0: # set up saved register r11 | 836 | 0: # set up saved register r11 |
847 | lg %r15,__LC_KERNEL_STACK | 837 | lg %r15,__LC_KERNEL_STACK |
848 | aghi %r15,-__PT_SIZE | 838 | la %r9,STACK_FRAME_OVERHEAD(%r15) |
849 | stg %r15,24(%r11) # r11 pt_regs pointer | 839 | stg %r9,24(%r11) # r11 pt_regs pointer |
850 | # fill pt_regs | 840 | # fill pt_regs |
851 | mvc __PT_R8(64,%r15),__LC_SAVE_AREA_SYNC | 841 | mvc __PT_R8(64,%r9),__LC_SAVE_AREA_SYNC |
852 | stmg %r0,%r7,__PT_R0(%r15) | 842 | stmg %r0,%r7,__PT_R0(%r9) |
853 | mvc __PT_PSW(16,%r15),__LC_SVC_OLD_PSW | 843 | mvc __PT_PSW(16,%r9),__LC_SVC_OLD_PSW |
854 | mvc __PT_INT_CODE(4,%r15),__LC_SVC_ILC | 844 | mvc __PT_INT_CODE(4,%r9),__LC_SVC_ILC |
855 | # setup saved register r15 | 845 | # setup saved register r15 |
856 | aghi %r15,-STACK_FRAME_OVERHEAD | ||
857 | stg %r15,56(%r11) # r15 stack pointer | 846 | stg %r15,56(%r11) # r15 stack pointer |
858 | # set new psw address and exit | 847 | # set new psw address and exit |
859 | larl %r9,sysc_do_svc | 848 | larl %r9,sysc_do_svc |
@@ -1010,6 +999,7 @@ sys_call_table: | |||
1010 | #ifdef CONFIG_COMPAT | 999 | #ifdef CONFIG_COMPAT |
1011 | 1000 | ||
1012 | #define SYSCALL(esa,esame,emu) .long emu | 1001 | #define SYSCALL(esa,esame,emu) .long emu |
1002 | .globl sys_call_table_emu | ||
1013 | sys_call_table_emu: | 1003 | sys_call_table_emu: |
1014 | #include "syscalls.S" | 1004 | #include "syscalls.S" |
1015 | #undef SYSCALL | 1005 | #undef SYSCALL |