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