]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: arm64: Make ID_REG_LIMIT_FIELD_ENUM() more widely available
authorMarc Zyngier <maz@kernel.org>
Thu, 20 Feb 2025 13:49:00 +0000 (13:49 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Mon, 24 Feb 2025 19:06:55 +0000 (11:06 -0800)
ID_REG_LIMIT_FIELD_ENUM() is a useful macro to limit the idreg
features exposed to guest and userspace, and the NV code can
make use of it.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Joey Gouly <joey.gouly@arm.com>
Link: https://lore.kernel.org/r/20250220134907.554085-8-maz@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/kvm/sys_regs.c
arch/arm64/kvm/sys_regs.h

index a30c48a71f50ba4977ae8395d959a64eba534404..db94d8a380331cc33b200dd297a12f1e98091aec 100644 (file)
@@ -1803,16 +1803,6 @@ static u64 sanitise_id_aa64pfr0_el1(const struct kvm_vcpu *vcpu, u64 val)
        return val;
 }
 
-#define ID_REG_LIMIT_FIELD_ENUM(val, reg, field, limit)                               \
-({                                                                            \
-       u64 __f_val = FIELD_GET(reg##_##field##_MASK, val);                    \
-       (val) &= ~reg##_##field##_MASK;                                        \
-       (val) |= FIELD_PREP(reg##_##field##_MASK,                              \
-                           min(__f_val,                                       \
-                               (u64)SYS_FIELD_VALUE(reg, field, limit)));     \
-       (val);                                                                 \
-})
-
 static u64 sanitise_id_aa64dfr0_el1(const struct kvm_vcpu *vcpu, u64 val)
 {
        val = ID_REG_LIMIT_FIELD_ENUM(val, ID_AA64DFR0_EL1, DebugVer, V8P8);
index 1d94ed6efad2ca46eca2e6f7450aa276553d47eb..cc6338d3876638a69d432462608c5e7e8eb34ac8 100644 (file)
@@ -247,4 +247,14 @@ int kvm_finalize_sys_regs(struct kvm_vcpu *vcpu);
        CRn(sys_reg_CRn(reg)), CRm(sys_reg_CRm(reg)),   \
        Op2(sys_reg_Op2(reg))
 
+#define ID_REG_LIMIT_FIELD_ENUM(val, reg, field, limit)                               \
+({                                                                            \
+       u64 __f_val = FIELD_GET(reg##_##field##_MASK, val);                    \
+       (val) &= ~reg##_##field##_MASK;                                        \
+       (val) |= FIELD_PREP(reg##_##field##_MASK,                              \
+                           min(__f_val,                                       \
+                               (u64)SYS_FIELD_VALUE(reg, field, limit)));     \
+       (val);                                                                 \
+})
+
 #endif /* __ARM64_KVM_SYS_REGS_LOCAL_H__ */