Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

[S390] Fix IRQ tracing in case of PER

In case user space is single stepped (PER) the program check handler
claims too early that IRQs are enabled on the return path.
Subsequent checks will notice that the IRQ mask in the PSW and
what lockdep thinks the IRQ mask should be do not correlate and
therefore will print a warning to the console and disable lockdep.

Fix this by doing all the work within the correct context.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

authored by

Heiko Carstens and committed by
Martin Schwidefsky
f5cdac27 1a041a23

+20 -4
+10 -2
arch/s390/kernel/entry.S
··· 535 535 l %r3,__LC_PGM_ILC # load program interruption code 536 536 la %r8,0x7f 537 537 nr %r8,%r3 # clear per-event-bit and ilc 538 - be BASED(pgm_exit) # only per or per+check ? 539 - b BASED(pgm_do_call) 538 + be BASED(pgm_exit2) # only per or per+check ? 539 + l %r7,BASED(.Ljump_table) 540 + sll %r8,2 541 + l %r7,0(%r8,%r7) # load address of handler routine 542 + la %r2,SP_PTREGS(%r15) # address of register-save area 543 + basr %r14,%r7 # branch to interrupt-handler 544 + pgm_exit2: 545 + TRACE_IRQS_ON 546 + stosm __SF_EMPTY(%r15),0x03 # reenable interrupts 547 + b BASED(sysc_return) 540 548 541 549 # 542 550 # it was a single stepped SVC that is causing all the trouble
+10 -2
arch/s390/kernel/entry64.S
··· 544 544 lgf %r3,__LC_PGM_ILC # load program interruption code 545 545 lghi %r8,0x7f 546 546 ngr %r8,%r3 # clear per-event-bit and ilc 547 - je pgm_exit 548 - j pgm_do_call 547 + je pgm_exit2 548 + sll %r8,3 549 + larl %r1,pgm_check_table 550 + lg %r1,0(%r8,%r1) # load address of handler routine 551 + la %r2,SP_PTREGS(%r15) # address of register-save area 552 + basr %r14,%r1 # branch to interrupt-handler 553 + pgm_exit2: 554 + TRACE_IRQS_ON 555 + stosm __SF_EMPTY(%r15),0x03 # reenable interrupts 556 + j sysc_return 549 557 550 558 # 551 559 # it was a single stepped SVC that is causing all the trouble