linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/5] KVM: arm64: Add support for FEAT_IDST
@ 2025-11-26 15:59 Marc Zyngier
  2025-11-26 15:59 ` [PATCH v2 1/5] KVM: arm64: Add routing/handling for GMID_EL1 Marc Zyngier
                   ` (5 more replies)
  0 siblings, 6 replies; 17+ messages in thread
From: Marc Zyngier @ 2025-11-26 15:59 UTC (permalink / raw)
  To: kvmarm, kvm, linux-arm-kernel
  Cc: Joey Gouly, Suzuki K Poulose, Oliver Upton, Zenghui Yu,
	Ben Horgan

FEAT_IDST appeared in ARMv8.4, and allows ID registers to be trapped
if they are not implemented. This only concerns 3 registers (GMID_EL1,
CCSIDR2_EL1 and SMIDR_EL1), which are part of features that may not be
exposed to the guest even if present on the host.

For these registers, the HW should report them with EC=0x18, even if
the feature isn't implemented.

Add support for this feature by handling these registers in a specific
way and implementing GMID_EL1 support in the process. A very basic
selftest checks that these registers behave as expected.

* From v1: [1]

  - Fixed commit message in patch #4 (Ben)
  - Collected RB, with thanks (Joey)

[1] https://lore.kernel.org/r/20251120133202.2037803-1-maz@kernel.org

Marc Zyngier (5):
  KVM: arm64: Add routing/handling for GMID_EL1
  KVM: arm64: Force trap of GMID_EL1 when the guest doesn't have MTE
  KVM: arm64: Add a generic synchronous exception injection primitive
  KVM: arm64: Report optional ID register traps with a 0x18 syndrome
  KVM: arm64: selftests: Add a test for FEAT_IDST

 arch/arm64/include/asm/kvm_emulate.h          |   1 +
 arch/arm64/kvm/emulate-nested.c               |   8 ++
 arch/arm64/kvm/inject_fault.c                 |  10 +-
 arch/arm64/kvm/sys_regs.c                     |  17 ++-
 tools/testing/selftests/kvm/Makefile.kvm      |   1 +
 .../testing/selftests/kvm/arm64/idreg-idst.c  | 117 ++++++++++++++++++
 6 files changed, 149 insertions(+), 5 deletions(-)
 create mode 100644 tools/testing/selftests/kvm/arm64/idreg-idst.c

-- 
2.47.3



^ permalink raw reply	[flat|nested] 17+ messages in thread

* [PATCH v2 1/5] KVM: arm64: Add routing/handling for GMID_EL1
  2025-11-26 15:59 [PATCH v2 0/5] KVM: arm64: Add support for FEAT_IDST Marc Zyngier
@ 2025-11-26 15:59 ` Marc Zyngier
  2025-11-26 15:59 ` [PATCH v2 2/5] KVM: arm64: Force trap of GMID_EL1 when the guest doesn't have MTE Marc Zyngier
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 17+ messages in thread
From: Marc Zyngier @ 2025-11-26 15:59 UTC (permalink / raw)
  To: kvmarm, kvm, linux-arm-kernel
  Cc: Joey Gouly, Suzuki K Poulose, Oliver Upton, Zenghui Yu,
	Ben Horgan

HCR_EL2.TID5 is currently ignored by the trap routing infrastructure,
and we currently don't handle GMID_EL1 either (the only register trapped
by TID5).

Wire both the trap bit and a default UNDEF handler.

Signed-off-by: Marc Zyngier <maz@kernel.org>
---
 arch/arm64/kvm/emulate-nested.c | 8 ++++++++
 arch/arm64/kvm/sys_regs.c       | 1 +
 2 files changed, 9 insertions(+)

