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