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