[S390] ftrace: fix kernel stack backchain walking

With CONFIG_IRQSOFF_TRACER the trace_hardirqs_off() function includes
a call to __builtin_return_address(1). But we calltrace_hardirqs_off()
from early entry code. There we have just a single stack frame.
So this results in a kernel stack backchain walk that would walk beyond
the kernel stack. Following the NULL terminated backchain this results
in a lowcore read access.

To fix this we simply call trace_hardirqs_off_caller() and pass the
current instruction pointer.

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 50bec4ce 632448f6

+18 -11
+11 -7
arch/s390/kernel/entry.S
··· 61 61 62 62 #ifdef CONFIG_TRACE_IRQFLAGS 63 63 .macro TRACE_IRQS_ON 64 - l %r1,BASED(.Ltrace_irq_on) 64 + basr %r2,%r0 65 + l %r1,BASED(.Ltrace_irq_on_caller) 65 66 basr %r14,%r1 66 67 .endm 67 68 68 69 .macro TRACE_IRQS_OFF 69 - l %r1,BASED(.Ltrace_irq_off) 70 + basr %r2,%r0 71 + l %r1,BASED(.Ltrace_irq_off_caller) 70 72 basr %r14,%r1 71 73 .endm 72 74 73 75 .macro TRACE_IRQS_CHECK 76 + basr %r2,%r0 74 77 tm SP_PSW(%r15),0x03 # irqs enabled? 75 78 jz 0f 76 - l %r1,BASED(.Ltrace_irq_on) 79 + l %r1,BASED(.Ltrace_irq_on_caller) 77 80 basr %r14,%r1 78 81 j 1f 79 - 0: l %r1,BASED(.Ltrace_irq_off) 82 + 0: l %r1,BASED(.Ltrace_irq_off_caller) 80 83 basr %r14,%r1 81 84 1: 82 85 .endm ··· 1116 1113 .Lschedtail: .long schedule_tail 1117 1114 .Lsysc_table: .long sys_call_table 1118 1115 #ifdef CONFIG_TRACE_IRQFLAGS 1119 - .Ltrace_irq_on: .long trace_hardirqs_on 1120 - .Ltrace_irq_off: 1121 - .long trace_hardirqs_off 1116 + .Ltrace_irq_on_caller: 1117 + .long trace_hardirqs_on_caller 1118 + .Ltrace_irq_off_caller: 1119 + .long trace_hardirqs_off_caller 1122 1120 #endif 1123 1121 #ifdef CONFIG_LOCKDEP 1124 1122 .Llockdep_sys_exit:
+7 -4
arch/s390/kernel/entry64.S
··· 61 61 62 62 #ifdef CONFIG_TRACE_IRQFLAGS 63 63 .macro TRACE_IRQS_ON 64 - brasl %r14,trace_hardirqs_on 64 + basr %r2,%r0 65 + brasl %r14,trace_hardirqs_on_caller 65 66 .endm 66 67 67 68 .macro TRACE_IRQS_OFF 68 - brasl %r14,trace_hardirqs_off 69 + basr %r2,%r0 70 + brasl %r14,trace_hardirqs_off_caller 69 71 .endm 70 72 71 73 .macro TRACE_IRQS_CHECK 74 + basr %r2,%r0 72 75 tm SP_PSW(%r15),0x03 # irqs enabled? 73 76 jz 0f 74 - brasl %r14,trace_hardirqs_on 77 + brasl %r14,trace_hardirqs_on_caller 75 78 j 1f 76 - 0: brasl %r14,trace_hardirqs_off 79 + 0: brasl %r14,trace_hardirqs_off_caller 77 80 1: 78 81 .endm 79 82 #else