RISC-V: KVM: Add ONE_REG interface for mvendorid, marchid, and mimpid
authorAnup Patel <apatel@ventanamicro.com>
Wed, 7 Dec 2022 03:47:49 +0000 (09:17 +0530)
committerAnup Patel <anup@brainfault.org>
Wed, 7 Dec 2022 03:47:49 +0000 (09:17 +0530)
We add ONE_REG interface for VCPU mvendorid, marchid, and mimpid
so that KVM user-space can change this details to support migration
across heterogeneous hosts.

Signed-off-by: Anup Patel <apatel@ventanamicro.com>
Reviewed-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Signed-off-by: Anup Patel <anup@brainfault.org>
arch/riscv/include/uapi/asm/kvm.h
arch/riscv/kvm/vcpu.c

index 8985ff234c01cd03ce660dfaad7cf5abedfd2a78..92af6f3f057cf7d33031343ee09e01588b7aef17 100644 (file)
@@ -49,6 +49,9 @@ struct kvm_sregs {
 struct kvm_riscv_config {
        unsigned long isa;
        unsigned long zicbom_block_size;
+       unsigned long mvendorid;
+       unsigned long marchid;
+       unsigned long mimpid;
 };
 
 /* CORE registers for KVM_GET_ONE_REG and KVM_SET_ONE_REG */
index 312a8a92686775172fa558eb64837e18d9ae5fcd..7c08567097f0a875ebe11afa00b8f29f372e130e 100644 (file)
@@ -276,6 +276,15 @@ static int kvm_riscv_vcpu_get_reg_config(struct kvm_vcpu *vcpu,
                        return -EINVAL;
                reg_val = riscv_cbom_block_size;
                break;
+       case KVM_REG_RISCV_CONFIG_REG(mvendorid):
+               reg_val = vcpu->arch.mvendorid;
+               break;
+       case KVM_REG_RISCV_CONFIG_REG(marchid):
+               reg_val = vcpu->arch.marchid;
+               break;
+       case KVM_REG_RISCV_CONFIG_REG(mimpid):
+               reg_val = vcpu->arch.mimpid;
+               break;
        default:
                return -EINVAL;
        }
@@ -338,6 +347,24 @@ static int kvm_riscv_vcpu_set_reg_config(struct kvm_vcpu *vcpu,
                break;
        case KVM_REG_RISCV_CONFIG_REG(zicbom_block_size):
                return -EOPNOTSUPP;
+       case KVM_REG_RISCV_CONFIG_REG(mvendorid):
+               if (!vcpu->arch.ran_atleast_once)
+                       vcpu->arch.mvendorid = reg_val;
+               else
+                       return -EBUSY;
+               break;
+       case KVM_REG_RISCV_CONFIG_REG(marchid):
+               if (!vcpu->arch.ran_atleast_once)
+                       vcpu->arch.marchid = reg_val;
+               else
+                       return -EBUSY;
+               break;
+       case KVM_REG_RISCV_CONFIG_REG(mimpid):
+               if (!vcpu->arch.ran_atleast_once)
+                       vcpu->arch.mimpid = reg_val;
+               else
+                       return -EBUSY;
+               break;
        default:
                return -EINVAL;
        }