xref: /openbmc/linux/tools/testing/selftests/kvm/riscv/get-reg-list.c (revision 8a511e7efc5a72173f64d191f01cda236d54e27a)
147706939SHaibo Xu // SPDX-License-Identifier: GPL-2.0
247706939SHaibo Xu /*
347706939SHaibo Xu  * Check for KVM_GET_REG_LIST regressions.
447706939SHaibo Xu  *
547706939SHaibo Xu  * Copyright (c) 2023 Intel Corporation
647706939SHaibo Xu  *
747706939SHaibo Xu  */
847706939SHaibo Xu #include <stdio.h>
947706939SHaibo Xu #include "kvm_util.h"
1047706939SHaibo Xu #include "test_util.h"
1147706939SHaibo Xu #include "processor.h"
1247706939SHaibo Xu 
1347706939SHaibo Xu #define REG_MASK (KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK)
1447706939SHaibo Xu 
15*071ef070SAnup Patel static bool isa_ext_cant_disable[KVM_RISCV_ISA_EXT_MAX];
16*071ef070SAnup Patel 
filter_reg(__u64 reg)1747706939SHaibo Xu bool filter_reg(__u64 reg)
1847706939SHaibo Xu {
1947706939SHaibo Xu 	switch (reg & ~REG_MASK) {
20ba1af6e2SAnup Patel 	/*
21ba1af6e2SAnup Patel 	 * Same set of ISA_EXT registers are not present on all host because
22ba1af6e2SAnup Patel 	 * ISA_EXT registers are visible to the KVM user space based on the
23ba1af6e2SAnup Patel 	 * ISA extensions available on the host. Also, disabling an ISA
24ba1af6e2SAnup Patel 	 * extension using corresponding ISA_EXT register does not affect
25ba1af6e2SAnup Patel 	 * the visibility of the ISA_EXT register itself.
26ba1af6e2SAnup Patel 	 *
27ba1af6e2SAnup Patel 	 * Based on above, we should filter-out all ISA_EXT registers.
28ba1af6e2SAnup Patel 	 */
29ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_A:
30ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_C:
31ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_D:
32ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_F:
33ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_H:
34ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_I:
35ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_M:
36ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_SVPBMT:
3747706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_SSTC:
3847706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_SVINVAL:
3947706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZIHINTPAUSE:
40ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZICBOM:
41ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZICBOZ:
4247706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZBB:
4347706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_SSAIA:
44ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_V:
45ba1af6e2SAnup Patel 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_SVNAPOT:
4647706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZBA:
4747706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZBS:
4847706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZICNTR:
4947706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZICSR:
5047706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZIFENCEI:
5147706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZIHPM:
5247706939SHaibo Xu 		return true;
53*071ef070SAnup Patel 	/* AIA registers are always available when Ssaia can't be disabled */
54*071ef070SAnup Patel 	case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siselect):
55*071ef070SAnup Patel 	case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1):
56*071ef070SAnup Patel 	case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2):
57*071ef070SAnup Patel 	case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(sieh):
58*071ef070SAnup Patel 	case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siph):
59*071ef070SAnup Patel 	case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1h):
60*071ef070SAnup Patel 	case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2h):
61*071ef070SAnup Patel 		return isa_ext_cant_disable[KVM_RISCV_ISA_EXT_SSAIA];
6247706939SHaibo Xu 	default:
6347706939SHaibo Xu 		break;
6447706939SHaibo Xu 	}
6547706939SHaibo Xu 
6647706939SHaibo Xu 	return false;
6747706939SHaibo Xu }
6847706939SHaibo Xu 
check_reject_set(int err)6947706939SHaibo Xu bool check_reject_set(int err)
7047706939SHaibo Xu {
7147706939SHaibo Xu 	return err == EINVAL;
7247706939SHaibo Xu }
7347706939SHaibo Xu 
vcpu_has_ext(struct kvm_vcpu * vcpu,int ext)7447706939SHaibo Xu static inline bool vcpu_has_ext(struct kvm_vcpu *vcpu, int ext)
7547706939SHaibo Xu {
7647706939SHaibo Xu 	int ret;
7747706939SHaibo Xu 	unsigned long value;
7847706939SHaibo Xu 
7947706939SHaibo Xu 	ret = __vcpu_get_reg(vcpu, RISCV_ISA_EXT_REG(ext), &value);
80ba1af6e2SAnup Patel 	return (ret) ? false : !!value;
8147706939SHaibo Xu }
8247706939SHaibo Xu 
finalize_vcpu(struct kvm_vcpu * vcpu,struct vcpu_reg_list * c)8347706939SHaibo Xu void finalize_vcpu(struct kvm_vcpu *vcpu, struct vcpu_reg_list *c)
8447706939SHaibo Xu {
85*071ef070SAnup Patel 	unsigned long isa_ext_state[KVM_RISCV_ISA_EXT_MAX] = { 0 };
8647706939SHaibo Xu 	struct vcpu_reg_sublist *s;
87*071ef070SAnup Patel 	int rc;
88*071ef070SAnup Patel 
89*071ef070SAnup Patel 	for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++)
90*071ef070SAnup Patel 		__vcpu_get_reg(vcpu, RISCV_ISA_EXT_REG(i), &isa_ext_state[i]);
9147706939SHaibo Xu 
9247706939SHaibo Xu 	/*
9347706939SHaibo Xu 	 * Disable all extensions which were enabled by default
9447706939SHaibo Xu 	 * if they were available in the risc-v host.
9547706939SHaibo Xu 	 */
96*071ef070SAnup Patel 	for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
97*071ef070SAnup Patel 		rc = __vcpu_set_reg(vcpu, RISCV_ISA_EXT_REG(i), 0);
98*071ef070SAnup Patel 		if (rc && isa_ext_state[i])
99*071ef070SAnup Patel 			isa_ext_cant_disable[i] = true;
100*071ef070SAnup Patel 	}
10147706939SHaibo Xu 
10247706939SHaibo Xu 	for_each_sublist(c, s) {
10347706939SHaibo Xu 		if (!s->feature)
10447706939SHaibo Xu 			continue;
10547706939SHaibo Xu 
10647706939SHaibo Xu 		/* Try to enable the desired extension */
10747706939SHaibo Xu 		__vcpu_set_reg(vcpu, RISCV_ISA_EXT_REG(s->feature), 1);
10847706939SHaibo Xu 
10947706939SHaibo Xu 		/* Double check whether the desired extension was enabled */
11047706939SHaibo Xu 		__TEST_REQUIRE(vcpu_has_ext(vcpu, s->feature),
11147706939SHaibo Xu 			       "%s not available, skipping tests\n", s->name);
11247706939SHaibo Xu 	}
11347706939SHaibo Xu }
11447706939SHaibo Xu 
config_id_to_str(__u64 id)11547706939SHaibo Xu static const char *config_id_to_str(__u64 id)
11647706939SHaibo Xu {
11747706939SHaibo Xu 	/* reg_off is the offset into struct kvm_riscv_config */
11847706939SHaibo Xu 	__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CONFIG);
11947706939SHaibo Xu 
12047706939SHaibo Xu 	switch (reg_off) {
12147706939SHaibo Xu 	case KVM_REG_RISCV_CONFIG_REG(isa):
12247706939SHaibo Xu 		return "KVM_REG_RISCV_CONFIG_REG(isa)";
12347706939SHaibo Xu 	case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
12447706939SHaibo Xu 		return "KVM_REG_RISCV_CONFIG_REG(zicbom_block_size)";
12547706939SHaibo Xu 	case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):
12647706939SHaibo Xu 		return "KVM_REG_RISCV_CONFIG_REG(zicboz_block_size)";
12747706939SHaibo Xu 	case KVM_REG_RISCV_CONFIG_REG(mvendorid):
12847706939SHaibo Xu 		return "KVM_REG_RISCV_CONFIG_REG(mvendorid)";
12947706939SHaibo Xu 	case KVM_REG_RISCV_CONFIG_REG(marchid):
13047706939SHaibo Xu 		return "KVM_REG_RISCV_CONFIG_REG(marchid)";
13147706939SHaibo Xu 	case KVM_REG_RISCV_CONFIG_REG(mimpid):
13247706939SHaibo Xu 		return "KVM_REG_RISCV_CONFIG_REG(mimpid)";
13347706939SHaibo Xu 	case KVM_REG_RISCV_CONFIG_REG(satp_mode):
13447706939SHaibo Xu 		return "KVM_REG_RISCV_CONFIG_REG(satp_mode)";
13547706939SHaibo Xu 	}
13647706939SHaibo Xu 
13747706939SHaibo Xu 	/*
13847706939SHaibo Xu 	 * Config regs would grow regularly with new pseudo reg added, so
13947706939SHaibo Xu 	 * just show raw id to indicate a new pseudo config reg.
14047706939SHaibo Xu 	 */
14147706939SHaibo Xu 	return strdup_printf("KVM_REG_RISCV_CONFIG_REG(%lld) /* UNKNOWN */", reg_off);
14247706939SHaibo Xu }
14347706939SHaibo Xu 
core_id_to_str(const char * prefix,__u64 id)14447706939SHaibo Xu static const char *core_id_to_str(const char *prefix, __u64 id)
14547706939SHaibo Xu {
14647706939SHaibo Xu 	/* reg_off is the offset into struct kvm_riscv_core */
14747706939SHaibo Xu 	__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CORE);
14847706939SHaibo Xu 
14947706939SHaibo Xu 	switch (reg_off) {
15047706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(regs.pc):
15147706939SHaibo Xu 		return "KVM_REG_RISCV_CORE_REG(regs.pc)";
15247706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(regs.ra):
15347706939SHaibo Xu 		return "KVM_REG_RISCV_CORE_REG(regs.ra)";
15447706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(regs.sp):
15547706939SHaibo Xu 		return "KVM_REG_RISCV_CORE_REG(regs.sp)";
15647706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(regs.gp):
15747706939SHaibo Xu 		return "KVM_REG_RISCV_CORE_REG(regs.gp)";
15847706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(regs.tp):
15947706939SHaibo Xu 		return "KVM_REG_RISCV_CORE_REG(regs.tp)";
16047706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(regs.t0) ... KVM_REG_RISCV_CORE_REG(regs.t2):
16147706939SHaibo Xu 		return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.t%lld)",
16247706939SHaibo Xu 			   reg_off - KVM_REG_RISCV_CORE_REG(regs.t0));
16347706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(regs.s0) ... KVM_REG_RISCV_CORE_REG(regs.s1):
16447706939SHaibo Xu 		return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.s%lld)",
16547706939SHaibo Xu 			   reg_off - KVM_REG_RISCV_CORE_REG(regs.s0));
16647706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(regs.a0) ... KVM_REG_RISCV_CORE_REG(regs.a7):
16747706939SHaibo Xu 		return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.a%lld)",
16847706939SHaibo Xu 			   reg_off - KVM_REG_RISCV_CORE_REG(regs.a0));
16947706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(regs.s2) ... KVM_REG_RISCV_CORE_REG(regs.s11):
17047706939SHaibo Xu 		return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.s%lld)",
17147706939SHaibo Xu 			   reg_off - KVM_REG_RISCV_CORE_REG(regs.s2) + 2);
17247706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(regs.t3) ... KVM_REG_RISCV_CORE_REG(regs.t6):
17347706939SHaibo Xu 		return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.t%lld)",
17447706939SHaibo Xu 			   reg_off - KVM_REG_RISCV_CORE_REG(regs.t3) + 3);
17547706939SHaibo Xu 	case KVM_REG_RISCV_CORE_REG(mode):
17647706939SHaibo Xu 		return "KVM_REG_RISCV_CORE_REG(mode)";
17747706939SHaibo Xu 	}
17847706939SHaibo Xu 
17947706939SHaibo Xu 	TEST_FAIL("%s: Unknown core reg id: 0x%llx", prefix, id);
18047706939SHaibo Xu 	return NULL;
18147706939SHaibo Xu }
18247706939SHaibo Xu 
18347706939SHaibo Xu #define RISCV_CSR_GENERAL(csr) \
18447706939SHaibo Xu 	"KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(" #csr ")"
18547706939SHaibo Xu #define RISCV_CSR_AIA(csr) \
18647706939SHaibo Xu 	"KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_REG(" #csr ")"
18747706939SHaibo Xu 
general_csr_id_to_str(__u64 reg_off)18847706939SHaibo Xu static const char *general_csr_id_to_str(__u64 reg_off)
18947706939SHaibo Xu {
19047706939SHaibo Xu 	/* reg_off is the offset into struct kvm_riscv_csr */
19147706939SHaibo Xu 	switch (reg_off) {
19247706939SHaibo Xu 	case KVM_REG_RISCV_CSR_REG(sstatus):
19347706939SHaibo Xu 		return RISCV_CSR_GENERAL(sstatus);
19447706939SHaibo Xu 	case KVM_REG_RISCV_CSR_REG(sie):
19547706939SHaibo Xu 		return RISCV_CSR_GENERAL(sie);
19647706939SHaibo Xu 	case KVM_REG_RISCV_CSR_REG(stvec):
19747706939SHaibo Xu 		return RISCV_CSR_GENERAL(stvec);
19847706939SHaibo Xu 	case KVM_REG_RISCV_CSR_REG(sscratch):
19947706939SHaibo Xu 		return RISCV_CSR_GENERAL(sscratch);
20047706939SHaibo Xu 	case KVM_REG_RISCV_CSR_REG(sepc):
20147706939SHaibo Xu 		return RISCV_CSR_GENERAL(sepc);
20247706939SHaibo Xu 	case KVM_REG_RISCV_CSR_REG(scause):
20347706939SHaibo Xu 		return RISCV_CSR_GENERAL(scause);
20447706939SHaibo Xu 	case KVM_REG_RISCV_CSR_REG(stval):
20547706939SHaibo Xu 		return RISCV_CSR_GENERAL(stval);
20647706939SHaibo Xu 	case KVM_REG_RISCV_CSR_REG(sip):
20747706939SHaibo Xu 		return RISCV_CSR_GENERAL(sip);
20847706939SHaibo Xu 	case KVM_REG_RISCV_CSR_REG(satp):
20947706939SHaibo Xu 		return RISCV_CSR_GENERAL(satp);
21047706939SHaibo Xu 	case KVM_REG_RISCV_CSR_REG(scounteren):
21147706939SHaibo Xu 		return RISCV_CSR_GENERAL(scounteren);
21247706939SHaibo Xu 	}
21347706939SHaibo Xu 
21447706939SHaibo Xu 	TEST_FAIL("Unknown general csr reg: 0x%llx", reg_off);
21547706939SHaibo Xu 	return NULL;
21647706939SHaibo Xu }
21747706939SHaibo Xu 
aia_csr_id_to_str(__u64 reg_off)21847706939SHaibo Xu static const char *aia_csr_id_to_str(__u64 reg_off)
21947706939SHaibo Xu {
22047706939SHaibo Xu 	/* reg_off is the offset into struct kvm_riscv_aia_csr */
22147706939SHaibo Xu 	switch (reg_off) {
22247706939SHaibo Xu 	case KVM_REG_RISCV_CSR_AIA_REG(siselect):
22347706939SHaibo Xu 		return RISCV_CSR_AIA(siselect);
22447706939SHaibo Xu 	case KVM_REG_RISCV_CSR_AIA_REG(iprio1):
22547706939SHaibo Xu 		return RISCV_CSR_AIA(iprio1);
22647706939SHaibo Xu 	case KVM_REG_RISCV_CSR_AIA_REG(iprio2):
22747706939SHaibo Xu 		return RISCV_CSR_AIA(iprio2);
22847706939SHaibo Xu 	case KVM_REG_RISCV_CSR_AIA_REG(sieh):
22947706939SHaibo Xu 		return RISCV_CSR_AIA(sieh);
23047706939SHaibo Xu 	case KVM_REG_RISCV_CSR_AIA_REG(siph):
23147706939SHaibo Xu 		return RISCV_CSR_AIA(siph);
23247706939SHaibo Xu 	case KVM_REG_RISCV_CSR_AIA_REG(iprio1h):
23347706939SHaibo Xu 		return RISCV_CSR_AIA(iprio1h);
23447706939SHaibo Xu 	case KVM_REG_RISCV_CSR_AIA_REG(iprio2h):
23547706939SHaibo Xu 		return RISCV_CSR_AIA(iprio2h);
23647706939SHaibo Xu 	}
23747706939SHaibo Xu 
23847706939SHaibo Xu 	TEST_FAIL("Unknown aia csr reg: 0x%llx", reg_off);
23947706939SHaibo Xu 	return NULL;
24047706939SHaibo Xu }
24147706939SHaibo Xu 
csr_id_to_str(const char * prefix,__u64 id)24247706939SHaibo Xu static const char *csr_id_to_str(const char *prefix, __u64 id)
24347706939SHaibo Xu {
24447706939SHaibo Xu 	__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CSR);
24547706939SHaibo Xu 	__u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK;
24647706939SHaibo Xu 
24747706939SHaibo Xu 	reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK;
24847706939SHaibo Xu 
24947706939SHaibo Xu 	switch (reg_subtype) {
25047706939SHaibo Xu 	case KVM_REG_RISCV_CSR_GENERAL:
25147706939SHaibo Xu 		return general_csr_id_to_str(reg_off);
25247706939SHaibo Xu 	case KVM_REG_RISCV_CSR_AIA:
25347706939SHaibo Xu 		return aia_csr_id_to_str(reg_off);
25447706939SHaibo Xu 	}
25547706939SHaibo Xu 
25647706939SHaibo Xu 	TEST_FAIL("%s: Unknown csr subtype: 0x%llx", prefix, reg_subtype);
25747706939SHaibo Xu 	return NULL;
25847706939SHaibo Xu }
25947706939SHaibo Xu 
timer_id_to_str(const char * prefix,__u64 id)26047706939SHaibo Xu static const char *timer_id_to_str(const char *prefix, __u64 id)
26147706939SHaibo Xu {
26247706939SHaibo Xu 	/* reg_off is the offset into struct kvm_riscv_timer */
26347706939SHaibo Xu 	__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_TIMER);
26447706939SHaibo Xu 
26547706939SHaibo Xu 	switch (reg_off) {
26647706939SHaibo Xu 	case KVM_REG_RISCV_TIMER_REG(frequency):
26747706939SHaibo Xu 		return "KVM_REG_RISCV_TIMER_REG(frequency)";
26847706939SHaibo Xu 	case KVM_REG_RISCV_TIMER_REG(time):
26947706939SHaibo Xu 		return "KVM_REG_RISCV_TIMER_REG(time)";
27047706939SHaibo Xu 	case KVM_REG_RISCV_TIMER_REG(compare):
27147706939SHaibo Xu 		return "KVM_REG_RISCV_TIMER_REG(compare)";
27247706939SHaibo Xu 	case KVM_REG_RISCV_TIMER_REG(state):
27347706939SHaibo Xu 		return "KVM_REG_RISCV_TIMER_REG(state)";
27447706939SHaibo Xu 	}
27547706939SHaibo Xu 
27647706939SHaibo Xu 	TEST_FAIL("%s: Unknown timer reg id: 0x%llx", prefix, id);
27747706939SHaibo Xu 	return NULL;
27847706939SHaibo Xu }
27947706939SHaibo Xu 
fp_f_id_to_str(const char * prefix,__u64 id)28047706939SHaibo Xu static const char *fp_f_id_to_str(const char *prefix, __u64 id)
28147706939SHaibo Xu {
28247706939SHaibo Xu 	/* reg_off is the offset into struct __riscv_f_ext_state */
28347706939SHaibo Xu 	__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_FP_F);
28447706939SHaibo Xu 
28547706939SHaibo Xu 	switch (reg_off) {
28647706939SHaibo Xu 	case KVM_REG_RISCV_FP_F_REG(f[0]) ...
28747706939SHaibo Xu 	     KVM_REG_RISCV_FP_F_REG(f[31]):
28847706939SHaibo Xu 		return strdup_printf("KVM_REG_RISCV_FP_F_REG(f[%lld])", reg_off);
28947706939SHaibo Xu 	case KVM_REG_RISCV_FP_F_REG(fcsr):
29047706939SHaibo Xu 		return "KVM_REG_RISCV_FP_F_REG(fcsr)";
29147706939SHaibo Xu 	}
29247706939SHaibo Xu 
29347706939SHaibo Xu 	TEST_FAIL("%s: Unknown fp_f reg id: 0x%llx", prefix, id);
29447706939SHaibo Xu 	return NULL;
29547706939SHaibo Xu }
29647706939SHaibo Xu 
fp_d_id_to_str(const char * prefix,__u64 id)29747706939SHaibo Xu static const char *fp_d_id_to_str(const char *prefix, __u64 id)
29847706939SHaibo Xu {
29947706939SHaibo Xu 	/* reg_off is the offset into struct __riscv_d_ext_state */
30047706939SHaibo Xu 	__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_FP_D);
30147706939SHaibo Xu 
30247706939SHaibo Xu 	switch (reg_off) {
30347706939SHaibo Xu 	case KVM_REG_RISCV_FP_D_REG(f[0]) ...
30447706939SHaibo Xu 	     KVM_REG_RISCV_FP_D_REG(f[31]):
30547706939SHaibo Xu 		return strdup_printf("KVM_REG_RISCV_FP_D_REG(f[%lld])", reg_off);
30647706939SHaibo Xu 	case KVM_REG_RISCV_FP_D_REG(fcsr):
30747706939SHaibo Xu 		return "KVM_REG_RISCV_FP_D_REG(fcsr)";
30847706939SHaibo Xu 	}
30947706939SHaibo Xu 
31047706939SHaibo Xu 	TEST_FAIL("%s: Unknown fp_d reg id: 0x%llx", prefix, id);
31147706939SHaibo Xu 	return NULL;
31247706939SHaibo Xu }
31347706939SHaibo Xu 
isa_ext_id_to_str(__u64 id)31447706939SHaibo Xu static const char *isa_ext_id_to_str(__u64 id)
31547706939SHaibo Xu {
31647706939SHaibo Xu 	/* reg_off is the offset into unsigned long kvm_isa_ext_arr[] */
31747706939SHaibo Xu 	__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_ISA_EXT);
31847706939SHaibo Xu 
31947706939SHaibo Xu 	static const char * const kvm_isa_ext_reg_name[] = {
32047706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_A",
32147706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_C",
32247706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_D",
32347706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_F",
32447706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_H",
32547706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_I",
32647706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_M",
32747706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_SVPBMT",
32847706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_SSTC",
32947706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_SVINVAL",
33047706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_ZIHINTPAUSE",
33147706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_ZICBOM",
33247706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_ZICBOZ",
33347706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_ZBB",
33447706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_SSAIA",
33547706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_V",
33647706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_SVNAPOT",
33747706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_ZBA",
33847706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_ZBS",
33947706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_ZICNTR",
34047706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_ZICSR",
34147706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_ZIFENCEI",
34247706939SHaibo Xu 		"KVM_RISCV_ISA_EXT_ZIHPM",
34347706939SHaibo Xu 	};
34447706939SHaibo Xu 
34547706939SHaibo Xu 	if (reg_off >= ARRAY_SIZE(kvm_isa_ext_reg_name)) {
34647706939SHaibo Xu 		/*
34747706939SHaibo Xu 		 * isa_ext regs would grow regularly with new isa extension added, so
34847706939SHaibo Xu 		 * just show "reg" to indicate a new extension.
34947706939SHaibo Xu 		 */
35047706939SHaibo Xu 		return strdup_printf("%lld /* UNKNOWN */", reg_off);
35147706939SHaibo Xu 	}
35247706939SHaibo Xu 
35347706939SHaibo Xu 	return kvm_isa_ext_reg_name[reg_off];
35447706939SHaibo Xu }
35547706939SHaibo Xu 
sbi_ext_single_id_to_str(__u64 reg_off)35647706939SHaibo Xu static const char *sbi_ext_single_id_to_str(__u64 reg_off)
35747706939SHaibo Xu {
35847706939SHaibo Xu 	/* reg_off is KVM_RISCV_SBI_EXT_ID */
35947706939SHaibo Xu 	static const char * const kvm_sbi_ext_reg_name[] = {
36047706939SHaibo Xu 		"KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_V01",
36147706939SHaibo Xu 		"KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_TIME",
36247706939SHaibo Xu 		"KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_IPI",
36347706939SHaibo Xu 		"KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_RFENCE",
36447706939SHaibo Xu 		"KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_SRST",
36547706939SHaibo Xu 		"KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_HSM",
36647706939SHaibo Xu 		"KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_PMU",
36747706939SHaibo Xu 		"KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_EXPERIMENTAL",
36847706939SHaibo Xu 		"KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_VENDOR",
36947706939SHaibo Xu 	};
37047706939SHaibo Xu 
37147706939SHaibo Xu 	if (reg_off >= ARRAY_SIZE(kvm_sbi_ext_reg_name)) {
37247706939SHaibo Xu 		/*
37347706939SHaibo Xu 		 * sbi_ext regs would grow regularly with new sbi extension added, so
37447706939SHaibo Xu 		 * just show "reg" to indicate a new extension.
37547706939SHaibo Xu 		 */
37647706939SHaibo Xu 		return strdup_printf("KVM_REG_RISCV_SBI_SINGLE | %lld /* UNKNOWN */", reg_off);
37747706939SHaibo Xu 	}
37847706939SHaibo Xu 
37947706939SHaibo Xu 	return kvm_sbi_ext_reg_name[reg_off];
38047706939SHaibo Xu }
38147706939SHaibo Xu 
sbi_ext_multi_id_to_str(__u64 reg_subtype,__u64 reg_off)38247706939SHaibo Xu static const char *sbi_ext_multi_id_to_str(__u64 reg_subtype, __u64 reg_off)
38347706939SHaibo Xu {
38447706939SHaibo Xu 	if (reg_off > KVM_REG_RISCV_SBI_MULTI_REG_LAST) {
38547706939SHaibo Xu 		/*
38647706939SHaibo Xu 		 * sbi_ext regs would grow regularly with new sbi extension added, so
38747706939SHaibo Xu 		 * just show "reg" to indicate a new extension.
38847706939SHaibo Xu 		 */
38947706939SHaibo Xu 		return strdup_printf("%lld /* UNKNOWN */", reg_off);
39047706939SHaibo Xu 	}
39147706939SHaibo Xu 
39247706939SHaibo Xu 	switch (reg_subtype) {
39347706939SHaibo Xu 	case KVM_REG_RISCV_SBI_MULTI_EN:
39447706939SHaibo Xu 		return strdup_printf("KVM_REG_RISCV_SBI_MULTI_EN | %lld", reg_off);
39547706939SHaibo Xu 	case KVM_REG_RISCV_SBI_MULTI_DIS:
39647706939SHaibo Xu 		return strdup_printf("KVM_REG_RISCV_SBI_MULTI_DIS | %lld", reg_off);
39747706939SHaibo Xu 	}
39847706939SHaibo Xu 
39947706939SHaibo Xu 	return NULL;
40047706939SHaibo Xu }
40147706939SHaibo Xu 
sbi_ext_id_to_str(const char * prefix,__u64 id)40247706939SHaibo Xu static const char *sbi_ext_id_to_str(const char *prefix, __u64 id)
40347706939SHaibo Xu {
40447706939SHaibo Xu 	__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_SBI_EXT);
40547706939SHaibo Xu 	__u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK;
40647706939SHaibo Xu 
40747706939SHaibo Xu 	reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK;
40847706939SHaibo Xu 
40947706939SHaibo Xu 	switch (reg_subtype) {
41047706939SHaibo Xu 	case KVM_REG_RISCV_SBI_SINGLE:
41147706939SHaibo Xu 		return sbi_ext_single_id_to_str(reg_off);
41247706939SHaibo Xu 	case KVM_REG_RISCV_SBI_MULTI_EN:
41347706939SHaibo Xu 	case KVM_REG_RISCV_SBI_MULTI_DIS:
41447706939SHaibo Xu 		return sbi_ext_multi_id_to_str(reg_subtype, reg_off);
41547706939SHaibo Xu 	}
41647706939SHaibo Xu 
41747706939SHaibo Xu 	TEST_FAIL("%s: Unknown sbi ext subtype: 0x%llx", prefix, reg_subtype);
41847706939SHaibo Xu 	return NULL;
41947706939SHaibo Xu }
42047706939SHaibo Xu 
print_reg(const char * prefix,__u64 id)42147706939SHaibo Xu void print_reg(const char *prefix, __u64 id)
42247706939SHaibo Xu {
42347706939SHaibo Xu 	const char *reg_size = NULL;
42447706939SHaibo Xu 
42547706939SHaibo Xu 	TEST_ASSERT((id & KVM_REG_ARCH_MASK) == KVM_REG_RISCV,
42647706939SHaibo Xu 		    "%s: KVM_REG_RISCV missing in reg id: 0x%llx", prefix, id);
42747706939SHaibo Xu 
42847706939SHaibo Xu 	switch (id & KVM_REG_SIZE_MASK) {
42947706939SHaibo Xu 	case KVM_REG_SIZE_U32:
43047706939SHaibo Xu 		reg_size = "KVM_REG_SIZE_U32";
43147706939SHaibo Xu 		break;
43247706939SHaibo Xu 	case KVM_REG_SIZE_U64:
43347706939SHaibo Xu 		reg_size = "KVM_REG_SIZE_U64";
43447706939SHaibo Xu 		break;
43547706939SHaibo Xu 	case KVM_REG_SIZE_U128:
43647706939SHaibo Xu 		reg_size = "KVM_REG_SIZE_U128";
43747706939SHaibo Xu 		break;
43847706939SHaibo Xu 	default:
43947706939SHaibo Xu 		TEST_FAIL("%s: Unexpected reg size: 0x%llx in reg id: 0x%llx",
44047706939SHaibo Xu 			  prefix, (id & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT, id);
44147706939SHaibo Xu 	}
44247706939SHaibo Xu 
44347706939SHaibo Xu 	switch (id & KVM_REG_RISCV_TYPE_MASK) {
44447706939SHaibo Xu 	case KVM_REG_RISCV_CONFIG:
44547706939SHaibo Xu 		printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_CONFIG | %s,\n",
44647706939SHaibo Xu 				reg_size, config_id_to_str(id));
44747706939SHaibo Xu 		break;
44847706939SHaibo Xu 	case KVM_REG_RISCV_CORE:
44947706939SHaibo Xu 		printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_CORE | %s,\n",
45047706939SHaibo Xu 				reg_size, core_id_to_str(prefix, id));
45147706939SHaibo Xu 		break;
45247706939SHaibo Xu 	case KVM_REG_RISCV_CSR:
45347706939SHaibo Xu 		printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_CSR | %s,\n",
45447706939SHaibo Xu 				reg_size, csr_id_to_str(prefix, id));
45547706939SHaibo Xu 		break;
45647706939SHaibo Xu 	case KVM_REG_RISCV_TIMER:
45747706939SHaibo Xu 		printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_TIMER | %s,\n",
45847706939SHaibo Xu 				reg_size, timer_id_to_str(prefix, id));
45947706939SHaibo Xu 		break;
46047706939SHaibo Xu 	case KVM_REG_RISCV_FP_F:
46147706939SHaibo Xu 		printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_FP_F | %s,\n",
46247706939SHaibo Xu 				reg_size, fp_f_id_to_str(prefix, id));
46347706939SHaibo Xu 		break;
46447706939SHaibo Xu 	case KVM_REG_RISCV_FP_D:
46547706939SHaibo Xu 		printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_FP_D | %s,\n",
46647706939SHaibo Xu 				reg_size, fp_d_id_to_str(prefix, id));
46747706939SHaibo Xu 		break;
46847706939SHaibo Xu 	case KVM_REG_RISCV_ISA_EXT:
46947706939SHaibo Xu 		printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_ISA_EXT | %s,\n",
47047706939SHaibo Xu 				reg_size, isa_ext_id_to_str(id));
47147706939SHaibo Xu 		break;
47247706939SHaibo Xu 	case KVM_REG_RISCV_SBI_EXT:
47347706939SHaibo Xu 		printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_SBI_EXT | %s,\n",
47447706939SHaibo Xu 				reg_size, sbi_ext_id_to_str(prefix, id));
47547706939SHaibo Xu 		break;
47647706939SHaibo Xu 	default:
47747706939SHaibo Xu 		TEST_FAIL("%s: Unexpected reg type: 0x%llx in reg id: 0x%llx", prefix,
47847706939SHaibo Xu 				(id & KVM_REG_RISCV_TYPE_MASK) >> KVM_REG_RISCV_TYPE_SHIFT, id);
47947706939SHaibo Xu 	}
48047706939SHaibo Xu }
48147706939SHaibo Xu 
48247706939SHaibo Xu /*
48347706939SHaibo Xu  * The current blessed list was primed with the output of kernel version
48447706939SHaibo Xu  * v6.5-rc3 and then later updated with new registers.
48547706939SHaibo Xu  */
48647706939SHaibo Xu static __u64 base_regs[] = {
48747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(isa),
48847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(mvendorid),
48947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(marchid),
49047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(mimpid),
49147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(satp_mode),
49247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.pc),
49347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.ra),
49447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.sp),
49547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.gp),
49647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.tp),
49747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t0),
49847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t1),
49947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t2),
50047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s0),
50147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s1),
50247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a0),
50347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a1),
50447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a2),
50547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a3),
50647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a4),
50747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a5),
50847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a6),
50947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a7),
51047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s2),
51147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s3),
51247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s4),
51347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s5),
51447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s6),
51547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s7),
51647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s8),
51747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s9),
51847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s10),
51947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s11),
52047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t3),
52147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t4),
52247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t5),
52347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t6),
52447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(mode),
52547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sstatus),
52647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sie),
52747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(stvec),
52847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sscratch),
52947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sepc),
53047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(scause),
53147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(stval),
53247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sip),
53347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(satp),
53447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(scounteren),
53547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(frequency),
53647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(time),
53747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(compare),
53847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(state),
53947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_V01,
54047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_TIME,
54147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_IPI,
54247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_RFENCE,
54347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_SRST,
54447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_HSM,
54547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_PMU,
54647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_EXPERIMENTAL,
54747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_VENDOR,
54847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_MULTI_EN | 0,
54947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_MULTI_DIS | 0,
55047706939SHaibo Xu };
55147706939SHaibo Xu 
55247706939SHaibo Xu /*
55347706939SHaibo Xu  * The skips_set list registers that should skip set test.
55447706939SHaibo Xu  *  - KVM_REG_RISCV_TIMER_REG(state): set would fail if it was not initialized properly.
55547706939SHaibo Xu  */
55647706939SHaibo Xu static __u64 base_skips_set[] = {
55747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(state),
55847706939SHaibo Xu };
55947706939SHaibo Xu 
56047706939SHaibo Xu static __u64 h_regs[] = {
56147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_H,
56247706939SHaibo Xu };
56347706939SHaibo Xu 
56447706939SHaibo Xu static __u64 zicbom_regs[] = {
56547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(zicbom_block_size),
56647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZICBOM,
56747706939SHaibo Xu };
56847706939SHaibo Xu 
56947706939SHaibo Xu static __u64 zicboz_regs[] = {
57047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(zicboz_block_size),
57147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZICBOZ,
57247706939SHaibo Xu };
57347706939SHaibo Xu 
57447706939SHaibo Xu static __u64 svpbmt_regs[] = {
57547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_SVPBMT,
57647706939SHaibo Xu };
57747706939SHaibo Xu 
57847706939SHaibo Xu static __u64 sstc_regs[] = {
57947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_SSTC,
58047706939SHaibo Xu };
58147706939SHaibo Xu 
58247706939SHaibo Xu static __u64 svinval_regs[] = {
58347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_SVINVAL,
58447706939SHaibo Xu };
58547706939SHaibo Xu 
58647706939SHaibo Xu static __u64 zihintpause_regs[] = {
58747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZIHINTPAUSE,
58847706939SHaibo Xu };
58947706939SHaibo Xu 
59047706939SHaibo Xu static __u64 zba_regs[] = {
59147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZBA,
59247706939SHaibo Xu };
59347706939SHaibo Xu 
59447706939SHaibo Xu static __u64 zbb_regs[] = {
59547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZBB,
59647706939SHaibo Xu };
59747706939SHaibo Xu 
59847706939SHaibo Xu static __u64 zbs_regs[] = {
59947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZBS,
60047706939SHaibo Xu };
60147706939SHaibo Xu 
60247706939SHaibo Xu static __u64 zicntr_regs[] = {
60347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZICNTR,
60447706939SHaibo Xu };
60547706939SHaibo Xu 
60647706939SHaibo Xu static __u64 zicsr_regs[] = {
60747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZICSR,
60847706939SHaibo Xu };
60947706939SHaibo Xu 
61047706939SHaibo Xu static __u64 zifencei_regs[] = {
61147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZIFENCEI,
61247706939SHaibo Xu };
61347706939SHaibo Xu 
61447706939SHaibo Xu static __u64 zihpm_regs[] = {
61547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_ZIHPM,
61647706939SHaibo Xu };
61747706939SHaibo Xu 
61847706939SHaibo Xu static __u64 aia_regs[] = {
61947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siselect),
62047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1),
62147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2),
62247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(sieh),
62347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siph),
62447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1h),
62547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2h),
62647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_SSAIA,
62747706939SHaibo Xu };
62847706939SHaibo Xu 
62947706939SHaibo Xu static __u64 fp_f_regs[] = {
63047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[0]),
63147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[1]),
63247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[2]),
63347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[3]),
63447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[4]),
63547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[5]),
63647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[6]),
63747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[7]),
63847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[8]),
63947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[9]),
64047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[10]),
64147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[11]),
64247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[12]),
64347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[13]),
64447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[14]),
64547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[15]),
64647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[16]),
64747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[17]),
64847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[18]),
64947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[19]),
65047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[20]),
65147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[21]),
65247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[22]),
65347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[23]),
65447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[24]),
65547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[25]),
65647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[26]),
65747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[27]),
65847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[28]),
65947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[29]),
66047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[30]),
66147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[31]),
66247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(fcsr),
66347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_F,
66447706939SHaibo Xu };
66547706939SHaibo Xu 
66647706939SHaibo Xu static __u64 fp_d_regs[] = {
66747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[0]),
66847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[1]),
66947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[2]),
67047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[3]),
67147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[4]),
67247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[5]),
67347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[6]),
67447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[7]),
67547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[8]),
67647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[9]),
67747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[10]),
67847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[11]),
67947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[12]),
68047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[13]),
68147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[14]),
68247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[15]),
68347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[16]),
68447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[17]),
68547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[18]),
68647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[19]),
68747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[20]),
68847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[21]),
68947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[22]),
69047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[23]),
69147706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[24]),
69247706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[25]),
69347706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[26]),
69447706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[27]),
69547706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[28]),
69647706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[29]),
69747706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[30]),
69847706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[31]),
69947706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(fcsr),
70047706939SHaibo Xu 	KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_RISCV_ISA_EXT_D,
70147706939SHaibo Xu };
70247706939SHaibo Xu 
70347706939SHaibo Xu #define BASE_SUBLIST \
70447706939SHaibo Xu 	{"base", .regs = base_regs, .regs_n = ARRAY_SIZE(base_regs), \
70547706939SHaibo Xu 	 .skips_set = base_skips_set, .skips_set_n = ARRAY_SIZE(base_skips_set),}
70647706939SHaibo Xu #define H_REGS_SUBLIST \
70747706939SHaibo Xu 	{"h", .feature = KVM_RISCV_ISA_EXT_H, .regs = h_regs, .regs_n = ARRAY_SIZE(h_regs),}
70847706939SHaibo Xu #define ZICBOM_REGS_SUBLIST \
70947706939SHaibo Xu 	{"zicbom", .feature = KVM_RISCV_ISA_EXT_ZICBOM, .regs = zicbom_regs, .regs_n = ARRAY_SIZE(zicbom_regs),}
71047706939SHaibo Xu #define ZICBOZ_REGS_SUBLIST \
71147706939SHaibo Xu 	{"zicboz", .feature = KVM_RISCV_ISA_EXT_ZICBOZ, .regs = zicboz_regs, .regs_n = ARRAY_SIZE(zicboz_regs),}
71247706939SHaibo Xu #define SVPBMT_REGS_SUBLIST \
71347706939SHaibo Xu 	{"svpbmt", .feature = KVM_RISCV_ISA_EXT_SVPBMT, .regs = svpbmt_regs, .regs_n = ARRAY_SIZE(svpbmt_regs),}
71447706939SHaibo Xu #define SSTC_REGS_SUBLIST \
71547706939SHaibo Xu 	{"sstc", .feature = KVM_RISCV_ISA_EXT_SSTC, .regs = sstc_regs, .regs_n = ARRAY_SIZE(sstc_regs),}
71647706939SHaibo Xu #define SVINVAL_REGS_SUBLIST \
71747706939SHaibo Xu 	{"svinval", .feature = KVM_RISCV_ISA_EXT_SVINVAL, .regs = svinval_regs, .regs_n = ARRAY_SIZE(svinval_regs),}
71847706939SHaibo Xu #define ZIHINTPAUSE_REGS_SUBLIST \
71947706939SHaibo Xu 	{"zihintpause", .feature = KVM_RISCV_ISA_EXT_ZIHINTPAUSE, .regs = zihintpause_regs, .regs_n = ARRAY_SIZE(zihintpause_regs),}
72047706939SHaibo Xu #define ZBA_REGS_SUBLIST \
72147706939SHaibo Xu 	{"zba", .feature = KVM_RISCV_ISA_EXT_ZBA, .regs = zba_regs, .regs_n = ARRAY_SIZE(zba_regs),}
72247706939SHaibo Xu #define ZBB_REGS_SUBLIST \
72347706939SHaibo Xu 	{"zbb", .feature = KVM_RISCV_ISA_EXT_ZBB, .regs = zbb_regs, .regs_n = ARRAY_SIZE(zbb_regs),}
72447706939SHaibo Xu #define ZBS_REGS_SUBLIST \
72547706939SHaibo Xu 	{"zbs", .feature = KVM_RISCV_ISA_EXT_ZBS, .regs = zbs_regs, .regs_n = ARRAY_SIZE(zbs_regs),}
72647706939SHaibo Xu #define ZICNTR_REGS_SUBLIST \
72747706939SHaibo Xu 	{"zicntr", .feature = KVM_RISCV_ISA_EXT_ZICNTR, .regs = zicntr_regs, .regs_n = ARRAY_SIZE(zicntr_regs),}
72847706939SHaibo Xu #define ZICSR_REGS_SUBLIST \
72947706939SHaibo Xu 	{"zicsr", .feature = KVM_RISCV_ISA_EXT_ZICSR, .regs = zicsr_regs, .regs_n = ARRAY_SIZE(zicsr_regs),}
73047706939SHaibo Xu #define ZIFENCEI_REGS_SUBLIST \
73147706939SHaibo Xu 	{"zifencei", .feature = KVM_RISCV_ISA_EXT_ZIFENCEI, .regs = zifencei_regs, .regs_n = ARRAY_SIZE(zifencei_regs),}
73247706939SHaibo Xu #define ZIHPM_REGS_SUBLIST \
73347706939SHaibo Xu 	{"zihpm", .feature = KVM_RISCV_ISA_EXT_ZIHPM, .regs = zihpm_regs, .regs_n = ARRAY_SIZE(zihpm_regs),}
73447706939SHaibo Xu #define AIA_REGS_SUBLIST \
73547706939SHaibo Xu 	{"aia", .feature = KVM_RISCV_ISA_EXT_SSAIA, .regs = aia_regs, .regs_n = ARRAY_SIZE(aia_regs),}
73647706939SHaibo Xu #define FP_F_REGS_SUBLIST \
73747706939SHaibo Xu 	{"fp_f", .feature = KVM_RISCV_ISA_EXT_F, .regs = fp_f_regs, \
73847706939SHaibo Xu 		.regs_n = ARRAY_SIZE(fp_f_regs),}
73947706939SHaibo Xu #define FP_D_REGS_SUBLIST \
74047706939SHaibo Xu 	{"fp_d", .feature = KVM_RISCV_ISA_EXT_D, .regs = fp_d_regs, \
74147706939SHaibo Xu 		.regs_n = ARRAY_SIZE(fp_d_regs),}
74247706939SHaibo Xu 
74347706939SHaibo Xu static struct vcpu_reg_list h_config = {
74447706939SHaibo Xu 	.sublists = {
74547706939SHaibo Xu 	BASE_SUBLIST,
74647706939SHaibo Xu 	H_REGS_SUBLIST,
74747706939SHaibo Xu 	{0},
74847706939SHaibo Xu 	},
74947706939SHaibo Xu };
75047706939SHaibo Xu 
75147706939SHaibo Xu static struct vcpu_reg_list zicbom_config = {
75247706939SHaibo Xu 	.sublists = {
75347706939SHaibo Xu 	BASE_SUBLIST,
75447706939SHaibo Xu 	ZICBOM_REGS_SUBLIST,
75547706939SHaibo Xu 	{0},
75647706939SHaibo Xu 	},
75747706939SHaibo Xu };
75847706939SHaibo Xu 
75947706939SHaibo Xu static struct vcpu_reg_list zicboz_config = {
76047706939SHaibo Xu 	.sublists = {
76147706939SHaibo Xu 	BASE_SUBLIST,
76247706939SHaibo Xu 	ZICBOZ_REGS_SUBLIST,
76347706939SHaibo Xu 	{0},
76447706939SHaibo Xu 	},
76547706939SHaibo Xu };
76647706939SHaibo Xu 
76747706939SHaibo Xu static struct vcpu_reg_list svpbmt_config = {
76847706939SHaibo Xu 	.sublists = {
76947706939SHaibo Xu 	BASE_SUBLIST,
77047706939SHaibo Xu 	SVPBMT_REGS_SUBLIST,
77147706939SHaibo Xu 	{0},
77247706939SHaibo Xu 	},
77347706939SHaibo Xu };
77447706939SHaibo Xu 
77547706939SHaibo Xu static struct vcpu_reg_list sstc_config = {
77647706939SHaibo Xu 	.sublists = {
77747706939SHaibo Xu 	BASE_SUBLIST,
77847706939SHaibo Xu 	SSTC_REGS_SUBLIST,
77947706939SHaibo Xu 	{0},
78047706939SHaibo Xu 	},
78147706939SHaibo Xu };
78247706939SHaibo Xu 
78347706939SHaibo Xu static struct vcpu_reg_list svinval_config = {
78447706939SHaibo Xu 	.sublists = {
78547706939SHaibo Xu 	BASE_SUBLIST,
78647706939SHaibo Xu 	SVINVAL_REGS_SUBLIST,
78747706939SHaibo Xu 	{0},
78847706939SHaibo Xu 	},
78947706939SHaibo Xu };
79047706939SHaibo Xu 
79147706939SHaibo Xu static struct vcpu_reg_list zihintpause_config = {
79247706939SHaibo Xu 	.sublists = {
79347706939SHaibo Xu 	BASE_SUBLIST,
79447706939SHaibo Xu 	ZIHINTPAUSE_REGS_SUBLIST,
79547706939SHaibo Xu 	{0},
79647706939SHaibo Xu 	},
79747706939SHaibo Xu };
79847706939SHaibo Xu 
79947706939SHaibo Xu static struct vcpu_reg_list zba_config = {
80047706939SHaibo Xu 	.sublists = {
80147706939SHaibo Xu 	BASE_SUBLIST,
80247706939SHaibo Xu 	ZBA_REGS_SUBLIST,
80347706939SHaibo Xu 	{0},
80447706939SHaibo Xu 	},
80547706939SHaibo Xu };
80647706939SHaibo Xu 
80747706939SHaibo Xu static struct vcpu_reg_list zbb_config = {
80847706939SHaibo Xu 	.sublists = {
80947706939SHaibo Xu 	BASE_SUBLIST,
81047706939SHaibo Xu 	ZBB_REGS_SUBLIST,
81147706939SHaibo Xu 	{0},
81247706939SHaibo Xu 	},
81347706939SHaibo Xu };
81447706939SHaibo Xu 
81547706939SHaibo Xu static struct vcpu_reg_list zbs_config = {
81647706939SHaibo Xu 	.sublists = {
81747706939SHaibo Xu 	BASE_SUBLIST,
81847706939SHaibo Xu 	ZBS_REGS_SUBLIST,
81947706939SHaibo Xu 	{0},
82047706939SHaibo Xu 	},
82147706939SHaibo Xu };
82247706939SHaibo Xu 
82347706939SHaibo Xu static struct vcpu_reg_list zicntr_config = {
82447706939SHaibo Xu 	.sublists = {
82547706939SHaibo Xu 	BASE_SUBLIST,
82647706939SHaibo Xu 	ZICNTR_REGS_SUBLIST,
82747706939SHaibo Xu 	{0},
82847706939SHaibo Xu 	},
82947706939SHaibo Xu };
83047706939SHaibo Xu 
83147706939SHaibo Xu static struct vcpu_reg_list zicsr_config = {
83247706939SHaibo Xu 	.sublists = {
83347706939SHaibo Xu 	BASE_SUBLIST,
83447706939SHaibo Xu 	ZICSR_REGS_SUBLIST,
83547706939SHaibo Xu 	{0},
83647706939SHaibo Xu 	},
83747706939SHaibo Xu };
83847706939SHaibo Xu 
83947706939SHaibo Xu static struct vcpu_reg_list zifencei_config = {
84047706939SHaibo Xu 	.sublists = {
84147706939SHaibo Xu 	BASE_SUBLIST,
84247706939SHaibo Xu 	ZIFENCEI_REGS_SUBLIST,
84347706939SHaibo Xu 	{0},
84447706939SHaibo Xu 	},
84547706939SHaibo Xu };
84647706939SHaibo Xu 
84747706939SHaibo Xu static struct vcpu_reg_list zihpm_config = {
84847706939SHaibo Xu 	.sublists = {
84947706939SHaibo Xu 	BASE_SUBLIST,
85047706939SHaibo Xu 	ZIHPM_REGS_SUBLIST,
85147706939SHaibo Xu 	{0},
85247706939SHaibo Xu 	},
85347706939SHaibo Xu };
85447706939SHaibo Xu 
85547706939SHaibo Xu static struct vcpu_reg_list aia_config = {
85647706939SHaibo Xu 	.sublists = {
85747706939SHaibo Xu 	BASE_SUBLIST,
85847706939SHaibo Xu 	AIA_REGS_SUBLIST,
85947706939SHaibo Xu 	{0},
86047706939SHaibo Xu 	},
86147706939SHaibo Xu };
86247706939SHaibo Xu 
86347706939SHaibo Xu static struct vcpu_reg_list fp_f_config = {
86447706939SHaibo Xu 	.sublists = {
86547706939SHaibo Xu 	BASE_SUBLIST,
86647706939SHaibo Xu 	FP_F_REGS_SUBLIST,
86747706939SHaibo Xu 	{0},
86847706939SHaibo Xu 	},
86947706939SHaibo Xu };
87047706939SHaibo Xu 
87147706939SHaibo Xu static struct vcpu_reg_list fp_d_config = {
87247706939SHaibo Xu 	.sublists = {
87347706939SHaibo Xu 	BASE_SUBLIST,
87447706939SHaibo Xu 	FP_D_REGS_SUBLIST,
87547706939SHaibo Xu 	{0},
87647706939SHaibo Xu 	},
87747706939SHaibo Xu };
87847706939SHaibo Xu 
87947706939SHaibo Xu struct vcpu_reg_list *vcpu_configs[] = {
88047706939SHaibo Xu 	&h_config,
88147706939SHaibo Xu 	&zicbom_config,
88247706939SHaibo Xu 	&zicboz_config,
88347706939SHaibo Xu 	&svpbmt_config,
88447706939SHaibo Xu 	&sstc_config,
88547706939SHaibo Xu 	&svinval_config,
88647706939SHaibo Xu 	&zihintpause_config,
88747706939SHaibo Xu 	&zba_config,
88847706939SHaibo Xu 	&zbb_config,
88947706939SHaibo Xu 	&zbs_config,
89047706939SHaibo Xu 	&zicntr_config,
89147706939SHaibo Xu 	&zicsr_config,
89247706939SHaibo Xu 	&zifencei_config,
89347706939SHaibo Xu 	&zihpm_config,
89447706939SHaibo Xu 	&aia_config,
89547706939SHaibo Xu 	&fp_f_config,
89647706939SHaibo Xu 	&fp_d_config,
89747706939SHaibo Xu };
89847706939SHaibo Xu int vcpu_configs_n = ARRAY_SIZE(vcpu_configs);
899