bool filter_reg(__u64 reg)
{ switch (reg & ~REG_MASK) { /* * Same set of ISA_EXT registers are not present on all host because * ISA_EXT registers are visible to the KVM user space based on the * ISA extensions available on the host. Also, disabling an ISA * extension using corresponding ISA_EXT register does not affect * the visibility of the ISA_EXT register itself. * * Based on above, we should filter-out all ISA_EXT registers. * * Note: The below list is alphabetically sorted.
*/ case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_A: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_C: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_D: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_F: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_H: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_I: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_M: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_V: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SMNPM: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SMSTATEEN: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSAIA: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSCOFPMF: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSNPM: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SSTC: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVADE: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVADU: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVINVAL: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVNAPOT: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVPBMT: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_SVVPTC: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZAAMO: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZABHA: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZACAS: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZALRSC: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZAWRS: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBA: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBB: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBC: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBKB: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBKC: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBKX: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZBS: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZCA: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZCB: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZCD: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZCF: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZCMOP: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZFA: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZFH: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZFHMIN: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOM: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICBOZ: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICCRSE: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICNTR: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICOND: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZICSR: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIFENCEI: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIHINTNTL: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIHINTPAUSE: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIHPM: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZIMOP: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKND: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKNE: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKNH: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKR: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKSED: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKSH: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZKT: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZTSO: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVBB: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVBC: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVFH: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVFHMIN: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKB: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKG: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKNED: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKNHA: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKNHB: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKSED: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKSH: case KVM_REG_RISCV_ISA_EXT | KVM_REG_RISCV_ISA_SINGLE | KVM_RISCV_ISA_EXT_ZVKT: /* * Like ISA_EXT registers, SBI_EXT registers are only visible when the * host supports them and disabling them does not affect the visibility * of the SBI_EXT register itself.
*/ case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_V01: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_TIME: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_IPI: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_RFENCE: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_SRST: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_HSM: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_PMU: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_DBCN: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_SUSP: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_STA: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_EXPERIMENTAL: case KVM_REG_RISCV_SBI_EXT | KVM_REG_RISCV_SBI_SINGLE | KVM_RISCV_SBI_EXT_VENDOR: returntrue; /* AIA registers are always available when Ssaia can't be disabled */ case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siselect): case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1): case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2): case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(sieh): case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(siph): case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio1h): case KVM_REG_RISCV_CSR | KVM_REG_RISCV_CSR_AIA | KVM_REG_RISCV_CSR_AIA_REG(iprio2h): return isa_ext_cant_disable[KVM_RISCV_ISA_EXT_SSAIA]; default: break;
}
for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++)
__vcpu_get_reg(vcpu, RISCV_ISA_EXT_REG(i), &isa_ext_state[i]);
/* * Disable all extensions which were enabled by default * if they were available in the risc-v host.
*/ for (int i = 0; i < KVM_RISCV_ISA_EXT_MAX; i++) {
rc = __vcpu_set_reg(vcpu, RISCV_ISA_EXT_REG(i), 0); if (rc && isa_ext_state[i])
isa_ext_cant_disable[i] = true;
}
for (int i = 0; i < KVM_RISCV_SBI_EXT_MAX; i++) {
rc = __vcpu_set_reg(vcpu, RISCV_SBI_EXT_REG(i), 0);
TEST_ASSERT(!rc || (rc == -1 && errno == ENOENT), "Unexpected error");
}
for_each_sublist(c, s) { if (!s->feature) continue;
if (s->feature == KVM_RISCV_ISA_EXT_V) {
feature = RISCV_ISA_EXT_REG(s->feature);
rc = override_vector_reg_size(vcpu, s, feature); if (rc) goto skip;
}
switch (s->feature_type) { case VCPU_FEATURE_ISA_EXT:
feature = RISCV_ISA_EXT_REG(s->feature); break; case VCPU_FEATURE_SBI_EXT:
feature = RISCV_SBI_EXT_REG(s->feature); break; default:
TEST_FAIL("Unknown feature type");
}
/* Try to enable the desired extension */
__vcpu_set_reg(vcpu, feature, 1);
skip: /* Double check whether the desired extension was enabled */
__TEST_REQUIRE(__vcpu_has_ext(vcpu, feature), "%s not available, skipping tests", s->name);
}
}
staticconstchar *config_id_to_str(constchar *prefix, __u64 id)
{ /* reg_off is the offset into struct kvm_riscv_config */
__u64 reg_off = id & ~(REG_MASK | KVM_REG_RISCV_CONFIG);
switch (reg_off) { case KVM_REG_RISCV_CONFIG_REG(isa): return"KVM_REG_RISCV_CONFIG_REG(isa)"; case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size): return"KVM_REG_RISCV_CONFIG_REG(zicbom_block_size)"; case KVM_REG_RISCV_CONFIG_REG(zicboz_block_size): return"KVM_REG_RISCV_CONFIG_REG(zicboz_block_size)"; case KVM_REG_RISCV_CONFIG_REG(mvendorid): return"KVM_REG_RISCV_CONFIG_REG(mvendorid)"; case KVM_REG_RISCV_CONFIG_REG(marchid): return"KVM_REG_RISCV_CONFIG_REG(marchid)"; case KVM_REG_RISCV_CONFIG_REG(mimpid): return"KVM_REG_RISCV_CONFIG_REG(mimpid)"; case KVM_REG_RISCV_CONFIG_REG(satp_mode): return"KVM_REG_RISCV_CONFIG_REG(satp_mode)";
}
staticconstchar *general_csr_id_to_str(__u64 reg_off)
{ /* reg_off is the offset into struct kvm_riscv_csr */ switch (reg_off) { case KVM_REG_RISCV_CSR_REG(sstatus): return RISCV_CSR_GENERAL(sstatus); case KVM_REG_RISCV_CSR_REG(sie): return RISCV_CSR_GENERAL(sie); case KVM_REG_RISCV_CSR_REG(stvec): return RISCV_CSR_GENERAL(stvec); case KVM_REG_RISCV_CSR_REG(sscratch): return RISCV_CSR_GENERAL(sscratch); case KVM_REG_RISCV_CSR_REG(sepc): return RISCV_CSR_GENERAL(sepc); case KVM_REG_RISCV_CSR_REG(scause): return RISCV_CSR_GENERAL(scause); case KVM_REG_RISCV_CSR_REG(stval): return RISCV_CSR_GENERAL(stval); case KVM_REG_RISCV_CSR_REG(sip): return RISCV_CSR_GENERAL(sip); case KVM_REG_RISCV_CSR_REG(satp): return RISCV_CSR_GENERAL(satp); case KVM_REG_RISCV_CSR_REG(scounteren): return RISCV_CSR_GENERAL(scounteren); case KVM_REG_RISCV_CSR_REG(senvcfg): return RISCV_CSR_GENERAL(senvcfg);
}
staticconstchar *aia_csr_id_to_str(__u64 reg_off)
{ /* reg_off is the offset into struct kvm_riscv_aia_csr */ switch (reg_off) { case KVM_REG_RISCV_CSR_AIA_REG(siselect): return RISCV_CSR_AIA(siselect); case KVM_REG_RISCV_CSR_AIA_REG(iprio1): return RISCV_CSR_AIA(iprio1); case KVM_REG_RISCV_CSR_AIA_REG(iprio2): return RISCV_CSR_AIA(iprio2); case KVM_REG_RISCV_CSR_AIA_REG(sieh): return RISCV_CSR_AIA(sieh); case KVM_REG_RISCV_CSR_AIA_REG(siph): return RISCV_CSR_AIA(siph); case KVM_REG_RISCV_CSR_AIA_REG(iprio1h): return RISCV_CSR_AIA(iprio1h); case KVM_REG_RISCV_CSR_AIA_REG(iprio2h): return RISCV_CSR_AIA(iprio2h);
}
switch (reg_off) { case KVM_REG_RISCV_TIMER_REG(frequency): return"KVM_REG_RISCV_TIMER_REG(frequency)"; case KVM_REG_RISCV_TIMER_REG(time): return"KVM_REG_RISCV_TIMER_REG(time)"; case KVM_REG_RISCV_TIMER_REG(compare): return"KVM_REG_RISCV_TIMER_REG(compare)"; case KVM_REG_RISCV_TIMER_REG(state): return"KVM_REG_RISCV_TIMER_REG(state)";
}
if (reg_off >= KVM_REG_RISCV_VECTOR_REG(0))
reg_index = reg_off - KVM_REG_RISCV_VECTOR_REG(0); switch (reg_off) { case KVM_REG_RISCV_VECTOR_REG(0) ...
KVM_REG_RISCV_VECTOR_REG(31): return strdup_printf("KVM_REG_RISCV_VECTOR_REG(%d)", reg_index); case KVM_REG_RISCV_VECTOR_CSR_REG(vstart): return"KVM_REG_RISCV_VECTOR_CSR_REG(vstart)"; case KVM_REG_RISCV_VECTOR_CSR_REG(vl): return"KVM_REG_RISCV_VECTOR_CSR_REG(vl)"; case KVM_REG_RISCV_VECTOR_CSR_REG(vtype): return"KVM_REG_RISCV_VECTOR_CSR_REG(vtype)"; case KVM_REG_RISCV_VECTOR_CSR_REG(vcsr): return"KVM_REG_RISCV_VECTOR_CSR_REG(vcsr)"; case KVM_REG_RISCV_VECTOR_CSR_REG(vlenb): return"KVM_REG_RISCV_VECTOR_CSR_REG(vlenb)";
}
switch (reg_subtype) { case KVM_REG_RISCV_ISA_SINGLE: return isa_ext_single_id_to_str(reg_off); case KVM_REG_RISCV_ISA_MULTI_EN: case KVM_REG_RISCV_ISA_MULTI_DIS: return isa_ext_multi_id_to_str(reg_subtype, reg_off);
}
switch (reg_subtype) { case KVM_REG_RISCV_SBI_SINGLE: return sbi_ext_single_id_to_str(reg_off); case KVM_REG_RISCV_SBI_MULTI_EN: case KVM_REG_RISCV_SBI_MULTI_DIS: return sbi_ext_multi_id_to_str(reg_subtype, reg_off);
}
/* * The skips_set list registers that should skip set test. * - KVM_REG_RISCV_TIMER_REG(state): set would fail if it was not initialized properly.
*/ static __u64 base_skips_set[] = {
KVM_REG_RISCV | KVM_REG_SIZE_U64 | KVM_REG_RISCV_TIMER | KVM_REG_RISCV_TIMER_REG(state),
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.