Track the baseline guest value for mdcr_el2 in struct kvm_vcpu_arch.
Use this value when setting mdcr_el2 for the guest.

Currently this value is unchanged, but the following patches will set
trapping bits based on features supported for the guest.

No functional change intended.

Signed-off-by: Reiji Watanabe <rei...@google.com>
---
 arch/arm64/include/asm/kvm_arm.h | 16 ++++++++++++++++
 arch/arm64/kvm/arm.c             |  1 +
 arch/arm64/kvm/debug.c           | 13 ++++---------
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
index f11ba1b6699d..e560e5549472 100644
--- a/arch/arm64/include/asm/kvm_arm.h
+++ b/arch/arm64/include/asm/kvm_arm.h
@@ -332,6 +332,22 @@
                                 BIT(18) |              \
                                 GENMASK(16, 15))
 
+/*
+ * The default value for the guest below also clears MDCR_EL2_E2PB_MASK
+ * and MDCR_EL2_E2TB_MASK to disable guest access to the profiling and
+ * trace buffers.
+ */
+#define MDCR_GUEST_FLAGS_DEFAULT                               \
+       (MDCR_EL2_TPM  | MDCR_EL2_TPMS | MDCR_EL2_TTRF |        \
+        MDCR_EL2_TPMCR | MDCR_EL2_TDRA | MDCR_EL2_TDOSA)
+
+/* Bits that are copied from vcpu->arch.mdcr_el2 to set mdcr_el2 for guest. */
+#define MDCR_GUEST_FLAGS_TRACKED_MASK                          \
+       (MDCR_EL2_TPM  | MDCR_EL2_TPMS | MDCR_EL2_TTRF |        \
+        MDCR_EL2_TPMCR | MDCR_EL2_TDRA | MDCR_EL2_TDOSA |      \
+        (MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT))
+
+
 /* For compatibility with fault code shared with 32-bit */
 #define FSC_FAULT      ESR_ELx_FSC_FAULT
 #define FSC_ACCESS     ESR_ELx_FSC_ACCESS
diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
index 32fd6edbd9e1..38301ddf8372 100644
--- a/arch/arm64/kvm/arm.c
+++ b/arch/arm64/kvm/arm.c
@@ -1108,6 +1108,7 @@ static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu 
*vcpu,
        }
 
        vcpu_reset_hcr(vcpu);
+       vcpu->arch.mdcr_el2 = MDCR_GUEST_FLAGS_DEFAULT;
        if (has_vhe())
                vcpu->arch.cptr_el2 = CPTR_EL2_VHE_GUEST_DEFAULT;
        else
diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c
index db9361338b2a..83330968a411 100644
--- a/arch/arm64/kvm/debug.c
+++ b/arch/arm64/kvm/debug.c
@@ -84,16 +84,11 @@ void kvm_arm_init_debug(void)
 static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu)
 {
        /*
-        * This also clears MDCR_EL2_E2PB_MASK and MDCR_EL2_E2TB_MASK
-        * to disable guest access to the profiling and trace buffers
+        * Keep the vcpu->arch.mdcr_el2 bits that are specified by
+        * MDCR_GUEST_FLAGS_TRACKED_MASK.
         */
-       vcpu->arch.mdcr_el2 = __this_cpu_read(mdcr_el2) & MDCR_EL2_HPMN_MASK;
-       vcpu->arch.mdcr_el2 |= (MDCR_EL2_TPM |
-                               MDCR_EL2_TPMS |
-                               MDCR_EL2_TTRF |
-                               MDCR_EL2_TPMCR |
-                               MDCR_EL2_TDRA |
-                               MDCR_EL2_TDOSA);
+       vcpu->arch.mdcr_el2 &= MDCR_GUEST_FLAGS_TRACKED_MASK;
+       vcpu->arch.mdcr_el2 |= __this_cpu_read(mdcr_el2) & MDCR_EL2_HPMN_MASK;
 
        /* Is the VM being debugged by userspace? */
        if (vcpu->guest_debug)
-- 
2.33.0.882.g93a45727a2-goog

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to