• Nicholas Piggin's avatar
    powerpc/64s: Fix POWER9 machine check handler from stop state · 1945bc45
    Nicholas Piggin authored
    The ISA specifies power save wakeup due to a machine check exception can
    cause a machine check interrupt (rather than the usual system reset
    interrupt).
    
    The machine check handler copes with this by doing low level machine
    check recovery without restoring full state from idle, then queues up a
    machine check event for logging, then directly executes the same idle
    instruction it woke from. This minimises the work done before recovery
    is performed.
    
    The problem is that it requires machine specific instructions and
    knowledge of the book3s idle code. Currently it only has code to handle
    POWER8 idle, so POWER9 crashes when trying to execute the P8 idle
    instructions which don't exist in ISAv3.0B.
    
    cpu 0x0: Vector: e40 (Emulation Assist) at [c0000000008f3810]
        pc: c000000000008380: machine_check_handle_early+0x130/0x2f0
        lr: c00000000053a098: stop_loop+0x68/0xd0
        sp: c0000000008f3a90
       msr: 9000000000081001
      current = 0xc0000000008a1080
      paca    = 0xc00000000ffd0000   softe: 0        irq_happened: 0x01
        pid   = 0, comm = swapper/0
    
    Instead of going to sleep after recovery, do the usual idle wakeup and
    state restoration by calling into the normal idle wakeup path. This
    reuses the normal idle wakeup paths.
    Reviewed-by: default avatarGautham R. Shenoy <ego@linux.vnet.ibm.com>
    Reviewed-by: default avatarMahesh J Salgaonkar <mahesh@linux.vnet.ibm.com>
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    1945bc45
idle_book3s.S 19.3 KB