Hi Sebastian On 7/2/26 3:36 PM, Sebastian Ott wrote: > From: Cornelia Huck <[email protected]> > > We now have the infrastructure in place to handle demuxed ID registers > from kvm. Use it to get the values that kvm emulates for CCSIDR_EL1.
I wonder whether that patch is needed at this point. Were previous ccsidr[i] initialized from KVM before? What is the actual motivation to read them in this series. Doesn't it bring the risk to expose new values to the guest? For instance, in [RFC PATCH v6 11/17] arm/kvm: Initialize all writable ID registers from host, I generalized the initialization of all writable id regs and I noticed that the new initialization of CLIDR from KVM broke the execution (which is not the case for the CCSIDR because I did it a try) because CLIDR was previously uninitialized and null. Thanks Eric > > Tested-by: Alireza Sanaee <[email protected]> > Signed-off-by: Cornelia Huck <[email protected]> > Signed-off-by: Sebastian Ott <[email protected]> > --- > target/arm/kvm.c | 31 +++++++++++++++++++++++++++++++ > 1 file changed, 31 insertions(+) > > diff --git a/target/arm/kvm.c b/target/arm/kvm.c > index a54ef51ec2..f57e86b441 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -244,6 +244,33 @@ static int get_host_cpu_reg(int fd, ARMHostCPUFeatures > *ahcf, > return ret; > } > > + > +/* CSSELR values supported by kvm; used to index KVM_REG_ARM_DEMUX_ID_CCSIDR > */ > +#define CSSELR_MAX 14 > + > +static int get_host_cpu_reg_demux(int fd, ARMHostCPUFeatures *ahcf, > + ARMIDRegisterIdx index, int subindex) > +{ > + > + struct kvm_one_reg one_reg = { > + .id = KVM_REG_ARM64 | KsVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX, > + }; > + > + switch (index) { > + case CCSIDR_EL1_IDX: > + if (subindex >= CSSELR_MAX) { > + return -EINVAL; > + } > + one_reg.id |= KVM_REG_ARM_DEMUX_ID_CCSIDR | subindex; > + one_reg.addr = (uintptr_t)&ahcf->isar.idregs[index + subindex]; > + break; > + default: > + return -EINVAL; > + } > + > + return ioctl(fd, KVM_GET_ONE_REG, &one_reg); > +} > + > static uint32_t kvm_arm_sve_get_vls(int fd) > { > uint64_t vls[KVM_ARM64_SVE_VLS_WORDS]; > @@ -454,6 +481,10 @@ static void > kvm_arm_get_host_cpu_features(ARMHostCPUFeatures *ahcf) > /* Read the set of supported vector lengths. */ > arm_host_cpu_features.sve_vq_supported = kvm_arm_sve_get_vls(fd); > } > + /* Grab demuxed registers. */ > + for (int i = 0; i < CSSELR_MAX; i++) { > + err |= get_host_cpu_reg_demux(fd, ahcf, CCSIDR_EL1_IDX, i); > + } > } > > kvm_arm_destroy_scratch_host_vcpu(fdarray);
