KVM: PPC: Book3S HV: Context-switch EBB registers properly
authorPaul Mackerras <paulus@ozlabs.org>
Tue, 6 Jun 2017 06:47:22 +0000 (16:47 +1000)
committerPaul Mackerras <paulus@ozlabs.org>
Tue, 13 Jun 2017 04:12:02 +0000 (14:12 +1000)
commitca8efa1df1d15a1795a2da57f9f6aada6ed6b946
treeb5e2d32d88334bc2b8e2546c03a9a12081b498bb
parent2f2724630f7a8d582470f03ee56b96746767d270
KVM: PPC: Book3S HV: Context-switch EBB registers properly

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: b005255e12a3 ("KVM: PPC: Book3S HV: Context-switch new POWER8 SPRs", 2014-01-08)
Cc: stable@vger.kernel.org # v3.14+
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
arch/powerpc/kvm/book3s_hv.c