Skip to content

Commit 67faed4

Browse files
author
James Morse
committed
KVM: arm64: Force guest EL1 to use user-space's partid configuration
While we trap the guest's attempts to read/write the MPAM control registers, the hardware continues to use them. Guest-EL0 uses KVM's user-space's configuration, as the value is left in the register, and guest-EL1 uses either the host kernel's configuration, or in the case of VHE, the UNKNOWN reset value of MPAM1_EL1. We want to force the guest-EL1 to use KVM's user-space's MPAM configuration. On nVHE rely on MPAM0_EL1 and MPAM1_EL1 always being programmed the same and on VHE copy MPAM0_EL1 into the guest's MPAM1_EL1. There is no need to restore as this is out of context once TGE is set. Tested-by: Gavin Shan <gshan@redhat.com> Tested-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com> Tested-by: Peter Newman <peternewman@google.com> Tested-by: Zeng Heng <zengheng4@huawei.com> Tested-by: Punit Agrawal <punit.agrawal@oss.qualcomm.com> Tested-by: Jesse Chick <jessechick@os.amperecomputing.com> Reviewed-by: Zeng Heng <zengheng4@huawei.com> Reviewed-by: Shaopeng Tan <tan.shaopeng@jp.fujitsu.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Reviewed-by: Gavin Shan <gshan@redhat.com> Acked-by: Marc Zyngier <maz@kernel.org> Co-developed-by: Ben Horgan <ben.horgan@arm.com> Signed-off-by: Ben Horgan <ben.horgan@arm.com> Signed-off-by: James Morse <james.morse@arm.com>
1 parent 2cf9ca3 commit 67faed4

1 file changed

Lines changed: 16 additions & 0 deletions

File tree

arch/arm64/kvm/hyp/vhe/sysreg-sr.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,21 @@ void sysreg_restore_guest_state_vhe(struct kvm_cpu_context *ctxt)
183183
}
184184
NOKPROBE_SYMBOL(sysreg_restore_guest_state_vhe);
185185

186+
/*
187+
* The _EL0 value was written by the host's context switch and belongs to the
188+
* VMM. Copy this into the guest's _EL1 register.
189+
*/
190+
static inline void __mpam_guest_load(void)
191+
{
192+
u64 mask = MPAM0_EL1_PARTID_D | MPAM0_EL1_PARTID_I | MPAM0_EL1_PMG_D | MPAM0_EL1_PMG_I;
193+
194+
if (system_supports_mpam()) {
195+
u64 val = (read_sysreg_s(SYS_MPAM0_EL1) & mask) | MPAM1_EL1_MPAMEN;
196+
197+
write_sysreg_el1(val, SYS_MPAM1);
198+
}
199+
}
200+
186201
/**
187202
* __vcpu_load_switch_sysregs - Load guest system registers to the physical CPU
188203
*
@@ -222,6 +237,7 @@ void __vcpu_load_switch_sysregs(struct kvm_vcpu *vcpu)
222237
*/
223238
__sysreg32_restore_state(vcpu);
224239
__sysreg_restore_user_state(guest_ctxt);
240+
__mpam_guest_load();
225241

226242
if (unlikely(is_hyp_ctxt(vcpu))) {
227243
__sysreg_restore_vel2_state(vcpu);

0 commit comments

Comments
 (0)