1fd02029aSAndrew Jones // SPDX-License-Identifier: GPL-2.0
2fd02029aSAndrew Jones /*
3fd02029aSAndrew Jones * Check for KVM_GET_REG_LIST regressions.
4fd02029aSAndrew Jones *
5fd02029aSAndrew Jones * Copyright (C) 2020, Red Hat, Inc.
6fd02029aSAndrew Jones *
717da79e0SAndrew Jones * While the blessed list should be created from the oldest possible
817da79e0SAndrew Jones * kernel, we can't go older than v5.2, though, because that's the first
90ace6bdaSAndrew Jones * release which includes df205b5c6328 ("KVM: arm64: Filter out invalid
100ace6bdaSAndrew Jones * core register IDs in KVM_GET_REG_LIST"). Without that commit the core
110ace6bdaSAndrew Jones * registers won't match expectations.
12fd02029aSAndrew Jones */
13fd02029aSAndrew Jones #include <stdio.h>
14fd02029aSAndrew Jones #include "kvm_util.h"
15fd02029aSAndrew Jones #include "test_util.h"
1631d21295SAndrew Jones #include "processor.h"
1731d21295SAndrew Jones
18ee053e03SJoey Gouly struct feature_id_reg {
19ee053e03SJoey Gouly __u64 reg;
20ee053e03SJoey Gouly __u64 id_reg;
21ee053e03SJoey Gouly __u64 feat_shift;
22ee053e03SJoey Gouly __u64 feat_min;
23ee053e03SJoey Gouly };
24ee053e03SJoey Gouly
25ee053e03SJoey Gouly static struct feature_id_reg feat_id_regs[] = {
265f0419a0SJoey Gouly {
275f0419a0SJoey Gouly ARM64_SYS_REG(3, 0, 2, 0, 3), /* TCR2_EL1 */
285f0419a0SJoey Gouly ARM64_SYS_REG(3, 0, 0, 7, 3), /* ID_AA64MMFR3_EL1 */
295f0419a0SJoey Gouly 0,
305f0419a0SJoey Gouly 1
315f0419a0SJoey Gouly },
325f0419a0SJoey Gouly {
335f0419a0SJoey Gouly ARM64_SYS_REG(3, 0, 10, 2, 2), /* PIRE0_EL1 */
345f0419a0SJoey Gouly ARM64_SYS_REG(3, 0, 0, 7, 3), /* ID_AA64MMFR3_EL1 */
355f0419a0SJoey Gouly 4,
365f0419a0SJoey Gouly 1
375f0419a0SJoey Gouly },
385f0419a0SJoey Gouly {
395f0419a0SJoey Gouly ARM64_SYS_REG(3, 0, 10, 2, 3), /* PIR_EL1 */
405f0419a0SJoey Gouly ARM64_SYS_REG(3, 0, 0, 7, 3), /* ID_AA64MMFR3_EL1 */
415f0419a0SJoey Gouly 4,
425f0419a0SJoey Gouly 1
435f0419a0SJoey Gouly }
44ee053e03SJoey Gouly };
45ee053e03SJoey Gouly
filter_reg(__u64 reg)4617da79e0SAndrew Jones bool filter_reg(__u64 reg)
47c6232bd4SAndrew Jones {
48c6232bd4SAndrew Jones /*
49c6232bd4SAndrew Jones * DEMUX register presence depends on the host's CLIDR_EL1.
50c6232bd4SAndrew Jones * This means there's no set of them that we can bless.
51c6232bd4SAndrew Jones */
52c6232bd4SAndrew Jones if ((reg & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_DEMUX)
53c6232bd4SAndrew Jones return true;
54c6232bd4SAndrew Jones
55c6232bd4SAndrew Jones return false;
56c6232bd4SAndrew Jones }
57c6232bd4SAndrew Jones
check_supported_feat_reg(struct kvm_vcpu * vcpu,__u64 reg)58ee053e03SJoey Gouly static bool check_supported_feat_reg(struct kvm_vcpu *vcpu, __u64 reg)
59ee053e03SJoey Gouly {
60ee053e03SJoey Gouly int i, ret;
61ee053e03SJoey Gouly __u64 data, feat_val;
62ee053e03SJoey Gouly
63ee053e03SJoey Gouly for (i = 0; i < ARRAY_SIZE(feat_id_regs); i++) {
64ee053e03SJoey Gouly if (feat_id_regs[i].reg == reg) {
65ee053e03SJoey Gouly ret = __vcpu_get_reg(vcpu, feat_id_regs[i].id_reg, &data);
66ee053e03SJoey Gouly if (ret < 0)
67ee053e03SJoey Gouly return false;
68ee053e03SJoey Gouly
69ee053e03SJoey Gouly feat_val = ((data >> feat_id_regs[i].feat_shift) & 0xf);
70ee053e03SJoey Gouly return feat_val >= feat_id_regs[i].feat_min;
71ee053e03SJoey Gouly }
72ee053e03SJoey Gouly }
73ee053e03SJoey Gouly
74ee053e03SJoey Gouly return true;
75ee053e03SJoey Gouly }
76ee053e03SJoey Gouly
check_supported_reg(struct kvm_vcpu * vcpu,__u64 reg)7717da79e0SAndrew Jones bool check_supported_reg(struct kvm_vcpu *vcpu, __u64 reg)
7817da79e0SAndrew Jones {
7917da79e0SAndrew Jones return check_supported_feat_reg(vcpu, reg);
8017da79e0SAndrew Jones }
8117da79e0SAndrew Jones
check_reject_set(int err)8290a6bcbcSHaibo Xu bool check_reject_set(int err)
8390a6bcbcSHaibo Xu {
8490a6bcbcSHaibo Xu return err == EPERM;
8590a6bcbcSHaibo Xu }
8690a6bcbcSHaibo Xu
finalize_vcpu(struct kvm_vcpu * vcpu,struct vcpu_reg_list * c)87*e8566033SHaibo Xu void finalize_vcpu(struct kvm_vcpu *vcpu, struct vcpu_reg_list *c)
88*e8566033SHaibo Xu {
89*e8566033SHaibo Xu struct vcpu_reg_sublist *s;
90*e8566033SHaibo Xu int feature;
91*e8566033SHaibo Xu
92*e8566033SHaibo Xu for_each_sublist(c, s) {
93*e8566033SHaibo Xu if (s->finalize) {
94*e8566033SHaibo Xu feature = s->feature;
95*e8566033SHaibo Xu vcpu_ioctl(vcpu, KVM_ARM_VCPU_FINALIZE, &feature);
96*e8566033SHaibo Xu }
97*e8566033SHaibo Xu }
98*e8566033SHaibo Xu }
99*e8566033SHaibo Xu
1002f9ace5dSAndrew Jones #define REG_MASK (KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK | KVM_REG_ARM_COPROC_MASK)
1012f9ace5dSAndrew Jones
102fd02029aSAndrew Jones #define CORE_REGS_XX_NR_WORDS 2
103fd02029aSAndrew Jones #define CORE_SPSR_XX_NR_WORDS 2
104fd02029aSAndrew Jones #define CORE_FPREGS_XX_NR_WORDS 4
105fd02029aSAndrew Jones
core_id_to_str(const char * prefix,__u64 id)106c2b5aa7aSAndrew Jones static const char *core_id_to_str(const char *prefix, __u64 id)
107fd02029aSAndrew Jones {
108fd02029aSAndrew Jones __u64 core_off = id & ~REG_MASK, idx;
109fd02029aSAndrew Jones
110fd02029aSAndrew Jones /*
111fd02029aSAndrew Jones * core_off is the offset into struct kvm_regs
112fd02029aSAndrew Jones */
113fd02029aSAndrew Jones switch (core_off) {
114fd02029aSAndrew Jones case KVM_REG_ARM_CORE_REG(regs.regs[0]) ...
115fd02029aSAndrew Jones KVM_REG_ARM_CORE_REG(regs.regs[30]):
116fd02029aSAndrew Jones idx = (core_off - KVM_REG_ARM_CORE_REG(regs.regs[0])) / CORE_REGS_XX_NR_WORDS;
117c2b5aa7aSAndrew Jones TEST_ASSERT(idx < 31, "%s: Unexpected regs.regs index: %lld", prefix, idx);
118dfaf20afSAndrew Jones return strdup_printf("KVM_REG_ARM_CORE_REG(regs.regs[%lld])", idx);
119fd02029aSAndrew Jones case KVM_REG_ARM_CORE_REG(regs.sp):
120fd02029aSAndrew Jones return "KVM_REG_ARM_CORE_REG(regs.sp)";
121fd02029aSAndrew Jones case KVM_REG_ARM_CORE_REG(regs.pc):
122fd02029aSAndrew Jones return "KVM_REG_ARM_CORE_REG(regs.pc)";
123fd02029aSAndrew Jones case KVM_REG_ARM_CORE_REG(regs.pstate):
124fd02029aSAndrew Jones return "KVM_REG_ARM_CORE_REG(regs.pstate)";
125fd02029aSAndrew Jones case KVM_REG_ARM_CORE_REG(sp_el1):
126fd02029aSAndrew Jones return "KVM_REG_ARM_CORE_REG(sp_el1)";
127fd02029aSAndrew Jones case KVM_REG_ARM_CORE_REG(elr_el1):
128fd02029aSAndrew Jones return "KVM_REG_ARM_CORE_REG(elr_el1)";
129fd02029aSAndrew Jones case KVM_REG_ARM_CORE_REG(spsr[0]) ...
130fd02029aSAndrew Jones KVM_REG_ARM_CORE_REG(spsr[KVM_NR_SPSR - 1]):
131fd02029aSAndrew Jones idx = (core_off - KVM_REG_ARM_CORE_REG(spsr[0])) / CORE_SPSR_XX_NR_WORDS;
132c2b5aa7aSAndrew Jones TEST_ASSERT(idx < KVM_NR_SPSR, "%s: Unexpected spsr index: %lld", prefix, idx);
133dfaf20afSAndrew Jones return strdup_printf("KVM_REG_ARM_CORE_REG(spsr[%lld])", idx);
134fd02029aSAndrew Jones case KVM_REG_ARM_CORE_REG(fp_regs.vregs[0]) ...
135fd02029aSAndrew Jones KVM_REG_ARM_CORE_REG(fp_regs.vregs[31]):
136fd02029aSAndrew Jones idx = (core_off - KVM_REG_ARM_CORE_REG(fp_regs.vregs[0])) / CORE_FPREGS_XX_NR_WORDS;
137c2b5aa7aSAndrew Jones TEST_ASSERT(idx < 32, "%s: Unexpected fp_regs.vregs index: %lld", prefix, idx);
138dfaf20afSAndrew Jones return strdup_printf("KVM_REG_ARM_CORE_REG(fp_regs.vregs[%lld])", idx);
139fd02029aSAndrew Jones case KVM_REG_ARM_CORE_REG(fp_regs.fpsr):
140fd02029aSAndrew Jones return "KVM_REG_ARM_CORE_REG(fp_regs.fpsr)";
141fd02029aSAndrew Jones case KVM_REG_ARM_CORE_REG(fp_regs.fpcr):
142fd02029aSAndrew Jones return "KVM_REG_ARM_CORE_REG(fp_regs.fpcr)";
143fd02029aSAndrew Jones }
144fd02029aSAndrew Jones
145c2b5aa7aSAndrew Jones TEST_FAIL("%s: Unknown core reg id: 0x%llx", prefix, id);
146fd02029aSAndrew Jones return NULL;
147fd02029aSAndrew Jones }
148fd02029aSAndrew Jones
sve_id_to_str(const char * prefix,__u64 id)149c2b5aa7aSAndrew Jones static const char *sve_id_to_str(const char *prefix, __u64 id)
15031d21295SAndrew Jones {
15131d21295SAndrew Jones __u64 sve_off, n, i;
15231d21295SAndrew Jones
15331d21295SAndrew Jones if (id == KVM_REG_ARM64_SVE_VLS)
15431d21295SAndrew Jones return "KVM_REG_ARM64_SVE_VLS";
15531d21295SAndrew Jones
15631d21295SAndrew Jones sve_off = id & ~(REG_MASK | ((1ULL << 5) - 1));
15731d21295SAndrew Jones i = id & (KVM_ARM64_SVE_MAX_SLICES - 1);
15831d21295SAndrew Jones
159c2b5aa7aSAndrew Jones TEST_ASSERT(i == 0, "%s: Currently we don't expect slice > 0, reg id 0x%llx", prefix, id);
16031d21295SAndrew Jones
16131d21295SAndrew Jones switch (sve_off) {
16231d21295SAndrew Jones case KVM_REG_ARM64_SVE_ZREG_BASE ...
16331d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG_BASE + (1ULL << 5) * KVM_ARM64_SVE_NUM_ZREGS - 1:
16431d21295SAndrew Jones n = (id >> 5) & (KVM_ARM64_SVE_NUM_ZREGS - 1);
16531d21295SAndrew Jones TEST_ASSERT(id == KVM_REG_ARM64_SVE_ZREG(n, 0),
166c2b5aa7aSAndrew Jones "%s: Unexpected bits set in SVE ZREG id: 0x%llx", prefix, id);
167dfaf20afSAndrew Jones return strdup_printf("KVM_REG_ARM64_SVE_ZREG(%lld, 0)", n);
16831d21295SAndrew Jones case KVM_REG_ARM64_SVE_PREG_BASE ...
16931d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG_BASE + (1ULL << 5) * KVM_ARM64_SVE_NUM_PREGS - 1:
17031d21295SAndrew Jones n = (id >> 5) & (KVM_ARM64_SVE_NUM_PREGS - 1);
17131d21295SAndrew Jones TEST_ASSERT(id == KVM_REG_ARM64_SVE_PREG(n, 0),
172c2b5aa7aSAndrew Jones "%s: Unexpected bits set in SVE PREG id: 0x%llx", prefix, id);
173dfaf20afSAndrew Jones return strdup_printf("KVM_REG_ARM64_SVE_PREG(%lld, 0)", n);
17431d21295SAndrew Jones case KVM_REG_ARM64_SVE_FFR_BASE:
17531d21295SAndrew Jones TEST_ASSERT(id == KVM_REG_ARM64_SVE_FFR(0),
176c2b5aa7aSAndrew Jones "%s: Unexpected bits set in SVE FFR id: 0x%llx", prefix, id);
17731d21295SAndrew Jones return "KVM_REG_ARM64_SVE_FFR(0)";
17831d21295SAndrew Jones }
17931d21295SAndrew Jones
18031d21295SAndrew Jones return NULL;
18131d21295SAndrew Jones }
18231d21295SAndrew Jones
print_reg(const char * prefix,__u64 id)18317da79e0SAndrew Jones void print_reg(const char *prefix, __u64 id)
184fd02029aSAndrew Jones {
185fd02029aSAndrew Jones unsigned op0, op1, crn, crm, op2;
186fd02029aSAndrew Jones const char *reg_size = NULL;
187fd02029aSAndrew Jones
188fd02029aSAndrew Jones TEST_ASSERT((id & KVM_REG_ARCH_MASK) == KVM_REG_ARM64,
189c2b5aa7aSAndrew Jones "%s: KVM_REG_ARM64 missing in reg id: 0x%llx", prefix, id);
190fd02029aSAndrew Jones
191fd02029aSAndrew Jones switch (id & KVM_REG_SIZE_MASK) {
192fd02029aSAndrew Jones case KVM_REG_SIZE_U8:
193fd02029aSAndrew Jones reg_size = "KVM_REG_SIZE_U8";
194fd02029aSAndrew Jones break;
195fd02029aSAndrew Jones case KVM_REG_SIZE_U16:
196fd02029aSAndrew Jones reg_size = "KVM_REG_SIZE_U16";
197fd02029aSAndrew Jones break;
198fd02029aSAndrew Jones case KVM_REG_SIZE_U32:
199fd02029aSAndrew Jones reg_size = "KVM_REG_SIZE_U32";
200fd02029aSAndrew Jones break;
201fd02029aSAndrew Jones case KVM_REG_SIZE_U64:
202fd02029aSAndrew Jones reg_size = "KVM_REG_SIZE_U64";
203fd02029aSAndrew Jones break;
204fd02029aSAndrew Jones case KVM_REG_SIZE_U128:
205fd02029aSAndrew Jones reg_size = "KVM_REG_SIZE_U128";
206fd02029aSAndrew Jones break;
207fd02029aSAndrew Jones case KVM_REG_SIZE_U256:
208fd02029aSAndrew Jones reg_size = "KVM_REG_SIZE_U256";
209fd02029aSAndrew Jones break;
210fd02029aSAndrew Jones case KVM_REG_SIZE_U512:
211fd02029aSAndrew Jones reg_size = "KVM_REG_SIZE_U512";
212fd02029aSAndrew Jones break;
213fd02029aSAndrew Jones case KVM_REG_SIZE_U1024:
214fd02029aSAndrew Jones reg_size = "KVM_REG_SIZE_U1024";
215fd02029aSAndrew Jones break;
216fd02029aSAndrew Jones case KVM_REG_SIZE_U2048:
217fd02029aSAndrew Jones reg_size = "KVM_REG_SIZE_U2048";
218fd02029aSAndrew Jones break;
219fd02029aSAndrew Jones default:
2202f9ace5dSAndrew Jones TEST_FAIL("%s: Unexpected reg size: 0x%llx in reg id: 0x%llx",
221c2b5aa7aSAndrew Jones prefix, (id & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT, id);
222fd02029aSAndrew Jones }
223fd02029aSAndrew Jones
224fd02029aSAndrew Jones switch (id & KVM_REG_ARM_COPROC_MASK) {
225fd02029aSAndrew Jones case KVM_REG_ARM_CORE:
226c2b5aa7aSAndrew Jones printf("\tKVM_REG_ARM64 | %s | KVM_REG_ARM_CORE | %s,\n", reg_size, core_id_to_str(prefix, id));
227fd02029aSAndrew Jones break;
228fd02029aSAndrew Jones case KVM_REG_ARM_DEMUX:
229fd02029aSAndrew Jones TEST_ASSERT(!(id & ~(REG_MASK | KVM_REG_ARM_DEMUX_ID_MASK | KVM_REG_ARM_DEMUX_VAL_MASK)),
230c2b5aa7aSAndrew Jones "%s: Unexpected bits set in DEMUX reg id: 0x%llx", prefix, id);
231fd02029aSAndrew Jones printf("\tKVM_REG_ARM64 | %s | KVM_REG_ARM_DEMUX | KVM_REG_ARM_DEMUX_ID_CCSIDR | %lld,\n",
232fd02029aSAndrew Jones reg_size, id & KVM_REG_ARM_DEMUX_VAL_MASK);
233fd02029aSAndrew Jones break;
234fd02029aSAndrew Jones case KVM_REG_ARM64_SYSREG:
235fd02029aSAndrew Jones op0 = (id & KVM_REG_ARM64_SYSREG_OP0_MASK) >> KVM_REG_ARM64_SYSREG_OP0_SHIFT;
236fd02029aSAndrew Jones op1 = (id & KVM_REG_ARM64_SYSREG_OP1_MASK) >> KVM_REG_ARM64_SYSREG_OP1_SHIFT;
237fd02029aSAndrew Jones crn = (id & KVM_REG_ARM64_SYSREG_CRN_MASK) >> KVM_REG_ARM64_SYSREG_CRN_SHIFT;
238fd02029aSAndrew Jones crm = (id & KVM_REG_ARM64_SYSREG_CRM_MASK) >> KVM_REG_ARM64_SYSREG_CRM_SHIFT;
239fd02029aSAndrew Jones op2 = (id & KVM_REG_ARM64_SYSREG_OP2_MASK) >> KVM_REG_ARM64_SYSREG_OP2_SHIFT;
240fd02029aSAndrew Jones TEST_ASSERT(id == ARM64_SYS_REG(op0, op1, crn, crm, op2),
241c2b5aa7aSAndrew Jones "%s: Unexpected bits set in SYSREG reg id: 0x%llx", prefix, id);
242fd02029aSAndrew Jones printf("\tARM64_SYS_REG(%d, %d, %d, %d, %d),\n", op0, op1, crn, crm, op2);
243fd02029aSAndrew Jones break;
244fd02029aSAndrew Jones case KVM_REG_ARM_FW:
245fd02029aSAndrew Jones TEST_ASSERT(id == KVM_REG_ARM_FW_REG(id & 0xffff),
246c2b5aa7aSAndrew Jones "%s: Unexpected bits set in FW reg id: 0x%llx", prefix, id);
247fd02029aSAndrew Jones printf("\tKVM_REG_ARM_FW_REG(%lld),\n", id & 0xffff);
248fd02029aSAndrew Jones break;
249920f4a55SRaghavendra Rao Ananta case KVM_REG_ARM_FW_FEAT_BMAP:
250920f4a55SRaghavendra Rao Ananta TEST_ASSERT(id == KVM_REG_ARM_FW_FEAT_BMAP_REG(id & 0xffff),
251c2b5aa7aSAndrew Jones "%s: Unexpected bits set in the bitmap feature FW reg id: 0x%llx", prefix, id);
252920f4a55SRaghavendra Rao Ananta printf("\tKVM_REG_ARM_FW_FEAT_BMAP_REG(%lld),\n", id & 0xffff);
253920f4a55SRaghavendra Rao Ananta break;
254fd02029aSAndrew Jones case KVM_REG_ARM64_SVE:
255c2b5aa7aSAndrew Jones printf("\t%s,\n", sve_id_to_str(prefix, id));
256fd02029aSAndrew Jones break;
257fd02029aSAndrew Jones default:
2582f9ace5dSAndrew Jones TEST_FAIL("%s: Unexpected coproc type: 0x%llx in reg id: 0x%llx",
259c2b5aa7aSAndrew Jones prefix, (id & KVM_REG_ARM_COPROC_MASK) >> KVM_REG_ARM_COPROC_SHIFT, id);
260fd02029aSAndrew Jones }
261fd02029aSAndrew Jones }
262fd02029aSAndrew Jones
263fd02029aSAndrew Jones /*
2640ace6bdaSAndrew Jones * The original blessed list was primed with the output of kernel version
265fd02029aSAndrew Jones * v4.15 with --core-reg-fixup and then later updated with new registers.
2660ace6bdaSAndrew Jones * (The --core-reg-fixup option and it's fixup function have been removed
2670ace6bdaSAndrew Jones * from the test, as it's unlikely to use this type of test on a kernel
2680ace6bdaSAndrew Jones * older than v5.2.)
269c6232bd4SAndrew Jones *
2700630fb8eSMarc Zyngier * The blessed list is up to date with kernel version v6.4 (or so we hope)
271fd02029aSAndrew Jones */
27231d21295SAndrew Jones static __u64 base_regs[] = {
273fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[0]),
274fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[1]),
275fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[2]),
276fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[3]),
277fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[4]),
278fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[5]),
279fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[6]),
280fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[7]),
281fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[8]),
282fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[9]),
283fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[10]),
284fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[11]),
285fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[12]),
286fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[13]),
287fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[14]),
288fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[15]),
289fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[16]),
290fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[17]),
291fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[18]),
292fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[19]),
293fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[20]),
294fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[21]),
295fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[22]),
296fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[23]),
297fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[24]),
298fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[25]),
299fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[26]),
300fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[27]),
301fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[28]),
302fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[29]),
303fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[30]),
304fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.sp),
305fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.pc),
306fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.pstate),
307fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(sp_el1),
308fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(elr_el1),
309fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[0]),
310fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[1]),
311fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[2]),
312fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[3]),
313fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[4]),
314fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.fpsr),
315fd02029aSAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.fpcr),
31602de9331SAndrew Jones KVM_REG_ARM_FW_REG(0), /* KVM_REG_ARM_PSCI_VERSION */
31702de9331SAndrew Jones KVM_REG_ARM_FW_REG(1), /* KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1 */
31802de9331SAndrew Jones KVM_REG_ARM_FW_REG(2), /* KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2 */
31902de9331SAndrew Jones KVM_REG_ARM_FW_REG(3), /* KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3 */
320920f4a55SRaghavendra Rao Ananta KVM_REG_ARM_FW_FEAT_BMAP_REG(0), /* KVM_REG_ARM_STD_BMAP */
321920f4a55SRaghavendra Rao Ananta KVM_REG_ARM_FW_FEAT_BMAP_REG(1), /* KVM_REG_ARM_STD_HYP_BMAP */
322920f4a55SRaghavendra Rao Ananta KVM_REG_ARM_FW_FEAT_BMAP_REG(2), /* KVM_REG_ARM_VENDOR_HYP_BMAP */
323fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 3, 1), /* CNTV_CTL_EL0 */
324fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 3, 2), /* CNTV_CVAL_EL0 */
325fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 0, 2),
326fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 0, 0), /* MIDR_EL1 */
327fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 0, 6), /* REVIDR_EL1 */
328fd02029aSAndrew Jones ARM64_SYS_REG(3, 1, 0, 0, 1), /* CLIDR_EL1 */
329fd02029aSAndrew Jones ARM64_SYS_REG(3, 1, 0, 0, 7), /* AIDR_EL1 */
330fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 0, 0, 1), /* CTR_EL0 */
331fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 0, 4),
332fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 0, 5),
333fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 0, 6),
334fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 0, 7),
335fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 1, 4),
336fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 1, 5),
337fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 1, 6),
338fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 1, 7),
339fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 2, 0), /* MDCCINT_EL1 */
340fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 2, 2), /* MDSCR_EL1 */
341fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 2, 4),
342fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 2, 5),
343fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 2, 6),
344fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 2, 7),
345fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 3, 4),
346fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 3, 5),
347fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 3, 6),
348fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 3, 7),
349fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 4, 4),
350fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 4, 5),
351fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 4, 6),
352fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 4, 7),
353fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 5, 4),
354fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 5, 5),
355fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 5, 6),
356fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 5, 7),
357fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 6, 4),
358fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 6, 5),
359fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 6, 6),
360fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 6, 7),
361fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 7, 4),
362fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 7, 5),
363fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 7, 6),
364fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 7, 7),
365fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 8, 4),
366fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 8, 5),
367fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 8, 6),
368fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 8, 7),
369fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 9, 4),
370fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 9, 5),
371fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 9, 6),
372fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 9, 7),
373fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 10, 4),
374fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 10, 5),
375fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 10, 6),
376fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 10, 7),
377fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 11, 4),
378fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 11, 5),
379fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 11, 6),
380fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 11, 7),
381fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 12, 4),
382fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 12, 5),
383fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 12, 6),
384fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 12, 7),
385fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 13, 4),
386fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 13, 5),
387fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 13, 6),
388fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 13, 7),
389fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 14, 4),
390fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 14, 5),
391fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 14, 6),
392fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 14, 7),
393fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 15, 4),
394fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 15, 5),
395fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 15, 6),
396fd02029aSAndrew Jones ARM64_SYS_REG(2, 0, 0, 15, 7),
397d1349988SOliver Upton ARM64_SYS_REG(2, 0, 1, 1, 4), /* OSLSR_EL1 */
398fd02029aSAndrew Jones ARM64_SYS_REG(2, 4, 0, 7, 0), /* DBGVCR32_EL2 */
399fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 0, 5), /* MPIDR_EL1 */
400fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 1, 0), /* ID_PFR0_EL1 */
401fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 1, 1), /* ID_PFR1_EL1 */
402fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 1, 2), /* ID_DFR0_EL1 */
403fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 1, 3), /* ID_AFR0_EL1 */
404fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 1, 4), /* ID_MMFR0_EL1 */
405fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 1, 5), /* ID_MMFR1_EL1 */
406fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 1, 6), /* ID_MMFR2_EL1 */
407fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 1, 7), /* ID_MMFR3_EL1 */
408fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 2, 0), /* ID_ISAR0_EL1 */
409fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 2, 1), /* ID_ISAR1_EL1 */
410fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 2, 2), /* ID_ISAR2_EL1 */
411fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 2, 3), /* ID_ISAR3_EL1 */
412fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 2, 4), /* ID_ISAR4_EL1 */
413fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 2, 5), /* ID_ISAR5_EL1 */
414fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 2, 6), /* ID_MMFR4_EL1 */
415fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 2, 7), /* ID_ISAR6_EL1 */
416fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 3, 0), /* MVFR0_EL1 */
417fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 3, 1), /* MVFR1_EL1 */
418fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 3, 2), /* MVFR2_EL1 */
419fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 3, 3),
420fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 3, 4), /* ID_PFR2_EL1 */
421fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 3, 5), /* ID_DFR1_EL1 */
422fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 3, 6), /* ID_MMFR5_EL1 */
423fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 3, 7),
424fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 4, 0), /* ID_AA64PFR0_EL1 */
425fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 4, 1), /* ID_AA64PFR1_EL1 */
426767cc050SMark Brown ARM64_SYS_REG(3, 0, 0, 4, 2), /* ID_AA64PFR2_EL1 */
427fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 4, 3),
428fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 4, 4), /* ID_AA64ZFR0_EL1 */
429767cc050SMark Brown ARM64_SYS_REG(3, 0, 0, 4, 5), /* ID_AA64SMFR0_EL1 */
430fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 4, 6),
431fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 4, 7),
432fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 5, 0), /* ID_AA64DFR0_EL1 */
433fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 5, 1), /* ID_AA64DFR1_EL1 */
434fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 5, 2),
435fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 5, 3),
436fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 5, 4), /* ID_AA64AFR0_EL1 */
437fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 5, 5), /* ID_AA64AFR1_EL1 */
438fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 5, 6),
439fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 5, 7),
440fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 6, 0), /* ID_AA64ISAR0_EL1 */
441fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 6, 1), /* ID_AA64ISAR1_EL1 */
442767cc050SMark Brown ARM64_SYS_REG(3, 0, 0, 6, 2), /* ID_AA64ISAR2_EL1 */
443fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 6, 3),
444fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 6, 4),
445fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 6, 5),
446fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 6, 6),
447fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 6, 7),
448fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 7, 0), /* ID_AA64MMFR0_EL1 */
449fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 7, 1), /* ID_AA64MMFR1_EL1 */
450fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 7, 2), /* ID_AA64MMFR2_EL1 */
451767cc050SMark Brown ARM64_SYS_REG(3, 0, 0, 7, 3), /* ID_AA64MMFR3_EL1 */
452767cc050SMark Brown ARM64_SYS_REG(3, 0, 0, 7, 4), /* ID_AA64MMFR4_EL1 */
453fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 7, 5),
454fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 7, 6),
455fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 0, 7, 7),
456fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 1, 0, 0), /* SCTLR_EL1 */
457fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 1, 0, 1), /* ACTLR_EL1 */
458fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 1, 0, 2), /* CPACR_EL1 */
459fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 2, 0, 0), /* TTBR0_EL1 */
460fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 2, 0, 1), /* TTBR1_EL1 */
461fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 2, 0, 2), /* TCR_EL1 */
4625f0419a0SJoey Gouly ARM64_SYS_REG(3, 0, 2, 0, 3), /* TCR2_EL1 */
463fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 5, 1, 0), /* AFSR0_EL1 */
464fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 5, 1, 1), /* AFSR1_EL1 */
465fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 5, 2, 0), /* ESR_EL1 */
466fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 6, 0, 0), /* FAR_EL1 */
467fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 7, 4, 0), /* PAR_EL1 */
468fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 10, 2, 0), /* MAIR_EL1 */
4695f0419a0SJoey Gouly ARM64_SYS_REG(3, 0, 10, 2, 2), /* PIRE0_EL1 */
4705f0419a0SJoey Gouly ARM64_SYS_REG(3, 0, 10, 2, 3), /* PIR_EL1 */
471fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 10, 3, 0), /* AMAIR_EL1 */
472fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 12, 0, 0), /* VBAR_EL1 */
473fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 12, 1, 1), /* DISR_EL1 */
474fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 13, 0, 1), /* CONTEXTIDR_EL1 */
475fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 13, 0, 4), /* TPIDR_EL1 */
476fd02029aSAndrew Jones ARM64_SYS_REG(3, 0, 14, 1, 0), /* CNTKCTL_EL1 */
477fd02029aSAndrew Jones ARM64_SYS_REG(3, 2, 0, 0, 0), /* CSSELR_EL1 */
478313673baSAndrew Jones ARM64_SYS_REG(3, 3, 13, 0, 2), /* TPIDR_EL0 */
479313673baSAndrew Jones ARM64_SYS_REG(3, 3, 13, 0, 3), /* TPIDRRO_EL0 */
4800630fb8eSMarc Zyngier ARM64_SYS_REG(3, 3, 14, 0, 1), /* CNTPCT_EL0 */
4810630fb8eSMarc Zyngier ARM64_SYS_REG(3, 3, 14, 2, 1), /* CNTP_CTL_EL0 */
4820630fb8eSMarc Zyngier ARM64_SYS_REG(3, 3, 14, 2, 2), /* CNTP_CVAL_EL0 */
483313673baSAndrew Jones ARM64_SYS_REG(3, 4, 3, 0, 0), /* DACR32_EL2 */
484313673baSAndrew Jones ARM64_SYS_REG(3, 4, 5, 0, 1), /* IFSR32_EL2 */
485313673baSAndrew Jones ARM64_SYS_REG(3, 4, 5, 3, 0), /* FPEXC32_EL2 */
486313673baSAndrew Jones };
487313673baSAndrew Jones
488313673baSAndrew Jones static __u64 pmu_regs[] = {
489313673baSAndrew Jones ARM64_SYS_REG(3, 0, 9, 14, 1), /* PMINTENSET_EL1 */
490313673baSAndrew Jones ARM64_SYS_REG(3, 0, 9, 14, 2), /* PMINTENCLR_EL1 */
491fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 9, 12, 0), /* PMCR_EL0 */
492fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 9, 12, 1), /* PMCNTENSET_EL0 */
493fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 9, 12, 2), /* PMCNTENCLR_EL0 */
494fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 9, 12, 3), /* PMOVSCLR_EL0 */
495fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 9, 12, 4), /* PMSWINC_EL0 */
496fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 9, 12, 5), /* PMSELR_EL0 */
497fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 9, 13, 0), /* PMCCNTR_EL0 */
498fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 9, 14, 0), /* PMUSERENR_EL0 */
499fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 9, 14, 3), /* PMOVSSET_EL0 */
500fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 8, 0),
501fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 8, 1),
502fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 8, 2),
503fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 8, 3),
504fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 8, 4),
505fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 8, 5),
506fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 8, 6),
507fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 8, 7),
508fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 9, 0),
509fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 9, 1),
510fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 9, 2),
511fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 9, 3),
512fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 9, 4),
513fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 9, 5),
514fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 9, 6),
515fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 9, 7),
516fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 10, 0),
517fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 10, 1),
518fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 10, 2),
519fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 10, 3),
520fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 10, 4),
521fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 10, 5),
522fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 10, 6),
523fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 10, 7),
524fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 11, 0),
525fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 11, 1),
526fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 11, 2),
527fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 11, 3),
528fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 11, 4),
529fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 11, 5),
530fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 11, 6),
531fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 12, 0),
532fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 12, 1),
533fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 12, 2),
534fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 12, 3),
535fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 12, 4),
536fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 12, 5),
537fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 12, 6),
538fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 12, 7),
539fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 13, 0),
540fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 13, 1),
541fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 13, 2),
542fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 13, 3),
543fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 13, 4),
544fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 13, 5),
545fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 13, 6),
546fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 13, 7),
547fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 14, 0),
548fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 14, 1),
549fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 14, 2),
550fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 14, 3),
551fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 14, 4),
552fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 14, 5),
553fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 14, 6),
554fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 14, 7),
555fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 15, 0),
556fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 15, 1),
557fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 15, 2),
558fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 15, 3),
559fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 15, 4),
560fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 15, 5),
561fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 15, 6),
562fd02029aSAndrew Jones ARM64_SYS_REG(3, 3, 14, 15, 7), /* PMCCFILTR_EL0 */
563fd02029aSAndrew Jones };
56431d21295SAndrew Jones
56531d21295SAndrew Jones static __u64 vregs[] = {
56631d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[0]),
56731d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[1]),
56831d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[2]),
56931d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[3]),
57031d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[4]),
57131d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[5]),
57231d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[6]),
57331d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[7]),
57431d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[8]),
57531d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[9]),
57631d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[10]),
57731d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[11]),
57831d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[12]),
57931d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[13]),
58031d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[14]),
58131d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[15]),
58231d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[16]),
58331d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[17]),
58431d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[18]),
58531d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[19]),
58631d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[20]),
58731d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[21]),
58831d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[22]),
58931d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[23]),
59031d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[24]),
59131d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[25]),
59231d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[26]),
59331d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[27]),
59431d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[28]),
59531d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[29]),
59631d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[30]),
59731d21295SAndrew Jones KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[31]),
59831d21295SAndrew Jones };
59931d21295SAndrew Jones
60031d21295SAndrew Jones static __u64 sve_regs[] = {
60131d21295SAndrew Jones KVM_REG_ARM64_SVE_VLS,
60231d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(0, 0),
60331d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(1, 0),
60431d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(2, 0),
60531d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(3, 0),
60631d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(4, 0),
60731d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(5, 0),
60831d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(6, 0),
60931d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(7, 0),
61031d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(8, 0),
61131d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(9, 0),
61231d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(10, 0),
61331d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(11, 0),
61431d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(12, 0),
61531d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(13, 0),
61631d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(14, 0),
61731d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(15, 0),
61831d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(16, 0),
61931d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(17, 0),
62031d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(18, 0),
62131d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(19, 0),
62231d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(20, 0),
62331d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(21, 0),
62431d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(22, 0),
62531d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(23, 0),
62631d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(24, 0),
62731d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(25, 0),
62831d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(26, 0),
62931d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(27, 0),
63031d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(28, 0),
63131d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(29, 0),
63231d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(30, 0),
63331d21295SAndrew Jones KVM_REG_ARM64_SVE_ZREG(31, 0),
63431d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(0, 0),
63531d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(1, 0),
63631d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(2, 0),
63731d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(3, 0),
63831d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(4, 0),
63931d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(5, 0),
64031d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(6, 0),
64131d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(7, 0),
64231d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(8, 0),
64331d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(9, 0),
64431d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(10, 0),
64531d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(11, 0),
64631d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(12, 0),
64731d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(13, 0),
64831d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(14, 0),
64931d21295SAndrew Jones KVM_REG_ARM64_SVE_PREG(15, 0),
65031d21295SAndrew Jones KVM_REG_ARM64_SVE_FFR(0),
65131d21295SAndrew Jones ARM64_SYS_REG(3, 0, 1, 2, 0), /* ZCR_EL1 */
65231d21295SAndrew Jones };
65331d21295SAndrew Jones
6542f9ace5dSAndrew Jones static __u64 sve_rejects_set[] = {
65531d21295SAndrew Jones KVM_REG_ARM64_SVE_VLS,
65631d21295SAndrew Jones };
6572f9ace5dSAndrew Jones
658f15dcf1bSMarc Zyngier static __u64 pauth_addr_regs[] = {
659f15dcf1bSMarc Zyngier ARM64_SYS_REG(3, 0, 2, 1, 0), /* APIAKEYLO_EL1 */
660f15dcf1bSMarc Zyngier ARM64_SYS_REG(3, 0, 2, 1, 1), /* APIAKEYHI_EL1 */
661f15dcf1bSMarc Zyngier ARM64_SYS_REG(3, 0, 2, 1, 2), /* APIBKEYLO_EL1 */
662f15dcf1bSMarc Zyngier ARM64_SYS_REG(3, 0, 2, 1, 3), /* APIBKEYHI_EL1 */
663f15dcf1bSMarc Zyngier ARM64_SYS_REG(3, 0, 2, 2, 0), /* APDAKEYLO_EL1 */
664f15dcf1bSMarc Zyngier ARM64_SYS_REG(3, 0, 2, 2, 1), /* APDAKEYHI_EL1 */
665f15dcf1bSMarc Zyngier ARM64_SYS_REG(3, 0, 2, 2, 2), /* APDBKEYLO_EL1 */
666f15dcf1bSMarc Zyngier ARM64_SYS_REG(3, 0, 2, 2, 3) /* APDBKEYHI_EL1 */
667f15dcf1bSMarc Zyngier };
668f15dcf1bSMarc Zyngier
669f15dcf1bSMarc Zyngier static __u64 pauth_generic_regs[] = {
670f15dcf1bSMarc Zyngier ARM64_SYS_REG(3, 0, 2, 3, 0), /* APGAKEYLO_EL1 */
671f15dcf1bSMarc Zyngier ARM64_SYS_REG(3, 0, 2, 3, 1), /* APGAKEYHI_EL1 */
672f15dcf1bSMarc Zyngier };
673f15dcf1bSMarc Zyngier
6742f9ace5dSAndrew Jones #define BASE_SUBLIST \
6752f9ace5dSAndrew Jones { "base", .regs = base_regs, .regs_n = ARRAY_SIZE(base_regs), }
6762f9ace5dSAndrew Jones #define VREGS_SUBLIST \
6772f9ace5dSAndrew Jones { "vregs", .regs = vregs, .regs_n = ARRAY_SIZE(vregs), }
678313673baSAndrew Jones #define PMU_SUBLIST \
6795cf17746SAndrew Jones { "pmu", .capability = KVM_CAP_ARM_PMU_V3, .feature = KVM_ARM_VCPU_PMU_V3, \
6805cf17746SAndrew Jones .regs = pmu_regs, .regs_n = ARRAY_SIZE(pmu_regs), }
6812f9ace5dSAndrew Jones #define SVE_SUBLIST \
6822f9ace5dSAndrew Jones { "sve", .capability = KVM_CAP_ARM_SVE, .feature = KVM_ARM_VCPU_SVE, .finalize = true, \
6832f9ace5dSAndrew Jones .regs = sve_regs, .regs_n = ARRAY_SIZE(sve_regs), \
6842f9ace5dSAndrew Jones .rejects_set = sve_rejects_set, .rejects_set_n = ARRAY_SIZE(sve_rejects_set), }
685f15dcf1bSMarc Zyngier #define PAUTH_SUBLIST \
686f15dcf1bSMarc Zyngier { \
687f15dcf1bSMarc Zyngier .name = "pauth_address", \
688f15dcf1bSMarc Zyngier .capability = KVM_CAP_ARM_PTRAUTH_ADDRESS, \
689f15dcf1bSMarc Zyngier .feature = KVM_ARM_VCPU_PTRAUTH_ADDRESS, \
690f15dcf1bSMarc Zyngier .regs = pauth_addr_regs, \
691f15dcf1bSMarc Zyngier .regs_n = ARRAY_SIZE(pauth_addr_regs), \
692f15dcf1bSMarc Zyngier }, \
693f15dcf1bSMarc Zyngier { \
694f15dcf1bSMarc Zyngier .name = "pauth_generic", \
695f15dcf1bSMarc Zyngier .capability = KVM_CAP_ARM_PTRAUTH_GENERIC, \
696f15dcf1bSMarc Zyngier .feature = KVM_ARM_VCPU_PTRAUTH_GENERIC, \
697f15dcf1bSMarc Zyngier .regs = pauth_generic_regs, \
698f15dcf1bSMarc Zyngier .regs_n = ARRAY_SIZE(pauth_generic_regs), \
699f15dcf1bSMarc Zyngier }
7002f9ace5dSAndrew Jones
7019177b715SAndrew Jones static struct vcpu_reg_list vregs_config = {
7022f9ace5dSAndrew Jones .sublists = {
7032f9ace5dSAndrew Jones BASE_SUBLIST,
7042f9ace5dSAndrew Jones VREGS_SUBLIST,
7052f9ace5dSAndrew Jones {0},
7062f9ace5dSAndrew Jones },
7072f9ace5dSAndrew Jones };
7089177b715SAndrew Jones static struct vcpu_reg_list vregs_pmu_config = {
709313673baSAndrew Jones .sublists = {
710313673baSAndrew Jones BASE_SUBLIST,
711313673baSAndrew Jones VREGS_SUBLIST,
712313673baSAndrew Jones PMU_SUBLIST,
713313673baSAndrew Jones {0},
714313673baSAndrew Jones },
715313673baSAndrew Jones };
7169177b715SAndrew Jones static struct vcpu_reg_list sve_config = {
7172f9ace5dSAndrew Jones .sublists = {
7182f9ace5dSAndrew Jones BASE_SUBLIST,
7192f9ace5dSAndrew Jones SVE_SUBLIST,
7202f9ace5dSAndrew Jones {0},
7212f9ace5dSAndrew Jones },
7222f9ace5dSAndrew Jones };
7239177b715SAndrew Jones static struct vcpu_reg_list sve_pmu_config = {
724313673baSAndrew Jones .sublists = {
725313673baSAndrew Jones BASE_SUBLIST,
726313673baSAndrew Jones SVE_SUBLIST,
727313673baSAndrew Jones PMU_SUBLIST,
728313673baSAndrew Jones {0},
729313673baSAndrew Jones },
730313673baSAndrew Jones };
7319177b715SAndrew Jones static struct vcpu_reg_list pauth_config = {
732f15dcf1bSMarc Zyngier .sublists = {
733f15dcf1bSMarc Zyngier BASE_SUBLIST,
734f15dcf1bSMarc Zyngier VREGS_SUBLIST,
735f15dcf1bSMarc Zyngier PAUTH_SUBLIST,
736f15dcf1bSMarc Zyngier {0},
737f15dcf1bSMarc Zyngier },
738f15dcf1bSMarc Zyngier };
7399177b715SAndrew Jones static struct vcpu_reg_list pauth_pmu_config = {
740f15dcf1bSMarc Zyngier .sublists = {
741f15dcf1bSMarc Zyngier BASE_SUBLIST,
742f15dcf1bSMarc Zyngier VREGS_SUBLIST,
743f15dcf1bSMarc Zyngier PAUTH_SUBLIST,
744f15dcf1bSMarc Zyngier PMU_SUBLIST,
745f15dcf1bSMarc Zyngier {0},
746f15dcf1bSMarc Zyngier },
747f15dcf1bSMarc Zyngier };
74894e9223cSAndrew Jones
74917da79e0SAndrew Jones struct vcpu_reg_list *vcpu_configs[] = {
75032edd229SAndrew Jones &vregs_config,
751313673baSAndrew Jones &vregs_pmu_config,
75232edd229SAndrew Jones &sve_config,
753313673baSAndrew Jones &sve_pmu_config,
754f15dcf1bSMarc Zyngier &pauth_config,
755f15dcf1bSMarc Zyngier &pauth_pmu_config,
75694e9223cSAndrew Jones };
75717da79e0SAndrew Jones int vcpu_configs_n = ARRAY_SIZE(vcpu_configs);
758