Skip to content

Commit 0d87485

Browse files
committed
Merge branch kvm-arm64/vm-configuration into kvmarm/next
* kvm-arm64/vm-configuration: (29 commits) : VM configuration enforcement, courtesy of Marc Zyngier : : Userspace has gained the ability to control the features visible : through the ID registers, yet KVM didn't take this into account as the : effective feature set when determing trap / emulation behavior. This : series adds: : : - Mechanism for testing the presence of a particular CPU feature in the : guest's ID registers : : - Infrastructure for computing the effective value of VNCR-backed : registers, taking into account the RES0 / RES1 bits for a particular : VM configuration : : - Implementation of 'fine-grained UNDEF' controls that shadow the FGT : register definitions. KVM: arm64: Don't initialize idreg debugfs w/ preemption disabled KVM: arm64: Fail the idreg iterator if idregs aren't initialized KVM: arm64: Make build-time check of RES0/RES1 bits optional KVM: arm64: Add debugfs file for guest's ID registers KVM: arm64: Snapshot all non-zero RES0/RES1 sysreg fields for later checking KVM: arm64: Make FEAT_MOPS UNDEF if not advertised to the guest KVM: arm64: Make AMU sysreg UNDEF if FEAT_AMU is not advertised to the guest KVM: arm64: Make PIR{,E0}_EL1 UNDEF if S1PIE is not advertised to the guest KVM: arm64: Make TLBI OS/Range UNDEF if not advertised to the guest KVM: arm64: Streamline save/restore of HFG[RW]TR_EL2 KVM: arm64: Move existing feature disabling over to FGU infrastructure KVM: arm64: Propagate and handle Fine-Grained UNDEF bits KVM: arm64: Add Fine-Grained UNDEF tracking information KVM: arm64: Rename __check_nv_sr_forward() to triage_sysreg_trap() KVM: arm64: Use the xarray as the primary sysreg/sysinsn walker KVM: arm64: Register AArch64 system register entries with the sysreg xarray KVM: arm64: Always populate the trap configuration xarray KVM: arm64: nv: Move system instructions to their own sys_reg_desc array KVM: arm64: Drop the requirement for XARRAY_MULTI KVM: arm64: nv: Turn encoding ranges into discrete XArray stores ... Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
2 parents a040adf + 5c1ebe9 commit 0d87485

File tree

15 files changed

+997
-181
lines changed

15 files changed

+997
-181
lines changed

arch/arm64/include/asm/kvm_arm.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,7 @@
102102
#define HCR_HOST_NVHE_PROTECTED_FLAGS (HCR_HOST_NVHE_FLAGS | HCR_TSC)
103103
#define HCR_HOST_VHE_FLAGS (HCR_RW | HCR_TGE | HCR_E2H)
104104

105-
#define HCRX_GUEST_FLAGS \
106-
(HCRX_EL2_SMPME | HCRX_EL2_TCR2En | \
107-
(cpus_have_final_cap(ARM64_HAS_MOPS) ? (HCRX_EL2_MSCEn | HCRX_EL2_MCE2) : 0))
105+
#define HCRX_GUEST_FLAGS (HCRX_EL2_SMPME | HCRX_EL2_TCR2En)
108106
#define HCRX_HOST_FLAGS (HCRX_EL2_MSCEn | HCRX_EL2_TCR2En)
109107

110108
/* TCR_EL2 Registers bits */

arch/arm64/include/asm/kvm_host.h

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,32 @@ static inline u16 kvm_mpidr_index(struct kvm_mpidr_data *data, u64 mpidr)
238238
return index;
239239
}
240240

