]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
RISC-V: KVM: Provide UAPI for Zicbop block size
authorQuan Zhou <zhouquan@iscas.ac.cn>
Fri, 8 Aug 2025 10:18:34 +0000 (18:18 +0800)
committerAnup Patel <anup@brainfault.org>
Tue, 16 Sep 2025 05:23:38 +0000 (10:53 +0530)
We're about to allow guests to use the Zicbop extension.
KVM userspace needs to know the cache block size in order to
properly advertise it to the guest. Provide a virtual config
register for userspace to get it with the GET_ONE_REG API, but
setting it cannot be supported, so disallow SET_ONE_REG.

Signed-off-by: Quan Zhou <zhouquan@iscas.ac.cn>
Reviewed-by: Nutty Liu <nutty.liu@hotmail.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Link: https://lore.kernel.org/r/befd8403cd76d7adb97231ac993eaeb86bf2582c.1754646071.git.zhouquan@iscas.ac.cn
Signed-off-by: Anup Patel <anup@brainfault.org>
arch/riscv/include/uapi/asm/kvm.h
arch/riscv/kvm/vcpu_onereg.c

index a5ca0f4ce2d336a6cafaff8f422c565f7d2f2401..4644e10bf4afc0efca756e1ef83b0f5edc62a0f1 100644 (file)
@@ -56,6 +56,7 @@ struct kvm_riscv_config {
        unsigned long mimpid;
        unsigned long zicboz_block_size;
        unsigned long satp_mode;
+       unsigned long zicbop_block_size;
 };
 
 /* CORE registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
index 87a2ee369ac2e957a5c8a728f72b98b68a15bb25..dcbcefbf64b07969c25ab3ac2a0b9d2e553e7ec9 100644 (file)
@@ -285,6 +285,11 @@ static int kvm_riscv_vcpu_get_reg_config(struct kvm_vcpu *vcpu,
                        return -ENOENT;
                reg_val = riscv_cboz_block_size;
                break;
+       case KVM_REG_RISCV_CONFIG_REG(zicbop_block_size):
+               if (!riscv_isa_extension_available(NULL, ZICBOP))
+                       return -ENOENT;
+               reg_val = riscv_cbop_block_size;
+               break;
        case KVM_REG_RISCV_CONFIG_REG(mvendorid):
                reg_val = vcpu->arch.mvendorid;
                break;
@@ -376,6 +381,12 @@ static int kvm_riscv_vcpu_set_reg_config(struct kvm_vcpu *vcpu,
                if (reg_val != riscv_cboz_block_size)
                        return -EINVAL;
                break;
+       case KVM_REG_RISCV_CONFIG_REG(zicbop_block_size):
+               if (!riscv_isa_extension_available(NULL, ZICBOP))
+                       return -ENOENT;
+               if (reg_val != riscv_cbop_block_size)
+                       return -EINVAL;
+               break;
        case KVM_REG_RISCV_CONFIG_REG(mvendorid):
                if (reg_val == vcpu->arch.mvendorid)
                        break;
@@ -821,6 +832,9 @@ static int copy_config_reg_indices(const struct kvm_vcpu *vcpu,
                else if (i == KVM_REG_RISCV_CONFIG_REG(zicboz_block_size) &&
                        !riscv_isa_extension_available(NULL, ZICBOZ))
                        continue;
+               else if (i == KVM_REG_RISCV_CONFIG_REG(zicbop_block_size) &&
+                       !riscv_isa_extension_available(NULL, ZICBOP))
+                       continue;
 
                size = IS_ENABLED(CONFIG_32BIT) ? KVM_REG_SIZE_U32 : KVM_REG_SIZE_U64;
                reg = KVM_REG_RISCV | size | KVM_REG_RISCV_CONFIG | i;