[PATCH v2 2/2] KVM: arm64: VHE: Save and restore host MDCR_EL2 value correctly
Oliver Upton
oliver.upton at linux.dev
Wed Sep 3 23:55:46 PDT 2025
On Tue, Sep 02, 2025 at 02:08:33PM +0100, Alexandru Elisei wrote:
> Prior to commit 75a5fbaf6623 ("KVM: arm64: Compute MDCR_EL2 at
> vcpu_load()"), host MDCR_EL2 was saved correctly:
>
> kvm_arch_vcpu_load()
> kvm_vcpu_load_debug() /* Doesn't touch hardware MDCR_EL2. */
> kvm_vcpu_load_vhe()
> __activate_traps_common()
> /* Saves host MDCR_EL2. */
> *host_data_ptr(host_debug_state.mdcr_el2) = read_sysreg(mdcr_el2)
> /* Writes VCPU MDCR_EL2. */
> write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2)
>
> The MDCR_EL2 value saved previously was restored in
> kvm_arch_vcpu_put() -> kvm_vcpu_put_vhe().
>
> After the aforementioned commit, host MDCR_EL2 is never saved:
>
> kvm_arch_vcpu_load()
> kvm_vcpu_load_debug() /* Writes VCPU MDCR_EL2 */
> kvm_vcpu_load_vhe()
> __activate_traps_common()
> /* Saves **VCPU** MDCR_EL2. */
> *host_data_ptr(host_debug_state.mdcr_el2) = read_sysreg(mdcr_el2)
> /* Writes VCPU MDCR_EL2 a second time. */
> write_sysreg(vcpu->arch.mdcr_el2, mdcr_el2)
>
> kvm_arch_vcpu_put() -> kvm_vcpu_put_vhe() then restores the VCPU MDCR_EL2
> value. Also VCPU's MDCR_EL2 value gets written to hardware twice now.
>
> Fix this by saving the host MDCR_EL2 in kvm_arch_vcpu_load() before it gets
> overwritten by the VCPU's MDCR_EL2 value, and restore it on VCPU put.
>
> Signed-off-by: Alexandru Elisei <alexandru.elisei at arm.com>
Reviewed-by: Oliver Upton <oliver.upton at linux.dev>
Thanks,
Oliver
More information about the linux-arm-kernel
mailing list