From: Reiji Watanabe <reijiw@google.com>
To: Marc Zyngier <maz@kernel.org>, kvmarm@lists.cs.columbia.edu
Cc: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
James Morse <james.morse@arm.com>,
Alexandru Elisei <alexandru.elisei@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Will Deacon <will@kernel.org>, Andrew Jones <drjones@redhat.com>,
Fuad Tabba <tabba@google.com>,
Peng Liang <liangpeng10@huawei.com>,
Peter Shier <pshier@google.com>,
Ricardo Koller <ricarkol@google.com>,
Oliver Upton <oupton@google.com>,
Jing Zhang <jingzhangos@google.com>,
Raghavendra Rao Anata <rananta@google.com>,
Reiji Watanabe <reijiw@google.com>
Subject: [PATCH v7 12/38] KVM: arm64: Add a KVM flag indicating emulating debug regs access is needed
Date: Mon, 18 Apr 2022 23:55:18 -0700 [thread overview]
Message-ID: <20220419065544.3616948-13-reijiw@google.com> (raw)
In-Reply-To: <20220419065544.3616948-1-reijiw@google.com>
Highest numbered breakpoints must be context aware breakpoints
(as specified by Arm ARM). If the number of non-context aware
breakpoints for the guest is decreased by userspace, simply narrowing
the breakpoints will be problematic because it will lead to
narrowing context aware breakpoints for the guest.
Introduce KVM_ARCH_FLAG_EMULATE_DEBUG_REGS for kvm->arch.flags to
indicate trapping debug reg access is needed, and enable the trapping
when the flag is set. Set the new flag at the first KVM_RUN if the
number of non-context aware breakpoints for the guest is decreased
by userspace.
No code sets the new flag yet since ID_AA64DFR0_EL1 is not configurable
by userspace.
Signed-off-by: Reiji Watanabe <reijiw@google.com>
---
arch/arm64/include/asm/kvm_host.h | 3 +++
arch/arm64/kvm/debug.c | 7 ++++++-
arch/arm64/kvm/sys_regs.c | 35 +++++++++++++++++++++++++++++++
3 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index a43fddd58e68..dbed94e759a8 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -136,6 +136,8 @@ struct kvm_arch {
*/
#define KVM_ARCH_FLAG_REG_WIDTH_CONFIGURED 3
#define KVM_ARCH_FLAG_EL1_32BIT 4
+ /* Access to debug registers need to be emulated ? */
+#define KVM_ARCH_FLAG_EMULATE_DEBUG_REGS 5
unsigned long flags;
@@ -786,6 +788,7 @@ long kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm,
void set_default_id_regs(struct kvm *kvm);
int kvm_set_id_reg_feature(struct kvm *kvm, u32 id, u8 field_shift, u8 fval);
+void kvm_vcpu_breakpoint_config(struct kvm_vcpu *vcpu);
/* Guest/host FPSIMD coordination helpers */
int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu);
diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c
index 4fd5c216c4bb..6eb146d908f8 100644
--- a/arch/arm64/kvm/debug.c
+++ b/arch/arm64/kvm/debug.c
@@ -106,10 +106,14 @@ static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu)
* (KVM_GUESTDBG_USE_HW is set).
* - The guest is not using debug (KVM_ARM64_DEBUG_DIRTY is clear).
* - The guest has enabled the OS Lock (debug exceptions are blocked).
+ * - The guest's access to debug registers needs to be emulated
+ * (the number of non-context aware breakpoints for the guest
+ * is decreased by userspace).
*/
if ((vcpu->guest_debug & KVM_GUESTDBG_USE_HW) ||
!(vcpu->arch.flags & KVM_ARM64_DEBUG_DIRTY) ||
- kvm_vcpu_os_lock_enabled(vcpu))
+ kvm_vcpu_os_lock_enabled(vcpu) ||
+ test_bit(KVM_ARCH_FLAG_EMULATE_DEBUG_REGS, &vcpu->kvm->arch.flags))
vcpu->arch.mdcr_el2 |= MDCR_EL2_TDA;
trace_kvm_arm_set_dreg32("MDCR_EL2", vcpu->arch.mdcr_el2);
@@ -124,6 +128,7 @@ static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu)
*/
void kvm_arm_vcpu_init_debug(struct kvm_vcpu *vcpu)
{
+ kvm_vcpu_breakpoint_config(vcpu);
preempt_disable();
kvm_arm_setup_mdcr_el2(vcpu);
preempt_enable();
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index b68ae53af792..f4aae4ccffd0 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -844,6 +844,41 @@ static bool trap_dbgauthstatus_el1(struct kvm_vcpu *vcpu,
}
}
+#define AA64DFR0_BRPS(v) \
+ ((u8)cpuid_feature_extract_unsigned_field(v, ID_AA64DFR0_BRPS_SHIFT))
+#define AA64DFR0_CTX_CMPS(v) \
+ ((u8)cpuid_feature_extract_unsigned_field(v, ID_AA64DFR0_CTX_CMPS_SHIFT))
+
+/*
+ * Set KVM_ARCH_FLAG_EMULATE_DEBUG_REGS in the VM flags when the number of
+ * non-context aware breakpoints for the guest is decreased by userspace
+ * (meaning that debug register accesses need to be emulated).
+ */
+void kvm_vcpu_breakpoint_config(struct kvm_vcpu *vcpu)
+{
+ u64 p_val = read_sanitised_ftr_reg(SYS_ID_AA64DFR0_EL1);
+ u64 v_val = read_id_reg_with_encoding(vcpu, SYS_ID_AA64DFR0_EL1);
+ u8 v_nbpn, p_nbpn;
+ struct kvm *kvm = vcpu->kvm;
+
+ /*
+ * Check the number of normal (non-context aware) breakpoints
+ * for the guest and the host.
+ */
+ v_nbpn = AA64DFR0_BRPS(v_val) - AA64DFR0_CTX_CMPS(v_val);
+ p_nbpn = AA64DFR0_BRPS(p_val) - AA64DFR0_CTX_CMPS(p_val);
+ if (v_nbpn >= p_nbpn)
+ /*
+ * Nothing to do if the number of normal breakpoints for the
+ * guest is not decreased by userspace (meaning KVM doesn't
+ * need to emulate an access of debug registers).
+ */
+ return;
+
+ if (!test_bit(KVM_ARCH_FLAG_EMULATE_DEBUG_REGS, &kvm->arch.flags))
+ set_bit(KVM_ARCH_FLAG_EMULATE_DEBUG_REGS, &kvm->arch.flags);
+}
+
/*
* We want to avoid world-switching all the DBG registers all the
* time:
--
2.36.0.rc0.470.gd361397f0d-goog
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-04-19 7:03 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-19 6:55 [PATCH v7 00/38] KVM: arm64: Make CPU ID registers writable by userspace Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 01/38] KVM: arm64: Introduce a validation function for an ID register Reiji Watanabe
2022-05-04 6:35 ` Oliver Upton
2022-06-01 6:16 ` Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 02/38] KVM: arm64: Save ID registers' sanitized value per guest Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 03/38] KVM: arm64: Introduce struct id_reg_desc Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 04/38] KVM: arm64: Generate id_reg_desc's ftr_bits at KVM init when needed Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 05/38] KVM: arm64: Prohibit modifying values of ID regs for 32bit EL1 guests Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 06/38] KVM: arm64: Make ID_AA64PFR0_EL1 writable Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 07/38] KVM: arm64: Make ID_AA64PFR1_EL1 writable Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 08/38] KVM: arm64: Make ID_AA64ISAR0_EL1 writable Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 09/38] KVM: arm64: Make ID_AA64ISAR1_EL1 writable Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 10/38] KVM: arm64: Make ID_AA64ISAR2_EL1 writable Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 11/38] KVM: arm64: Make ID_AA64MMFR0_EL1 writable Reiji Watanabe
2022-04-19 6:55 ` Reiji Watanabe [this message]
2022-04-19 6:55 ` [PATCH v7 13/38] KVM: arm64: Emulate dbgbcr/dbgbvr accesses Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 14/38] KVM: arm64: Emulate dbgwcr accesses Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 15/38] KVM: arm64: Make ID_AA64DFR0_EL1/ID_DFR0_EL1 writable Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 16/38] KVM: arm64: KVM: arm64: Make ID_DFR1_EL1 writable Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 17/38] KVM: arm64: KVM: arm64: Make ID_MMFR0_EL1 writable Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 18/38] KVM: arm64: Make MVFR1_EL1 writable Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 19/38] KVM: arm64: Add remaining ID registers to id_reg_desc_table Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 20/38] KVM: arm64: Use id_reg_desc_table for ID registers Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 21/38] KVM: arm64: Add consistency checking for frac fields of " Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 22/38] KVM: arm64: Introduce KVM_CAP_ARM_ID_REG_CONFIGURABLE capability Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 23/38] KVM: arm64: Add kunit test for ID register validation Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 24/38] KVM: arm64: Use vcpu->arch cptr_el2 to track value of cptr_el2 for VHE Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 25/38] KVM: arm64: Use vcpu->arch.mdcr_el2 to track value of mdcr_el2 Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 26/38] KVM: arm64: Introduce framework to trap disabled features Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 27/38] KVM: arm64: Trap disabled features of ID_AA64PFR0_EL1 Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 28/38] KVM: arm64: Trap disabled features of ID_AA64PFR1_EL1 Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 29/38] KVM: arm64: Trap disabled features of ID_AA64DFR0_EL1 Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 30/38] KVM: arm64: Trap disabled features of ID_AA64MMFR1_EL1 Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 31/38] KVM: arm64: Trap disabled features of ID_AA64ISAR1_EL1 Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 32/38] KVM: arm64: Add kunit test for trap initialization Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 33/38] KVM: arm64: selftests: Add helpers to extract a field of ID registers Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 34/38] KVM: arm64: selftests: Introduce id_reg_test Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 35/38] KVM: arm64: selftests: Test linked breakpoint and watchpoint Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 36/38] KVM: arm64: selftests: Test breakpoint/watchpoint register access Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 37/38] KVM: arm64: selftests: Test with every breakpoint/watchpoint Reiji Watanabe
2022-04-19 6:55 ` [PATCH v7 38/38] KVM: arm64: selftests: Test breakpoint/watchpoint changing ID_AA64DFR0_EL1 Reiji Watanabe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220419065544.3616948-13-reijiw@google.com \
--to=reijiw@google.com \
--cc=alexandru.elisei@arm.com \
--cc=drjones@redhat.com \
--cc=james.morse@arm.com \
--cc=jingzhangos@google.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=liangpeng10@huawei.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=maz@kernel.org \
--cc=oupton@google.com \
--cc=pbonzini@redhat.com \
--cc=pshier@google.com \
--cc=rananta@google.com \
--cc=ricarkol@google.com \
--cc=suzuki.poulose@arm.com \
--cc=tabba@google.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).