1 // SPDX-License-Identifier: GPL-2.0
3 * Check for KVM_GET_REG_LIST regressions.
5 * Copyright (c) 2023 Intel Corporation
10 #include "test_util.h"
11 #include "processor.h"
13 #define REG_MASK (KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK)
16 VCPU_FEATURE_ISA_EXT = 0,
20 static bool isa_ext_cant_disable[KVM_RISCV_ISA_EXT_MAX];
22 bool filter_reg(__u64 reg)
24 switch (reg & ~REG_MASK) {
26 * Same set of ISA_EXT registers are not present on all host because
27 * ISA_EXT registers are visible to the KVM user space based on the
28 * ISA extensions available on the host. Also, disabling an ISA
29 * extension using corresponding ISA_EXT register does not affect
30 * the visibility of the ISA_EXT register itself.
32 * Based on above, we should filter-out all ISA_EXT registers.
34 * Note: The below list is alphabetically sorted.
36 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_A:
37 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_C:
38 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_D:
39 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_F:
40 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_H:
41 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_I:
42 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_M:
43 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_V:
44 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SMSTATEEN:
45 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSAIA:
46 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSTC:
47 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVINVAL:
48 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVNAPOT:
49 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVPBMT:
50 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBA:
51 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBB:
52 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBC:
53 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBKB:
54 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBKC:
55 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBKX:
56 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBS:
57 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZFA:
58 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZFH:
59 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZFHMIN:
60 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOM:
61 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOZ:
62 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICNTR:
63 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICOND:
64 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICSR:
65 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIFENCEI:
66 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIHINTNTL:
67 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIHINTPAUSE:
68 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIHPM:
69 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKND:
70 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKNE:
71 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKNH:
72 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKR:
73 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKSED:
74 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKSH:
75 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKT:
76 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVBB:
77 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVBC:
78 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVFH:
79 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVFHMIN:
80 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKB:
81 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKG:
82 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKNED:
83 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKNHA:
84 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKNHB:
85 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKSED:
86 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKSH:
87 case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKT:
89 * Like ISA_EXT registers, SBI_EXT registers are only visible when the
90 * host supports them and disabling them does not affect the visibility
91 * of the SBI_EXT register itself.
93 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_V01:
94 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_TIME:
95 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_IPI:
96 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_RFENCE:
97 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_SRST:
98 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_HSM:
99 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_PMU:
100 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_DBCN:
101 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_STA:
102 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_EXPERIMENTAL:
103 case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_VENDOR:
105 /* AIA registers are always available when Ssaia can't be disabled */
106 case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siselect):
107 case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1):
108 case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2):
109 case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(sieh):
110 case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siph):
111 case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1h):
112 case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2h):
113 return isa_ext_cant_disable[KVM_RISCV_ISA_EXT_SSAIA];
121 bool check_reject_set(int err)
123 return err == EINVAL;
126 static bool vcpu_has_ext(struct kvm_vcpu *vcpu, uint64_t ext_id)
131 ret = __vcpu_get_reg(vcpu, ext_id, &value);
132 return (ret) ? false : !!value;
135 void finalize_vcpu(struct kvm_vcpu *vcpu, struct vcpu_reg_list *c)
137 unsigned long isa_ext_state[KVM_RISCV_ISA_EXT_MAX] = { 0 };
138 struct vcpu_reg_sublist *s;
142 for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++)
143 __vcpu_get_reg(vcpu, RISCV_ISA_EXT_REG(i), &isa_ext_state[i]);
146 * Disable all extensions which were enabled by default
147 * if they were available in the risc-v host.
149 for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
150 rc = __vcpu_set_reg(vcpu, RISCV_ISA_EXT_REG(i), 0);
151 if (rc && isa_ext_state[i])
152 isa_ext_cant_disable[i] = true;
155 for (int i = 0; i < KVM_RISCV_SBI_EXT_MAX; i++) {
156 rc = __vcpu_set_reg(vcpu, RISCV_SBI_EXT_REG(i), 0);
157 TEST_ASSERT(!rc || (rc == -1 && errno == ENOENT), "Unexpected error");
160 for_each_sublist(c, s) {
164 switch (s->feature_type) {
165 case VCPU_FEATURE_ISA_EXT:
166 feature = RISCV_ISA_EXT_REG(s->feature);
168 case VCPU_FEATURE_SBI_EXT:
169 feature = RISCV_SBI_EXT_REG(s->feature);
172 TEST_FAIL("Unknown feature type");
175 /* Try to enable the desired extension */
176 __vcpu_set_reg(vcpu, feature, 1);
178 /* Double check whether the desired extension was enabled */
179 __TEST_REQUIRE(vcpu_has_ext(vcpu, feature),
180 "%s not available, skipping tests", s->name);
184 static const char *config_id_to_str(const char *prefix, __u64 id)
186 /* reg_off is the offset into struct kvm_riscv_config */
187 __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CONFIG);
189 assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_CONFIG);
192 case KVM_REG_RISCV_CONFIG_REG(isa):
193 return "KVM_REG_RISCV_CONFIG_REG(isa)";
194 case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
195 return "KVM_REG_RISCV_CONFIG_REG(zicbom_block_size)";
196 case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):
197 return "KVM_REG_RISCV_CONFIG_REG(zicboz_block_size)";
198 case KVM_REG_RISCV_CONFIG_REG(mvendorid):
199 return "KVM_REG_RISCV_CONFIG_REG(mvendorid)";
200 case KVM_REG_RISCV_CONFIG_REG(marchid):
201 return "KVM_REG_RISCV_CONFIG_REG(marchid)";
202 case KVM_REG_RISCV_CONFIG_REG(mimpid):
203 return "KVM_REG_RISCV_CONFIG_REG(mimpid)";
204 case KVM_REG_RISCV_CONFIG_REG(satp_mode):
205 return "KVM_REG_RISCV_CONFIG_REG(satp_mode)";
208 return strdup_printf("%lld /* UNKNOWN */", reg_off);
211 static const char *core_id_to_str(const char *prefix, __u64 id)
213 /* reg_off is the offset into struct kvm_riscv_core */
214 __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CORE);
216 assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_CORE);
219 case KVM_REG_RISCV_CORE_REG(regs.pc):
220 return "KVM_REG_RISCV_CORE_REG(regs.pc)";
221 case KVM_REG_RISCV_CORE_REG(regs.ra):
222 return "KVM_REG_RISCV_CORE_REG(regs.ra)";
223 case KVM_REG_RISCV_CORE_REG(regs.sp):
224 return "KVM_REG_RISCV_CORE_REG(regs.sp)";
225 case KVM_REG_RISCV_CORE_REG(regs.gp):
226 return "KVM_REG_RISCV_CORE_REG(regs.gp)";
227 case KVM_REG_RISCV_CORE_REG(regs.tp):
228 return "KVM_REG_RISCV_CORE_REG(regs.tp)";
229 case KVM_REG_RISCV_CORE_REG(regs.t0) ... KVM_REG_RISCV_CORE_REG(regs.t2):
230 return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.t%lld)",
231 reg_off - KVM_REG_RISCV_CORE_REG(regs.t0));
232 case KVM_REG_RISCV_CORE_REG(regs.s0) ... KVM_REG_RISCV_CORE_REG(regs.s1):
233 return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.s%lld)",
234 reg_off - KVM_REG_RISCV_CORE_REG(regs.s0));
235 case KVM_REG_RISCV_CORE_REG(regs.a0) ... KVM_REG_RISCV_CORE_REG(regs.a7):
236 return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.a%lld)",
237 reg_off - KVM_REG_RISCV_CORE_REG(regs.a0));
238 case KVM_REG_RISCV_CORE_REG(regs.s2) ... KVM_REG_RISCV_CORE_REG(regs.s11):
239 return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.s%lld)",
240 reg_off - KVM_REG_RISCV_CORE_REG(regs.s2) + 2);
241 case KVM_REG_RISCV_CORE_REG(regs.t3) ... KVM_REG_RISCV_CORE_REG(regs.t6):
242 return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.t%lld)",
243 reg_off - KVM_REG_RISCV_CORE_REG(regs.t3) + 3);
244 case KVM_REG_RISCV_CORE_REG(mode):
245 return "KVM_REG_RISCV_CORE_REG(mode)";
248 return strdup_printf("%lld /* UNKNOWN */", reg_off);
251 #define RISCV_CSR_GENERAL(csr) \
252 "KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(" #csr ")"
253 #define RISCV_CSR_AIA(csr) \
254 "KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_REG(" #csr ")"
255 #define RISCV_CSR_SMSTATEEN(csr) \
256 "KVM_REG_RISCV_CSR_SMSTATEEN | KVM_REG_RISCV_CSR_REG(" #csr ")"
258 static const char *general_csr_id_to_str(__u64 reg_off)
260 /* reg_off is the offset into struct kvm_riscv_csr */
262 case KVM_REG_RISCV_CSR_REG(sstatus):
263 return RISCV_CSR_GENERAL(sstatus);
264 case KVM_REG_RISCV_CSR_REG(sie):
265 return RISCV_CSR_GENERAL(sie);
266 case KVM_REG_RISCV_CSR_REG(stvec):
267 return RISCV_CSR_GENERAL(stvec);
268 case KVM_REG_RISCV_CSR_REG(sscratch):
269 return RISCV_CSR_GENERAL(sscratch);
270 case KVM_REG_RISCV_CSR_REG(sepc):
271 return RISCV_CSR_GENERAL(sepc);
272 case KVM_REG_RISCV_CSR_REG(scause):
273 return RISCV_CSR_GENERAL(scause);
274 case KVM_REG_RISCV_CSR_REG(stval):
275 return RISCV_CSR_GENERAL(stval);
276 case KVM_REG_RISCV_CSR_REG(sip):
277 return RISCV_CSR_GENERAL(sip);
278 case KVM_REG_RISCV_CSR_REG(satp):
279 return RISCV_CSR_GENERAL(satp);
280 case KVM_REG_RISCV_CSR_REG(scounteren):
281 return RISCV_CSR_GENERAL(scounteren);
282 case KVM_REG_RISCV_CSR_REG(senvcfg):
283 return RISCV_CSR_GENERAL(senvcfg);
286 return strdup_printf("KVM_REG_RISCV_CSR_GENERAL | %lld /* UNKNOWN */", reg_off);
289 static const char *aia_csr_id_to_str(__u64 reg_off)
291 /* reg_off is the offset into struct kvm_riscv_aia_csr */
293 case KVM_REG_RISCV_CSR_AIA_REG(siselect):
294 return RISCV_CSR_AIA(siselect);
295 case KVM_REG_RISCV_CSR_AIA_REG(iprio1):
296 return RISCV_CSR_AIA(iprio1);
297 case KVM_REG_RISCV_CSR_AIA_REG(iprio2):
298 return RISCV_CSR_AIA(iprio2);
299 case KVM_REG_RISCV_CSR_AIA_REG(sieh):
300 return RISCV_CSR_AIA(sieh);
301 case KVM_REG_RISCV_CSR_AIA_REG(siph):
302 return RISCV_CSR_AIA(siph);
303 case KVM_REG_RISCV_CSR_AIA_REG(iprio1h):
304 return RISCV_CSR_AIA(iprio1h);
305 case KVM_REG_RISCV_CSR_AIA_REG(iprio2h):
306 return RISCV_CSR_AIA(iprio2h);
309 return strdup_printf("KVM_REG_RISCV_CSR_AIA | %lld /* UNKNOWN */", reg_off);
312 static const char *smstateen_csr_id_to_str(__u64 reg_off)
314 /* reg_off is the offset into struct kvm_riscv_smstateen_csr */
316 case KVM_REG_RISCV_CSR_SMSTATEEN_REG(sstateen0):
317 return RISCV_CSR_SMSTATEEN(sstateen0);
320 TEST_FAIL("Unknown smstateen csr reg: 0x%llx", reg_off);
324 static const char *csr_id_to_str(const char *prefix, __u64 id)
326 __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CSR);
327 __u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK;
329 assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_CSR);
331 reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK;
333 switch (reg_subtype) {
334 case KVM_REG_RISCV_CSR_GENERAL:
335 return general_csr_id_to_str(reg_off);
336 case KVM_REG_RISCV_CSR_AIA:
337 return aia_csr_id_to_str(reg_off);
338 case KVM_REG_RISCV_CSR_SMSTATEEN:
339 return smstateen_csr_id_to_str(reg_off);
342 return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);
345 static const char *timer_id_to_str(const char *prefix, __u64 id)
347 /* reg_off is the offset into struct kvm_riscv_timer */
348 __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_TIMER);
350 assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_TIMER);
353 case KVM_REG_RISCV_TIMER_REG(frequency):
354 return "KVM_REG_RISCV_TIMER_REG(frequency)";
355 case KVM_REG_RISCV_TIMER_REG(time):
356 return "KVM_REG_RISCV_TIMER_REG(time)";
357 case KVM_REG_RISCV_TIMER_REG(compare):
358 return "KVM_REG_RISCV_TIMER_REG(compare)";
359 case KVM_REG_RISCV_TIMER_REG(state):
360 return "KVM_REG_RISCV_TIMER_REG(state)";
363 return strdup_printf("%lld /* UNKNOWN */", reg_off);
366 static const char *fp_f_id_to_str(const char *prefix, __u64 id)
368 /* reg_off is the offset into struct __riscv_f_ext_state */
369 __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_FP_F);
371 assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_FP_F);
374 case KVM_REG_RISCV_FP_F_REG(f[0]) ...
375 KVM_REG_RISCV_FP_F_REG(f[31]):
376 return strdup_printf("KVM_REG_RISCV_FP_F_REG(f[%lld])", reg_off);
377 case KVM_REG_RISCV_FP_F_REG(fcsr):
378 return "KVM_REG_RISCV_FP_F_REG(fcsr)";
381 return strdup_printf("%lld /* UNKNOWN */", reg_off);
384 static const char *fp_d_id_to_str(const char *prefix, __u64 id)
386 /* reg_off is the offset into struct __riscv_d_ext_state */
387 __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_FP_D);
389 assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_FP_D);
392 case KVM_REG_RISCV_FP_D_REG(f[0]) ...
393 KVM_REG_RISCV_FP_D_REG(f[31]):
394 return strdup_printf("KVM_REG_RISCV_FP_D_REG(f[%lld])", reg_off);
395 case KVM_REG_RISCV_FP_D_REG(fcsr):
396 return "KVM_REG_RISCV_FP_D_REG(fcsr)";
399 return strdup_printf("%lld /* UNKNOWN */", reg_off);
402 #define KVM_ISA_EXT_ARR(ext) \
403 [KVM_RISCV_ISA_EXT_##ext] = "KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_" #ext
405 static const char *isa_ext_single_id_to_str(__u64 reg_off)
407 static const char * const kvm_isa_ext_reg_name[] = {
416 KVM_ISA_EXT_ARR(SMSTATEEN),
417 KVM_ISA_EXT_ARR(SSAIA),
418 KVM_ISA_EXT_ARR(SSTC),
419 KVM_ISA_EXT_ARR(SVINVAL),
420 KVM_ISA_EXT_ARR(SVNAPOT),
421 KVM_ISA_EXT_ARR(SVPBMT),
422 KVM_ISA_EXT_ARR(ZBA),
423 KVM_ISA_EXT_ARR(ZBB),
424 KVM_ISA_EXT_ARR(ZBC),
425 KVM_ISA_EXT_ARR(ZBKB),
426 KVM_ISA_EXT_ARR(ZBKC),
427 KVM_ISA_EXT_ARR(ZBKX),
428 KVM_ISA_EXT_ARR(ZBS),
429 KVM_ISA_EXT_ARR(ZFA),
430 KVM_ISA_EXT_ARR(ZFH),
431 KVM_ISA_EXT_ARR(ZFHMIN),
432 KVM_ISA_EXT_ARR(ZICBOM),
433 KVM_ISA_EXT_ARR(ZICBOZ),
434 KVM_ISA_EXT_ARR(ZICNTR),
435 KVM_ISA_EXT_ARR(ZICOND),
436 KVM_ISA_EXT_ARR(ZICSR),
437 KVM_ISA_EXT_ARR(ZIFENCEI),
438 KVM_ISA_EXT_ARR(ZIHINTNTL),
439 KVM_ISA_EXT_ARR(ZIHINTPAUSE),
440 KVM_ISA_EXT_ARR(ZIHPM),
441 KVM_ISA_EXT_ARR(ZKND),
442 KVM_ISA_EXT_ARR(ZKNE),
443 KVM_ISA_EXT_ARR(ZKNH),
444 KVM_ISA_EXT_ARR(ZKR),
445 KVM_ISA_EXT_ARR(ZKSED),
446 KVM_ISA_EXT_ARR(ZKSH),
447 KVM_ISA_EXT_ARR(ZKT),
448 KVM_ISA_EXT_ARR(ZVBB),
449 KVM_ISA_EXT_ARR(ZVBC),
450 KVM_ISA_EXT_ARR(ZVFH),
451 KVM_ISA_EXT_ARR(ZVFHMIN),
452 KVM_ISA_EXT_ARR(ZVKB),
453 KVM_ISA_EXT_ARR(ZVKG),
454 KVM_ISA_EXT_ARR(ZVKNED),
455 KVM_ISA_EXT_ARR(ZVKNHA),
456 KVM_ISA_EXT_ARR(ZVKNHB),
457 KVM_ISA_EXT_ARR(ZVKSED),
458 KVM_ISA_EXT_ARR(ZVKSH),
459 KVM_ISA_EXT_ARR(ZVKT),
462 if (reg_off >= ARRAY_SIZE(kvm_isa_ext_reg_name))
463 return strdup_printf("KVM_REG_RISCV_ISA_SINGLE | %lld /* UNKNOWN */", reg_off);
465 return kvm_isa_ext_reg_name[reg_off];
468 static const char *isa_ext_multi_id_to_str(__u64 reg_subtype, __u64 reg_off)
470 const char *unknown = "";
472 if (reg_off > KVM_REG_RISCV_ISA_MULTI_REG_LAST)
473 unknown = " /* UNKNOWN */";
475 switch (reg_subtype) {
476 case KVM_REG_RISCV_ISA_MULTI_EN:
477 return strdup_printf("KVM_REG_RISCV_ISA_MULTI_EN | %lld%s", reg_off, unknown);
478 case KVM_REG_RISCV_ISA_MULTI_DIS:
479 return strdup_printf("KVM_REG_RISCV_ISA_MULTI_DIS | %lld%s", reg_off, unknown);
482 return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);
485 static const char *isa_ext_id_to_str(const char *prefix, __u64 id)
487 __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_ISA_EXT);
488 __u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK;
490 assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_ISA_EXT);
492 reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK;
494 switch (reg_subtype) {
495 case KVM_REG_RISCV_ISA_SINGLE:
496 return isa_ext_single_id_to_str(reg_off);
497 case KVM_REG_RISCV_ISA_MULTI_EN:
498 case KVM_REG_RISCV_ISA_MULTI_DIS:
499 return isa_ext_multi_id_to_str(reg_subtype, reg_off);
502 return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);
505 #define KVM_SBI_EXT_ARR(ext) \
506 [ext] = "KVM_REG_RISCV_SBI_SINGLE | " #ext
508 static const char *sbi_ext_single_id_to_str(__u64 reg_off)
510 /* reg_off is KVM_RISCV_SBI_EXT_ID */
511 static const char * const kvm_sbi_ext_reg_name[] = {
512 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_V01),
513 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_TIME),
514 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_IPI),
515 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_RFENCE),
516 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_SRST),
517 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_HSM),
518 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_PMU),
519 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_STA),
520 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_EXPERIMENTAL),
521 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_VENDOR),
522 KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_DBCN),
525 if (reg_off >= ARRAY_SIZE(kvm_sbi_ext_reg_name))
526 return strdup_printf("KVM_REG_RISCV_SBI_SINGLE | %lld /* UNKNOWN */", reg_off);
528 return kvm_sbi_ext_reg_name[reg_off];
531 static const char *sbi_ext_multi_id_to_str(__u64 reg_subtype, __u64 reg_off)
533 const char *unknown = "";
535 if (reg_off > KVM_REG_RISCV_SBI_MULTI_REG_LAST)
536 unknown = " /* UNKNOWN */";
538 switch (reg_subtype) {
539 case KVM_REG_RISCV_SBI_MULTI_EN:
540 return strdup_printf("KVM_REG_RISCV_SBI_MULTI_EN | %lld%s", reg_off, unknown);
541 case KVM_REG_RISCV_SBI_MULTI_DIS:
542 return strdup_printf("KVM_REG_RISCV_SBI_MULTI_DIS | %lld%s", reg_off, unknown);
545 return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);
548 static const char *sbi_ext_id_to_str(const char *prefix, __u64 id)
550 __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_SBI_EXT);
551 __u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK;
553 assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_SBI_EXT);
555 reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK;
557 switch (reg_subtype) {
558 case KVM_REG_RISCV_SBI_SINGLE:
559 return sbi_ext_single_id_to_str(reg_off);
560 case KVM_REG_RISCV_SBI_MULTI_EN:
561 case KVM_REG_RISCV_SBI_MULTI_DIS:
562 return sbi_ext_multi_id_to_str(reg_subtype, reg_off);
565 return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);
568 static const char *sbi_sta_id_to_str(__u64 reg_off)
571 case 0: return "KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_lo)";
572 case 1: return "KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_hi)";
574 return strdup_printf("KVM_REG_RISCV_SBI_STA | %lld /* UNKNOWN */", reg_off);
577 static const char *sbi_id_to_str(const char *prefix, __u64 id)
579 __u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_SBI_STATE);
580 __u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK;
582 assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_SBI_STATE);
584 reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK;
586 switch (reg_subtype) {
587 case KVM_REG_RISCV_SBI_STA:
588 return sbi_sta_id_to_str(reg_off);
591 return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);
594 void print_reg(const char *prefix, __u64 id)
596 const char *reg_size = NULL;
598 TEST_ASSERT((id & KVM_REG_ARCH_MASK) == KVM_REG_RISCV,
599 "%s: KVM_REG_RISCV missing in reg id: 0x%llx", prefix, id);
601 switch (id & KVM_REG_SIZE_MASK) {
602 case KVM_REG_SIZE_U32:
603 reg_size = "KVM_REG_SIZE_U32";
605 case KVM_REG_SIZE_U64:
606 reg_size = "KVM_REG_SIZE_U64";
608 case KVM_REG_SIZE_U128:
609 reg_size = "KVM_REG_SIZE_U128";
612 printf("\tKVM_REG_RISCV | (%lld << KVM_REG_SIZE_SHIFT) | 0x%llx /* UNKNOWN */,\n",
613 (id & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT, id & ~REG_MASK);
617 switch (id & KVM_REG_RISCV_TYPE_MASK) {
618 case KVM_REG_RISCV_CONFIG:
619 printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_CONFIG | %s,\n",
620 reg_size, config_id_to_str(prefix, id));
622 case KVM_REG_RISCV_CORE:
623 printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_CORE | %s,\n",
624 reg_size, core_id_to_str(prefix, id));
626 case KVM_REG_RISCV_CSR:
627 printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_CSR | %s,\n",
628 reg_size, csr_id_to_str(prefix, id));
630 case KVM_REG_RISCV_TIMER:
631 printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_TIMER | %s,\n",
632 reg_size, timer_id_to_str(prefix, id));
634 case KVM_REG_RISCV_FP_F:
635 printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_FP_F | %s,\n",
636 reg_size, fp_f_id_to_str(prefix, id));
638 case KVM_REG_RISCV_FP_D:
639 printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_FP_D | %s,\n",
640 reg_size, fp_d_id_to_str(prefix, id));
642 case KVM_REG_RISCV_ISA_EXT:
643 printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_ISA_EXT | %s,\n",
644 reg_size, isa_ext_id_to_str(prefix, id));
646 case KVM_REG_RISCV_SBI_EXT:
647 printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_SBI_EXT | %s,\n",
648 reg_size, sbi_ext_id_to_str(prefix, id));
650 case KVM_REG_RISCV_SBI_STATE:
651 printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_SBI_STATE | %s,\n",
652 reg_size, sbi_id_to_str(prefix, id));
655 printf("\tKVM_REG_RISCV | %s | 0x%llx /* UNKNOWN */,\n",
656 reg_size, id & ~REG_MASK);
662 * The current blessed list was primed with the output of kernel version
663 * v6.5-rc3 and then later updated with new registers.
665 static __u64 base_regs[] = {
666 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(isa),
667 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(mvendorid),
668 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(marchid),
669 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(mimpid),
670 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(satp_mode),
671 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.pc),
672 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.ra),
673 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.sp),
674 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.gp),
675 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.tp),
676 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t0),
677 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t1),
678 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t2),
679 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s0),
680 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s1),
681 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a0),
682 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a1),
683 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a2),
684 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a3),
685 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a4),
686 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a5),
687 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a6),
688 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a7),
689 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s2),
690 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s3),
691 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s4),
692 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s5),
693 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s6),
694 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s7),
695 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s8),
696 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s9),
697 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s10),
698 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s11),
699 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t3),
700 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t4),
701 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t5),
702 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t6),
703 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(mode),
704 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sstatus),
705 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sie),
706 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(stvec),
707 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sscratch),
708 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sepc),
709 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(scause),
710 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(stval),
711 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sip),
712 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(satp),
713 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(scounteren),
714 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(senvcfg),
715 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(frequency),
716 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(time),
717 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(compare),
718 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(state),
722 * The skips_set list registers that should skip set test.
723 * - KVM_REG_RISCV_TIMER_REG(state): set would fail if it was not initialized properly.
725 static __u64 base_skips_set[] = {
726 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(state),
729 static __u64 sbi_base_regs[] = {
730 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_V01,
731 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_TIME,
732 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_IPI,
733 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_RFENCE,
734 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_SRST,
735 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_HSM,
736 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_EXPERIMENTAL,
737 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_VENDOR,
740 static __u64 sbi_sta_regs[] = {
741 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_STA,
742 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_lo),
743 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_hi),
746 static __u64 zicbom_regs[] = {
747 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(zicbom_block_size),
748 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOM,
751 static __u64 zicboz_regs[] = {
752 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(zicboz_block_size),
753 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOZ,
756 static __u64 aia_regs[] = {
757 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siselect),
758 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1),
759 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2),
760 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(sieh),
761 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siph),
762 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1h),
763 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2h),
764 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSAIA,
767 static __u64 smstateen_regs[] = {
768 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_SMSTATEEN | KVM_REG_RISCV_CSR_SMSTATEEN_REG(sstateen0),
769 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SMSTATEEN,
772 static __u64 fp_f_regs[] = {
773 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[0]),
774 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[1]),
775 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[2]),
776 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[3]),
777 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[4]),
778 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[5]),
779 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[6]),
780 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[7]),
781 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[8]),
782 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[9]),
783 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[10]),
784 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[11]),
785 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[12]),
786 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[13]),
787 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[14]),
788 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[15]),
789 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[16]),
790 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[17]),
791 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[18]),
792 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[19]),
793 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[20]),
794 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[21]),
795 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[22]),
796 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[23]),
797 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[24]),
798 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[25]),
799 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[26]),
800 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[27]),
801 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[28]),
802 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[29]),
803 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[30]),
804 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[31]),
805 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(fcsr),
806 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_F,
809 static __u64 fp_d_regs[] = {
810 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[0]),
811 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[1]),
812 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[2]),
813 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[3]),
814 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[4]),
815 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[5]),
816 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[6]),
817 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[7]),
818 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[8]),
819 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[9]),
820 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[10]),
821 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[11]),
822 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[12]),
823 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[13]),
824 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[14]),
825 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[15]),
826 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[16]),
827 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[17]),
828 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[18]),
829 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[19]),
830 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[20]),
831 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[21]),
832 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[22]),
833 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[23]),
834 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[24]),
835 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[25]),
836 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[26]),
837 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[27]),
838 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[28]),
839 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[29]),
840 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[30]),
841 KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[31]),
842 KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(fcsr),
843 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_D,
846 #define SUBLIST_BASE \
847 {"base", .regs = base_regs, .regs_n = ARRAY_SIZE(base_regs), \
848 .skips_set = base_skips_set, .skips_set_n = ARRAY_SIZE(base_skips_set),}
849 #define SUBLIST_SBI_BASE \
850 {"sbi-base", .feature_type = VCPU_FEATURE_SBI_EXT, .feature = KVM_RISCV_SBI_EXT_V01, \
851 .regs = sbi_base_regs, .regs_n = ARRAY_SIZE(sbi_base_regs),}
852 #define SUBLIST_SBI_STA \
853 {"sbi-sta", .feature_type = VCPU_FEATURE_SBI_EXT, .feature = KVM_RISCV_SBI_EXT_STA, \
854 .regs = sbi_sta_regs, .regs_n = ARRAY_SIZE(sbi_sta_regs),}
855 #define SUBLIST_ZICBOM \
856 {"zicbom", .feature = KVM_RISCV_ISA_EXT_ZICBOM, .regs = zicbom_regs, .regs_n = ARRAY_SIZE(zicbom_regs),}
857 #define SUBLIST_ZICBOZ \
858 {"zicboz", .feature = KVM_RISCV_ISA_EXT_ZICBOZ, .regs = zicboz_regs, .regs_n = ARRAY_SIZE(zicboz_regs),}
859 #define SUBLIST_AIA \
860 {"aia", .feature = KVM_RISCV_ISA_EXT_SSAIA, .regs = aia_regs, .regs_n = ARRAY_SIZE(aia_regs),}
861 #define SUBLIST_SMSTATEEN \
862 {"smstateen", .feature = KVM_RISCV_ISA_EXT_SMSTATEEN, .regs = smstateen_regs, .regs_n = ARRAY_SIZE(smstateen_regs),}
863 #define SUBLIST_FP_F \
864 {"fp_f", .feature = KVM_RISCV_ISA_EXT_F, .regs = fp_f_regs, \
865 .regs_n = ARRAY_SIZE(fp_f_regs),}
866 #define SUBLIST_FP_D \
867 {"fp_d", .feature = KVM_RISCV_ISA_EXT_D, .regs = fp_d_regs, \
868 .regs_n = ARRAY_SIZE(fp_d_regs),}
870 #define KVM_ISA_EXT_SIMPLE_CONFIG(ext, extu) \
871 static __u64 regs_##ext[] = { \
872 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | \
873 KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | \
874 KVM_RISCV_ISA_EXT_##extu, \
876 static struct vcpu_reg_list config_##ext = { \
881 .feature = KVM_RISCV_ISA_EXT_##extu, \
882 .regs = regs_##ext, \
883 .regs_n = ARRAY_SIZE(regs_##ext), \
889 #define KVM_SBI_EXT_SIMPLE_CONFIG(ext, extu) \
890 static __u64 regs_sbi_##ext[] = { \
891 KVM_REG_RISCV | KVM_REG_SIZE_ULONG | \
892 KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | \
893 KVM_RISCV_SBI_EXT_##extu, \
895 static struct vcpu_reg_list config_sbi_##ext = { \
899 .name = "sbi-"#ext, \
900 .feature_type = VCPU_FEATURE_SBI_EXT, \
901 .feature = KVM_RISCV_SBI_EXT_##extu, \
902 .regs = regs_sbi_##ext, \
903 .regs_n = ARRAY_SIZE(regs_sbi_##ext), \
909 #define KVM_ISA_EXT_SUBLIST_CONFIG(ext, extu) \
910 static struct vcpu_reg_list config_##ext = { \
918 #define KVM_SBI_EXT_SUBLIST_CONFIG(ext, extu) \
919 static struct vcpu_reg_list config_sbi_##ext = { \
922 SUBLIST_SBI_##extu, \
927 /* Note: The below list is alphabetically sorted. */
929 KVM_SBI_EXT_SUBLIST_CONFIG(base, BASE);
930 KVM_SBI_EXT_SUBLIST_CONFIG(sta, STA);
931 KVM_SBI_EXT_SIMPLE_CONFIG(pmu, PMU);
932 KVM_SBI_EXT_SIMPLE_CONFIG(dbcn, DBCN);
934 KVM_ISA_EXT_SUBLIST_CONFIG(aia, AIA);
935 KVM_ISA_EXT_SUBLIST_CONFIG(fp_f, FP_F);
936 KVM_ISA_EXT_SUBLIST_CONFIG(fp_d, FP_D);
937 KVM_ISA_EXT_SIMPLE_CONFIG(h, H);
938 KVM_ISA_EXT_SUBLIST_CONFIG(smstateen, SMSTATEEN);
939 KVM_ISA_EXT_SIMPLE_CONFIG(sstc, SSTC);
940 KVM_ISA_EXT_SIMPLE_CONFIG(svinval, SVINVAL);
941 KVM_ISA_EXT_SIMPLE_CONFIG(svnapot, SVNAPOT);
942 KVM_ISA_EXT_SIMPLE_CONFIG(svpbmt, SVPBMT);
943 KVM_ISA_EXT_SIMPLE_CONFIG(zba, ZBA);
944 KVM_ISA_EXT_SIMPLE_CONFIG(zbb, ZBB);
945 KVM_ISA_EXT_SIMPLE_CONFIG(zbc, ZBC);
946 KVM_ISA_EXT_SIMPLE_CONFIG(zbkb, ZBKB);
947 KVM_ISA_EXT_SIMPLE_CONFIG(zbkc, ZBKC);
948 KVM_ISA_EXT_SIMPLE_CONFIG(zbkx, ZBKX);
949 KVM_ISA_EXT_SIMPLE_CONFIG(zbs, ZBS);
950 KVM_ISA_EXT_SIMPLE_CONFIG(zfa, ZFA);
951 KVM_ISA_EXT_SIMPLE_CONFIG(zfh, ZFH);
952 KVM_ISA_EXT_SIMPLE_CONFIG(zfhmin, ZFHMIN);
953 KVM_ISA_EXT_SUBLIST_CONFIG(zicbom, ZICBOM);
954 KVM_ISA_EXT_SUBLIST_CONFIG(zicboz, ZICBOZ);
955 KVM_ISA_EXT_SIMPLE_CONFIG(zicntr, ZICNTR);
956 KVM_ISA_EXT_SIMPLE_CONFIG(zicond, ZICOND);
957 KVM_ISA_EXT_SIMPLE_CONFIG(zicsr, ZICSR);
958 KVM_ISA_EXT_SIMPLE_CONFIG(zifencei, ZIFENCEI);
959 KVM_ISA_EXT_SIMPLE_CONFIG(zihintntl, ZIHINTNTL);
960 KVM_ISA_EXT_SIMPLE_CONFIG(zihintpause, ZIHINTPAUSE);
961 KVM_ISA_EXT_SIMPLE_CONFIG(zihpm, ZIHPM);
962 KVM_ISA_EXT_SIMPLE_CONFIG(zknd, ZKND);
963 KVM_ISA_EXT_SIMPLE_CONFIG(zkne, ZKNE);
964 KVM_ISA_EXT_SIMPLE_CONFIG(zknh, ZKNH);
965 KVM_ISA_EXT_SIMPLE_CONFIG(zkr, ZKR);
966 KVM_ISA_EXT_SIMPLE_CONFIG(zksed, ZKSED);
967 KVM_ISA_EXT_SIMPLE_CONFIG(zksh, ZKSH);
968 KVM_ISA_EXT_SIMPLE_CONFIG(zkt, ZKT);
969 KVM_ISA_EXT_SIMPLE_CONFIG(zvbb, ZVBB);
970 KVM_ISA_EXT_SIMPLE_CONFIG(zvbc, ZVBC);
971 KVM_ISA_EXT_SIMPLE_CONFIG(zvfh, ZVFH);
972 KVM_ISA_EXT_SIMPLE_CONFIG(zvfhmin, ZVFHMIN);
973 KVM_ISA_EXT_SIMPLE_CONFIG(zvkb, ZVKB);
974 KVM_ISA_EXT_SIMPLE_CONFIG(zvkg, ZVKG);
975 KVM_ISA_EXT_SIMPLE_CONFIG(zvkned, ZVKNED);
976 KVM_ISA_EXT_SIMPLE_CONFIG(zvknha, ZVKNHA);
977 KVM_ISA_EXT_SIMPLE_CONFIG(zvknhb, ZVKNHB);
978 KVM_ISA_EXT_SIMPLE_CONFIG(zvksed, ZVKSED);
979 KVM_ISA_EXT_SIMPLE_CONFIG(zvksh, ZVKSH);
980 KVM_ISA_EXT_SIMPLE_CONFIG(zvkt, ZVKT);
982 struct vcpu_reg_list *vcpu_configs[] = {
1013 &config_zihintpause,
1035 int vcpu_configs_n = ARRAY_SIZE(vcpu_configs);