1. 24 Dec, 2021 2 commits
    • Michael Ellerman's avatar
      powerpc/64s: Use EMIT_WARN_ENTRY for SRR debug warnings · fd1eaaaa
      Michael Ellerman authored
      When CONFIG_PPC_RFI_SRR_DEBUG=y we check the SRR values before returning
      from interrupts. This is done in asm using EMIT_BUG_ENTRY, and passing
      BUGFLAG_WARNING.
      
      However that fails to create an exception table entry for the warning,
      and so do_program_check() fails the exception table search and proceeds
      to call _exception(), resulting in an oops like:
      
        Oops: Exception in kernel mode, sig: 5 [#1]
        LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA pSeries
        Modules linked in:
        CPU: 2 PID: 1204 Comm: sigreturn_unali Tainted: P                  5.16.0-rc2-00194-g91ca3d4f77c5 #12
        NIP:  c00000000000c5b0 LR: 0000000000000000 CTR: 0000000000000000
        ...
        NIP [c00000000000c5b0] system_call_common+0x150/0x268
        LR [0000000000000000] 0x0
        Call Trace:
        [c00000000db73e10] [c00000000000c558] system_call_common+0xf8/0x268 (unreliable)
        ...
        Instruction dump:
        7cc803a6 888d0931 2c240000 4082001c 38800000 988d0931 e8810170 e8a10178
        7c9a03a6 7cbb03a6 7d7a02a6 e9810170 <7f0b6088> 7d7b02a6 e9810178 7f0b6088
      
      We should instead use EMIT_WARN_ENTRY, which creates an exception table
      entry for the warning, allowing the warning to be correctly recognised,
      and the code to resume after printing the warning.
      
      Note however that because this warning is buried deep in the interrupt
      return path, we are not able to recover from it (due to MSR_RI being
      clear), so we still end up in die() with an unrecoverable exception.
      
      Fixes: 59dc5bfc ("powerpc/64s: avoid reloading (H)SRR registers if they are still valid")
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      Link: https://lore.kernel.org/r/20211221135101.2085547-2-mpe@ellerman.id.au
      fd1eaaaa
    • Michael Ellerman's avatar
      powerpc/64s: Mask NIP before checking against SRR0 · 314f6c23
      Michael Ellerman authored
      When CONFIG_PPC_RFI_SRR_DEBUG=y we check that NIP and SRR0 match when
      returning from interrupts. This can trigger falsely if NIP has either of
      its two low bits set via sigreturn or ptrace, while SRR0 has its low two
      bits masked in hardware.
      
      As a quick fix make sure to mask the low bits before doing the check.
      
      Fixes: 59dc5bfc ("powerpc/64s: avoid reloading (H)SRR registers if they are still valid")
      Reported-by: default avatarSachin Sant <sachinp@linux.vnet.ibm.com>
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      Tested-by: default avatarSachin Sant <sachinp@linux.vnet.ibm.com>
      Link: https://lore.kernel.org/r/20211221135101.2085547-1-mpe@ellerman.id.au
      314f6c23
  2. 23 Dec, 2021 38 commits