@samitouri / QOSamiQemu / commits / 7499bae6d9

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, &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) {