diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-04-15 06:55:07 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-05-20 02:58:47 -0400 |
commit | d3a73acbc26a4a81a01a35fd162973e53d0386f5 (patch) | |
tree | 5b8fd3880f3b38575b1a043f3f4f07623a633bd1 /arch/s390/kernel/entry64.S | |
parent | beef560b4cdfafb2211a856e1d722540f5151933 (diff) |
s390: split TIF bits into CIF, PIF and TIF bits
The oi and ni instructions used in entry[64].S to set and clear bits
in the thread-flags are not guaranteed to be atomic in regard to other
CPUs. Split the TIF bits into CPU, pt_regs and thread-info specific
bits. Updates on the TIF bits are done with atomic instructions,
updates on CPU and pt_regs bits are done with non-atomic instructions.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/entry64.S')
-rw-r--r-- | arch/s390/kernel/entry64.S | 82 |
1 files changed, 42 insertions, 40 deletions
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index d15e7bf6a863..c41f3f906720 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -42,13 +42,11 @@ STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER | |||
42 | STACK_SIZE = 1 << STACK_SHIFT | 42 | STACK_SIZE = 1 << STACK_SHIFT |
43 | STACK_INIT = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE | 43 | STACK_INIT = STACK_SIZE - STACK_FRAME_OVERHEAD - __PT_SIZE |
44 | 44 | ||
45 | _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | 45 | _TIF_WORK = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED) |
46 | _TIF_MCCK_PENDING | _TIF_PER_TRAP | _TIF_ASCE) | 46 | _TIF_TRACE = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \ |
47 | _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \ | 47 | _TIF_SYSCALL_TRACEPOINT) |
48 | _TIF_MCCK_PENDING | _TIF_ASCE) | 48 | _CIF_WORK = (_CIF_MCCK_PENDING | _CIF_ASCE) |
49 | _TIF_TRACE = (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | _TIF_SECCOMP | \ | 49 | _PIF_WORK = (_PIF_PER_TRAP) |
50 | _TIF_SYSCALL_TRACEPOINT) | ||
51 | _TIF_TRANSFER = (_TIF_MCCK_PENDING | _TIF_ASCE) | ||
52 | 50 | ||
53 | #define BASED(name) name-system_call(%r13) | 51 | #define BASED(name) name-system_call(%r13) |
54 | 52 | ||
@@ -190,13 +188,7 @@ ENTRY(__switch_to) | |||
190 | lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4 | 188 | lctl %c4,%c4,__TASK_pid(%r3) # load pid to control reg. 4 |
191 | mvc __LC_CURRENT_PID+4(4,%r0),__TASK_pid(%r3) # store pid of next | 189 | mvc __LC_CURRENT_PID+4(4,%r0),__TASK_pid(%r3) # store pid of next |
192 | lg %r15,__THREAD_ksp(%r3) # load kernel stack of next | 190 | lg %r15,__THREAD_ksp(%r3) # load kernel stack of next |
193 | llill %r6,_TIF_TRANSFER # transfer TIF bits | 191 | lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task |
194 | ng %r6,__TI_flags(%r4) # isolate TIF bits | ||
195 | jz 0f | ||
196 | og %r6,__TI_flags(%r5) # set TIF bits of next | ||
197 | stg %r6,__TI_flags(%r5) | ||
198 | ni __TI_flags+7(%r4),255-_TIF_TRANSFER # clear TIF bits of prev | ||
199 | 0: lmg %r6,%r15,__SF_GPRS(%r15) # load gprs of next task | ||
200 | br %r14 | 192 | br %r14 |
201 | 193 | ||
202 | __critical_start: | 194 | __critical_start: |
@@ -211,6 +203,7 @@ sysc_stmg: | |||
211 | stmg %r8,%r15,__LC_SAVE_AREA_SYNC | 203 | stmg %r8,%r15,__LC_SAVE_AREA_SYNC |
212 | lg %r10,__LC_LAST_BREAK | 204 | lg %r10,__LC_LAST_BREAK |
213 | lg %r12,__LC_THREAD_INFO | 205 | lg %r12,__LC_THREAD_INFO |
206 | lghi %r14,_PIF_SYSCALL | ||
214 | sysc_per: | 207 | sysc_per: |
215 | lg %r15,__LC_KERNEL_STACK | 208 | lg %r15,__LC_KERNEL_STACK |
216 | la %r11,STACK_FRAME_OVERHEAD(%r15) # pointer to pt_regs | 209 | la %r11,STACK_FRAME_OVERHEAD(%r15) # pointer to pt_regs |
@@ -221,8 +214,8 @@ sysc_vtime: | |||
221 | mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC | 214 | mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC |
222 | mvc __PT_PSW(16,%r11),__LC_SVC_OLD_PSW | 215 | mvc __PT_PSW(16,%r11),__LC_SVC_OLD_PSW |
223 | mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC | 216 | mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC |
217 | stg %r14,__PT_FLAGS(%r11) | ||
224 | sysc_do_svc: | 218 | sysc_do_svc: |
225 | oi __TI_flags+7(%r12),_TIF_SYSCALL | ||
226 | lg %r10,__TI_sysc_table(%r12) # address of system call table | 219 | lg %r10,__TI_sysc_table(%r12) # address of system call table |
227 | llgh %r8,__PT_INT_CODE+2(%r11) | 220 | llgh %r8,__PT_INT_CODE+2(%r11) |
228 | slag %r8,%r8,2 # shift and test for svc 0 | 221 | slag %r8,%r8,2 # shift and test for svc 0 |
@@ -238,7 +231,7 @@ sysc_nr_ok: | |||
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) |
240 | lgf %r9,0(%r8,%r10) # get system call add. | 233 | lgf %r9,0(%r8,%r10) # get system call add. |
241 | tm __TI_flags+6(%r12),_TIF_TRACE >> 8 | 234 | tm __TI_flags+7(%r12),_TIF_TRACE |
242 | jnz sysc_tracesys | 235 | jnz sysc_tracesys |
243 | basr %r14,%r9 # call sys_xxxx | 236 | basr %r14,%r9 # call sys_xxxx |
244 | stg %r2,__PT_R2(%r11) # store return value | 237 | stg %r2,__PT_R2(%r11) # store return value |
@@ -248,9 +241,12 @@ sysc_return: | |||
248 | sysc_tif: | 241 | sysc_tif: |
249 | tm __PT_PSW+1(%r11),0x01 # returning to user ? | 242 | tm __PT_PSW+1(%r11),0x01 # returning to user ? |
250 | jno sysc_restore | 243 | jno sysc_restore |
251 | tm __TI_flags+7(%r12),_TIF_WORK_SVC | 244 | tm __PT_FLAGS+7(%r11),_PIF_WORK |
245 | jnz sysc_work | ||
246 | tm __TI_flags+7(%r12),_TIF_WORK | ||
252 | jnz sysc_work # check for work | 247 | jnz sysc_work # check for work |
253 | ni __TI_flags+7(%r12),255-_TIF_SYSCALL | 248 | tm __LC_CPU_FLAGS+7,_CIF_WORK |
249 | jnz sysc_work | ||
254 | sysc_restore: | 250 | sysc_restore: |
255 | lg %r14,__LC_VDSO_PER_CPU | 251 | lg %r14,__LC_VDSO_PER_CPU |
256 | lmg %r0,%r10,__PT_R0(%r11) | 252 | lmg %r0,%r10,__PT_R0(%r11) |
@@ -265,17 +261,17 @@ sysc_done: | |||
265 | # One of the work bits is on. Find out which one. | 261 | # One of the work bits is on. Find out which one. |
266 | # | 262 | # |
267 | sysc_work: | 263 | sysc_work: |
268 | tm __TI_flags+7(%r12),_TIF_MCCK_PENDING | 264 | tm __LC_CPU_FLAGS+7,_CIF_MCCK_PENDING |
269 | jo sysc_mcck_pending | 265 | jo sysc_mcck_pending |
270 | tm __TI_flags+7(%r12),_TIF_NEED_RESCHED | 266 | tm __TI_flags+7(%r12),_TIF_NEED_RESCHED |
271 | jo sysc_reschedule | 267 | jo sysc_reschedule |
272 | tm __TI_flags+7(%r12),_TIF_PER_TRAP | 268 | tm __PT_FLAGS+7(%r11),_PIF_PER_TRAP |
273 | jo sysc_singlestep | 269 | jo sysc_singlestep |
274 | tm __TI_flags+7(%r12),_TIF_SIGPENDING | 270 | tm __TI_flags+7(%r12),_TIF_SIGPENDING |
275 | jo sysc_sigpending | 271 | jo sysc_sigpending |
276 | tm __TI_flags+7(%r12),_TIF_NOTIFY_RESUME | 272 | tm __TI_flags+7(%r12),_TIF_NOTIFY_RESUME |
277 | jo sysc_notify_resume | 273 | jo sysc_notify_resume |
278 | tm __TI_flags+7(%r12),_TIF_ASCE | 274 | tm __LC_CPU_FLAGS+7,_CIF_ASCE |
279 | jo sysc_uaccess | 275 | jo sysc_uaccess |
280 | j sysc_return # beware of critical section cleanup | 276 | j sysc_return # beware of critical section cleanup |
281 | 277 | ||
@@ -287,17 +283,17 @@ sysc_reschedule: | |||
287 | jg schedule | 283 | jg schedule |
288 | 284 | ||
289 | # | 285 | # |
290 | # _TIF_MCCK_PENDING is set, call handler | 286 | # _CIF_MCCK_PENDING is set, call handler |
291 | # | 287 | # |
292 | sysc_mcck_pending: | 288 | sysc_mcck_pending: |
293 | larl %r14,sysc_return | 289 | larl %r14,sysc_return |
294 | jg s390_handle_mcck # TIF bit will be cleared by handler | 290 | jg s390_handle_mcck # TIF bit will be cleared by handler |
295 | 291 | ||
296 | # | 292 | # |
297 | # _TIF_ASCE is set, load user space asce | 293 | # _CIF_ASCE is set, load user space asce |
298 | # | 294 | # |
299 | sysc_uaccess: | 295 | sysc_uaccess: |
300 | ni __TI_flags+7(%r12),255-_TIF_ASCE | 296 | ni __LC_CPU_FLAGS+7,255-_CIF_ASCE |
301 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce | 297 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce |
302 | j sysc_return | 298 | j sysc_return |
303 | 299 | ||
@@ -307,7 +303,7 @@ sysc_uaccess: | |||
307 | sysc_sigpending: | 303 | sysc_sigpending: |
308 | lgr %r2,%r11 # pass pointer to pt_regs | 304 | lgr %r2,%r11 # pass pointer to pt_regs |
309 | brasl %r14,do_signal | 305 | brasl %r14,do_signal |
310 | tm __TI_flags+7(%r12),_TIF_SYSCALL | 306 | tm __PT_FLAGS+7(%r11),_PIF_SYSCALL |
311 | jno sysc_return | 307 | jno sysc_return |
312 | lmg %r2,%r7,__PT_R2(%r11) # load svc arguments | 308 | lmg %r2,%r7,__PT_R2(%r11) # load svc arguments |
313 | lg %r10,__TI_sysc_table(%r12) # address of system call table | 309 | lg %r10,__TI_sysc_table(%r12) # address of system call table |
@@ -327,10 +323,10 @@ sysc_notify_resume: | |||
327 | jg do_notify_resume | 323 | jg do_notify_resume |
328 | 324 | ||
329 | # | 325 | # |
330 | # _TIF_PER_TRAP is set, call do_per_trap | 326 | # _PIF_PER_TRAP is set, call do_per_trap |
331 | # | 327 | # |
332 | sysc_singlestep: | 328 | sysc_singlestep: |
333 | ni __TI_flags+7(%r12),255-_TIF_PER_TRAP | 329 | ni __PT_FLAGS+7(%r11),255-_PIF_PER_TRAP |
334 | lgr %r2,%r11 # pass pointer to pt_regs | 330 | lgr %r2,%r11 # pass pointer to pt_regs |
335 | larl %r14,sysc_return | 331 | larl %r14,sysc_return |
336 | jg do_per_trap | 332 | jg do_per_trap |
@@ -357,7 +353,7 @@ sysc_tracego: | |||
357 | basr %r14,%r9 # call sys_xxx | 353 | basr %r14,%r9 # call sys_xxx |
358 | stg %r2,__PT_R2(%r11) # store return value | 354 | stg %r2,__PT_R2(%r11) # store return value |
359 | sysc_tracenogo: | 355 | sysc_tracenogo: |
360 | tm __TI_flags+6(%r12),_TIF_TRACE >> 8 | 356 | tm __TI_flags+7(%r12),_TIF_TRACE |
361 | jz sysc_return | 357 | jz sysc_return |
362 | lgr %r2,%r11 # pass pointer to pt_regs | 358 | lgr %r2,%r11 # pass pointer to pt_regs |
363 | larl %r14,sysc_return | 359 | larl %r14,sysc_return |
@@ -416,12 +412,13 @@ ENTRY(pgm_check_handler) | |||
416 | stmg %r8,%r9,__PT_PSW(%r11) | 412 | stmg %r8,%r9,__PT_PSW(%r11) |
417 | mvc __PT_INT_CODE(4,%r11),__LC_PGM_ILC | 413 | mvc __PT_INT_CODE(4,%r11),__LC_PGM_ILC |
418 | mvc __PT_INT_PARM_LONG(8,%r11),__LC_TRANS_EXC_CODE | 414 | mvc __PT_INT_PARM_LONG(8,%r11),__LC_TRANS_EXC_CODE |
415 | xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) | ||
419 | stg %r10,__PT_ARGS(%r11) | 416 | stg %r10,__PT_ARGS(%r11) |
420 | tm __LC_PGM_ILC+3,0x80 # check for per exception | 417 | tm __LC_PGM_ILC+3,0x80 # check for per exception |
421 | jz 0f | 418 | jz 0f |
422 | tmhh %r8,0x0001 # kernel per event ? | 419 | tmhh %r8,0x0001 # kernel per event ? |
423 | jz pgm_kprobe | 420 | jz pgm_kprobe |
424 | oi __TI_flags+7(%r12),_TIF_PER_TRAP | 421 | oi __PT_FLAGS+7(%r11),_PIF_PER_TRAP |
425 | mvc __THREAD_per_address(8,%r14),__LC_PER_ADDRESS | 422 | mvc __THREAD_per_address(8,%r14),__LC_PER_ADDRESS |
426 | mvc __THREAD_per_cause(2,%r14),__LC_PER_CAUSE | 423 | mvc __THREAD_per_cause(2,%r14),__LC_PER_CAUSE |
427 | mvc __THREAD_per_paid(1,%r14),__LC_PER_PAID | 424 | mvc __THREAD_per_paid(1,%r14),__LC_PER_PAID |
@@ -451,10 +448,10 @@ pgm_kprobe: | |||
451 | # single stepped system call | 448 | # single stepped system call |
452 | # | 449 | # |
453 | pgm_svcper: | 450 | pgm_svcper: |
454 | oi __TI_flags+7(%r12),_TIF_PER_TRAP | ||
455 | mvc __LC_RETURN_PSW(8),__LC_SVC_NEW_PSW | 451 | mvc __LC_RETURN_PSW(8),__LC_SVC_NEW_PSW |
456 | larl %r14,sysc_per | 452 | larl %r14,sysc_per |
457 | stg %r14,__LC_RETURN_PSW+8 | 453 | stg %r14,__LC_RETURN_PSW+8 |
454 | lghi %r14,_PIF_SYSCALL | _PIF_PER_TRAP | ||
458 | lpswe __LC_RETURN_PSW # branch to sysc_per and enable irqs | 455 | lpswe __LC_RETURN_PSW # branch to sysc_per and enable irqs |
459 | 456 | ||
460 | /* | 457 | /* |
@@ -479,6 +476,7 @@ io_skip: | |||
479 | mvc __PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC | 476 | mvc __PT_R8(64,%r11),__LC_SAVE_AREA_ASYNC |
480 | stmg %r8,%r9,__PT_PSW(%r11) | 477 | stmg %r8,%r9,__PT_PSW(%r11) |
481 | mvc __PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID | 478 | mvc __PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID |
479 | xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) | ||
482 | TRACE_IRQS_OFF | 480 | TRACE_IRQS_OFF |
483 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) | 481 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
484 | io_loop: | 482 | io_loop: |
@@ -499,8 +497,10 @@ io_return: | |||
499 | LOCKDEP_SYS_EXIT | 497 | LOCKDEP_SYS_EXIT |
500 | TRACE_IRQS_ON | 498 | TRACE_IRQS_ON |
501 | io_tif: | 499 | io_tif: |
502 | tm __TI_flags+7(%r12),_TIF_WORK_INT | 500 | tm __TI_flags+7(%r12),_TIF_WORK |
503 | jnz io_work # there is work to do (signals etc.) | 501 | jnz io_work # there is work to do (signals etc.) |
502 | tm __LC_CPU_FLAGS+7,_CIF_WORK | ||
503 | jnz io_work | ||
504 | io_restore: | 504 | io_restore: |
505 | lg %r14,__LC_VDSO_PER_CPU | 505 | lg %r14,__LC_VDSO_PER_CPU |
506 | lmg %r0,%r10,__PT_R0(%r11) | 506 | lmg %r0,%r10,__PT_R0(%r11) |
@@ -513,7 +513,7 @@ io_done: | |||
513 | 513 | ||
514 | # | 514 | # |
515 | # There is work todo, find out in which context we have been interrupted: | 515 | # There is work todo, find out in which context we have been interrupted: |
516 | # 1) if we return to user space we can do all _TIF_WORK_INT work | 516 | # 1) if we return to user space we can do all _TIF_WORK work |
517 | # 2) if we return to kernel code and kvm is enabled check if we need to | 517 | # 2) if we return to kernel code and kvm is enabled check if we need to |
518 | # modify the psw to leave SIE | 518 | # modify the psw to leave SIE |
519 | # 3) if we return to kernel code and preemptive scheduling is enabled check | 519 | # 3) if we return to kernel code and preemptive scheduling is enabled check |
@@ -557,11 +557,9 @@ io_work_user: | |||
557 | 557 | ||
558 | # | 558 | # |
559 | # One of the work bits is on. Find out which one. | 559 | # One of the work bits is on. Find out which one. |
560 | # Checked are: _TIF_SIGPENDING, _TIF_NOTIFY_RESUME, _TIF_NEED_RESCHED | ||
561 | # and _TIF_MCCK_PENDING | ||
562 | # | 560 | # |
563 | io_work_tif: | 561 | io_work_tif: |
564 | tm __TI_flags+7(%r12),_TIF_MCCK_PENDING | 562 | tm __LC_CPU_FLAGS+7,_CIF_MCCK_PENDING |
565 | jo io_mcck_pending | 563 | jo io_mcck_pending |
566 | tm __TI_flags+7(%r12),_TIF_NEED_RESCHED | 564 | tm __TI_flags+7(%r12),_TIF_NEED_RESCHED |
567 | jo io_reschedule | 565 | jo io_reschedule |
@@ -569,12 +567,12 @@ io_work_tif: | |||
569 | jo io_sigpending | 567 | jo io_sigpending |
570 | tm __TI_flags+7(%r12),_TIF_NOTIFY_RESUME | 568 | tm __TI_flags+7(%r12),_TIF_NOTIFY_RESUME |
571 | jo io_notify_resume | 569 | jo io_notify_resume |
572 | tm __TI_flags+7(%r12),_TIF_ASCE | 570 | tm __LC_CPU_FLAGS+7,_CIF_ASCE |
573 | jo io_uaccess | 571 | jo io_uaccess |
574 | j io_return # beware of critical section cleanup | 572 | j io_return # beware of critical section cleanup |
575 | 573 | ||
576 | # | 574 | # |
577 | # _TIF_MCCK_PENDING is set, call handler | 575 | # _CIF_MCCK_PENDING is set, call handler |
578 | # | 576 | # |
579 | io_mcck_pending: | 577 | io_mcck_pending: |
580 | # TRACE_IRQS_ON already done at io_return | 578 | # TRACE_IRQS_ON already done at io_return |
@@ -583,10 +581,10 @@ io_mcck_pending: | |||
583 | j io_return | 581 | j io_return |
584 | 582 | ||
585 | # | 583 | # |
586 | # _TIF_ASCE is set, load user space asce | 584 | # _CIF_ASCE is set, load user space asce |
587 | # | 585 | # |
588 | io_uaccess: | 586 | io_uaccess: |
589 | ni __TI_flags+7(%r12),255-_TIF_ASCE | 587 | ni __LC_CPU_FLAGS+7,255-_CIF_ASCE |
590 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce | 588 | lctlg %c1,%c1,__LC_USER_ASCE # load primary asce |
591 | j io_return | 589 | j io_return |
592 | 590 | ||
@@ -650,6 +648,7 @@ ext_skip: | |||
650 | mvc __PT_INT_CODE(4,%r11),__LC_EXT_CPU_ADDR | 648 | mvc __PT_INT_CODE(4,%r11),__LC_EXT_CPU_ADDR |
651 | mvc __PT_INT_PARM(4,%r11),__LC_EXT_PARAMS | 649 | mvc __PT_INT_PARM(4,%r11),__LC_EXT_PARAMS |
652 | mvc __PT_INT_PARM_LONG(8,%r11),0(%r1) | 650 | mvc __PT_INT_PARM_LONG(8,%r11),0(%r1) |
651 | xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) | ||
653 | TRACE_IRQS_OFF | 652 | TRACE_IRQS_OFF |
654 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) | 653 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
655 | lgr %r2,%r11 # pass pointer to pt_regs | 654 | lgr %r2,%r11 # pass pointer to pt_regs |
@@ -716,6 +715,7 @@ mcck_skip: | |||
716 | stmg %r0,%r7,__PT_R0(%r11) | 715 | stmg %r0,%r7,__PT_R0(%r11) |
717 | mvc __PT_R8(64,%r11),0(%r14) | 716 | mvc __PT_R8(64,%r11),0(%r14) |
718 | stmg %r8,%r9,__PT_PSW(%r11) | 717 | stmg %r8,%r9,__PT_PSW(%r11) |
718 | xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11) | ||
719 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) | 719 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) |
720 | lgr %r2,%r11 # pass pointer to pt_regs | 720 | lgr %r2,%r11 # pass pointer to pt_regs |
721 | brasl %r14,s390_do_machine_check | 721 | brasl %r14,s390_do_machine_check |
@@ -727,7 +727,7 @@ mcck_skip: | |||
727 | la %r11,STACK_FRAME_OVERHEAD(%r1) | 727 | la %r11,STACK_FRAME_OVERHEAD(%r1) |
728 | lgr %r15,%r1 | 728 | lgr %r15,%r1 |
729 | ssm __LC_PGM_NEW_PSW # turn dat on, keep irqs off | 729 | ssm __LC_PGM_NEW_PSW # turn dat on, keep irqs off |
730 | tm __TI_flags+7(%r12),_TIF_MCCK_PENDING | 730 | tm __LC_CPU_FLAGS+7,_CIF_MCCK_PENDING |
731 | jno mcck_return | 731 | jno mcck_return |
732 | TRACE_IRQS_OFF | 732 | TRACE_IRQS_OFF |
733 | brasl %r14,s390_handle_mcck | 733 | brasl %r14,s390_handle_mcck |
@@ -884,6 +884,8 @@ cleanup_system_call: | |||
884 | stmg %r0,%r7,__PT_R0(%r9) | 884 | stmg %r0,%r7,__PT_R0(%r9) |
885 | mvc __PT_PSW(16,%r9),__LC_SVC_OLD_PSW | 885 | mvc __PT_PSW(16,%r9),__LC_SVC_OLD_PSW |
886 | mvc __PT_INT_CODE(4,%r9),__LC_SVC_ILC | 886 | mvc __PT_INT_CODE(4,%r9),__LC_SVC_ILC |
887 | xc __PT_FLAGS(8,%r9),__PT_FLAGS(%r9) | ||
888 | mvi __PT_FLAGS+7(%r9),_PIF_SYSCALL | ||
887 | # setup saved register r15 | 889 | # setup saved register r15 |
888 | stg %r15,56(%r11) # r15 stack pointer | 890 | stg %r15,56(%r11) # r15 stack pointer |
889 | # set new psw address and exit | 891 | # set new psw address and exit |