• Paul Mackerras's avatar
    KVM: PPC: Book3S HV: Handle guest-caused machine checks on POWER7 without panicking · b4072df4
    Paul Mackerras authored
    Currently, if a machine check interrupt happens while we are in the
    guest, we exit the guest and call the host's machine check handler,
    which tends to cause the host to panic.  Some machine checks can be
    triggered by the guest; for example, if the guest creates two entries
    in the SLB that map the same effective address, and then accesses that
    effective address, the CPU will take a machine check interrupt.
    
    To handle this better, when a machine check happens inside the guest,
    we call a new function, kvmppc_realmode_machine_check(), while still in
    real mode before exiting the guest.  On POWER7, it handles the cases
    that the guest can trigger, either by flushing and reloading the SLB,
    or by flushing the TLB, and then it delivers the machine check interrupt
    directly to the guest without going back to the host.  On POWER7, the
    OPAL firmware patches the machine check interrupt vector so that it
    gets control first, and it leaves behind its analysis of the situation
    in a structure pointed to by the opal_mc_evt field of the paca.  The
    kvmppc_realmode_machine_check() function looks at this, and if OPAL
    reports that there was no error, or that it has handled the error, we
    also go straight back to the guest with a machine check.  We have to
    deliver a machine check to the guest since the machine check interrupt
    might have trashed valid values in SRR0/1.
    
    If the machine check is one we can't handle in real mode, and one that
    OPAL hasn't already handled, or on PPC970, we exit the guest and call
    the host's machine check handler.  We do this by jumping to the
    machine_check_fwnmi label, rather than absolute address 0x200, because
    we don't want to re-execute OPAL's handler on POWER7.  On PPC970, the
    two are equivalent because address 0x200 just contains a branch.
    
    Then, if the host machine check handler decides that the system can
    continue executing, kvmppc_handle_exit() delivers a machine check
    interrupt to the guest -- once again to let the guest know that SRR0/1
    have been modified.
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    [agraf: fix checkpatch warnings]
    Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
    b4072df4
book3s_hv.c 48.8 KB