• Paul Mackerras's avatar
    KVM: PPC: Book3S HV: Context-switch EBB registers properly · 4ae3f358
    Paul Mackerras authored
    commit ca8efa1d upstream.
    
    This adds code to save the values of three SPRs (special-purpose
    registers) used by userspace to control event-based branches (EBBs),
    which are essentially interrupts that get delivered directly to
    userspace.  These registers are loaded up with guest values when
    entering the guest, and their values are saved when exiting the
    guest, but we were not saving the host values and restoring them
    before going back to userspace.
    
    On POWER8 this would only affect userspace programs which explicitly
    request the use of EBBs and also use the KVM_RUN ioctl, since the
    only source of EBBs on POWER8 is the PMU, and there is an explicit
    enable bit in the PMU registers (and those PMU registers do get
    properly context-switched between host and guest).  On POWER9 there
    is provision for externally-generated EBBs, and these are not subject
    to the control in the PMU registers.
    
    Since these registers only affect userspace, we can save them when
    we first come in from userspace and restore them before returning to
    userspace, rather than saving/restoring the host values on every
    guest entry/exit.  Similarly, we don't need to worry about their
    values on offline secondary threads since they execute in the context
    of the idle task, which never executes in userspace.
    
    Fixes: b005255e ("KVM: PPC: Book3S HV: Context-switch new POWER8 SPRs", 2014-01-08)
    Signed-off-by: default avatarPaul Mackerras <paulus@ozlabs.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    4ae3f358
book3s_hv.c 102 KB