powerpc/32: Clear on-stack exception marker upon exception return
authorChristophe Leroy <christophe.leroy@c-s.fr>
Wed, 27 Feb 2019 11:45:30 +0000 (11:45 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Mar 2019 13:35:26 +0000 (14:35 +0100)
commit 9580b71b5a7863c24a9bd18bcd2ad759b86b1eff upstream.

Clear the on-stack STACK_FRAME_REGS_MARKER on exception exit in order
to avoid confusing stacktrace like the one below.

  Call Trace:
  [c0e9dca0] [c01c42a0] print_address_description+0x64/0x2bc (unreliable)
  [c0e9dcd0] [c01c4684] kasan_report+0xfc/0x180
  [c0e9dd10] [c0895130] memchr+0x24/0x74
  [c0e9dd30] [c00a9e38] msg_print_text+0x124/0x574
  [c0e9dde0] [c00ab710] console_unlock+0x114/0x4f8
  [c0e9de40] [c00adc60] vprintk_emit+0x188/0x1c4
  --- interrupt: c0e9df00 at 0x400f330
      LR = init_stack+0x1f00/0x2000
  [c0e9de80] [c00ae3c4] printk+0xa8/0xcc (unreliable)
  [c0e9df20] [c0c27e44] early_irq_init+0x38/0x108
  [c0e9df50] [c0c15434] start_kernel+0x310/0x488
  [c0e9dff0] [00003484] 0x3484

With this patch the trace becomes:

  Call Trace:
  [c0e9dca0] [c01c42c0] print_address_description+0x64/0x2bc (unreliable)
  [c0e9dcd0] [c01c46a4] kasan_report+0xfc/0x180
  [c0e9dd10] [c0895150] memchr+0x24/0x74
  [c0e9dd30] [c00a9e58] msg_print_text+0x124/0x574
  [c0e9dde0] [c00ab730] console_unlock+0x114/0x4f8
  [c0e9de40] [c00adc80] vprintk_emit+0x188/0x1c4
  [c0e9de80] [c00ae3e4] printk+0xa8/0xcc
  [c0e9df20] [c0c27e44] early_irq_init+0x38/0x108
  [c0e9df50] [c0c15434] start_kernel+0x310/0x488
  [c0e9dff0] [00003484] 0x3484

Cc: stable@vger.kernel.org
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/powerpc/kernel/entry_32.S

index e780e1fbf6c2123d5170de951a696e53c29fdf66..4ae464b9d490a94da5bf92bd4701a0c771b2d4ed 100644 (file)
@@ -726,6 +726,9 @@ fast_exception_return:
        mtcr    r10
        lwz     r10,_LINK(r11)
        mtlr    r10
+       /* Clear the exception_marker on the stack to avoid confusing stacktrace */
+       li      r10, 0
+       stw     r10, 8(r11)
        REST_GPR(10, r11)
 #ifdef CONFIG_PPC_8xx_PERF_EVENT
        mtspr   SPRN_NRI, r0
@@ -963,6 +966,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX)
        mtcrf   0xFF,r10
        mtlr    r11
 
+       /* Clear the exception_marker on the stack to avoid confusing stacktrace */
+       li      r10, 0
+       stw     r10, 8(r1)
        /*
         * Once we put values in SRR0 and SRR1, we are in a state
         * where exceptions are not recoverable, since taking an
@@ -1002,6 +1008,9 @@ exc_exit_restart_end:
        mtlr    r11
        lwz     r10,_CCR(r1)
        mtcrf   0xff,r10
+       /* Clear the exception_marker on the stack to avoid confusing stacktrace */
+       li      r10, 0
+       stw     r10, 8(r1)
        REST_2GPRS(9, r1)
        .globl exc_exit_restart
 exc_exit_restart: