KVM: riscv: selftests: Selectively filter-out AIA registers

Currently the AIA ONE_REG registers are reported by get-reg-list
as new registers for various vcpu_reg_list configs whenever Ssaia
is available on the host because Ssaia extension can only be
disabled by Smstateen extension which is not always available.

To tackle this, we should filter-out AIA ONE_REG registers only
when Ssaia can't be disabled for a VCPU.

Fixes: 477069398ed6 ("KVM: riscv: selftests: Add get-reg-list test")
Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Signed-off-by: Anup Patel <anup@brainfault.org>

authored by Anup Patel and committed by Anup Patel 071ef070 ba1af6e2

Changed files
+21 -2
tools
testing
selftests
kvm
+21 -2
tools/testing/selftests/kvm/riscv/get-reg-list.c
··· 12 13 #define REG_MASK (KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK) 14 15 bool filter_reg(__u64 reg) 16 { 17 switch (reg & ~REG_MASK) { ··· 50 case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZIFENCEI: 51 case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZIHPM: 52 return true; 53 default: 54 break; 55 } ··· 82 83 void finalize_vcpu(struct kvm_vcpu *vcpu, struct vcpu_reg_list *c) 84 { 85 struct vcpu_reg_sublist *s; 86 87 /* 88 * Disable all extensions which were enabled by default 89 * if they were available in the risc-v host. 90 */ 91 - for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) 92 - __vcpu_set_reg(vcpu, RISCV_ISA_EXT_REG(i), 0); 93 94 for_each_sublist(c, s) { 95 if (!s->feature)
··· 12 13 #define REG_MASK (KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK) 14 15 + static bool isa_ext_cant_disable[KVM_RISCV_ISA_EXT_MAX]; 16 + 17 bool filter_reg(__u64 reg) 18 { 19 switch (reg & ~REG_MASK) { ··· 48 case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZIFENCEI: 49 case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZIHPM: 50 return true; 51 + /* AIA registers are always available when Ssaia can't be disabled */ 52 + case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siselect): 53 + case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1): 54 + case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2): 55 + case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(sieh): 56 + case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siph): 57 + case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1h): 58 + case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2h): 59 + return isa_ext_cant_disable[KVM_RISCV_ISA_EXT_SSAIA]; 60 default: 61 break; 62 } ··· 71 72 void finalize_vcpu(struct kvm_vcpu *vcpu, struct vcpu_reg_list *c) 73 { 74 + unsigned long isa_ext_state[KVM_RISCV_ISA_EXT_MAX] = { 0 }; 75 struct vcpu_reg_sublist *s; 76 + int rc; 77 + 78 + for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) 79 + __vcpu_get_reg(vcpu, RISCV_ISA_EXT_REG(i), &isa_ext_state[i]); 80 81 /* 82 * Disable all extensions which were enabled by default 83 * if they were available in the risc-v host. 84 */ 85 + for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) { 86 + rc = __vcpu_set_reg(vcpu, RISCV_ISA_EXT_REG(i), 0); 87 + if (rc && isa_ext_state[i]) 88 + isa_ext_cant_disable[i] = true; 89 + } 90 91 for_each_sublist(c, s) { 92 if (!s->feature)