• Vasily Gorbik's avatar
    s390/entry: save the caller of psw_idle · a994eddb
    Vasily Gorbik authored
    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: default avatarSven Schnelle <svens@linux.ibm.com>
    Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
    Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    a994eddb
entry.S 18.3 KB