static KVMCPUConfig kvm_multi_ext_cfgs[] = {
KVM_EXT_CFG("zicbom", ext_zicbom, KVM_RISCV_ISA_EXT_ZICBOM),
+ KVM_EXT_CFG("zicbop", ext_zicbop, KVM_RISCV_ISA_EXT_ZICBOP),
KVM_EXT_CFG("zicboz", ext_zicboz, KVM_RISCV_ISA_EXT_ZICBOZ),
KVM_EXT_CFG("ziccrse", ext_ziccrse, KVM_RISCV_ISA_EXT_ZICCRSE),
KVM_EXT_CFG("zicntr", ext_zicntr, KVM_RISCV_ISA_EXT_ZICNTR),
.kvm_reg_id = KVM_REG_RISCV_CONFIG_REG(zicboz_block_size)
};
+static KVMCPUConfig kvm_cbop_blocksize = {
+ .name = "cbop_blocksize",
+ .offset = CPU_CFG_OFFSET(cbop_blocksize),
+ .kvm_reg_id = KVM_REG_RISCV_CONFIG_REG(zicbop_block_size)
+};
+
static KVMCPUConfig kvm_v_vlenb = {
.name = "vlenb",
.offset = CPU_CFG_OFFSET(vlenb),
kvm_riscv_read_cbomz_blksize(cpu, kvmcpu, &kvm_cbom_blocksize);
}
+ if (cpu->cfg.ext_zicbop) {
+ kvm_riscv_read_cbomz_blksize(cpu, kvmcpu, &kvm_cbop_blocksize);
+ }
+
if (cpu->cfg.ext_zicboz) {
kvm_riscv_read_cbomz_blksize(cpu, kvmcpu, &kvm_cboz_blocksize);
}
int ret;
/* short-circuit without spinning the scratch CPU */
- if (!cpu->cfg.ext_zicbom && !cpu->cfg.ext_zicboz &&
- !riscv_has_ext(env, RVV)) {
+ if (!cpu->cfg.ext_zicbom && !cpu->cfg.ext_zicbop &&
+ !cpu->cfg.ext_zicboz && !riscv_has_ext(env, RVV)) {
return;
}
}
}
+ if (cpu->cfg.ext_zicbop &&
+ riscv_cpu_option_set(kvm_cbop_blocksize.name)) {
+
+ reg.id = KVM_RISCV_REG_ID_ULONG(KVM_REG_RISCV_CONFIG,
+ kvm_cbop_blocksize.kvm_reg_id);
+ reg.addr = (uint64_t)&val;
+ ret = ioctl(kvmcpu.cpufd, KVM_GET_ONE_REG, ®);
+ if (ret != 0) {
+ error_setg_errno(errp, errno, "Unable to read cbop_blocksize");
+ return;
+ }
+
+ if (cpu->cfg.cbop_blocksize != val) {
+ error_setg(errp, "Unable to set cbop_blocksize to a different "
+ "value than the host (%lu)", val);
+ return;
+ }
+ }
+
/* Users are setting vlen, not vlenb */
if (riscv_has_ext(env, RVV) && riscv_cpu_option_set("vlen")) {
if (!kvm_v_vlenb.supported) {