241+
struct kvm_sysreg_masks;
242+
243+
enum fgt_group_id {
244+
__NO_FGT_GROUP__,
245+
HFGxTR_GROUP,
246+
HDFGRTR_GROUP,
247+
HDFGWTR_GROUP = HDFGRTR_GROUP,
248+
HFGITR_GROUP,
249+
HAFGRTR_GROUP,
250+
251+
/* Must be last */
252+
__NR_FGT_GROUP_IDS__
253+
};
254+
241255
struct kvm_arch {
242256
struct kvm_s2_mmu mmu;
243257

258+
/*
259+
* Fine-Grained UNDEF, mimicking the FGT layout defined by the
260+
* architecture. We track them globally, as we present the
261+
* same feature-set to all vcpus.
262+
*
263+
* Index 0 is currently spare.
264+
*/
265+
u64 fgu[__NR_FGT_GROUP_IDS__];
266+
244267
/* Interrupt controller */
245268
struct vgic_dist vgic;
246269

@@ -274,6 +297,8 @@ struct kvm_arch {
274297
#define KVM_ARCH_FLAG_TIMER_PPIS_IMMUTABLE 6
275298
/* Initial ID reg values loaded */
276299
#define KVM_ARCH_FLAG_ID_REGS_INITIALIZED 7
300+
/* Fine-Grained UNDEF initialised */
301+
#define KVM_ARCH_FLAG_FGU_INITIALIZED 8
277302
unsigned long flags;
278303

279304
/* VM-wide vCPU feature set */
@@ -294,6 +319,9 @@ struct kvm_arch {
294319
/* PMCR_EL0.N value for the guest */
295320
u8 pmcr_n;
296321

322+
/* Iterator for idreg debugfs */
323+
u8 idreg_debugfs_iter;
324+
297325
/* Hypercall features firmware registers' descriptor */
298326
struct kvm_smccc_features smccc_feat;
299327
struct maple_tree smccc_filter;
@@ -312,6 +340,9 @@ struct kvm_arch {
312340
#define KVM_ARM_ID_REG_NUM (IDREG_IDX(sys_reg(3, 0, 0, 7, 7)) + 1)
313341
u64 id_regs[KVM_ARM_ID_REG_NUM];
314342

343+
/* Masks for VNCR-baked sysregs */
344+
struct kvm_sysreg_masks *sysreg_masks;
345+
315346
/*
316347
* For an untrusted host VM, 'pkvm.handle' is used to lookup
317348
* the associated pKVM instance in the hypervisor.
@@ -474,6 +505,13 @@ enum vcpu_sysreg {
474505
NR_SYS_REGS /* Nothing after this line! */
475506
};
476507

508+
struct kvm_sysreg_masks {
509+
struct {
510+
u64 res0;
511+
u64 res1;
512+
} mask[NR_SYS_REGS - __VNCR_START__];
513+
};
514+
477515
struct kvm_cpu_context {
478516
struct user_pt_regs regs; /* sp = sp_el0 */
479517

@@ -549,6 +587,7 @@ struct kvm_vcpu_arch {
549587

550588
/* Values of trap registers for the guest. */
551589
u64 hcr_el2;
590+
u64 hcrx_el2;
552591
u64 mdcr_el2;
553592
u64 cptr_el2;
554593

@@ -868,7 +907,15 @@ static inline u64 *__ctxt_sys_reg(const struct kvm_cpu_context *ctxt, int r)
868907

869908
#define ctxt_sys_reg(c,r) (*__ctxt_sys_reg(c,r))
870909

871-
#define __vcpu_sys_reg(v,r) (ctxt_sys_reg(&(v)->arch.ctxt, (r)))
910+
u64 kvm_vcpu_sanitise_vncr_reg(const struct kvm_vcpu *, enum vcpu_sysreg);
911+
#define __vcpu_sys_reg(v,r) \
912+
(*({ \
913+
const struct kvm_cpu_context *ctxt = &(v)->arch.ctxt; \
914+
u64 *__r = __ctxt_sys_reg(ctxt, (r)); \
915+
if (vcpu_has_nv((v)) && (r) >= __VNCR_START__) \
916+
*__r = kvm_vcpu_sanitise_vncr_reg((v), (r)); \
917+
__r; \
918+
}))
872919

873920
u64 vcpu_read_sys_reg(const struct kvm_vcpu *vcpu, int reg);
874921
void vcpu_write_sys_reg(struct kvm_vcpu *vcpu, u64 val, int reg);
@@ -1055,14 +1102,20 @@ int kvm_handle_cp15_64(struct kvm_vcpu *vcpu);
10551102
int kvm_handle_sys_reg(struct kvm_vcpu *vcpu);
10561103
int kvm_handle_cp10_id(struct kvm_vcpu *vcpu);
10571104

1105+
void kvm_sys_regs_create_debugfs(struct kvm *kvm);
10581106
void kvm_reset_sys_regs(struct kvm_vcpu *vcpu);
10591107

10601108
int __init kvm_sys_reg_table_init(void);
1109+
struct sys_reg_desc;
1110+
int __init populate_sysreg_config(const struct sys_reg_desc *sr,
1111+
unsigned int idx);
10611112
int __init populate_nv_trap_config(void);
10621113

10631114
bool lock_all_vcpus(struct kvm *kvm);
10641115
void unlock_all_vcpus(struct kvm *kvm);
10651116

1117+
void kvm_init_sysreg(struct kvm_vcpu *);
1118+
10661119
/* MMIO helpers */
10671120
void kvm_mmio_write_buf(void *buf, unsigned int len, unsigned long data);
10681121
unsigned long kvm_mmio_read_buf(const void *buf, unsigned int len);
@@ -1233,4 +1286,48 @@ static inline void kvm_hyp_reserve(void) { }
12331286
void kvm_arm_vcpu_power_off(struct kvm_vcpu *vcpu);
12341287
bool kvm_arm_vcpu_stopped(struct kvm_vcpu *vcpu);
12351288

1289+
#define __expand_field_sign_unsigned(id, fld, val) \
1290+
((u64)SYS_FIELD_VALUE(id, fld, val))
1291+
1292+
#define __expand_field_sign_signed(id, fld, val) \
1293+
({ \
1294+
u64 __val = SYS_FIELD_VALUE(id, fld, val); \
1295+
sign_extend64(__val, id##_##fld##_WIDTH - 1); \
1296+
})
1297+
1298+
#define expand_field_sign(id, fld, val) \
1299+
(id##_##fld##_SIGNED ? \
1300+
__expand_field_sign_signed(id, fld, val) : \
1301+
__expand_field_sign_unsigned(id, fld, val))
1302+
1303+
#define get_idreg_field_unsigned(kvm, id, fld) \
1304+
({ \
1305+
u64 __val = IDREG((kvm), SYS_##id); \
1306+
FIELD_GET(id##_##fld##_MASK, __val); \
1307+
})
1308+
1309+
#define get_idreg_field_signed(kvm, id, fld) \
1310+
({ \
1311+
u64 __val = get_idreg_field_unsigned(kvm, id, fld); \
1312+
sign_extend64(__val, id##_##fld##_WIDTH - 1); \
1313+
})
1314+
1315+
#define get_idreg_field_enum(kvm, id, fld) \
1316+
get_idreg_field_unsigned(kvm, id, fld)
1317+
1318+
#define get_idreg_field(kvm, id, fld) \
1319+
(id##_##fld##_SIGNED ? \
1320+
get_idreg_field_signed(kvm, id, fld) : \
1321+
get_idreg_field_unsigned(kvm, id, fld))
1322+
1323+
#define kvm_has_feat(kvm, id, fld, limit) \
1324+
(get_idreg_field((kvm), id, fld) >= expand_field_sign(id, fld, limit))
1325+
1326+
#define kvm_has_feat_enum(kvm, id, fld, val) \
1327+
(get_idreg_field_unsigned((kvm), id, fld) == __expand_field_sign_unsigned(id, fld, val))
1328+
1329+
#define kvm_has_feat_range(kvm, id, fld, min, max) \
1330+
(get_idreg_field((kvm), id, fld) >= expand_field_sign(id, fld, min) && \
1331+
get_idreg_field((kvm), id, fld) <= expand_field_sign(id, fld, max))
1332+
12361333
#endif /* __ARM64_KVM_HOST_H__ */

arch/arm64/include/asm/kvm_nested.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ static inline u64 translate_ttbr0_el2_to_ttbr0_el1(u64 ttbr0)
6060
return ttbr0 & ~GENMASK_ULL(63, 48);
6161
}
6262

63-
extern bool __check_nv_sr_forward(struct kvm_vcpu *vcpu);
6463

6564
int kvm_init_nv_sysregs(struct kvm *kvm);
6665

arch/arm64/kvm/Kconfig

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ menuconfig KVM
3939
select HAVE_KVM_VCPU_RUN_PID_CHANGE
4040
select SCHED_INFO
4141
select GUEST_PERF_EVENTS if PERF_EVENTS
42-
select XARRAY_MULTI
4342
help
4443
Support hosting virtualized guest machines.
4544

@@ -68,4 +67,15 @@ config PROTECTED_NVHE_STACKTRACE
6867

6968
If unsure, or not using protected nVHE (pKVM), say N.
7069

70+
config KVM_ARM64_RES_BITS_PARANOIA
71+
bool "Build-time check of RES0/RES1 bits"
72+
depends on KVM
73+
default n
74+
help
75+
Say Y here to validate that KVM's knowledge of most system
76+
registers' RES0/RES1 bits matches when the rest of the kernel
77+
defines. Expect the build to fail badly if you enable this.
78+
79+
Just say N.
80+
7181
endif # VIRTUALIZATION

arch/arm64/kvm/arm.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@ vm_fault_t kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
190190
return VM_FAULT_SIGBUS;
191191
}
192192

193+
void kvm_arch_create_vm_debugfs(struct kvm *kvm)
194+
{
195+
kvm_sys_regs_create_debugfs(kvm);
196+
}
193197

194198
/**
195199
* kvm_arch_destroy_vm - destroy the VM data structure
@@ -206,6 +210,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
206210
pkvm_destroy_hyp_vm(kvm);
207211

208212
kfree(kvm->arch.mpidr_data);
213+
kfree(kvm->arch.sysreg_masks);
209214
kvm_destroy_vcpus(kvm);
210215

211216
kvm_unshare_hyp(kvm, kvm + 1);
@@ -674,6 +679,12 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
674679
return ret;
675680
}
676681

682+
/*
683+
* This needs to happen after NV has imposed its own restrictions on
684+
* the feature set
685+
*/
686+
kvm_init_sysreg(vcpu);
687+
677688
ret = kvm_timer_enable(vcpu);
678689
if (ret)
679690
return ret;

arch/arm64/kvm/check-res-bits.h

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
/*
3+
* Copyright (C) 2024 - Google LLC
4+
* Author: Marc Zyngier <maz@kernel.org>
5+
*/
6+
7+
#include <asm/sysreg-defs.h>
8+
9+
/*
10+
* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
11+
*
12+
* If any of these BUILD_BUG_ON() fails, that's because some bits that
13+
* were reserved have gained some other meaning, and KVM needs to know
14+
* about those.
15+
*
16+
* In such case, do *NOT* blindly change the assertion so that it
17+
* passes, but also teach the rest of the code about the actual
18+
* change.
19+
*
20+
* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
21+
*/
22+
static inline void check_res_bits(void)
23+
{
24+
#ifdef CONFIG_KVM_ARM64_RES_BITS_PARANOIA
25+
26+
BUILD_BUG_ON(OSDTRRX_EL1_RES0 != (GENMASK_ULL(63, 32)));
27+
BUILD_BUG_ON(MDCCINT_EL1_RES0 != (GENMASK_ULL(63, 31) | GENMASK_ULL(28, 0)));
28+
BUILD_BUG_ON(MDSCR_EL1_RES0 != (GENMASK_ULL(63, 36) | GENMASK_ULL(28, 28) | GENMASK_ULL(25, 24) | GENMASK_ULL(20, 20) | GENMASK_ULL(18, 16) | GENMASK_ULL(11, 7) | GENMASK_ULL(5, 1)));
29+
BUILD_BUG_ON(OSDTRTX_EL1_RES0 != (GENMASK_ULL(63, 32)));
30+
BUILD_BUG_ON(OSECCR_EL1_RES0 != (GENMASK_ULL(63, 32)));
31+
BUILD_BUG_ON(OSLAR_EL1_RES0 != (GENMASK_ULL(63, 1)));
32+
BUILD_BUG_ON(ID_PFR0_EL1_RES0 != (GENMASK_ULL(63, 32)));
33+
BUILD_BUG_ON(ID_PFR1_EL1_RES0 != (GENMASK_ULL(63, 32)));
34+
BUILD_BUG_ON(ID_DFR0_EL1_RES0 != (GENMASK_ULL(63, 32)));
35+
BUILD_BUG_ON(ID_AFR0_EL1_RES0 != (GENMASK_ULL(63, 16)));
36+
BUILD_BUG_ON(ID_MMFR0_EL1_RES0 != (GENMASK_ULL(63, 32)));
37+
BUILD_BUG_ON(ID_MMFR1_EL1_RES0 != (GENMASK_ULL(63, 32)));
38+
BUILD_BUG_ON(ID_MMFR2_EL1_RES0 != (GENMASK_ULL(63, 32)));
39+
BUILD_BUG_ON(ID_MMFR3_EL1_RES0 != (GENMASK_ULL(63, 32)));
40+
BUILD_BUG_ON(ID_ISAR0_EL1_RES0 != (GENMASK_ULL(63, 28)));
41+
BUILD_BUG_ON(ID_ISAR1_EL1_RES0 != (GENMASK_ULL(63, 32)));
42+
BUILD_BUG_ON(ID_ISAR2_EL1_RES0 != (GENMASK_ULL(63, 32)));
43+
BUILD_BUG_ON(ID_ISAR3_EL1_RES0 != (GENMASK_ULL(63, 32)));
44+
BUILD_BUG_ON(ID_ISAR4_EL1_RES0 != (GENMASK_ULL(63, 32)));
45+
BUILD_BUG_ON(ID_ISAR5_EL1_RES0 != (GENMASK_ULL(63, 32) | GENMASK_ULL(23, 20)));
46+
BUILD_BUG_ON(ID_ISAR6_EL1_RES0 != (GENMASK_ULL(63, 28)));
47+
BUILD_BUG_ON(ID_MMFR4_EL1_RES0 != (GENMASK_ULL(63, 32)));
48+
BUILD_BUG_ON(MVFR0_EL1_RES0 != (GENMASK_ULL(63, 32)));
49+
BUILD_BUG_ON(MVFR1_EL1_RES0 != (GENMASK_ULL(63, 32)));
50+
BUILD_BUG_ON(MVFR2_EL1_RES0 != (GENMASK_ULL(63, 8)));
51+
BUILD_BUG_ON(ID_PFR2_EL1_RES0 != (GENMASK_ULL(63, 12)));
52+
BUILD_BUG_ON(ID_DFR1_EL1_RES0 != (GENMASK_ULL(63, 8)));
53+
BUILD_BUG_ON(ID_MMFR5_EL1_RES0 != (GENMASK_ULL(63, 8)));
54+
BUILD_BUG_ON(ID_AA64PFR1_EL1_RES0 != (GENMASK_ULL(23, 20)));
55+
BUILD_BUG_ON(ID_AA64PFR2_EL1_RES0 != (GENMASK_ULL(63, 36) | GENMASK_ULL(31, 12)));
56+
BUILD_BUG_ON(ID_AA64ZFR0_EL1_RES0 != (GENMASK_ULL(63, 60) | GENMASK_ULL(51, 48) | GENMASK_ULL(39, 36) | GENMASK_ULL(31, 28) | GENMASK_ULL(15, 8)));
57+
BUILD_BUG_ON(ID_AA64SMFR0_EL1_RES0 != (GENMASK_ULL(62, 61) | GENMASK_ULL(51, 49) | GENMASK_ULL(31, 31) | GENMASK_ULL(27, 0)));
58+
BUILD_BUG_ON(ID_AA64FPFR0_EL1_RES0 != (GENMASK_ULL(63, 32) | GENMASK_ULL(27, 2)));
59+
BUILD_BUG_ON(ID_AA64DFR0_EL1_RES0 != (GENMASK_ULL(27, 24) | GENMASK_ULL(19, 16)));
60+
BUILD_BUG_ON(ID_AA64DFR1_EL1_RES0 != (GENMASK_ULL(63, 0)));
61+
BUILD_BUG_ON(ID_AA64AFR0_EL1_RES0 != (GENMASK_ULL(63, 32)));
62+
BUILD_BUG_ON(ID_AA64AFR1_EL1_RES0 != (GENMASK_ULL(63, 0)));
63+
BUILD_BUG_ON(ID_AA64ISAR0_EL1_RES0 != (GENMASK_ULL(3, 0)));
64+
BUILD_BUG_ON(ID_AA64ISAR2_EL1_RES0 != (GENMASK_ULL(47, 44)));
65+
BUILD_BUG_ON(ID_AA64ISAR3_EL1_RES0 != (GENMASK_ULL(63, 16)));
66+
BUILD_BUG_ON(ID_AA64MMFR0_EL1_RES0 != (GENMASK_ULL(55, 48)));
67+
BUILD_BUG_ON(ID_AA64MMFR2_EL1_RES0 != (GENMASK_ULL(47, 44)));
68+
BUILD_BUG_ON(ID_AA64MMFR3_EL1_RES0 != (GENMASK_ULL(51, 48)));
69+
BUILD_BUG_ON(ID_AA64MMFR4_EL1_RES0 != (GENMASK_ULL(63, 40) | GENMASK_ULL(35, 28) | GENMASK_ULL(3, 0)));
70+
BUILD_BUG_ON(SCTLR_EL1_RES0 != (GENMASK_ULL(17, 17)));
71+
BUILD_BUG_ON(CPACR_ELx_RES0 != (GENMASK_ULL(63, 30) | GENMASK_ULL(27, 26) | GENMASK_ULL(23, 22) | GENMASK_ULL(19, 18) | GENMASK_ULL(15, 0)));
72+
BUILD_BUG_ON(SMPRI_EL1_RES0 != (GENMASK_ULL(63, 4)));
73+
BUILD_BUG_ON(ZCR_ELx_RES0 != (GENMASK_ULL(63, 9)));
74+
BUILD_BUG_ON(SMCR_ELx_RES0 != (GENMASK_ULL(63, 32) | GENMASK_ULL(29, 9)));
75+
BUILD_BUG_ON(GCSCR_ELx_RES0 != (GENMASK_ULL(63, 10) | GENMASK_ULL(7, 7) | GENMASK_ULL(4, 1)));
76+
BUILD_BUG_ON(GCSPR_ELx_RES0 != (GENMASK_ULL(2, 0)));
77+
BUILD_BUG_ON(GCSCRE0_EL1_RES0 != (GENMASK_ULL(63, 11) | GENMASK_ULL(7, 6) | GENMASK_ULL(4, 1)));
78+
BUILD_BUG_ON(ALLINT_RES0 != (GENMASK_ULL(63, 14) | GENMASK_ULL(12, 0)));
79+
BUILD_BUG_ON(PMSCR_EL1_RES0 != (GENMASK_ULL(63, 8) | GENMASK_ULL(2, 2)));
80+
BUILD_BUG_ON(PMSICR_EL1_RES0 != (GENMASK_ULL(55, 32)));
81+
BUILD_BUG_ON(PMSIRR_EL1_RES0 != (GENMASK_ULL(63, 32) | GENMASK_ULL(7, 1)));
82+
BUILD_BUG_ON(PMSFCR_EL1_RES0 != (GENMASK_ULL(63, 19) | GENMASK_ULL(15, 4)));
83+
BUILD_BUG_ON(PMSLATFR_EL1_RES0 != (GENMASK_ULL(63, 16)));
84+
BUILD_BUG_ON(PMSIDR_EL1_RES0 != (GENMASK_ULL(63, 25) | GENMASK_ULL(7, 7)));
85+
BUILD_BUG_ON(PMBLIMITR_EL1_RES0 != (GENMASK_ULL(11, 6) | GENMASK_ULL(4, 3)));
86+
BUILD_BUG_ON(PMBSR_EL1_RES0 != (GENMASK_ULL(63, 32) | GENMASK_ULL(25, 20)));
87+
BUILD_BUG_ON(PMBIDR_EL1_RES0 != (GENMASK_ULL(63, 12) | GENMASK_ULL(7, 6)));
88+
BUILD_BUG_ON(CONTEXTIDR_ELx_RES0 != (GENMASK_ULL(63, 32)));
89+
BUILD_BUG_ON(CCSIDR_EL1_RES0 != (GENMASK_ULL(63, 32)));
90+
BUILD_BUG_ON(CLIDR_EL1_RES0 != (GENMASK_ULL(63, 47)));
91+
BUILD_BUG_ON(CCSIDR2_EL1_RES0 != (GENMASK_ULL(63, 24)));
92+
BUILD_BUG_ON(GMID_EL1_RES0 != (GENMASK_ULL(63, 4)));
93+
BUILD_BUG_ON(SMIDR_EL1_RES0 != (GENMASK_ULL(63, 32) | GENMASK_ULL(14, 12)));
94+
BUILD_BUG_ON(CSSELR_EL1_RES0 != (GENMASK_ULL(63, 5)));
95+
BUILD_BUG_ON(CTR_EL0_RES0 != (GENMASK_ULL(63, 38) | GENMASK_ULL(30, 30) | GENMASK_ULL(13, 4)));
96+
BUILD_BUG_ON(CTR_EL0_RES1 != (GENMASK_ULL(31, 31)));
97+
BUILD_BUG_ON(DCZID_EL0_RES0 != (GENMASK_ULL(63, 5)));
98+
BUILD_BUG_ON(SVCR_RES0 != (GENMASK_ULL(63, 2)));
99+
BUILD_BUG_ON(FPMR_RES0 != (GENMASK_ULL(63, 38) | GENMASK_ULL(23, 23) | GENMASK_ULL(13, 9)));
100+
BUILD_BUG_ON(HFGxTR_EL2_RES0 != (GENMASK_ULL(51, 51)));
101+
BUILD_BUG_ON(HFGITR_EL2_RES0 != (GENMASK_ULL(63, 63) | GENMASK_ULL(61, 61)));
102+
BUILD_BUG_ON(HDFGRTR_EL2_RES0 != (GENMASK_ULL(49, 49) | GENMASK_ULL(42, 42) | GENMASK_ULL(39, 38) | GENMASK_ULL(21, 20) | GENMASK_ULL(8, 8)));
103+
BUILD_BUG_ON(HDFGWTR_EL2_RES0 != (GENMASK_ULL(63, 63) | GENMASK_ULL(59, 58) | GENMASK_ULL(51, 51) | GENMASK_ULL(47, 47) | GENMASK_ULL(43, 43) | GENMASK_ULL(40, 38) | GENMASK_ULL(34, 34) | GENMASK_ULL(30, 30) | GENMASK_ULL(22, 22) | GENMASK_ULL(9, 9) | GENMASK_ULL(6, 6)));
104+
BUILD_BUG_ON(HAFGRTR_EL2_RES0 != (GENMASK_ULL(63, 50) | GENMASK_ULL(16, 5)));
105+
BUILD_BUG_ON(HCRX_EL2_RES0 != (GENMASK_ULL(63, 25) | GENMASK_ULL(13, 12)));
106+
BUILD_BUG_ON(DACR32_EL2_RES0 != (GENMASK_ULL(63, 32)));
107+
BUILD_BUG_ON(PMSCR_EL2_RES0 != (GENMASK_ULL(63, 8) | GENMASK_ULL(2, 2)));
108+
BUILD_BUG_ON(TCR2_EL1x_RES0 != (GENMASK_ULL(63, 16) | GENMASK_ULL(13, 12) | GENMASK_ULL(9, 6)));
109+
BUILD_BUG_ON(TCR2_EL2_RES0 != (GENMASK_ULL(63, 16)));
110+
BUILD_BUG_ON(LORSA_EL1_RES0 != (GENMASK_ULL(63, 52) | GENMASK_ULL(15, 1)));
111+
BUILD_BUG_ON(LOREA_EL1_RES0 != (GENMASK_ULL(63, 52) | GENMASK_ULL(15, 0)));
112+
BUILD_BUG_ON(LORN_EL1_RES0 != (GENMASK_ULL(63, 8)));
113+
BUILD_BUG_ON(LORC_EL1_RES0 != (GENMASK_ULL(63, 10) | GENMASK_ULL(1, 1)));
114+
BUILD_BUG_ON(LORID_EL1_RES0 != (GENMASK_ULL(63, 24) | GENMASK_ULL(15, 8)));
115+
BUILD_BUG_ON(ISR_EL1_RES0 != (GENMASK_ULL(63, 11) | GENMASK_ULL(5, 0)));
116+
BUILD_BUG_ON(ICC_NMIAR1_EL1_RES0 != (GENMASK_ULL(63, 24)));
117+
BUILD_BUG_ON(TRBLIMITR_EL1_RES0 != (GENMASK_ULL(11, 7)));
118+
BUILD_BUG_ON(TRBBASER_EL1_RES0 != (GENMASK_ULL(11, 0)));
119+
BUILD_BUG_ON(TRBSR_EL1_RES0 != (GENMASK_ULL(63, 56) | GENMASK_ULL(25, 24) | GENMASK_ULL(19, 19) | GENMASK_ULL(16, 16)));
120+
BUILD_BUG_ON(TRBMAR_EL1_RES0 != (GENMASK_ULL(63, 12)));
121+
BUILD_BUG_ON(TRBTRG_EL1_RES0 != (GENMASK_ULL(63, 32)));
122+
BUILD_BUG_ON(TRBIDR_EL1_RES0 != (GENMASK_ULL(63, 12) | GENMASK_ULL(7, 6)));
123+
124+
#endif
125+
}

0 commit comments

Comments
 (0)