Path: blob/master/tools/testing/selftests/kvm/riscv/get-reg-list.c
38237 views
// SPDX-License-Identifier: GPL-2.01/*2* Check for KVM_GET_REG_LIST regressions.3*4* Copyright (c) 2023 Intel Corporation5*6*/7#include <stdio.h>8#include "kvm_util.h"9#include "test_util.h"10#include "processor.h"1112#define REG_MASK (KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK)1314enum {15VCPU_FEATURE_ISA_EXT = 0,16VCPU_FEATURE_SBI_EXT,17};1819enum {20KVM_RISC_V_REG_OFFSET_VSTART = 0,21KVM_RISC_V_REG_OFFSET_VL,22KVM_RISC_V_REG_OFFSET_VTYPE,23KVM_RISC_V_REG_OFFSET_VCSR,24KVM_RISC_V_REG_OFFSET_VLENB,25KVM_RISC_V_REG_OFFSET_MAX,26};2728static bool isa_ext_cant_disable[KVM_RISCV_ISA_EXT_MAX];2930bool filter_reg(__u64 reg)31{32switch (reg & ~REG_MASK) {33/*34* Same set of ISA_EXT registers are not present on all host because35* ISA_EXT registers are visible to the KVM user space based on the36* ISA extensions available on the host. Also, disabling an ISA37* extension using corresponding ISA_EXT register does not affect38* the visibility of the ISA_EXT register itself.39*40* Based on above, we should filter-out all ISA_EXT registers.41*42* Note: The below list is alphabetically sorted.43*/44case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_A:45case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_C:46case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_D:47case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_F:48case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_H:49case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_I:50case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_M:51case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_V:52case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SMNPM:53case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SMSTATEEN:54case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSAIA:55case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSCOFPMF:56case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSNPM:57case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSTC:58case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVADE:59case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVADU:60case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVINVAL:61case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVNAPOT:62case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVPBMT:63case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVVPTC:64case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZAAMO:65case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZABHA:66case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZACAS:67case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZALRSC:68case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZAWRS:69case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBA:70case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBB:71case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBC:72case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBKB:73case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBKC:74case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBKX:75case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBS:76case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZCA:77case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZCB:78case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZCD:79case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZCF:80case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZCMOP:81case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZFA:82case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZFBFMIN:83case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZFH:84case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZFHMIN:85case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOM:86case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOP:87case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOZ:88case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICCRSE:89case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICNTR:90case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICOND:91case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICSR:92case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIFENCEI:93case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIHINTNTL:94case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIHINTPAUSE:95case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIHPM:96case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIMOP:97case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKND:98case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKNE:99case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKNH:100case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKR:101case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKSED:102case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKSH:103case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKT:104case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZTSO:105case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVBB:106case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVBC:107case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVFBFMIN:108case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVFBFWMA:109case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVFH:110case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVFHMIN:111case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKB:112case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKG:113case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKNED:114case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKNHA:115case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKNHB:116case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKSED:117case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKSH:118case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKT:119/*120* Like ISA_EXT registers, SBI_EXT registers are only visible when the121* host supports them and disabling them does not affect the visibility122* of the SBI_EXT register itself.123*/124case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_V01:125case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_TIME:126case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_IPI:127case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_RFENCE:128case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_SRST:129case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_HSM:130case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_PMU:131case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_DBCN:132case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_SUSP:133case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_STA:134case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_FWFT:135case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_MPXY:136case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_EXPERIMENTAL:137case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_VENDOR:138return true;139/* AIA registers are always available when Ssaia can't be disabled */140case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siselect):141case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1):142case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2):143case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(sieh):144case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siph):145case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1h):146case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2h):147return isa_ext_cant_disable[KVM_RISCV_ISA_EXT_SSAIA];148default:149break;150}151152return false;153}154155bool check_reject_set(int err)156{157return err == EINVAL;158}159160static int override_vector_reg_size(struct kvm_vcpu *vcpu, struct vcpu_reg_sublist *s,161uint64_t feature)162{163unsigned long vlenb_reg = 0;164int rc;165u64 reg, size;166167/* Enable V extension so that we can get the vlenb register */168rc = __vcpu_set_reg(vcpu, feature, 1);169if (rc)170return rc;171172vlenb_reg = vcpu_get_reg(vcpu, s->regs[KVM_RISC_V_REG_OFFSET_VLENB]);173if (!vlenb_reg) {174TEST_FAIL("Can't compute vector register size from zero vlenb\n");175return -EPERM;176}177178size = __builtin_ctzl(vlenb_reg);179size <<= KVM_REG_SIZE_SHIFT;180181for (int i = 0; i < 32; i++) {182reg = KVM_REG_RISCV | KVM_REG_RISCV_VECTOR | size | KVM_REG_RISCV_VECTOR_REG(i);183s->regs[KVM_RISC_V_REG_OFFSET_MAX + i] = reg;184}185186/* We should assert if disabling failed here while enabling succeeded before */187vcpu_set_reg(vcpu, feature, 0);188189return 0;190}191192void finalize_vcpu(struct kvm_vcpu *vcpu, struct vcpu_reg_list *c)193{194unsigned long isa_ext_state[KVM_RISCV_ISA_EXT_MAX] = { 0 };195struct vcpu_reg_sublist *s;196uint64_t feature;197int rc;198199for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++)200__vcpu_get_reg(vcpu, RISCV_ISA_EXT_REG(i), &isa_ext_state[i]);201202/*203* Disable all extensions which were enabled by default204* if they were available in the risc-v host.205*/206for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {207rc = __vcpu_set_reg(vcpu, RISCV_ISA_EXT_REG(i), 0);208if (rc && isa_ext_state[i])209isa_ext_cant_disable[i] = true;210}211212for (int i = 0; i < KVM_RISCV_SBI_EXT_MAX; i++) {213rc = __vcpu_set_reg(vcpu, RISCV_SBI_EXT_REG(i), 0);214TEST_ASSERT(!rc || (rc == -1 && errno == ENOENT), "Unexpected error");215}216217for_each_sublist(c, s) {218if (!s->feature)219continue;220221if (s->feature == KVM_RISCV_ISA_EXT_V) {222feature = RISCV_ISA_EXT_REG(s->feature);223rc = override_vector_reg_size(vcpu, s, feature);224if (rc)225goto skip;226}227228switch (s->feature_type) {229case VCPU_FEATURE_ISA_EXT:230feature = RISCV_ISA_EXT_REG(s->feature);231break;232case VCPU_FEATURE_SBI_EXT:233feature = RISCV_SBI_EXT_REG(s->feature);234break;235default:236TEST_FAIL("Unknown feature type");237}238239/* Try to enable the desired extension */240__vcpu_set_reg(vcpu, feature, 1);241242skip:243/* Double check whether the desired extension was enabled */244__TEST_REQUIRE(__vcpu_has_ext(vcpu, feature),245"%s not available, skipping tests", s->name);246}247}248249static const char *config_id_to_str(const char *prefix, __u64 id)250{251/* reg_off is the offset into struct kvm_riscv_config */252__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CONFIG);253254assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_CONFIG);255256switch (reg_off) {257case KVM_REG_RISCV_CONFIG_REG(isa):258return "KVM_REG_RISCV_CONFIG_REG(isa)";259case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):260return "KVM_REG_RISCV_CONFIG_REG(zicbom_block_size)";261case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size):262return "KVM_REG_RISCV_CONFIG_REG(zicboz_block_size)";263case KVM_REG_RISCV_CONFIG_REG(zicbop_block_size):264return "KVM_REG_RISCV_CONFIG_REG(zicbop_block_size)";265case KVM_REG_RISCV_CONFIG_REG(mvendorid):266return "KVM_REG_RISCV_CONFIG_REG(mvendorid)";267case KVM_REG_RISCV_CONFIG_REG(marchid):268return "KVM_REG_RISCV_CONFIG_REG(marchid)";269case KVM_REG_RISCV_CONFIG_REG(mimpid):270return "KVM_REG_RISCV_CONFIG_REG(mimpid)";271case KVM_REG_RISCV_CONFIG_REG(satp_mode):272return "KVM_REG_RISCV_CONFIG_REG(satp_mode)";273}274275return strdup_printf("%lld /* UNKNOWN */", reg_off);276}277278static const char *core_id_to_str(const char *prefix, __u64 id)279{280/* reg_off is the offset into struct kvm_riscv_core */281__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CORE);282283assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_CORE);284285switch (reg_off) {286case KVM_REG_RISCV_CORE_REG(regs.pc):287return "KVM_REG_RISCV_CORE_REG(regs.pc)";288case KVM_REG_RISCV_CORE_REG(regs.ra):289return "KVM_REG_RISCV_CORE_REG(regs.ra)";290case KVM_REG_RISCV_CORE_REG(regs.sp):291return "KVM_REG_RISCV_CORE_REG(regs.sp)";292case KVM_REG_RISCV_CORE_REG(regs.gp):293return "KVM_REG_RISCV_CORE_REG(regs.gp)";294case KVM_REG_RISCV_CORE_REG(regs.tp):295return "KVM_REG_RISCV_CORE_REG(regs.tp)";296case KVM_REG_RISCV_CORE_REG(regs.t0) ... KVM_REG_RISCV_CORE_REG(regs.t2):297return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.t%lld)",298reg_off - KVM_REG_RISCV_CORE_REG(regs.t0));299case KVM_REG_RISCV_CORE_REG(regs.s0) ... KVM_REG_RISCV_CORE_REG(regs.s1):300return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.s%lld)",301reg_off - KVM_REG_RISCV_CORE_REG(regs.s0));302case KVM_REG_RISCV_CORE_REG(regs.a0) ... KVM_REG_RISCV_CORE_REG(regs.a7):303return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.a%lld)",304reg_off - KVM_REG_RISCV_CORE_REG(regs.a0));305case KVM_REG_RISCV_CORE_REG(regs.s2) ... KVM_REG_RISCV_CORE_REG(regs.s11):306return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.s%lld)",307reg_off - KVM_REG_RISCV_CORE_REG(regs.s2) + 2);308case KVM_REG_RISCV_CORE_REG(regs.t3) ... KVM_REG_RISCV_CORE_REG(regs.t6):309return strdup_printf("KVM_REG_RISCV_CORE_REG(regs.t%lld)",310reg_off - KVM_REG_RISCV_CORE_REG(regs.t3) + 3);311case KVM_REG_RISCV_CORE_REG(mode):312return "KVM_REG_RISCV_CORE_REG(mode)";313}314315return strdup_printf("%lld /* UNKNOWN */", reg_off);316}317318#define RISCV_CSR_GENERAL(csr) \319"KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(" #csr ")"320#define RISCV_CSR_AIA(csr) \321"KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_REG(" #csr ")"322#define RISCV_CSR_SMSTATEEN(csr) \323"KVM_REG_RISCV_CSR_SMSTATEEN | KVM_REG_RISCV_CSR_REG(" #csr ")"324325static const char *general_csr_id_to_str(__u64 reg_off)326{327/* reg_off is the offset into struct kvm_riscv_csr */328switch (reg_off) {329case KVM_REG_RISCV_CSR_REG(sstatus):330return RISCV_CSR_GENERAL(sstatus);331case KVM_REG_RISCV_CSR_REG(sie):332return RISCV_CSR_GENERAL(sie);333case KVM_REG_RISCV_CSR_REG(stvec):334return RISCV_CSR_GENERAL(stvec);335case KVM_REG_RISCV_CSR_REG(sscratch):336return RISCV_CSR_GENERAL(sscratch);337case KVM_REG_RISCV_CSR_REG(sepc):338return RISCV_CSR_GENERAL(sepc);339case KVM_REG_RISCV_CSR_REG(scause):340return RISCV_CSR_GENERAL(scause);341case KVM_REG_RISCV_CSR_REG(stval):342return RISCV_CSR_GENERAL(stval);343case KVM_REG_RISCV_CSR_REG(sip):344return RISCV_CSR_GENERAL(sip);345case KVM_REG_RISCV_CSR_REG(satp):346return RISCV_CSR_GENERAL(satp);347case KVM_REG_RISCV_CSR_REG(scounteren):348return RISCV_CSR_GENERAL(scounteren);349case KVM_REG_RISCV_CSR_REG(senvcfg):350return RISCV_CSR_GENERAL(senvcfg);351}352353return strdup_printf("KVM_REG_RISCV_CSR_GENERAL | %lld /* UNKNOWN */", reg_off);354}355356static const char *aia_csr_id_to_str(__u64 reg_off)357{358/* reg_off is the offset into struct kvm_riscv_aia_csr */359switch (reg_off) {360case KVM_REG_RISCV_CSR_AIA_REG(siselect):361return RISCV_CSR_AIA(siselect);362case KVM_REG_RISCV_CSR_AIA_REG(iprio1):363return RISCV_CSR_AIA(iprio1);364case KVM_REG_RISCV_CSR_AIA_REG(iprio2):365return RISCV_CSR_AIA(iprio2);366case KVM_REG_RISCV_CSR_AIA_REG(sieh):367return RISCV_CSR_AIA(sieh);368case KVM_REG_RISCV_CSR_AIA_REG(siph):369return RISCV_CSR_AIA(siph);370case KVM_REG_RISCV_CSR_AIA_REG(iprio1h):371return RISCV_CSR_AIA(iprio1h);372case KVM_REG_RISCV_CSR_AIA_REG(iprio2h):373return RISCV_CSR_AIA(iprio2h);374}375376return strdup_printf("KVM_REG_RISCV_CSR_AIA | %lld /* UNKNOWN */", reg_off);377}378379static const char *smstateen_csr_id_to_str(__u64 reg_off)380{381/* reg_off is the offset into struct kvm_riscv_smstateen_csr */382switch (reg_off) {383case KVM_REG_RISCV_CSR_SMSTATEEN_REG(sstateen0):384return RISCV_CSR_SMSTATEEN(sstateen0);385}386387TEST_FAIL("Unknown smstateen csr reg: 0x%llx", reg_off);388return NULL;389}390391static const char *csr_id_to_str(const char *prefix, __u64 id)392{393__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CSR);394__u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK;395396assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_CSR);397398reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK;399400switch (reg_subtype) {401case KVM_REG_RISCV_CSR_GENERAL:402return general_csr_id_to_str(reg_off);403case KVM_REG_RISCV_CSR_AIA:404return aia_csr_id_to_str(reg_off);405case KVM_REG_RISCV_CSR_SMSTATEEN:406return smstateen_csr_id_to_str(reg_off);407}408409return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);410}411412static const char *timer_id_to_str(const char *prefix, __u64 id)413{414/* reg_off is the offset into struct kvm_riscv_timer */415__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_TIMER);416417assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_TIMER);418419switch (reg_off) {420case KVM_REG_RISCV_TIMER_REG(frequency):421return "KVM_REG_RISCV_TIMER_REG(frequency)";422case KVM_REG_RISCV_TIMER_REG(time):423return "KVM_REG_RISCV_TIMER_REG(time)";424case KVM_REG_RISCV_TIMER_REG(compare):425return "KVM_REG_RISCV_TIMER_REG(compare)";426case KVM_REG_RISCV_TIMER_REG(state):427return "KVM_REG_RISCV_TIMER_REG(state)";428}429430return strdup_printf("%lld /* UNKNOWN */", reg_off);431}432433static const char *fp_f_id_to_str(const char *prefix, __u64 id)434{435/* reg_off is the offset into struct __riscv_f_ext_state */436__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_FP_F);437438assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_FP_F);439440switch (reg_off) {441case KVM_REG_RISCV_FP_F_REG(f[0]) ...442KVM_REG_RISCV_FP_F_REG(f[31]):443return strdup_printf("KVM_REG_RISCV_FP_F_REG(f[%lld])", reg_off);444case KVM_REG_RISCV_FP_F_REG(fcsr):445return "KVM_REG_RISCV_FP_F_REG(fcsr)";446}447448return strdup_printf("%lld /* UNKNOWN */", reg_off);449}450451static const char *fp_d_id_to_str(const char *prefix, __u64 id)452{453/* reg_off is the offset into struct __riscv_d_ext_state */454__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_FP_D);455456assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_FP_D);457458switch (reg_off) {459case KVM_REG_RISCV_FP_D_REG(f[0]) ...460KVM_REG_RISCV_FP_D_REG(f[31]):461return strdup_printf("KVM_REG_RISCV_FP_D_REG(f[%lld])", reg_off);462case KVM_REG_RISCV_FP_D_REG(fcsr):463return "KVM_REG_RISCV_FP_D_REG(fcsr)";464}465466return strdup_printf("%lld /* UNKNOWN */", reg_off);467}468469static const char *vector_id_to_str(const char *prefix, __u64 id)470{471/* reg_off is the offset into struct __riscv_v_ext_state */472__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_VECTOR);473int reg_index = 0;474475assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_VECTOR);476477if (reg_off >= KVM_REG_RISCV_VECTOR_REG(0))478reg_index = reg_off - KVM_REG_RISCV_VECTOR_REG(0);479switch (reg_off) {480case KVM_REG_RISCV_VECTOR_REG(0) ...481KVM_REG_RISCV_VECTOR_REG(31):482return strdup_printf("KVM_REG_RISCV_VECTOR_REG(%d)", reg_index);483case KVM_REG_RISCV_VECTOR_CSR_REG(vstart):484return "KVM_REG_RISCV_VECTOR_CSR_REG(vstart)";485case KVM_REG_RISCV_VECTOR_CSR_REG(vl):486return "KVM_REG_RISCV_VECTOR_CSR_REG(vl)";487case KVM_REG_RISCV_VECTOR_CSR_REG(vtype):488return "KVM_REG_RISCV_VECTOR_CSR_REG(vtype)";489case KVM_REG_RISCV_VECTOR_CSR_REG(vcsr):490return "KVM_REG_RISCV_VECTOR_CSR_REG(vcsr)";491case KVM_REG_RISCV_VECTOR_CSR_REG(vlenb):492return "KVM_REG_RISCV_VECTOR_CSR_REG(vlenb)";493}494495return strdup_printf("%lld /* UNKNOWN */", reg_off);496}497498#define KVM_ISA_EXT_ARR(ext) \499[KVM_RISCV_ISA_EXT_##ext] = "KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_" #ext500501static const char *isa_ext_single_id_to_str(__u64 reg_off)502{503static const char * const kvm_isa_ext_reg_name[] = {504KVM_ISA_EXT_ARR(A),505KVM_ISA_EXT_ARR(C),506KVM_ISA_EXT_ARR(D),507KVM_ISA_EXT_ARR(F),508KVM_ISA_EXT_ARR(H),509KVM_ISA_EXT_ARR(I),510KVM_ISA_EXT_ARR(M),511KVM_ISA_EXT_ARR(V),512KVM_ISA_EXT_ARR(SMNPM),513KVM_ISA_EXT_ARR(SMSTATEEN),514KVM_ISA_EXT_ARR(SSAIA),515KVM_ISA_EXT_ARR(SSCOFPMF),516KVM_ISA_EXT_ARR(SSNPM),517KVM_ISA_EXT_ARR(SSTC),518KVM_ISA_EXT_ARR(SVADE),519KVM_ISA_EXT_ARR(SVADU),520KVM_ISA_EXT_ARR(SVINVAL),521KVM_ISA_EXT_ARR(SVNAPOT),522KVM_ISA_EXT_ARR(SVPBMT),523KVM_ISA_EXT_ARR(SVVPTC),524KVM_ISA_EXT_ARR(ZAAMO),525KVM_ISA_EXT_ARR(ZABHA),526KVM_ISA_EXT_ARR(ZACAS),527KVM_ISA_EXT_ARR(ZALRSC),528KVM_ISA_EXT_ARR(ZAWRS),529KVM_ISA_EXT_ARR(ZBA),530KVM_ISA_EXT_ARR(ZBB),531KVM_ISA_EXT_ARR(ZBC),532KVM_ISA_EXT_ARR(ZBKB),533KVM_ISA_EXT_ARR(ZBKC),534KVM_ISA_EXT_ARR(ZBKX),535KVM_ISA_EXT_ARR(ZBS),536KVM_ISA_EXT_ARR(ZCA),537KVM_ISA_EXT_ARR(ZCB),538KVM_ISA_EXT_ARR(ZCD),539KVM_ISA_EXT_ARR(ZCF),540KVM_ISA_EXT_ARR(ZCMOP),541KVM_ISA_EXT_ARR(ZFA),542KVM_ISA_EXT_ARR(ZFBFMIN),543KVM_ISA_EXT_ARR(ZFH),544KVM_ISA_EXT_ARR(ZFHMIN),545KVM_ISA_EXT_ARR(ZICBOM),546KVM_ISA_EXT_ARR(ZICBOP),547KVM_ISA_EXT_ARR(ZICBOZ),548KVM_ISA_EXT_ARR(ZICCRSE),549KVM_ISA_EXT_ARR(ZICNTR),550KVM_ISA_EXT_ARR(ZICOND),551KVM_ISA_EXT_ARR(ZICSR),552KVM_ISA_EXT_ARR(ZIFENCEI),553KVM_ISA_EXT_ARR(ZIHINTNTL),554KVM_ISA_EXT_ARR(ZIHINTPAUSE),555KVM_ISA_EXT_ARR(ZIHPM),556KVM_ISA_EXT_ARR(ZIMOP),557KVM_ISA_EXT_ARR(ZKND),558KVM_ISA_EXT_ARR(ZKNE),559KVM_ISA_EXT_ARR(ZKNH),560KVM_ISA_EXT_ARR(ZKR),561KVM_ISA_EXT_ARR(ZKSED),562KVM_ISA_EXT_ARR(ZKSH),563KVM_ISA_EXT_ARR(ZKT),564KVM_ISA_EXT_ARR(ZTSO),565KVM_ISA_EXT_ARR(ZVBB),566KVM_ISA_EXT_ARR(ZVBC),567KVM_ISA_EXT_ARR(ZVFBFMIN),568KVM_ISA_EXT_ARR(ZVFBFWMA),569KVM_ISA_EXT_ARR(ZVFH),570KVM_ISA_EXT_ARR(ZVFHMIN),571KVM_ISA_EXT_ARR(ZVKB),572KVM_ISA_EXT_ARR(ZVKG),573KVM_ISA_EXT_ARR(ZVKNED),574KVM_ISA_EXT_ARR(ZVKNHA),575KVM_ISA_EXT_ARR(ZVKNHB),576KVM_ISA_EXT_ARR(ZVKSED),577KVM_ISA_EXT_ARR(ZVKSH),578KVM_ISA_EXT_ARR(ZVKT),579};580581if (reg_off >= ARRAY_SIZE(kvm_isa_ext_reg_name))582return strdup_printf("KVM_REG_RISCV_ISA_SINGLE | %lld /* UNKNOWN */", reg_off);583584return kvm_isa_ext_reg_name[reg_off];585}586587static const char *isa_ext_multi_id_to_str(__u64 reg_subtype, __u64 reg_off)588{589const char *unknown = "";590591if (reg_off > KVM_REG_RISCV_ISA_MULTI_REG_LAST)592unknown = " /* UNKNOWN */";593594switch (reg_subtype) {595case KVM_REG_RISCV_ISA_MULTI_EN:596return strdup_printf("KVM_REG_RISCV_ISA_MULTI_EN | %lld%s", reg_off, unknown);597case KVM_REG_RISCV_ISA_MULTI_DIS:598return strdup_printf("KVM_REG_RISCV_ISA_MULTI_DIS | %lld%s", reg_off, unknown);599}600601return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);602}603604static const char *isa_ext_id_to_str(const char *prefix, __u64 id)605{606__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_ISA_EXT);607__u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK;608609assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_ISA_EXT);610611reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK;612613switch (reg_subtype) {614case KVM_REG_RISCV_ISA_SINGLE:615return isa_ext_single_id_to_str(reg_off);616case KVM_REG_RISCV_ISA_MULTI_EN:617case KVM_REG_RISCV_ISA_MULTI_DIS:618return isa_ext_multi_id_to_str(reg_subtype, reg_off);619}620621return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);622}623624#define KVM_SBI_EXT_ARR(ext) \625[ext] = "KVM_REG_RISCV_SBI_SINGLE | " #ext626627static const char *sbi_ext_single_id_to_str(__u64 reg_off)628{629/* reg_off is KVM_RISCV_SBI_EXT_ID */630static const char * const kvm_sbi_ext_reg_name[] = {631KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_V01),632KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_TIME),633KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_IPI),634KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_RFENCE),635KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_SRST),636KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_HSM),637KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_PMU),638KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_DBCN),639KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_SUSP),640KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_STA),641KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_FWFT),642KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_MPXY),643KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_EXPERIMENTAL),644KVM_SBI_EXT_ARR(KVM_RISCV_SBI_EXT_VENDOR),645};646647if (reg_off >= ARRAY_SIZE(kvm_sbi_ext_reg_name))648return strdup_printf("KVM_REG_RISCV_SBI_SINGLE | %lld /* UNKNOWN */", reg_off);649650return kvm_sbi_ext_reg_name[reg_off];651}652653static const char *sbi_ext_multi_id_to_str(__u64 reg_subtype, __u64 reg_off)654{655const char *unknown = "";656657if (reg_off > KVM_REG_RISCV_SBI_MULTI_REG_LAST)658unknown = " /* UNKNOWN */";659660switch (reg_subtype) {661case KVM_REG_RISCV_SBI_MULTI_EN:662return strdup_printf("KVM_REG_RISCV_SBI_MULTI_EN | %lld%s", reg_off, unknown);663case KVM_REG_RISCV_SBI_MULTI_DIS:664return strdup_printf("KVM_REG_RISCV_SBI_MULTI_DIS | %lld%s", reg_off, unknown);665}666667return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);668}669670static const char *sbi_ext_id_to_str(const char *prefix, __u64 id)671{672__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_SBI_EXT);673__u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK;674675assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_SBI_EXT);676677reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK;678679switch (reg_subtype) {680case KVM_REG_RISCV_SBI_SINGLE:681return sbi_ext_single_id_to_str(reg_off);682case KVM_REG_RISCV_SBI_MULTI_EN:683case KVM_REG_RISCV_SBI_MULTI_DIS:684return sbi_ext_multi_id_to_str(reg_subtype, reg_off);685}686687return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);688}689690static const char *sbi_sta_id_to_str(__u64 reg_off)691{692switch (reg_off) {693case 0: return "KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_lo)";694case 1: return "KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_hi)";695}696return strdup_printf("KVM_REG_RISCV_SBI_STA | %lld /* UNKNOWN */", reg_off);697}698699static const char *sbi_fwft_id_to_str(__u64 reg_off)700{701switch (reg_off) {702case 0: return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.enable)";703case 1: return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.flags)";704case 2: return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.value)";705case 3: return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.enable)";706case 4: return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.flags)";707case 5: return "KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.value)";708}709return strdup_printf("KVM_REG_RISCV_SBI_FWFT | %lld /* UNKNOWN */", reg_off);710}711712static const char *sbi_id_to_str(const char *prefix, __u64 id)713{714__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_SBI_STATE);715__u64 reg_subtype = reg_off & KVM_REG_RISCV_SUBTYPE_MASK;716717assert((id & KVM_REG_RISCV_TYPE_MASK) == KVM_REG_RISCV_SBI_STATE);718719reg_off &= ~KVM_REG_RISCV_SUBTYPE_MASK;720721switch (reg_subtype) {722case KVM_REG_RISCV_SBI_STA:723return sbi_sta_id_to_str(reg_off);724case KVM_REG_RISCV_SBI_FWFT:725return sbi_fwft_id_to_str(reg_off);726}727728return strdup_printf("%lld | %lld /* UNKNOWN */", reg_subtype, reg_off);729}730731void print_reg(const char *prefix, __u64 id)732{733const char *reg_size = NULL;734735TEST_ASSERT((id & KVM_REG_ARCH_MASK) == KVM_REG_RISCV,736"%s: KVM_REG_RISCV missing in reg id: 0x%llx", prefix, id);737738switch (id & KVM_REG_SIZE_MASK) {739case KVM_REG_SIZE_U32:740reg_size = "KVM_REG_SIZE_U32";741break;742case KVM_REG_SIZE_U64:743reg_size = "KVM_REG_SIZE_U64";744break;745case KVM_REG_SIZE_U128:746reg_size = "KVM_REG_SIZE_U128";747break;748case KVM_REG_SIZE_U256:749reg_size = "KVM_REG_SIZE_U256";750break;751default:752printf("\tKVM_REG_RISCV | (%lld << KVM_REG_SIZE_SHIFT) | 0x%llx /* UNKNOWN */,\n",753(id & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT, id & ~REG_MASK);754return;755}756757switch (id & KVM_REG_RISCV_TYPE_MASK) {758case KVM_REG_RISCV_CONFIG:759printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_CONFIG | %s,\n",760reg_size, config_id_to_str(prefix, id));761break;762case KVM_REG_RISCV_CORE:763printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_CORE | %s,\n",764reg_size, core_id_to_str(prefix, id));765break;766case KVM_REG_RISCV_CSR:767printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_CSR | %s,\n",768reg_size, csr_id_to_str(prefix, id));769break;770case KVM_REG_RISCV_TIMER:771printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_TIMER | %s,\n",772reg_size, timer_id_to_str(prefix, id));773break;774case KVM_REG_RISCV_FP_F:775printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_FP_F | %s,\n",776reg_size, fp_f_id_to_str(prefix, id));777break;778case KVM_REG_RISCV_FP_D:779printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_FP_D | %s,\n",780reg_size, fp_d_id_to_str(prefix, id));781break;782case KVM_REG_RISCV_VECTOR:783printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_VECTOR | %s,\n",784reg_size, vector_id_to_str(prefix, id));785break;786case KVM_REG_RISCV_ISA_EXT:787printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_ISA_EXT | %s,\n",788reg_size, isa_ext_id_to_str(prefix, id));789break;790case KVM_REG_RISCV_SBI_EXT:791printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_SBI_EXT | %s,\n",792reg_size, sbi_ext_id_to_str(prefix, id));793break;794case KVM_REG_RISCV_SBI_STATE:795printf("\tKVM_REG_RISCV | %s | KVM_REG_RISCV_SBI_STATE | %s,\n",796reg_size, sbi_id_to_str(prefix, id));797break;798default:799printf("\tKVM_REG_RISCV | %s | 0x%llx /* UNKNOWN */,\n",800reg_size, id & ~REG_MASK);801return;802}803}804805/*806* The current blessed list was primed with the output of kernel version807* v6.5-rc3 and then later updated with new registers.808*/809static __u64 base_regs[] = {810KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(isa),811KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(zicbom_block_size),812KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(mvendorid),813KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(marchid),814KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(mimpid),815KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(zicboz_block_size),816KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(satp_mode),817KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(zicbop_block_size),818KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.pc),819KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.ra),820KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.sp),821KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.gp),822KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.tp),823KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t0),824KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t1),825KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t2),826KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s0),827KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s1),828KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a0),829KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a1),830KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a2),831KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a3),832KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a4),833KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a5),834KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a6),835KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.a7),836KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s2),837KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s3),838KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s4),839KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s5),840KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s6),841KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s7),842KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s8),843KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s9),844KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s10),845KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.s11),846KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t3),847KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t4),848KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t5),849KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(regs.t6),850KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CORE | KVM_REG_RISCV_CORE_REG(mode),851KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sstatus),852KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sie),853KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(stvec),854KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sscratch),855KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sepc),856KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(scause),857KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(stval),858KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(sip),859KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(satp),860KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(scounteren),861KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_GENERAL | KVM_REG_RISCV_CSR_REG(senvcfg),862KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(frequency),863KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(time),864KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(compare),865KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(state),866};867868/*869* The skips_set list registers that should skip set test.870* - KVM_REG_RISCV_TIMER_REG(state): set would fail if it was not initialized properly.871*/872static __u64 base_skips_set[] = {873KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(state),874};875876static __u64 sbi_base_regs[] = {877KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_V01,878KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_TIME,879KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_IPI,880KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_RFENCE,881KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_SRST,882KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_HSM,883KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_EXPERIMENTAL,884KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_VENDOR,885};886887static __u64 sbi_sta_regs[] = {888KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_STA,889KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_lo),890KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_STA | KVM_REG_RISCV_SBI_STA_REG(shmem_hi),891};892893static __u64 sbi_fwft_regs[] = {894KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_FWFT,895KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.enable),896KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.flags),897KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(misaligned_deleg.value),898KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.enable),899KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.flags),900KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_SBI_STATE | KVM_REG_RISCV_SBI_FWFT | KVM_REG_RISCV_SBI_FWFT_REG(pointer_masking.value),901};902903static __u64 zicbom_regs[] = {904KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(zicbom_block_size),905KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOM,906};907908static __u64 zicbop_regs[] = {909KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(zicbop_block_size),910KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOP,911};912913static __u64 zicboz_regs[] = {914KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CONFIG | KVM_REG_RISCV_CONFIG_REG(zicboz_block_size),915KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOZ,916};917918static __u64 aia_regs[] = {919KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siselect),920KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1),921KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2),922KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(sieh),923KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siph),924KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1h),925KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2h),926KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSAIA,927};928929static __u64 smstateen_regs[] = {930KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_SMSTATEEN | KVM_REG_RISCV_CSR_SMSTATEEN_REG(sstateen0),931KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SMSTATEEN,932};933934static __u64 fp_f_regs[] = {935KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[0]),936KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[1]),937KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[2]),938KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[3]),939KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[4]),940KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[5]),941KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[6]),942KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[7]),943KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[8]),944KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[9]),945KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[10]),946KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[11]),947KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[12]),948KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[13]),949KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[14]),950KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[15]),951KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[16]),952KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[17]),953KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[18]),954KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[19]),955KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[20]),956KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[21]),957KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[22]),958KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[23]),959KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[24]),960KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[25]),961KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[26]),962KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[27]),963KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[28]),964KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[29]),965KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[30]),966KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(f[31]),967KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_F | KVM_REG_RISCV_FP_F_REG(fcsr),968KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_F,969};970971static __u64 fp_d_regs[] = {972KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[0]),973KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[1]),974KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[2]),975KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[3]),976KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[4]),977KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[5]),978KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[6]),979KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[7]),980KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[8]),981KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[9]),982KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[10]),983KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[11]),984KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[12]),985KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[13]),986KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[14]),987KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[15]),988KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[16]),989KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[17]),990KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[18]),991KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[19]),992KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[20]),993KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[21]),994KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[22]),995KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[23]),996KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[24]),997KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[25]),998KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[26]),999KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[27]),1000KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[28]),1001KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[29]),1002KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[30]),1003KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(f[31]),1004KVM_REG_RISCV | KVM_REG_SIZE_U32 | KVM_REG_RISCV_FP_D | KVM_REG_RISCV_FP_D_REG(fcsr),1005KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_D,1006};10071008/* Define a default vector registers with length. This will be overwritten at runtime */1009static __u64 vector_regs[] = {1010KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_CSR_REG(vstart),1011KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_CSR_REG(vl),1012KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_CSR_REG(vtype),1013KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_CSR_REG(vcsr),1014KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_CSR_REG(vlenb),1015KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(0),1016KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(1),1017KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(2),1018KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(3),1019KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(4),1020KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(5),1021KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(6),1022KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(7),1023KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(8),1024KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(9),1025KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(10),1026KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(11),1027KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(12),1028KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(13),1029KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(14),1030KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(15),1031KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(16),1032KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(17),1033KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(18),1034KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(19),1035KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(20),1036KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(21),1037KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(22),1038KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(23),1039KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(24),1040KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(25),1041KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(26),1042KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(27),1043KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(28),1044KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(29),1045KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(30),1046KVM_REG_RISCV | KVM_REG_SIZE_U128 | KVM_REG_RISCV_VECTOR | KVM_REG_RISCV_VECTOR_REG(31),1047KVM_REG_RISCV | KVM_REG_SIZE_ULONG | KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_V,1048};10491050#define SUBLIST_BASE \1051{"base", .regs = base_regs, .regs_n = ARRAY_SIZE(base_regs), \1052.skips_set = base_skips_set, .skips_set_n = ARRAY_SIZE(base_skips_set),}1053#define SUBLIST_SBI_BASE \1054{"sbi-base", .feature_type = VCPU_FEATURE_SBI_EXT, .feature = KVM_RISCV_SBI_EXT_V01, \1055.regs = sbi_base_regs, .regs_n = ARRAY_SIZE(sbi_base_regs),}1056#define SUBLIST_SBI_STA \1057{"sbi-sta", .feature_type = VCPU_FEATURE_SBI_EXT, .feature = KVM_RISCV_SBI_EXT_STA, \1058.regs = sbi_sta_regs, .regs_n = ARRAY_SIZE(sbi_sta_regs),}1059#define SUBLIST_SBI_FWFT \1060{"sbi-fwft", .feature_type = VCPU_FEATURE_SBI_EXT, .feature = KVM_RISCV_SBI_EXT_FWFT, \1061.regs = sbi_fwft_regs, .regs_n = ARRAY_SIZE(sbi_fwft_regs),}1062#define SUBLIST_ZICBOM \1063{"zicbom", .feature = KVM_RISCV_ISA_EXT_ZICBOM, .regs = zicbom_regs, .regs_n = ARRAY_SIZE(zicbom_regs),}1064#define SUBLIST_ZICBOP \1065{"zicbop", .feature = KVM_RISCV_ISA_EXT_ZICBOP, .regs = zicbop_regs, .regs_n = ARRAY_SIZE(zicbop_regs),}1066#define SUBLIST_ZICBOZ \1067{"zicboz", .feature = KVM_RISCV_ISA_EXT_ZICBOZ, .regs = zicboz_regs, .regs_n = ARRAY_SIZE(zicboz_regs),}1068#define SUBLIST_AIA \1069{"aia", .feature = KVM_RISCV_ISA_EXT_SSAIA, .regs = aia_regs, .regs_n = ARRAY_SIZE(aia_regs),}1070#define SUBLIST_SMSTATEEN \1071{"smstateen", .feature = KVM_RISCV_ISA_EXT_SMSTATEEN, .regs = smstateen_regs, .regs_n = ARRAY_SIZE(smstateen_regs),}1072#define SUBLIST_FP_F \1073{"fp_f", .feature = KVM_RISCV_ISA_EXT_F, .regs = fp_f_regs, \1074.regs_n = ARRAY_SIZE(fp_f_regs),}1075#define SUBLIST_FP_D \1076{"fp_d", .feature = KVM_RISCV_ISA_EXT_D, .regs = fp_d_regs, \1077.regs_n = ARRAY_SIZE(fp_d_regs),}10781079#define SUBLIST_V \1080{"v", .feature = KVM_RISCV_ISA_EXT_V, .regs = vector_regs, .regs_n = ARRAY_SIZE(vector_regs),}10811082#define KVM_ISA_EXT_SIMPLE_CONFIG(ext, extu) \1083static __u64 regs_##ext[] = { \1084KVM_REG_RISCV | KVM_REG_SIZE_ULONG | \1085KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | \1086KVM_RISCV_ISA_EXT_##extu, \1087}; \1088static struct vcpu_reg_list config_##ext = { \1089.sublists = { \1090SUBLIST_BASE, \1091{ \1092.name = #ext, \1093.feature = KVM_RISCV_ISA_EXT_##extu, \1094.regs = regs_##ext, \1095.regs_n = ARRAY_SIZE(regs_##ext), \1096}, \1097{0}, \1098}, \1099} \11001101#define KVM_SBI_EXT_SIMPLE_CONFIG(ext, extu) \1102static __u64 regs_sbi_##ext[] = { \1103KVM_REG_RISCV | KVM_REG_SIZE_ULONG | \1104KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | \1105KVM_RISCV_SBI_EXT_##extu, \1106}; \1107static struct vcpu_reg_list config_sbi_##ext = { \1108.sublists = { \1109SUBLIST_BASE, \1110{ \1111.name = "sbi-"#ext, \1112.feature_type = VCPU_FEATURE_SBI_EXT, \1113.feature = KVM_RISCV_SBI_EXT_##extu, \1114.regs = regs_sbi_##ext, \1115.regs_n = ARRAY_SIZE(regs_sbi_##ext), \1116}, \1117{0}, \1118}, \1119} \11201121#define KVM_ISA_EXT_SUBLIST_CONFIG(ext, extu) \1122static struct vcpu_reg_list config_##ext = { \1123.sublists = { \1124SUBLIST_BASE, \1125SUBLIST_##extu, \1126{0}, \1127}, \1128} \11291130#define KVM_SBI_EXT_SUBLIST_CONFIG(ext, extu) \1131static struct vcpu_reg_list config_sbi_##ext = { \1132.sublists = { \1133SUBLIST_BASE, \1134SUBLIST_SBI_##extu, \1135{0}, \1136}, \1137} \11381139/* Note: The below list is alphabetically sorted. */11401141KVM_SBI_EXT_SUBLIST_CONFIG(base, BASE);1142KVM_SBI_EXT_SUBLIST_CONFIG(sta, STA);1143KVM_SBI_EXT_SIMPLE_CONFIG(pmu, PMU);1144KVM_SBI_EXT_SIMPLE_CONFIG(dbcn, DBCN);1145KVM_SBI_EXT_SIMPLE_CONFIG(susp, SUSP);1146KVM_SBI_EXT_SIMPLE_CONFIG(mpxy, MPXY);1147KVM_SBI_EXT_SUBLIST_CONFIG(fwft, FWFT);11481149KVM_ISA_EXT_SUBLIST_CONFIG(aia, AIA);1150KVM_ISA_EXT_SUBLIST_CONFIG(fp_f, FP_F);1151KVM_ISA_EXT_SUBLIST_CONFIG(fp_d, FP_D);1152KVM_ISA_EXT_SUBLIST_CONFIG(v, V);1153KVM_ISA_EXT_SIMPLE_CONFIG(h, H);1154KVM_ISA_EXT_SIMPLE_CONFIG(smnpm, SMNPM);1155KVM_ISA_EXT_SUBLIST_CONFIG(smstateen, SMSTATEEN);1156KVM_ISA_EXT_SIMPLE_CONFIG(sscofpmf, SSCOFPMF);1157KVM_ISA_EXT_SIMPLE_CONFIG(ssnpm, SSNPM);1158KVM_ISA_EXT_SIMPLE_CONFIG(sstc, SSTC);1159KVM_ISA_EXT_SIMPLE_CONFIG(svade, SVADE);1160KVM_ISA_EXT_SIMPLE_CONFIG(svadu, SVADU);1161KVM_ISA_EXT_SIMPLE_CONFIG(svinval, SVINVAL);1162KVM_ISA_EXT_SIMPLE_CONFIG(svnapot, SVNAPOT);1163KVM_ISA_EXT_SIMPLE_CONFIG(svpbmt, SVPBMT);1164KVM_ISA_EXT_SIMPLE_CONFIG(svvptc, SVVPTC);1165KVM_ISA_EXT_SIMPLE_CONFIG(zaamo, ZAAMO);1166KVM_ISA_EXT_SIMPLE_CONFIG(zabha, ZABHA);1167KVM_ISA_EXT_SIMPLE_CONFIG(zacas, ZACAS);1168KVM_ISA_EXT_SIMPLE_CONFIG(zalrsc, ZALRSC);1169KVM_ISA_EXT_SIMPLE_CONFIG(zawrs, ZAWRS);1170KVM_ISA_EXT_SIMPLE_CONFIG(zba, ZBA);1171KVM_ISA_EXT_SIMPLE_CONFIG(zbb, ZBB);1172KVM_ISA_EXT_SIMPLE_CONFIG(zbc, ZBC);1173KVM_ISA_EXT_SIMPLE_CONFIG(zbkb, ZBKB);1174KVM_ISA_EXT_SIMPLE_CONFIG(zbkc, ZBKC);1175KVM_ISA_EXT_SIMPLE_CONFIG(zbkx, ZBKX);1176KVM_ISA_EXT_SIMPLE_CONFIG(zbs, ZBS);1177KVM_ISA_EXT_SIMPLE_CONFIG(zca, ZCA);1178KVM_ISA_EXT_SIMPLE_CONFIG(zcb, ZCB);1179KVM_ISA_EXT_SIMPLE_CONFIG(zcd, ZCD);1180KVM_ISA_EXT_SIMPLE_CONFIG(zcf, ZCF);1181KVM_ISA_EXT_SIMPLE_CONFIG(zcmop, ZCMOP);1182KVM_ISA_EXT_SIMPLE_CONFIG(zfa, ZFA);1183KVM_ISA_EXT_SIMPLE_CONFIG(zfbfmin, ZFBFMIN);1184KVM_ISA_EXT_SIMPLE_CONFIG(zfh, ZFH);1185KVM_ISA_EXT_SIMPLE_CONFIG(zfhmin, ZFHMIN);1186KVM_ISA_EXT_SUBLIST_CONFIG(zicbom, ZICBOM);1187KVM_ISA_EXT_SUBLIST_CONFIG(zicbop, ZICBOP);1188KVM_ISA_EXT_SUBLIST_CONFIG(zicboz, ZICBOZ);1189KVM_ISA_EXT_SIMPLE_CONFIG(ziccrse, ZICCRSE);1190KVM_ISA_EXT_SIMPLE_CONFIG(zicntr, ZICNTR);1191KVM_ISA_EXT_SIMPLE_CONFIG(zicond, ZICOND);1192KVM_ISA_EXT_SIMPLE_CONFIG(zicsr, ZICSR);1193KVM_ISA_EXT_SIMPLE_CONFIG(zifencei, ZIFENCEI);1194KVM_ISA_EXT_SIMPLE_CONFIG(zihintntl, ZIHINTNTL);1195KVM_ISA_EXT_SIMPLE_CONFIG(zihintpause, ZIHINTPAUSE);1196KVM_ISA_EXT_SIMPLE_CONFIG(zihpm, ZIHPM);1197KVM_ISA_EXT_SIMPLE_CONFIG(zimop, ZIMOP);1198KVM_ISA_EXT_SIMPLE_CONFIG(zknd, ZKND);1199KVM_ISA_EXT_SIMPLE_CONFIG(zkne, ZKNE);1200KVM_ISA_EXT_SIMPLE_CONFIG(zknh, ZKNH);1201KVM_ISA_EXT_SIMPLE_CONFIG(zkr, ZKR);1202KVM_ISA_EXT_SIMPLE_CONFIG(zksed, ZKSED);1203KVM_ISA_EXT_SIMPLE_CONFIG(zksh, ZKSH);1204KVM_ISA_EXT_SIMPLE_CONFIG(zkt, ZKT);1205KVM_ISA_EXT_SIMPLE_CONFIG(ztso, ZTSO);1206KVM_ISA_EXT_SIMPLE_CONFIG(zvbb, ZVBB);1207KVM_ISA_EXT_SIMPLE_CONFIG(zvbc, ZVBC);1208KVM_ISA_EXT_SIMPLE_CONFIG(zvfbfmin, ZVFBFMIN);1209KVM_ISA_EXT_SIMPLE_CONFIG(zvfbfwma, ZVFBFWMA);1210KVM_ISA_EXT_SIMPLE_CONFIG(zvfh, ZVFH);1211KVM_ISA_EXT_SIMPLE_CONFIG(zvfhmin, ZVFHMIN);1212KVM_ISA_EXT_SIMPLE_CONFIG(zvkb, ZVKB);1213KVM_ISA_EXT_SIMPLE_CONFIG(zvkg, ZVKG);1214KVM_ISA_EXT_SIMPLE_CONFIG(zvkned, ZVKNED);1215KVM_ISA_EXT_SIMPLE_CONFIG(zvknha, ZVKNHA);1216KVM_ISA_EXT_SIMPLE_CONFIG(zvknhb, ZVKNHB);1217KVM_ISA_EXT_SIMPLE_CONFIG(zvksed, ZVKSED);1218KVM_ISA_EXT_SIMPLE_CONFIG(zvksh, ZVKSH);1219KVM_ISA_EXT_SIMPLE_CONFIG(zvkt, ZVKT);12201221struct vcpu_reg_list *vcpu_configs[] = {1222&config_sbi_base,1223&config_sbi_sta,1224&config_sbi_pmu,1225&config_sbi_dbcn,1226&config_sbi_susp,1227&config_sbi_mpxy,1228&config_sbi_fwft,1229&config_aia,1230&config_fp_f,1231&config_fp_d,1232&config_h,1233&config_v,1234&config_smnpm,1235&config_smstateen,1236&config_sscofpmf,1237&config_ssnpm,1238&config_sstc,1239&config_svade,1240&config_svadu,1241&config_svinval,1242&config_svnapot,1243&config_svpbmt,1244&config_svvptc,1245&config_zaamo,1246&config_zabha,1247&config_zacas,1248&config_zalrsc,1249&config_zawrs,1250&config_zba,1251&config_zbb,1252&config_zbc,1253&config_zbkb,1254&config_zbkc,1255&config_zbkx,1256&config_zbs,1257&config_zca,1258&config_zcb,1259&config_zcd,1260&config_zcf,1261&config_zcmop,1262&config_zfa,1263&config_zfbfmin,1264&config_zfh,1265&config_zfhmin,1266&config_zicbom,1267&config_zicbop,1268&config_zicboz,1269&config_ziccrse,1270&config_zicntr,1271&config_zicond,1272&config_zicsr,1273&config_zifencei,1274&config_zihintntl,1275&config_zihintpause,1276&config_zihpm,1277&config_zimop,1278&config_zknd,1279&config_zkne,1280&config_zknh,1281&config_zkr,1282&config_zksed,1283&config_zksh,1284&config_zkt,1285&config_ztso,1286&config_zvbb,1287&config_zvbc,1288&config_zvfbfmin,1289&config_zvfbfwma,1290&config_zvfh,1291&config_zvfhmin,1292&config_zvkb,1293&config_zvkg,1294&config_zvkned,1295&config_zvknha,1296&config_zvknhb,1297&config_zvksed,1298&config_zvksh,1299&config_zvkt,1300};1301int vcpu_configs_n = ARRAY_SIZE(vcpu_configs);130213031304