diff --git a/arch/arm64/kvm/emulate-nested.c b/arch/arm64/kvm/emulate-nested.c
index 834f13fb1fb7d..616eb6ad68701 100644
--- a/arch/arm64/kvm/emulate-nested.c
+++ b/arch/arm64/kvm/emulate-nested.c
@@ -70,6 +70,7 @@ enum cgt_group_id {
 	CGT_HCR_ENSCXT,
 	CGT_HCR_TTLBIS,
 	CGT_HCR_TTLBOS,
+	CGT_HCR_TID5,
 
 	CGT_MDCR_TPMCR,
 	CGT_MDCR_TPM,
@@ -308,6 +309,12 @@ static const struct trap_bits coarse_trap_bits[] = {
 		.mask		= HCR_TTLBOS,
 		.behaviour	= BEHAVE_FORWARD_RW,
 	},
+	[CGT_HCR_TID5] = {
+		.index		= HCR_EL2,
+		.value		= HCR_TID5,
+		.mask		= HCR_TID5,
+		.behaviour	= BEHAVE_FORWARD_RW,
+	},
 	[CGT_MDCR_TPMCR] = {
 		.index		= MDCR_EL2,
 		.value		= MDCR_EL2_TPMCR,
@@ -665,6 +672,7 @@ static const struct encoding_to_trap_config encoding_to_cgt[] __initconst = {
 	SR_TRAP(SYS_CCSIDR2_EL1,	CGT_HCR_TID2_TID4),
 	SR_TRAP(SYS_CLIDR_EL1,		CGT_HCR_TID2_TID4),
 	SR_TRAP(SYS_CSSELR_EL1,		CGT_HCR_TID2_TID4),
+	SR_TRAP(SYS_GMID_EL1,		CGT_HCR_TID5),
 	SR_RANGE_TRAP(SYS_ID_PFR0_EL1,
 		      sys_reg(3, 0, 0, 7, 7), CGT_HCR_TID3),
 	SR_TRAP(SYS_ICC_SGI0R_EL1,	CGT_HCR_IMO_FMO_ICH_HCR_TC),
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 8ae2bca816148..9e4c46fbfd802 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -3400,6 +3400,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 	{ SYS_DESC(SYS_CLIDR_EL1), access_clidr, reset_clidr, CLIDR_EL1,
 	  .set_user = set_clidr, .val = ~CLIDR_EL1_RES0 },
 	{ SYS_DESC(SYS_CCSIDR2_EL1), undef_access },
+	{ SYS_DESC(SYS_GMID_EL1), undef_access },
 	{ SYS_DESC(SYS_SMIDR_EL1), undef_access },
 	IMPLEMENTATION_ID(AIDR_EL1, GENMASK_ULL(63, 0)),
 	{ SYS_DESC(SYS_CSSELR_EL1), access_csselr, reset_unknown, CSSELR_EL1 },
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 2/5] KVM: arm64: Force trap of GMID_EL1 when the guest doesn't have MTE
  2025-11-26 15:59 [PATCH v2 0/5] KVM: arm64: Add support for FEAT_IDST Marc Zyngier
  2025-11-26 15:59 ` [PATCH v2 1/5] KVM: arm64: Add routing/handling for GMID_EL1 Marc Zyngier
@ 2025-11-26 15:59 ` Marc Zyngier
  2025-11-27  5:52   ` Yao Yuan
  2025-11-27  6:37   ` Oliver Upton
  2025-11-26 15:59 ` [PATCH v2 3/5] KVM: arm64: Add a generic synchronous exception injection primitive Marc Zyngier
                   ` (3 subsequent siblings)
  5 siblings, 2 replies; 17+ messages in thread
From: Marc Zyngier @ 2025-11-26 15:59 UTC (permalink / raw)
  To: kvmarm, kvm, linux-arm-kernel
  Cc: Joey Gouly, Suzuki K Poulose, Oliver Upton, Zenghui Yu,
	Ben Horgan

If our host has MTE, but the guest doesn't, make sure we set HCR_EL2.TID5
to force GMID_EL1 being trapped.

Reviewed-by: Joey Gouly <joey.gouly@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
---
 arch/arm64/kvm/sys_regs.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 9e4c46fbfd802..2ca6862e935b5 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -5561,6 +5561,8 @@ static void vcpu_set_hcr(struct kvm_vcpu *vcpu)
 
 	if (kvm_has_mte(vcpu->kvm))
 		vcpu->arch.hcr_el2 |= HCR_ATA;
+	else if (id_aa64pfr1_mte(read_sanitised_ftr_reg(SYS_ID_AA64PFR1_EL1)))
+		vcpu->arch.hcr_el2 |= HCR_TID5;
 
 	/*
 	 * In the absence of FGT, we cannot independently trap TLBI
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 3/5] KVM: arm64: Add a generic synchronous exception injection primitive
  2025-11-26 15:59 [PATCH v2 0/5] KVM: arm64: Add support for FEAT_IDST Marc Zyngier
  2025-11-26 15:59 ` [PATCH v2 1/5] KVM: arm64: Add routing/handling for GMID_EL1 Marc Zyngier
  2025-11-26 15:59 ` [PATCH v2 2/5] KVM: arm64: Force trap of GMID_EL1 when the guest doesn't have MTE Marc Zyngier
@ 2025-11-26 15:59 ` Marc Zyngier
  2025-11-26 16:58   ` Ben Horgan
  2025-11-27  5:57   ` Yao Yuan
  2025-11-26 15:59 ` [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome Marc Zyngier
                   ` (2 subsequent siblings)
  5 siblings, 2 replies; 17+ messages in thread
From: Marc Zyngier @ 2025-11-26 15:59 UTC (permalink / raw)
  To: kvmarm, kvm, linux-arm-kernel
  Cc: Joey Gouly, Suzuki K Poulose, Oliver Upton, Zenghui Yu,
	Ben Horgan

Maybe in a surprising way, we don't currently have a generic way
to inject a synchronous exception at the EL the vcpu is currently
running at.

Extract such primitive from the UNDEF injection code.

Signed-off-by: Marc Zyngier <maz@kernel.org>
---
 arch/arm64/include/asm/kvm_emulate.h |  1 +
 arch/arm64/kvm/inject_fault.c        | 10 +++++++---
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h
index c9eab316398e2..df20d47f0d256 100644
--- a/arch/arm64/include/asm/kvm_emulate.h
+++ b/arch/arm64/include/asm/kvm_emulate.h
@@ -45,6 +45,7 @@ bool kvm_condition_valid32(const struct kvm_vcpu *vcpu);
 void kvm_skip_instr32(struct kvm_vcpu *vcpu);
 
 void kvm_inject_undefined(struct kvm_vcpu *vcpu);
+void kvm_inject_sync(struct kvm_vcpu *vcpu, u64 esr);
 int kvm_inject_serror_esr(struct kvm_vcpu *vcpu, u64 esr);
 int kvm_inject_sea(struct kvm_vcpu *vcpu, bool iabt, u64 addr);
 void kvm_inject_size_fault(struct kvm_vcpu *vcpu);
diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c
index dfcd66c655179..7102424a3fa5e 100644
--- a/arch/arm64/kvm/inject_fault.c
+++ b/arch/arm64/kvm/inject_fault.c
@@ -162,12 +162,16 @@ static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr
 	vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu));
 }
 
+void kvm_inject_sync(struct kvm_vcpu *vcpu, u64 esr)
+{
+	pend_sync_exception(vcpu);
+	vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu));
+}
+
 static void inject_undef64(struct kvm_vcpu *vcpu)
 {
 	u64 esr = (ESR_ELx_EC_UNKNOWN << ESR_ELx_EC_SHIFT);
 
-	pend_sync_exception(vcpu);
-
 	/*
 	 * Build an unknown exception, depending on the instruction
 	 * set.
@@ -175,7 +179,7 @@ static void inject_undef64(struct kvm_vcpu *vcpu)
 	if (kvm_vcpu_trap_il_is32bit(vcpu))
 		esr |= ESR_ELx_IL;
 
-	vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu));
+	kvm_inject_sync(vcpu, esr);
 }
 
 #define DFSR_FSC_EXTABT_LPAE	0x10
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome
  2025-11-26 15:59 [PATCH v2 0/5] KVM: arm64: Add support for FEAT_IDST Marc Zyngier
                   ` (2 preceding siblings ...)
  2025-11-26 15:59 ` [PATCH v2 3/5] KVM: arm64: Add a generic synchronous exception injection primitive Marc Zyngier
@ 2025-11-26 15:59 ` Marc Zyngier
  2025-11-26 17:10   ` Ben Horgan
  2025-11-27  6:07   ` Yao Yuan
  2025-11-26 15:59 ` [PATCH v2 5/5] KVM: arm64: selftests: Add a test for FEAT_IDST Marc Zyngier
  2025-11-27 16:38 ` [PATCH v2 0/5] KVM: arm64: Add support " Marc Zyngier
  5 siblings, 2 replies; 17+ messages in thread
From: Marc Zyngier @ 2025-11-26 15:59 UTC (permalink / raw)
  To: kvmarm, kvm, linux-arm-kernel
  Cc: Joey Gouly, Suzuki K Poulose, Oliver Upton, Zenghui Yu,
	Ben Horgan

With FEAT_IDST, unimplemented system registers in the feature ID space
must be reported using EC=0x18 at the closest handling EL, rather than
with an UNDEF.

Most of these system registers are always implemented thanks to their
dependency on FEAT_AA64, except for a set of (currently) three registers:
GMID_EL1 (depending on MTE2), CCSIDR2_EL1 (depending on FEAT_CCIDX),
and SMIDR_EL1 (depending on SME).

For these three registers, report their trap as EC=0x18 if they
end-up trapping into KVM and that FEAT_IDST is not implemented in the
guest. Otherwise, just make them UNDEF.

Signed-off-by: Marc Zyngier <maz@kernel.org>
---
 arch/arm64/kvm/sys_regs.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index 2ca6862e935b5..7705f703e7c6d 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -82,6 +82,16 @@ static bool write_to_read_only(struct kvm_vcpu *vcpu,
 			"sys_reg write to read-only register");
 }
 
+static bool idst_access(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
+			const struct sys_reg_desc *r)
+{
+	if (kvm_has_feat_enum(vcpu->kvm, ID_AA64MMFR2_EL1, IDS, 0x0))
+		return undef_access(vcpu, p, r);
+
+	kvm_inject_sync(vcpu, kvm_vcpu_get_esr(vcpu));
+	return false;
+}
+
 enum sr_loc_attr {
 	SR_LOC_MEMORY	= 0,	  /* Register definitely in memory */
 	SR_LOC_LOADED	= BIT(0), /* Register on CPU, unless it cannot */
@@ -3399,9 +3409,9 @@ static const struct sys_reg_desc sys_reg_descs[] = {
 	{ SYS_DESC(SYS_CCSIDR_EL1), access_ccsidr },
 	{ SYS_DESC(SYS_CLIDR_EL1), access_clidr, reset_clidr, CLIDR_EL1,
 	  .set_user = set_clidr, .val = ~CLIDR_EL1_RES0 },
-	{ SYS_DESC(SYS_CCSIDR2_EL1), undef_access },
-	{ SYS_DESC(SYS_GMID_EL1), undef_access },
-	{ SYS_DESC(SYS_SMIDR_EL1), undef_access },
+	{ SYS_DESC(SYS_CCSIDR2_EL1), idst_access },
+	{ SYS_DESC(SYS_GMID_EL1), idst_access },
+	{ SYS_DESC(SYS_SMIDR_EL1), idst_access },
 	IMPLEMENTATION_ID(AIDR_EL1, GENMASK_ULL(63, 0)),
 	{ SYS_DESC(SYS_CSSELR_EL1), access_csselr, reset_unknown, CSSELR_EL1 },
 	ID_FILTERED(CTR_EL0, ctr_el0,
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH v2 5/5] KVM: arm64: selftests: Add a test for FEAT_IDST
  2025-11-26 15:59 [PATCH v2 0/5] KVM: arm64: Add support for FEAT_IDST Marc Zyngier
                   ` (3 preceding siblings ...)
  2025-11-26 15:59 ` [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome Marc Zyngier
@ 2025-11-26 15:59 ` Marc Zyngier
  2025-11-27 16:38 ` [PATCH v2 0/5] KVM: arm64: Add support " Marc Zyngier
  5 siblings, 0 replies; 17+ messages in thread
From: Marc Zyngier @ 2025-11-26 15:59 UTC (permalink / raw)
  To: kvmarm, kvm, linux-arm-kernel
  Cc: Joey Gouly, Suzuki K Poulose, Oliver Upton, Zenghui Yu,
	Ben Horgan

Add a very basic test checking that FEAT_IDST actually works for
the {GMID,SMIDR,CSSIDR2}_EL1 registers.

Signed-off-by: Marc Zyngier <maz@kernel.org>
---
 tools/testing/selftests/kvm/Makefile.kvm      |   1 +
 .../testing/selftests/kvm/arm64/idreg-idst.c  | 117 ++++++++++++++++++
 2 files changed, 118 insertions(+)
 create mode 100644 tools/testing/selftests/kvm/arm64/idreg-idst.c

diff --git a/tools/testing/selftests/kvm/Makefile.kvm b/tools/testing/selftests/kvm/Makefile.kvm
index 148d427ff24be..fa44e6d9afc35 100644
--- a/tools/testing/selftests/kvm/Makefile.kvm
+++ b/tools/testing/selftests/kvm/Makefile.kvm
@@ -171,6 +171,7 @@ TEST_GEN_PROGS_arm64 += arm64/vgic_irq
 TEST_GEN_PROGS_arm64 += arm64/vgic_lpi_stress
 TEST_GEN_PROGS_arm64 += arm64/vpmu_counter_access
 TEST_GEN_PROGS_arm64 += arm64/no-vgic-v3
+TEST_GEN_PROGS_arm64 += arm64/idreg-idst
 TEST_GEN_PROGS_arm64 += arm64/kvm-uuid
 TEST_GEN_PROGS_arm64 += access_tracking_perf_test
 TEST_GEN_PROGS_arm64 += arch_timer
diff --git a/tools/testing/selftests/kvm/arm64/idreg-idst.c b/tools/testing/selftests/kvm/arm64/idreg-idst.c
new file mode 100644
index 0000000000000..9ca9f125abdb7
--- /dev/null
+++ b/tools/testing/selftests/kvm/arm64/idreg-idst.c
@@ -0,0 +1,117 @@
+// SPDX-License-Identifier: GPL-2.0
+
+/*
+ * Access all FEAT_IDST-handled registers that depend on more than
+ * just FEAT_AA64, and fail if we don't get an a trap with an 0x18 EC.
+ */
+
+#include <test_util.h>
+#include <kvm_util.h>
+#include <processor.h>
+
+static volatile bool sys64, undef;
+
+#define __check_sr_read(r)					\
+	({							\
+		uint64_t val;					\
+								\
+		sys64 = false;					\
+		undef = false;					\
+		dsb(sy);					\
+		val = read_sysreg_s(SYS_ ## r);			\
+		val;						\
+	})
+
+/* Fatal checks */
+#define check_sr_read(r)					\
+	do {							\
+		__check_sr_read(r);				\
+		__GUEST_ASSERT(!undef, #r " unexpected UNDEF");	\
+		__GUEST_ASSERT(sys64, #r " didn't trap");	\
+	} while(0)
+
+
+static void guest_code(void)
+{
+	check_sr_read(CCSIDR2_EL1);
+	check_sr_read(SMIDR_EL1);
+	check_sr_read(GMID_EL1);
+
+	GUEST_DONE();
+}
+
+static void guest_sys64_handler(struct ex_regs *regs)
+{
+	sys64 = true;
+	undef = false;
+	regs->pc += 4;
+}
+
+static void guest_undef_handler(struct ex_regs *regs)
+{
+	sys64 = false;
+	undef = true;
+	regs->pc += 4;
+}
+
+static void test_run_vcpu(struct kvm_vcpu *vcpu)
+{
+	struct ucall uc;
+
+	do {
+		vcpu_run(vcpu);
+
+		switch (get_ucall(vcpu, &uc)) {
+		case UCALL_ABORT:
+			REPORT_GUEST_ASSERT(uc);
+			break;
+		case UCALL_PRINTF:
+			printf("%s", uc.buffer);
+			break;
+		case UCALL_DONE:
+			break;
+		default:
+			TEST_FAIL("Unknown ucall %lu", uc.cmd);
+		}
+	} while (uc.cmd != UCALL_DONE);
+}
+
+static void test_guest_feat_idst(void)
+{
+	struct kvm_vcpu *vcpu;
+	struct kvm_vm *vm;
+
+	/* This VM has no MTE, no SME, no CCIDX */
+	vm = vm_create_with_one_vcpu(&vcpu, guest_code);
+
+	vm_init_descriptor_tables(vm);
+	vcpu_init_descriptor_tables(vcpu);
+
+	vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT,
+				ESR_ELx_EC_SYS64, guest_sys64_handler);
+	vm_install_sync_handler(vm, VECTOR_SYNC_CURRENT,
+				ESR_ELx_EC_UNKNOWN, guest_undef_handler);
+
+	test_run_vcpu(vcpu);
+
+	kvm_vm_free(vm);
+}
+
+int main(int argc, char *argv[])
+{
+	struct kvm_vcpu *vcpu;
+	struct kvm_vm *vm;
+	uint64_t mmfr2;
+
+	test_disable_default_vgic();
+
+	vm = vm_create_with_one_vcpu(&vcpu, NULL);
+	mmfr2 = vcpu_get_reg(vcpu, KVM_ARM64_SYS_REG(SYS_ID_AA64MMFR2_EL1));
+	__TEST_REQUIRE(FIELD_GET(ID_AA64MMFR2_EL1_IDS, mmfr2) > 0,
+		       "FEAT_IDST not supported");
+	kvm_vm_free(vm);
+
+	test_guest_feat_idst();
+
+	return 0;
+}
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 3/5] KVM: arm64: Add a generic synchronous exception injection primitive
  2025-11-26 15:59 ` [PATCH v2 3/5] KVM: arm64: Add a generic synchronous exception injection primitive Marc Zyngier
@ 2025-11-26 16:58   ` Ben Horgan
  2025-11-27  5:57   ` Yao Yuan
  1 sibling, 0 replies; 17+ messages in thread
From: Ben Horgan @ 2025-11-26 16:58 UTC (permalink / raw)
  To: Marc Zyngier, kvmarm, kvm, linux-arm-kernel
  Cc: Joey Gouly, Suzuki K Poulose, Oliver Upton, Zenghui Yu

Hi Marc,

On 11/26/25 15:59, Marc Zyngier wrote:
> Maybe in a surprising way, we don't currently have a generic way
> to inject a synchronous exception at the EL the vcpu is currently
> running at.
> 
> Extract such primitive from the UNDEF injection code.
> 
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> ---
>  arch/arm64/include/asm/kvm_emulate.h |  1 +
>  arch/arm64/kvm/inject_fault.c        | 10 +++++++---
>  2 files changed, 8 insertions(+), 3 deletions(-)

LGTM.

Reviewed-by: Ben Horgan <ben.horgan@arm.com>

Thanks,

Ben





^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome
  2025-11-26 15:59 ` [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome Marc Zyngier
@ 2025-11-26 17:10   ` Ben Horgan
  2025-11-26 17:14     ` Ben Horgan
  2025-11-27  6:07   ` Yao Yuan
  1 sibling, 1 reply; 17+ messages in thread
From: Ben Horgan @ 2025-11-26 17:10 UTC (permalink / raw)
  To: Marc Zyngier, kvmarm, kvm, linux-arm-kernel
  Cc: Joey Gouly, Suzuki K Poulose, Oliver Upton, Zenghui Yu

Hi Marc,

On 11/26/25 15:59, Marc Zyngier wrote:
> With FEAT_IDST, unimplemented system registers in the feature ID space
> must be reported using EC=0x18 at the closest handling EL, rather than
> with an UNDEF.
> 
> Most of these system registers are always implemented thanks to their
> dependency on FEAT_AA64, except for a set of (currently) three registers:
> GMID_EL1 (depending on MTE2), CCSIDR2_EL1 (depending on FEAT_CCIDX),
> and SMIDR_EL1 (depending on SME).
> 
> For these three registers, report their trap as EC=0x18 if they
> end-up trapping into KVM and that FEAT_IDST is not implemented in the
> guest. Otherwise, just make them UNDEF.

Missed it before but there is a stray 'not' in there. You get the
EC=0x18 trap if FEAT_IDST is implemented.

> 
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> ---
>  arch/arm64/kvm/sys_regs.c | 16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)

The code looks good.

Reviewed-by: Ben Horgan

Thanks,

Ben



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome
  2025-11-26 17:10   ` Ben Horgan
@ 2025-11-26 17:14     ` Ben Horgan
  0 siblings, 0 replies; 17+ messages in thread
From: Ben Horgan @ 2025-11-26 17:14 UTC (permalink / raw)
  To: Marc Zyngier, kvmarm, kvm, linux-arm-kernel
  Cc: Joey Gouly, Suzuki K Poulose, Oliver Upton, Zenghui Yu



On 11/26/25 17:10, Ben Horgan wrote:
> Hi Marc,
> 
> On 11/26/25 15:59, Marc Zyngier wrote:
>> With FEAT_IDST, unimplemented system registers in the feature ID space
>> must be reported using EC=0x18 at the closest handling EL, rather than
>> with an UNDEF.
>>
>> Most of these system registers are always implemented thanks to their
>> dependency on FEAT_AA64, except for a set of (currently) three registers:
>> GMID_EL1 (depending on MTE2), CCSIDR2_EL1 (depending on FEAT_CCIDX),
>> and SMIDR_EL1 (depending on SME).
>>
>> For these three registers, report their trap as EC=0x18 if they
>> end-up trapping into KVM and that FEAT_IDST is not implemented in the
>> guest. Otherwise, just make them UNDEF.
> 
> Missed it before but there is a stray 'not' in there. You get the
> EC=0x18 trap if FEAT_IDST is implemented.
> 
>>
>> Signed-off-by: Marc Zyngier <maz@kernel.org>
>> ---
>>  arch/arm64/kvm/sys_regs.c | 16 +++++++++++++---
>>  1 file changed, 13 insertions(+), 3 deletions(-)
> 
> The code looks good.
> 
> Reviewed-by: Ben Horgan

Just to complete that tag.

Reviewed-by: Ben Horgan <ben.horgan@arm.com>

> 
> Thanks,
> 
> Ben
> 
> 

-- 
Thanks,

Ben



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 2/5] KVM: arm64: Force trap of GMID_EL1 when the guest doesn't have MTE
  2025-11-26 15:59 ` [PATCH v2 2/5] KVM: arm64: Force trap of GMID_EL1 when the guest doesn't have MTE Marc Zyngier
@ 2025-11-27  5:52   ` Yao Yuan
  2025-11-27  6:37   ` Oliver Upton
  1 sibling, 0 replies; 17+ messages in thread
From: Yao Yuan @ 2025-11-27  5:52 UTC (permalink / raw)
  To: Marc Zyngier
  Cc: kvmarm, kvm, linux-arm-kernel, Joey Gouly, Suzuki K Poulose,
	Oliver Upton, Zenghui Yu, Ben Horgan

Hi Marc,

On Wed, Nov 26, 2025 at 03:59:48PM +0800, Marc Zyngier wrote:
> If our host has MTE, but the guest doesn't, make sure we set HCR_EL2.TID5
> to force GMID_EL1 being trapped.
>
> Reviewed-by: Joey Gouly <joey.gouly@arm.com>
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> ---
>  arch/arm64/kvm/sys_regs.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index 9e4c46fbfd802..2ca6862e935b5 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -5561,6 +5561,8 @@ static void vcpu_set_hcr(struct kvm_vcpu *vcpu)
>
>  	if (kvm_has_mte(vcpu->kvm))
>  		vcpu->arch.hcr_el2 |= HCR_ATA;
> +	else if (id_aa64pfr1_mte(read_sanitised_ftr_reg(SYS_ID_AA64PFR1_EL1)))
> +		vcpu->arch.hcr_el2 |= HCR_TID5;

Reviewed-by: Yuan Yao <yaoyuan@linux.alibaba.com>

>
>  	/*
>  	 * In the absence of FGT, we cannot independently trap TLBI
> --
> 2.47.3
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 3/5] KVM: arm64: Add a generic synchronous exception injection primitive
  2025-11-26 15:59 ` [PATCH v2 3/5] KVM: arm64: Add a generic synchronous exception injection primitive Marc Zyngier
  2025-11-26 16:58   ` Ben Horgan
@ 2025-11-27  5:57   ` Yao Yuan
  1 sibling, 0 replies; 17+ messages in thread
From: Yao Yuan @ 2025-11-27  5:57 UTC (permalink / raw)
  To: Marc Zyngier
  Cc: kvmarm, kvm, linux-arm-kernel, Joey Gouly, Suzuki K Poulose,
	Oliver Upton, Zenghui Yu, Ben Horgan

On Wed, Nov 26, 2025 at 03:59:49PM +0800, Marc Zyngier wrote:
> Maybe in a surprising way, we don't currently have a generic way
> to inject a synchronous exception at the EL the vcpu is currently
> running at.

Hi Marc,

Thanks for bring this in generic way.

Reviewed-by: Yuan Yao <yaoyuan@linux.alibaba.com>

>
> Extract such primitive from the UNDEF injection code.
>
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> ---
>  arch/arm64/include/asm/kvm_emulate.h |  1 +
>  arch/arm64/kvm/inject_fault.c        | 10 +++++++---
>  2 files changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h
> index c9eab316398e2..df20d47f0d256 100644
> --- a/arch/arm64/include/asm/kvm_emulate.h
> +++ b/arch/arm64/include/asm/kvm_emulate.h
> @@ -45,6 +45,7 @@ bool kvm_condition_valid32(const struct kvm_vcpu *vcpu);
>  void kvm_skip_instr32(struct kvm_vcpu *vcpu);
>
>  void kvm_inject_undefined(struct kvm_vcpu *vcpu);
> +void kvm_inject_sync(struct kvm_vcpu *vcpu, u64 esr);
>  int kvm_inject_serror_esr(struct kvm_vcpu *vcpu, u64 esr);
>  int kvm_inject_sea(struct kvm_vcpu *vcpu, bool iabt, u64 addr);
>  void kvm_inject_size_fault(struct kvm_vcpu *vcpu);
> diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c
> index dfcd66c655179..7102424a3fa5e 100644
> --- a/arch/arm64/kvm/inject_fault.c
> +++ b/arch/arm64/kvm/inject_fault.c
> @@ -162,12 +162,16 @@ static void inject_abt64(struct kvm_vcpu *vcpu, bool is_iabt, unsigned long addr
>  	vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu));
>  }
>
> +void kvm_inject_sync(struct kvm_vcpu *vcpu, u64 esr)
> +{
> +	pend_sync_exception(vcpu);
> +	vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu));
> +}
> +
>  static void inject_undef64(struct kvm_vcpu *vcpu)
>  {
>  	u64 esr = (ESR_ELx_EC_UNKNOWN << ESR_ELx_EC_SHIFT);
>
> -	pend_sync_exception(vcpu);
> -
>  	/*
>  	 * Build an unknown exception, depending on the instruction
>  	 * set.
> @@ -175,7 +179,7 @@ static void inject_undef64(struct kvm_vcpu *vcpu)
>  	if (kvm_vcpu_trap_il_is32bit(vcpu))
>  		esr |= ESR_ELx_IL;
>
> -	vcpu_write_sys_reg(vcpu, esr, exception_esr_elx(vcpu));
> +	kvm_inject_sync(vcpu, esr);
>  }
>
>  #define DFSR_FSC_EXTABT_LPAE	0x10
> --
> 2.47.3
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome
  2025-11-26 15:59 ` [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome Marc Zyngier
  2025-11-26 17:10   ` Ben Horgan
@ 2025-11-27  6:07   ` Yao Yuan
  2025-11-27  6:43     ` Oliver Upton
  1 sibling, 1 reply; 17+ messages in thread
From: Yao Yuan @ 2025-11-27  6:07 UTC (permalink / raw)
  To: Marc Zyngier
  Cc: kvmarm, kvm, linux-arm-kernel, Joey Gouly, Suzuki K Poulose,
	Oliver Upton, Zenghui Yu, Ben Horgan

On Wed, Nov 26, 2025 at 03:59:50PM +0800, Marc Zyngier wrote:
> With FEAT_IDST, unimplemented system registers in the feature ID space
> must be reported using EC=0x18 at the closest handling EL, rather than
> with an UNDEF.
>
> Most of these system registers are always implemented thanks to their
> dependency on FEAT_AA64, except for a set of (currently) three registers:
> GMID_EL1 (depending on MTE2), CCSIDR2_EL1 (depending on FEAT_CCIDX),
> and SMIDR_EL1 (depending on SME).
>
> For these three registers, report their trap as EC=0x18 if they
> end-up trapping into KVM and that FEAT_IDST is not implemented in the
> guest. Otherwise, just make them UNDEF.
>
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> ---
>  arch/arm64/kvm/sys_regs.c | 16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index 2ca6862e935b5..7705f703e7c6d 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -82,6 +82,16 @@ static bool write_to_read_only(struct kvm_vcpu *vcpu,
>  			"sys_reg write to read-only register");
>  }
>
> +static bool idst_access(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
> +			const struct sys_reg_desc *r)
> +{
> +	if (kvm_has_feat_enum(vcpu->kvm, ID_AA64MMFR2_EL1, IDS, 0x0))

Hi Marc,

Minor: maybe beter readability if use NI instead of 0x0, just like
things in feat_nv2() below, but depends on you.

static bool feat_nv2(struct kvm *kvm)
{
	return ((kvm_has_feat(kvm, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY) &&
		 kvm_has_feat_enum(kvm, ID_AA64MMFR2_EL1, NV, NI)) ||
		kvm_has_feat(kvm, ID_AA64MMFR2_EL1, NV, NV2));
}


For others(except the "not" mentioned by Ben):

Reviewed-by: Yuan Yao <yaoyuan@linux.alibaba.com>

> +		return undef_access(vcpu, p, r);
> +
> +	kvm_inject_sync(vcpu, kvm_vcpu_get_esr(vcpu));
> +	return false;
> +}
> +
>  enum sr_loc_attr {
>  	SR_LOC_MEMORY	= 0,	  /* Register definitely in memory */
>  	SR_LOC_LOADED	= BIT(0), /* Register on CPU, unless it cannot */
> @@ -3399,9 +3409,9 @@ static const struct sys_reg_desc sys_reg_descs[] = {
>  	{ SYS_DESC(SYS_CCSIDR_EL1), access_ccsidr },
>  	{ SYS_DESC(SYS_CLIDR_EL1), access_clidr, reset_clidr, CLIDR_EL1,
>  	  .set_user = set_clidr, .val = ~CLIDR_EL1_RES0 },
> -	{ SYS_DESC(SYS_CCSIDR2_EL1), undef_access },
> -	{ SYS_DESC(SYS_GMID_EL1), undef_access },
> -	{ SYS_DESC(SYS_SMIDR_EL1), undef_access },
> +	{ SYS_DESC(SYS_CCSIDR2_EL1), idst_access },
> +	{ SYS_DESC(SYS_GMID_EL1), idst_access },
> +	{ SYS_DESC(SYS_SMIDR_EL1), idst_access },
>  	IMPLEMENTATION_ID(AIDR_EL1, GENMASK_ULL(63, 0)),
>  	{ SYS_DESC(SYS_CSSELR_EL1), access_csselr, reset_unknown, CSSELR_EL1 },
>  	ID_FILTERED(CTR_EL0, ctr_el0,
> --
> 2.47.3
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 2/5] KVM: arm64: Force trap of GMID_EL1 when the guest doesn't have MTE
  2025-11-26 15:59 ` [PATCH v2 2/5] KVM: arm64: Force trap of GMID_EL1 when the guest doesn't have MTE Marc Zyngier
  2025-11-27  5:52   ` Yao Yuan
@ 2025-11-27  6:37   ` Oliver Upton
  2025-11-27 16:31     ` Marc Zyngier
  1 sibling, 1 reply; 17+ messages in thread
From: Oliver Upton @ 2025-11-27  6:37 UTC (permalink / raw)
  To: Marc Zyngier
  Cc: kvmarm, kvm, linux-arm-kernel, Joey Gouly, Suzuki K Poulose,
	Zenghui Yu, Ben Horgan

On Wed, Nov 26, 2025 at 03:59:48PM +0000, Marc Zyngier wrote:
> If our host has MTE, but the guest doesn't, make sure we set HCR_EL2.TID5
> to force GMID_EL1 being trapped.
> 
> Reviewed-by: Joey Gouly <joey.gouly@arm.com>
> Signed-off-by: Marc Zyngier <maz@kernel.org>
> ---
>  arch/arm64/kvm/sys_regs.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index 9e4c46fbfd802..2ca6862e935b5 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -5561,6 +5561,8 @@ static void vcpu_set_hcr(struct kvm_vcpu *vcpu)
>  
>  	if (kvm_has_mte(vcpu->kvm))
>  		vcpu->arch.hcr_el2 |= HCR_ATA;
> +	else if (id_aa64pfr1_mte(read_sanitised_ftr_reg(SYS_ID_AA64PFR1_EL1)))

This helper is ugly!

> +		vcpu->arch.hcr_el2 |= HCR_TID5;

How about setting the trap unconditionally when !kvm_has_mte()? Even in
the case of asymmetry we'd want GMID_EL1 to trap.

Thanks,
Oliver


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome
  2025-11-27  6:07   ` Yao Yuan
@ 2025-11-27  6:43     ` Oliver Upton
  2025-11-27 16:35       ` Marc Zyngier
  0 siblings, 1 reply; 17+ messages in thread
From: Oliver Upton @ 2025-11-27  6:43 UTC (permalink / raw)
  To: Yao Yuan
  Cc: Marc Zyngier, kvmarm, kvm, linux-arm-kernel, Joey Gouly,
	Suzuki K Poulose, Zenghui Yu, Ben Horgan

On Thu, Nov 27, 2025 at 02:07:08PM +0800, Yao Yuan wrote:
> On Wed, Nov 26, 2025 at 03:59:50PM +0800, Marc Zyngier wrote:
> > With FEAT_IDST, unimplemented system registers in the feature ID space
> > must be reported using EC=0x18 at the closest handling EL, rather than
> > with an UNDEF.
> >
> > Most of these system registers are always implemented thanks to their
> > dependency on FEAT_AA64, except for a set of (currently) three registers:
> > GMID_EL1 (depending on MTE2), CCSIDR2_EL1 (depending on FEAT_CCIDX),
> > and SMIDR_EL1 (depending on SME).
> >
> > For these three registers, report their trap as EC=0x18 if they
> > end-up trapping into KVM and that FEAT_IDST is not implemented in the
> > guest. Otherwise, just make them UNDEF.
> >
> > Signed-off-by: Marc Zyngier <maz@kernel.org>
> > ---
> >  arch/arm64/kvm/sys_regs.c | 16 +++++++++++++---
> >  1 file changed, 13 insertions(+), 3 deletions(-)
> >
> > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> > index 2ca6862e935b5..7705f703e7c6d 100644
> > --- a/arch/arm64/kvm/sys_regs.c
> > +++ b/arch/arm64/kvm/sys_regs.c
> > @@ -82,6 +82,16 @@ static bool write_to_read_only(struct kvm_vcpu *vcpu,
> >  			"sys_reg write to read-only register");
> >  }
> >
> > +static bool idst_access(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
> > +			const struct sys_reg_desc *r)
> > +{
> > +	if (kvm_has_feat_enum(vcpu->kvm, ID_AA64MMFR2_EL1, IDS, 0x0))
> 
> Hi Marc,
> 
> Minor: maybe beter readability if use NI instead of 0x0, just like
> things in feat_nv2() below, but depends on you.

+1, using the ESR value as an identifier in the sysreg tables is just
terrible. This reads like a literal.

Thanks,
Oliver


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 2/5] KVM: arm64: Force trap of GMID_EL1 when the guest doesn't have MTE
  2025-11-27  6:37   ` Oliver Upton
@ 2025-11-27 16:31     ` Marc Zyngier
  0 siblings, 0 replies; 17+ messages in thread
From: Marc Zyngier @ 2025-11-27 16:31 UTC (permalink / raw)
  To: Oliver Upton
  Cc: kvmarm, kvm, linux-arm-kernel, Joey Gouly, Suzuki K Poulose,
	Zenghui Yu, Ben Horgan

On Thu, 27 Nov 2025 06:37:13 +0000,
Oliver Upton <oupton@kernel.org> wrote:
> 
> On Wed, Nov 26, 2025 at 03:59:48PM +0000, Marc Zyngier wrote:
> > If our host has MTE, but the guest doesn't, make sure we set HCR_EL2.TID5
> > to force GMID_EL1 being trapped.
> > 
> > Reviewed-by: Joey Gouly <joey.gouly@arm.com>
> > Signed-off-by: Marc Zyngier <maz@kernel.org>
> > ---
> >  arch/arm64/kvm/sys_regs.c | 2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> > index 9e4c46fbfd802..2ca6862e935b5 100644
> > --- a/arch/arm64/kvm/sys_regs.c
> > +++ b/arch/arm64/kvm/sys_regs.c
> > @@ -5561,6 +5561,8 @@ static void vcpu_set_hcr(struct kvm_vcpu *vcpu)
> >  
> >  	if (kvm_has_mte(vcpu->kvm))
> >  		vcpu->arch.hcr_el2 |= HCR_ATA;
> > +	else if (id_aa64pfr1_mte(read_sanitised_ftr_reg(SYS_ID_AA64PFR1_EL1)))
> 
> This helper is ugly!

You think? :D

> 
> > +		vcpu->arch.hcr_el2 |= HCR_TID5;
> 
> How about setting the trap unconditionally when !kvm_has_mte()? Even in
> the case of asymmetry we'd want GMID_EL1 to trap.

Yup, that's a good point. I'll fix that.

	M.

-- 
Without deviation from the norm, progress is not possible.


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome
  2025-11-27  6:43     ` Oliver Upton
@ 2025-11-27 16:35       ` Marc Zyngier
  0 siblings, 0 replies; 17+ messages in thread
From: Marc Zyngier @ 2025-11-27 16:35 UTC (permalink / raw)
  To: Oliver Upton
  Cc: Yao Yuan, kvmarm, kvm, linux-arm-kernel, Joey Gouly,
	Suzuki K Poulose, Zenghui Yu, Ben Horgan

On Thu, 27 Nov 2025 06:43:51 +0000,
Oliver Upton <oupton@kernel.org> wrote:
> 
> On Thu, Nov 27, 2025 at 02:07:08PM +0800, Yao Yuan wrote:
> > On Wed, Nov 26, 2025 at 03:59:50PM +0800, Marc Zyngier wrote:
> > > With FEAT_IDST, unimplemented system registers in the feature ID space
> > > must be reported using EC=0x18 at the closest handling EL, rather than
> > > with an UNDEF.
> > >
> > > Most of these system registers are always implemented thanks to their
> > > dependency on FEAT_AA64, except for a set of (currently) three registers:
> > > GMID_EL1 (depending on MTE2), CCSIDR2_EL1 (depending on FEAT_CCIDX),
> > > and SMIDR_EL1 (depending on SME).
> > >
> > > For these three registers, report their trap as EC=0x18 if they
> > > end-up trapping into KVM and that FEAT_IDST is not implemented in the
> > > guest. Otherwise, just make them UNDEF.
> > >
> > > Signed-off-by: Marc Zyngier <maz@kernel.org>
> > > ---
> > >  arch/arm64/kvm/sys_regs.c | 16 +++++++++++++---
> > >  1 file changed, 13 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> > > index 2ca6862e935b5..7705f703e7c6d 100644
> > > --- a/arch/arm64/kvm/sys_regs.c
> > > +++ b/arch/arm64/kvm/sys_regs.c
> > > @@ -82,6 +82,16 @@ static bool write_to_read_only(struct kvm_vcpu *vcpu,
> > >  			"sys_reg write to read-only register");
> > >  }
> > >
> > > +static bool idst_access(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
> > > +			const struct sys_reg_desc *r)
> > > +{
> > > +	if (kvm_has_feat_enum(vcpu->kvm, ID_AA64MMFR2_EL1, IDS, 0x0))
> > 
> > Hi Marc,
> > 
> > Minor: maybe beter readability if use NI instead of 0x0, just like
> > things in feat_nv2() below, but depends on you.
> 
> +1, using the ESR value as an identifier in the sysreg tables is just
> terrible. This reads like a literal.

Yeah, I was a bit shocked when I found how it was encoded in the
sysreg file, but kept it as is. Since there is a consensus that this
is pretty lame, I'll add a patch repainting it using the usual NI/IMP
identifiers.

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH v2 0/5] KVM: arm64: Add support for FEAT_IDST
  2025-11-26 15:59 [PATCH v2 0/5] KVM: arm64: Add support for FEAT_IDST Marc Zyngier
                   ` (4 preceding siblings ...)
  2025-11-26 15:59 ` [PATCH v2 5/5] KVM: arm64: selftests: Add a test for FEAT_IDST Marc Zyngier
@ 2025-11-27 16:38 ` Marc Zyngier
  5 siblings, 0 replies; 17+ messages in thread
From: Marc Zyngier @ 2025-11-27 16:38 UTC (permalink / raw)
  To: kvmarm, kvm, linux-arm-kernel
  Cc: Joey Gouly, Suzuki K Poulose, Oliver Upton, Zenghui Yu,
	Ben Horgan

On Wed, 26 Nov 2025 15:59:46 +0000,
Marc Zyngier <maz@kernel.org> wrote:
> 
> FEAT_IDST appeared in ARMv8.4, and allows ID registers to be trapped
> if they are not implemented. This only concerns 3 registers (GMID_EL1,
> CCSIDR2_EL1 and SMIDR_EL1), which are part of features that may not be
> exposed to the guest even if present on the host.
> 
> For these registers, the HW should report them with EC=0x18, even if
> the feature isn't implemented.
> 
> Add support for this feature by handling these registers in a specific
> way and implementing GMID_EL1 support in the process. A very basic
> selftest checks that these registers behave as expected.

Except that said selftest indicates that pKVM doesn't do the right
thing and requires similar rework. I now have some patches to address
it, and will repost the series sometime next week.

	M.

-- 
Without deviation from the norm, progress is not possible.


^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2025-11-27 16:38 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-26 15:59 [PATCH v2 0/5] KVM: arm64: Add support for FEAT_IDST Marc Zyngier
2025-11-26 15:59 ` [PATCH v2 1/5] KVM: arm64: Add routing/handling for GMID_EL1 Marc Zyngier
2025-11-26 15:59 ` [PATCH v2 2/5] KVM: arm64: Force trap of GMID_EL1 when the guest doesn't have MTE Marc Zyngier
2025-11-27  5:52   ` Yao Yuan
2025-11-27  6:37   ` Oliver Upton
2025-11-27 16:31     ` Marc Zyngier
2025-11-26 15:59 ` [PATCH v2 3/5] KVM: arm64: Add a generic synchronous exception injection primitive Marc Zyngier
2025-11-26 16:58   ` Ben Horgan
2025-11-27  5:57   ` Yao Yuan
2025-11-26 15:59 ` [PATCH v2 4/5] KVM: arm64: Report optional ID register traps with a 0x18 syndrome Marc Zyngier
2025-11-26 17:10   ` Ben Horgan
2025-11-26 17:14     ` Ben Horgan
2025-11-27  6:07   ` Yao Yuan
2025-11-27  6:43     ` Oliver Upton
2025-11-27 16:35       ` Marc Zyngier
2025-11-26 15:59 ` [PATCH v2 5/5] KVM: arm64: selftests: Add a test for FEAT_IDST Marc Zyngier
2025-11-27 16:38 ` [PATCH v2 0/5] KVM: arm64: Add support " Marc Zyngier

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).