target/riscv/kvm: add KVM support for Zicbop extension
When the Zicbop extension is available expose it to the KVM guest. Also read and validate cbop_blocksize from the host via KVM interface. Signed-off-by: Zongmin Zhou <zhouzongmin@kylinos.cn> Reviewed-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com> Message-ID: <9e388aa9984ea9d3d0c85e1630c9195023938952.1778653159.git.zhouzongmin@kylinos.cn> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Zongmin Zhou committed
May 13, 2026 at 15:02 UTC
7499bae6d91f100c57dca9e23ede2e39fb169b35
1 file changed
+32
-2
target/riscv/kvm/kvm-cpu.c
+32
-2
@@ -293,6 +293,7 @@ static void kvm_cpu_csr_set_u64(RISCVCPU *cpu, KVMCPUConfig *csr_cfg,
293
294
static KVMCPUConfig kvm_multi_ext_cfgs[] = {
295
KVM_EXT_CFG("zicbom", ext_zicbom, KVM_RISCV_ISA_EXT_ZICBOM),
296
+ KVM_EXT_CFG("zicbop", ext_zicbop, KVM_RISCV_ISA_EXT_ZICBOP),
297
KVM_EXT_CFG("zicboz", ext_zicboz, KVM_RISCV_ISA_EXT_ZICBOZ),
298
KVM_EXT_CFG("ziccrse", ext_ziccrse, KVM_RISCV_ISA_EXT_ZICCRSE),
299
KVM_EXT_CFG("zicntr", ext_zicntr, KVM_RISCV_ISA_EXT_ZICNTR),
@@ -439,6 +440,12 @@ static KVMCPUConfig kvm_cboz_blocksize = {
440
.kvm_reg_id = KVM_REG_RISCV_CONFIG_REG(zicboz_block_size)
441
};
442
443
+static KVMCPUConfig kvm_cbop_blocksize = {
444
+ .name = "cbop_blocksize",
445
+ .offset = CPU_CFG_OFFSET(cbop_blocksize),
446
+ .kvm_reg_id = KVM_REG_RISCV_CONFIG_REG(zicbop_block_size)
447
+};
448
+
449
static KVMCPUConfig kvm_v_vlenb = {
450
.name = "vlenb",
451
.offset = CPU_CFG_OFFSET(vlenb),
@@ -1293,6 +1300,10 @@ static void kvm_riscv_init_cfg(RISCVCPU *cpu, KVMScratchCPU *kvmcpu)
1300
kvm_riscv_read_cbomz_blksize(cpu, kvmcpu, &kvm_cbom_blocksize);
1301
}
1302
1303
+ if (cpu->cfg.ext_zicbop) {
1304
+ kvm_riscv_read_cbomz_blksize(cpu, kvmcpu, &kvm_cbop_blocksize);
1305
+ }
1306
+
1307
if (cpu->cfg.ext_zicboz) {
1308
kvm_riscv_read_cbomz_blksize(cpu, kvmcpu, &kvm_cboz_blocksize);
1309
}
@@ -2014,8 +2025,8 @@ void riscv_kvm_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
2025
int ret;
2026
2027
/* short-circuit without spinning the scratch CPU */
2017
- if (!cpu->cfg.ext_zicbom && !cpu->cfg.ext_zicboz &&
2018
- !riscv_has_ext(env, RVV)) {
2028
+ if (!cpu->cfg.ext_zicbom && !cpu->cfg.ext_zicbop &&
2029
+ !cpu->cfg.ext_zicboz && !riscv_has_ext(env, RVV)) {
2030
return;
2031
}
2032
@@ -2062,6 +2073,25 @@ void riscv_kvm_cpu_finalize_features(RISCVCPU *cpu, Error **errp)
2073
}
2074
}
2075
2076
+ if (cpu->cfg.ext_zicbop &&
2077
+ riscv_cpu_option_set(kvm_cbop_blocksize.name)) {
2078
+
2079
+ reg.id = KVM_RISCV_REG_ID_ULONG(KVM_REG_RISCV_CONFIG,
2080
+ kvm_cbop_blocksize.kvm_reg_id);
2081
+ reg.addr = (uint64_t)&val;
2082
+ ret = ioctl(kvmcpu.cpufd, KVM_GET_ONE_REG, ®);
2083
+ if (ret != 0) {
2084
+ error_setg_errno(errp, errno, "Unable to read cbop_blocksize");
2085
+ return;
2086
+ }
2087
+
2088
+ if (cpu->cfg.cbop_blocksize != val) {
2089
+ error_setg(errp, "Unable to set cbop_blocksize to a different "
2090
+ "value than the host (%lu)", val);
2091
+ return;
2092
+ }
2093
+ }
2094
+
2095
/* Users are setting vlen, not vlenb */
2096
if (riscv_has_ext(env, RVV) && riscv_cpu_option_set("vlen")) {
2097
if (!kvm_v_vlenb.supported) {