diff options
Diffstat (limited to 'arch/s390/kernel/entry64.S')
-rw-r--r-- | arch/s390/kernel/entry64.S | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 73845a9e587c..412a7b8783d7 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -1,4 +1,3 @@ | |||
1 | |||
2 | /* | 1 | /* |
3 | * arch/s390/kernel/entry64.S | 2 | * arch/s390/kernel/entry64.S |
4 | * S390 low-level entry points. | 3 | * S390 low-level entry points. |
@@ -200,17 +199,17 @@ sysc_vtime: | |||
200 | stmg %r0,%r7,__PT_R0(%r11) | 199 | stmg %r0,%r7,__PT_R0(%r11) |
201 | mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC | 200 | mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC |
202 | mvc __PT_PSW(16,%r11),__LC_SVC_OLD_PSW | 201 | mvc __PT_PSW(16,%r11),__LC_SVC_OLD_PSW |
203 | mvc __PT_SVC_CODE(4,%r11),__LC_SVC_ILC | 202 | mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC |
204 | sysc_do_svc: | 203 | sysc_do_svc: |
205 | oi __TI_flags+7(%r12),_TIF_SYSCALL | 204 | oi __TI_flags+7(%r12),_TIF_SYSCALL |
206 | llgh %r8,__PT_SVC_CODE+2(%r11) | 205 | llgh %r8,__PT_INT_CODE+2(%r11) |
207 | slag %r8,%r8,2 # shift and test for svc 0 | 206 | slag %r8,%r8,2 # shift and test for svc 0 |
208 | jnz sysc_nr_ok | 207 | jnz sysc_nr_ok |
209 | # svc 0: system call number in %r1 | 208 | # svc 0: system call number in %r1 |
210 | llgfr %r1,%r1 # clear high word in r1 | 209 | llgfr %r1,%r1 # clear high word in r1 |
211 | cghi %r1,NR_syscalls | 210 | cghi %r1,NR_syscalls |
212 | jnl sysc_nr_ok | 211 | jnl sysc_nr_ok |
213 | sth %r1,__PT_SVC_CODE+2(%r11) | 212 | sth %r1,__PT_INT_CODE+2(%r11) |
214 | slag %r8,%r1,2 | 213 | slag %r8,%r1,2 |
215 | sysc_nr_ok: | 214 | sysc_nr_ok: |
216 | larl %r10,sys_call_table # 64 bit system call table | 215 | larl %r10,sys_call_table # 64 bit system call table |
@@ -288,7 +287,7 @@ sysc_sigpending: | |||
288 | jno sysc_return | 287 | jno sysc_return |
289 | lmg %r2,%r7,__PT_R2(%r11) # load svc arguments | 288 | lmg %r2,%r7,__PT_R2(%r11) # load svc arguments |
290 | lghi %r8,0 # svc 0 returns -ENOSYS | 289 | lghi %r8,0 # svc 0 returns -ENOSYS |
291 | lh %r1,__PT_SVC_CODE+2(%r11) # load new svc number | 290 | lh %r1,__PT_INT_CODE+2(%r11) # load new svc number |
292 | cghi %r1,NR_syscalls | 291 | cghi %r1,NR_syscalls |
293 | jnl sysc_nr_ok # invalid svc number -> do svc 0 | 292 | jnl sysc_nr_ok # invalid svc number -> do svc 0 |
294 | slag %r8,%r1,2 | 293 | slag %r8,%r1,2 |
@@ -318,7 +317,7 @@ sysc_singlestep: | |||
318 | sysc_tracesys: | 317 | sysc_tracesys: |
319 | lgr %r2,%r11 # pass pointer to pt_regs | 318 | lgr %r2,%r11 # pass pointer to pt_regs |
320 | la %r3,0 | 319 | la %r3,0 |
321 | llgh %r0,__PT_SVC_CODE+2(%r11) | 320 | llgh %r0,__PT_INT_CODE+2(%r11) |
322 | stg %r0,__PT_R2(%r11) | 321 | stg %r0,__PT_R2(%r11) |
323 | brasl %r14,do_syscall_trace_enter | 322 | brasl %r14,do_syscall_trace_enter |
324 | lghi %r0,NR_syscalls | 323 | lghi %r0,NR_syscalls |
@@ -411,6 +410,8 @@ ENTRY(pgm_check_handler) | |||
411 | stmg %r0,%r7,__PT_R0(%r11) | 410 | stmg %r0,%r7,__PT_R0(%r11) |
412 | mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC | 411 | mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC |
413 | stmg %r8,%r9,__PT_PSW(%r11) | 412 | stmg %r8,%r9,__PT_PSW(%r11) |
413 | mvc __PT_INT_CODE(4,%r11),__LC_PGM_ILC | ||
414 | mvc __PT_INT_PARM_LONG(8,%r11),__LC_TRANS_EXC_CODE | ||
414 | stg %r10,__PT_ARGS(%r11) | 415 | stg %r10,__PT_ARGS(%r11) |
415 | tm __LC_PGM_ILC+3,0x80 # check for per exception | 416 | tm __LC_PGM_ILC+3,0x80 # check for per exception |
416 | jz 0f | 417 | jz 0f |
@@ -421,15 +422,13 @@ ENTRY(pgm_check_handler) | |||
421 | mvc __THREAD_per_address(8,%r1),__LC_PER_ADDRESS | 422 | mvc __THREAD_per_address(8,%r1),__LC_PER_ADDRESS |
422 | mvc __THREAD_per_cause(2,%r1),__LC_PER_CAUSE | 423 | mvc __THREAD_per_cause(2,%r1),__LC_PER_CAUSE |
423 | mvc __THREAD_per_paid(1,%r1),__LC_PER_PAID | 424 | mvc __THREAD_per_paid(1,%r1),__LC_PER_PAID |
424 | 0: lgf %r3,__LC_PGM_ILC # load program interruption code | 425 | 0: REENABLE_IRQS |
425 | lg %r4,__LC_TRANS_EXC_CODE | ||
426 | REENABLE_IRQS | ||
427 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) | 426 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
428 | lghi %r10,0x7f | ||
429 | ngr %r10,%r3 | ||
430 | je sysc_return | ||
431 | sll %r10,3 | ||
432 | larl %r1,pgm_check_table | 427 | larl %r1,pgm_check_table |
428 | llgh %r10,__PT_INT_CODE+2(%r11) | ||
429 | nill %r10,0x007f | ||
430 | sll %r10,3 | ||
431 | je sysc_return | ||
433 | lg %r1,0(%r10,%r1) # load address of handler routine | 432 | lg %r1,0(%r10,%r1) # load address of handler routine |
434 | lgr %r2,%r11 # pass pointer to pt_regs | 433 | lgr %r2,%r11 # pass pointer to pt_regs |
435 | basr %r14,%r1 # branch to interrupt-handler | 434 | basr %r14,%r1 # branch to interrupt-handler |
@@ -877,7 +876,7 @@ cleanup_system_call: | |||
877 | mvc __PT_R8(64,%r15),__LC_SAVE_AREA_SYNC | 876 | mvc __PT_R8(64,%r15),__LC_SAVE_AREA_SYNC |
878 | stmg %r0,%r7,__PT_R0(%r15) | 877 | stmg %r0,%r7,__PT_R0(%r15) |
879 | mvc __PT_PSW(16,%r15),__LC_SVC_OLD_PSW | 878 | mvc __PT_PSW(16,%r15),__LC_SVC_OLD_PSW |
880 | mvc __PT_SVC_CODE(4,%r15),__LC_SVC_ILC | 879 | mvc __PT_INT_CODE(4,%r15),__LC_SVC_ILC |
881 | # setup saved register r15 | 880 | # setup saved register r15 |
882 | aghi %r15,-STACK_FRAME_OVERHEAD | 881 | aghi %r15,-STACK_FRAME_OVERHEAD |
883 | stg %r15,56(%r11) # r15 stack pointer | 882 | stg %r15,56(%r11) # r15 stack pointer |