arm64: Add macro to compose a sysreg field value
authorMarc Zyngier <maz@kernel.org>
Mon, 22 Jan 2024 18:13:35 +0000 (18:13 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Thu, 8 Feb 2024 15:12:44 +0000 (15:12 +0000)
A common idiom is to compose a tupple (reg, field, val) into
a symbol matching an autogenerated definition.

Add a help performing the concatenation and replace it when
open-coded implementations exist.

Suggested-by: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Link: https://lore.kernel.org/r/20240122181344.258974-2-maz@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/sysreg.h
arch/arm64/kvm/sys_regs.c

index c3b19b376c86722c668a208b0be6cd122de17851..9e8999592f3af5068b27717f137337e5af500165 100644 (file)
        par;                                                            \
 })
 
+#define SYS_FIELD_VALUE(reg, field, val)       reg##_##field##_##val
+
 #define SYS_FIELD_GET(reg, field, val)         \
                 FIELD_GET(reg##_##field##_MASK, val)
 
                 FIELD_PREP(reg##_##field##_MASK, val)
 
 #define SYS_FIELD_PREP_ENUM(reg, field, val)           \
-                FIELD_PREP(reg##_##field##_MASK, reg##_##field##_##val)
+                FIELD_PREP(reg##_##field##_MASK,       \
+                           SYS_FIELD_VALUE(reg, field, val))
 
 #endif
 
index 30253bd19917f46640ecffc914d91a7d1102dc81..88b8fbeafaa0b7f398599564172dbbab31ae0814 100644 (file)
@@ -1685,7 +1685,8 @@ static u64 read_sanitised_id_aa64pfr0_el1(struct kvm_vcpu *vcpu,
        u64 __f_val = FIELD_GET(reg##_##field##_MASK, val);                    \
        (val) &= ~reg##_##field##_MASK;                                        \
        (val) |= FIELD_PREP(reg##_##field##_MASK,                              \
-                       min(__f_val, (u64)reg##_##field##_##limit));           \
+                           min(__f_val,                                       \
+                               (u64)SYS_FIELD_VALUE(reg, field, limit)));     \
        (val);                                                                 \
 })