[ Upstream commit
a994eddb947ea9ebb7b14d9a1267001699f0a136 ]
Currently psw_idle does not allocate a stack frame and does not
save its r14 and r15 into the save area. Even though this is valid from
call ABI point of view, because psw_idle does not make any calls
explicitly, in reality psw_idle is an entry point for controlled
transition into serving interrupts. So, in practice, psw_idle stack
frame is analyzed during stack unwinding. Depending on build options
that r14 slot in the save area of psw_idle might either contain a value
saved by previous sibling call or complete garbage.
[task
0000038000003c28] do_ext_irq+0xd6/0x160
[task
0000038000003c78] ext_int_handler+0xba/0xe8
[task *
0000038000003dd8] psw_idle_exit+0x0/0x8 <-- pt_regs
([task
0000038000003dd8] 0x0)
[task
0000038000003e10] default_idle_call+0x42/0x148
[task
0000038000003e30] do_idle+0xce/0x160
[task
0000038000003e70] cpu_startup_entry+0x36/0x40
[task
0000038000003ea0] arch_call_rest_init+0x76/0x80
So, to make a stacktrace nicer and actually point for the real caller of
psw_idle in this frequently occurring case, make psw_idle save its r14.
[task
0000038000003c28] do_ext_irq+0xd6/0x160
[task
0000038000003c78] ext_int_handler+0xba/0xe8
[task *
0000038000003dd8] psw_idle_exit+0x0/0x6 <-- pt_regs
([task
0000038000003dd8] arch_cpu_idle+0x3c/0xd0)
[task
0000038000003e10] default_idle_call+0x42/0x148
[task
0000038000003e30] do_idle+0xce/0x160
[task
0000038000003e70] cpu_startup_entry+0x36/0x40
[task
0000038000003ea0] arch_call_rest_init+0x76/0x80
Reviewed-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>