Path: blob/master/tools/testing/selftests/kvm/arm64/get-reg-list.c
38237 views
// SPDX-License-Identifier: GPL-2.01/*2* Check for KVM_GET_REG_LIST regressions.3*4* Copyright (C) 2020, Red Hat, Inc.5*6* While the blessed list should be created from the oldest possible7* kernel, we can't go older than v5.2, though, because that's the first8* release which includes df205b5c6328 ("KVM: arm64: Filter out invalid9* core register IDs in KVM_GET_REG_LIST"). Without that commit the core10* registers won't match expectations.11*/12#include <stdio.h>13#include "kvm_util.h"14#include "test_util.h"15#include "processor.h"1617#define SYS_REG(r) ARM64_SYS_REG(sys_reg_Op0(SYS_ ## r), \18sys_reg_Op1(SYS_ ## r), \19sys_reg_CRn(SYS_ ## r), \20sys_reg_CRm(SYS_ ## r), \21sys_reg_Op2(SYS_ ## r))2223struct feature_id_reg {24__u64 reg;25__u64 id_reg;26__u64 feat_shift;27__u64 feat_min;28};2930#define FEAT(id, f, v) \31.id_reg = SYS_REG(id), \32.feat_shift = id ## _ ## f ## _SHIFT, \33.feat_min = id ## _ ## f ## _ ## v3435#define REG_FEAT(r, id, f, v) \36{ \37.reg = SYS_REG(r), \38FEAT(id, f, v) \39}4041static struct feature_id_reg feat_id_regs[] = {42REG_FEAT(TCR2_EL1, ID_AA64MMFR3_EL1, TCRX, IMP),43REG_FEAT(TCR2_EL2, ID_AA64MMFR3_EL1, TCRX, IMP),44REG_FEAT(PIRE0_EL1, ID_AA64MMFR3_EL1, S1PIE, IMP),45REG_FEAT(PIRE0_EL2, ID_AA64MMFR3_EL1, S1PIE, IMP),46REG_FEAT(PIR_EL1, ID_AA64MMFR3_EL1, S1PIE, IMP),47REG_FEAT(PIR_EL2, ID_AA64MMFR3_EL1, S1PIE, IMP),48REG_FEAT(POR_EL1, ID_AA64MMFR3_EL1, S1POE, IMP),49REG_FEAT(POR_EL0, ID_AA64MMFR3_EL1, S1POE, IMP),50REG_FEAT(POR_EL2, ID_AA64MMFR3_EL1, S1POE, IMP),51REG_FEAT(HCRX_EL2, ID_AA64MMFR1_EL1, HCX, IMP),52REG_FEAT(HFGRTR_EL2, ID_AA64MMFR0_EL1, FGT, IMP),53REG_FEAT(HFGWTR_EL2, ID_AA64MMFR0_EL1, FGT, IMP),54REG_FEAT(HFGITR_EL2, ID_AA64MMFR0_EL1, FGT, IMP),55REG_FEAT(HDFGRTR_EL2, ID_AA64MMFR0_EL1, FGT, IMP),56REG_FEAT(HDFGWTR_EL2, ID_AA64MMFR0_EL1, FGT, IMP),57REG_FEAT(HAFGRTR_EL2, ID_AA64MMFR0_EL1, FGT, IMP),58REG_FEAT(HFGRTR2_EL2, ID_AA64MMFR0_EL1, FGT, FGT2),59REG_FEAT(HFGWTR2_EL2, ID_AA64MMFR0_EL1, FGT, FGT2),60REG_FEAT(HFGITR2_EL2, ID_AA64MMFR0_EL1, FGT, FGT2),61REG_FEAT(HDFGRTR2_EL2, ID_AA64MMFR0_EL1, FGT, FGT2),62REG_FEAT(HDFGWTR2_EL2, ID_AA64MMFR0_EL1, FGT, FGT2),63REG_FEAT(ZCR_EL2, ID_AA64PFR0_EL1, SVE, IMP),64REG_FEAT(SCTLR2_EL1, ID_AA64MMFR3_EL1, SCTLRX, IMP),65REG_FEAT(SCTLR2_EL2, ID_AA64MMFR3_EL1, SCTLRX, IMP),66REG_FEAT(VDISR_EL2, ID_AA64PFR0_EL1, RAS, IMP),67REG_FEAT(VSESR_EL2, ID_AA64PFR0_EL1, RAS, IMP),68REG_FEAT(VNCR_EL2, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY),69REG_FEAT(CNTHV_CTL_EL2, ID_AA64MMFR1_EL1, VH, IMP),70REG_FEAT(CNTHV_CVAL_EL2,ID_AA64MMFR1_EL1, VH, IMP),71REG_FEAT(ZCR_EL2, ID_AA64PFR0_EL1, SVE, IMP),72};7374bool filter_reg(__u64 reg)75{76/*77* DEMUX register presence depends on the host's CLIDR_EL1.78* This means there's no set of them that we can bless.79*/80if ((reg & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_DEMUX)81return true;8283return false;84}8586static bool check_supported_feat_reg(struct kvm_vcpu *vcpu, __u64 reg)87{88int i, ret;89__u64 data, feat_val;9091for (i = 0; i < ARRAY_SIZE(feat_id_regs); i++) {92if (feat_id_regs[i].reg == reg) {93ret = __vcpu_get_reg(vcpu, feat_id_regs[i].id_reg, &data);94if (ret < 0)95return false;9697feat_val = ((data >> feat_id_regs[i].feat_shift) & 0xf);98return feat_val >= feat_id_regs[i].feat_min;99}100}101102return true;103}104105bool check_supported_reg(struct kvm_vcpu *vcpu, __u64 reg)106{107return check_supported_feat_reg(vcpu, reg);108}109110bool check_reject_set(int err)111{112return err == EPERM;113}114115void finalize_vcpu(struct kvm_vcpu *vcpu, struct vcpu_reg_list *c)116{117struct vcpu_reg_sublist *s;118int feature;119120for_each_sublist(c, s) {121if (s->finalize) {122feature = s->feature;123vcpu_ioctl(vcpu, KVM_ARM_VCPU_FINALIZE, &feature);124}125}126}127128#define REG_MASK (KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK | KVM_REG_ARM_COPROC_MASK)129130#define CORE_REGS_XX_NR_WORDS 2131#define CORE_SPSR_XX_NR_WORDS 2132#define CORE_FPREGS_XX_NR_WORDS 4133134static const char *core_id_to_str(const char *prefix, __u64 id)135{136__u64 core_off = id & ~REG_MASK, idx;137138/*139* core_off is the offset into struct kvm_regs140*/141switch (core_off) {142case KVM_REG_ARM_CORE_REG(regs.regs[0]) ...143KVM_REG_ARM_CORE_REG(regs.regs[30]):144idx = (core_off - KVM_REG_ARM_CORE_REG(regs.regs[0])) / CORE_REGS_XX_NR_WORDS;145TEST_ASSERT(idx < 31, "%s: Unexpected regs.regs index: %lld", prefix, idx);146return strdup_printf("KVM_REG_ARM_CORE_REG(regs.regs[%lld])", idx);147case KVM_REG_ARM_CORE_REG(regs.sp):148return "KVM_REG_ARM_CORE_REG(regs.sp)";149case KVM_REG_ARM_CORE_REG(regs.pc):150return "KVM_REG_ARM_CORE_REG(regs.pc)";151case KVM_REG_ARM_CORE_REG(regs.pstate):152return "KVM_REG_ARM_CORE_REG(regs.pstate)";153case KVM_REG_ARM_CORE_REG(sp_el1):154return "KVM_REG_ARM_CORE_REG(sp_el1)";155case KVM_REG_ARM_CORE_REG(elr_el1):156return "KVM_REG_ARM_CORE_REG(elr_el1)";157case KVM_REG_ARM_CORE_REG(spsr[0]) ...158KVM_REG_ARM_CORE_REG(spsr[KVM_NR_SPSR - 1]):159idx = (core_off - KVM_REG_ARM_CORE_REG(spsr[0])) / CORE_SPSR_XX_NR_WORDS;160TEST_ASSERT(idx < KVM_NR_SPSR, "%s: Unexpected spsr index: %lld", prefix, idx);161return strdup_printf("KVM_REG_ARM_CORE_REG(spsr[%lld])", idx);162case KVM_REG_ARM_CORE_REG(fp_regs.vregs[0]) ...163KVM_REG_ARM_CORE_REG(fp_regs.vregs[31]):164idx = (core_off - KVM_REG_ARM_CORE_REG(fp_regs.vregs[0])) / CORE_FPREGS_XX_NR_WORDS;165TEST_ASSERT(idx < 32, "%s: Unexpected fp_regs.vregs index: %lld", prefix, idx);166return strdup_printf("KVM_REG_ARM_CORE_REG(fp_regs.vregs[%lld])", idx);167case KVM_REG_ARM_CORE_REG(fp_regs.fpsr):168return "KVM_REG_ARM_CORE_REG(fp_regs.fpsr)";169case KVM_REG_ARM_CORE_REG(fp_regs.fpcr):170return "KVM_REG_ARM_CORE_REG(fp_regs.fpcr)";171}172173TEST_FAIL("%s: Unknown core reg id: 0x%llx", prefix, id);174return NULL;175}176177static const char *sve_id_to_str(const char *prefix, __u64 id)178{179__u64 sve_off, n, i;180181if (id == KVM_REG_ARM64_SVE_VLS)182return "KVM_REG_ARM64_SVE_VLS";183184sve_off = id & ~(REG_MASK | ((1ULL << 5) - 1));185i = id & (KVM_ARM64_SVE_MAX_SLICES - 1);186187TEST_ASSERT(i == 0, "%s: Currently we don't expect slice > 0, reg id 0x%llx", prefix, id);188189switch (sve_off) {190case KVM_REG_ARM64_SVE_ZREG_BASE ...191KVM_REG_ARM64_SVE_ZREG_BASE + (1ULL << 5) * KVM_ARM64_SVE_NUM_ZREGS - 1:192n = (id >> 5) & (KVM_ARM64_SVE_NUM_ZREGS - 1);193TEST_ASSERT(id == KVM_REG_ARM64_SVE_ZREG(n, 0),194"%s: Unexpected bits set in SVE ZREG id: 0x%llx", prefix, id);195return strdup_printf("KVM_REG_ARM64_SVE_ZREG(%lld, 0)", n);196case KVM_REG_ARM64_SVE_PREG_BASE ...197KVM_REG_ARM64_SVE_PREG_BASE + (1ULL << 5) * KVM_ARM64_SVE_NUM_PREGS - 1:198n = (id >> 5) & (KVM_ARM64_SVE_NUM_PREGS - 1);199TEST_ASSERT(id == KVM_REG_ARM64_SVE_PREG(n, 0),200"%s: Unexpected bits set in SVE PREG id: 0x%llx", prefix, id);201return strdup_printf("KVM_REG_ARM64_SVE_PREG(%lld, 0)", n);202case KVM_REG_ARM64_SVE_FFR_BASE:203TEST_ASSERT(id == KVM_REG_ARM64_SVE_FFR(0),204"%s: Unexpected bits set in SVE FFR id: 0x%llx", prefix, id);205return "KVM_REG_ARM64_SVE_FFR(0)";206}207208return NULL;209}210211void print_reg(const char *prefix, __u64 id)212{213unsigned op0, op1, crn, crm, op2;214const char *reg_size = NULL;215216TEST_ASSERT((id & KVM_REG_ARCH_MASK) == KVM_REG_ARM64,217"%s: KVM_REG_ARM64 missing in reg id: 0x%llx", prefix, id);218219switch (id & KVM_REG_SIZE_MASK) {220case KVM_REG_SIZE_U8:221reg_size = "KVM_REG_SIZE_U8";222break;223case KVM_REG_SIZE_U16:224reg_size = "KVM_REG_SIZE_U16";225break;226case KVM_REG_SIZE_U32:227reg_size = "KVM_REG_SIZE_U32";228break;229case KVM_REG_SIZE_U64:230reg_size = "KVM_REG_SIZE_U64";231break;232case KVM_REG_SIZE_U128:233reg_size = "KVM_REG_SIZE_U128";234break;235case KVM_REG_SIZE_U256:236reg_size = "KVM_REG_SIZE_U256";237break;238case KVM_REG_SIZE_U512:239reg_size = "KVM_REG_SIZE_U512";240break;241case KVM_REG_SIZE_U1024:242reg_size = "KVM_REG_SIZE_U1024";243break;244case KVM_REG_SIZE_U2048:245reg_size = "KVM_REG_SIZE_U2048";246break;247default:248TEST_FAIL("%s: Unexpected reg size: 0x%llx in reg id: 0x%llx",249prefix, (id & KVM_REG_SIZE_MASK) >> KVM_REG_SIZE_SHIFT, id);250}251252switch (id & KVM_REG_ARM_COPROC_MASK) {253case KVM_REG_ARM_CORE:254printf("\tKVM_REG_ARM64 | %s | KVM_REG_ARM_CORE | %s,\n", reg_size, core_id_to_str(prefix, id));255break;256case KVM_REG_ARM_DEMUX:257TEST_ASSERT(!(id & ~(REG_MASK | KVM_REG_ARM_DEMUX_ID_MASK | KVM_REG_ARM_DEMUX_VAL_MASK)),258"%s: Unexpected bits set in DEMUX reg id: 0x%llx", prefix, id);259printf("\tKVM_REG_ARM64 | %s | KVM_REG_ARM_DEMUX | KVM_REG_ARM_DEMUX_ID_CCSIDR | %lld,\n",260reg_size, id & KVM_REG_ARM_DEMUX_VAL_MASK);261break;262case KVM_REG_ARM64_SYSREG:263op0 = (id & KVM_REG_ARM64_SYSREG_OP0_MASK) >> KVM_REG_ARM64_SYSREG_OP0_SHIFT;264op1 = (id & KVM_REG_ARM64_SYSREG_OP1_MASK) >> KVM_REG_ARM64_SYSREG_OP1_SHIFT;265crn = (id & KVM_REG_ARM64_SYSREG_CRN_MASK) >> KVM_REG_ARM64_SYSREG_CRN_SHIFT;266crm = (id & KVM_REG_ARM64_SYSREG_CRM_MASK) >> KVM_REG_ARM64_SYSREG_CRM_SHIFT;267op2 = (id & KVM_REG_ARM64_SYSREG_OP2_MASK) >> KVM_REG_ARM64_SYSREG_OP2_SHIFT;268TEST_ASSERT(id == ARM64_SYS_REG(op0, op1, crn, crm, op2),269"%s: Unexpected bits set in SYSREG reg id: 0x%llx", prefix, id);270printf("\tARM64_SYS_REG(%d, %d, %d, %d, %d),\n", op0, op1, crn, crm, op2);271break;272case KVM_REG_ARM_FW:273TEST_ASSERT(id == KVM_REG_ARM_FW_REG(id & 0xffff),274"%s: Unexpected bits set in FW reg id: 0x%llx", prefix, id);275printf("\tKVM_REG_ARM_FW_REG(%lld),\n", id & 0xffff);276break;277case KVM_REG_ARM_FW_FEAT_BMAP:278TEST_ASSERT(id == KVM_REG_ARM_FW_FEAT_BMAP_REG(id & 0xffff),279"%s: Unexpected bits set in the bitmap feature FW reg id: 0x%llx", prefix, id);280printf("\tKVM_REG_ARM_FW_FEAT_BMAP_REG(%lld),\n", id & 0xffff);281break;282case KVM_REG_ARM64_SVE:283printf("\t%s,\n", sve_id_to_str(prefix, id));284break;285default:286TEST_FAIL("%s: Unexpected coproc type: 0x%llx in reg id: 0x%llx",287prefix, (id & KVM_REG_ARM_COPROC_MASK) >> KVM_REG_ARM_COPROC_SHIFT, id);288}289}290291/*292* The original blessed list was primed with the output of kernel version293* v4.15 with --core-reg-fixup and then later updated with new registers.294* (The --core-reg-fixup option and it's fixup function have been removed295* from the test, as it's unlikely to use this type of test on a kernel296* older than v5.2.)297*298* The blessed list is up to date with kernel version v6.4 (or so we hope)299*/300static __u64 base_regs[] = {301KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[0]),302KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[1]),303KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[2]),304KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[3]),305KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[4]),306KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[5]),307KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[6]),308KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[7]),309KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[8]),310KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[9]),311KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[10]),312KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[11]),313KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[12]),314KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[13]),315KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[14]),316KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[15]),317KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[16]),318KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[17]),319KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[18]),320KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[19]),321KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[20]),322KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[21]),323KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[22]),324KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[23]),325KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[24]),326KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[25]),327KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[26]),328KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[27]),329KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[28]),330KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[29]),331KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.regs[30]),332KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.sp),333KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.pc),334KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(regs.pstate),335KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(sp_el1),336KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(elr_el1),337KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[0]),338KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[1]),339KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[2]),340KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[3]),341KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(spsr[4]),342KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.fpsr),343KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.fpcr),344KVM_REG_ARM_FW_REG(0), /* KVM_REG_ARM_PSCI_VERSION */345KVM_REG_ARM_FW_REG(1), /* KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_1 */346KVM_REG_ARM_FW_REG(2), /* KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_2 */347KVM_REG_ARM_FW_REG(3), /* KVM_REG_ARM_SMCCC_ARCH_WORKAROUND_3 */348KVM_REG_ARM_FW_FEAT_BMAP_REG(0), /* KVM_REG_ARM_STD_BMAP */349KVM_REG_ARM_FW_FEAT_BMAP_REG(1), /* KVM_REG_ARM_STD_HYP_BMAP */350KVM_REG_ARM_FW_FEAT_BMAP_REG(2), /* KVM_REG_ARM_VENDOR_HYP_BMAP */351KVM_REG_ARM_FW_FEAT_BMAP_REG(3), /* KVM_REG_ARM_VENDOR_HYP_BMAP_2 */352353/*354* EL0 Virtual Timer Registers355*356* WARNING:357* KVM_REG_ARM_TIMER_CVAL and KVM_REG_ARM_TIMER_CNT are not defined358* with the appropriate register encodings. Their values have been359* accidentally swapped. As this is set API, the definitions here360* must be used, rather than ones derived from the encodings.361*/362KVM_ARM64_SYS_REG(SYS_CNTV_CTL_EL0),363KVM_REG_ARM_TIMER_CVAL,364KVM_REG_ARM_TIMER_CNT,365366ARM64_SYS_REG(3, 0, 0, 0, 0), /* MIDR_EL1 */367ARM64_SYS_REG(3, 0, 0, 0, 6), /* REVIDR_EL1 */368ARM64_SYS_REG(3, 1, 0, 0, 1), /* CLIDR_EL1 */369ARM64_SYS_REG(3, 1, 0, 0, 7), /* AIDR_EL1 */370ARM64_SYS_REG(3, 3, 0, 0, 1), /* CTR_EL0 */371ARM64_SYS_REG(2, 0, 0, 0, 4),372ARM64_SYS_REG(2, 0, 0, 0, 5),373ARM64_SYS_REG(2, 0, 0, 0, 6),374ARM64_SYS_REG(2, 0, 0, 0, 7),375ARM64_SYS_REG(2, 0, 0, 1, 4),376ARM64_SYS_REG(2, 0, 0, 1, 5),377ARM64_SYS_REG(2, 0, 0, 1, 6),378ARM64_SYS_REG(2, 0, 0, 1, 7),379ARM64_SYS_REG(2, 0, 0, 2, 0), /* MDCCINT_EL1 */380ARM64_SYS_REG(2, 0, 0, 2, 2), /* MDSCR_EL1 */381ARM64_SYS_REG(2, 0, 0, 2, 4),382ARM64_SYS_REG(2, 0, 0, 2, 5),383ARM64_SYS_REG(2, 0, 0, 2, 6),384ARM64_SYS_REG(2, 0, 0, 2, 7),385ARM64_SYS_REG(2, 0, 0, 3, 4),386ARM64_SYS_REG(2, 0, 0, 3, 5),387ARM64_SYS_REG(2, 0, 0, 3, 6),388ARM64_SYS_REG(2, 0, 0, 3, 7),389ARM64_SYS_REG(2, 0, 0, 4, 4),390ARM64_SYS_REG(2, 0, 0, 4, 5),391ARM64_SYS_REG(2, 0, 0, 4, 6),392ARM64_SYS_REG(2, 0, 0, 4, 7),393ARM64_SYS_REG(2, 0, 0, 5, 4),394ARM64_SYS_REG(2, 0, 0, 5, 5),395ARM64_SYS_REG(2, 0, 0, 5, 6),396ARM64_SYS_REG(2, 0, 0, 5, 7),397ARM64_SYS_REG(2, 0, 0, 6, 4),398ARM64_SYS_REG(2, 0, 0, 6, 5),399ARM64_SYS_REG(2, 0, 0, 6, 6),400ARM64_SYS_REG(2, 0, 0, 6, 7),401ARM64_SYS_REG(2, 0, 0, 7, 4),402ARM64_SYS_REG(2, 0, 0, 7, 5),403ARM64_SYS_REG(2, 0, 0, 7, 6),404ARM64_SYS_REG(2, 0, 0, 7, 7),405ARM64_SYS_REG(2, 0, 0, 8, 4),406ARM64_SYS_REG(2, 0, 0, 8, 5),407ARM64_SYS_REG(2, 0, 0, 8, 6),408ARM64_SYS_REG(2, 0, 0, 8, 7),409ARM64_SYS_REG(2, 0, 0, 9, 4),410ARM64_SYS_REG(2, 0, 0, 9, 5),411ARM64_SYS_REG(2, 0, 0, 9, 6),412ARM64_SYS_REG(2, 0, 0, 9, 7),413ARM64_SYS_REG(2, 0, 0, 10, 4),414ARM64_SYS_REG(2, 0, 0, 10, 5),415ARM64_SYS_REG(2, 0, 0, 10, 6),416ARM64_SYS_REG(2, 0, 0, 10, 7),417ARM64_SYS_REG(2, 0, 0, 11, 4),418ARM64_SYS_REG(2, 0, 0, 11, 5),419ARM64_SYS_REG(2, 0, 0, 11, 6),420ARM64_SYS_REG(2, 0, 0, 11, 7),421ARM64_SYS_REG(2, 0, 0, 12, 4),422ARM64_SYS_REG(2, 0, 0, 12, 5),423ARM64_SYS_REG(2, 0, 0, 12, 6),424ARM64_SYS_REG(2, 0, 0, 12, 7),425ARM64_SYS_REG(2, 0, 0, 13, 4),426ARM64_SYS_REG(2, 0, 0, 13, 5),427ARM64_SYS_REG(2, 0, 0, 13, 6),428ARM64_SYS_REG(2, 0, 0, 13, 7),429ARM64_SYS_REG(2, 0, 0, 14, 4),430ARM64_SYS_REG(2, 0, 0, 14, 5),431ARM64_SYS_REG(2, 0, 0, 14, 6),432ARM64_SYS_REG(2, 0, 0, 14, 7),433ARM64_SYS_REG(2, 0, 0, 15, 4),434ARM64_SYS_REG(2, 0, 0, 15, 5),435ARM64_SYS_REG(2, 0, 0, 15, 6),436ARM64_SYS_REG(2, 0, 0, 15, 7),437ARM64_SYS_REG(2, 0, 1, 1, 4), /* OSLSR_EL1 */438ARM64_SYS_REG(2, 4, 0, 7, 0), /* DBGVCR32_EL2 */439ARM64_SYS_REG(3, 0, 0, 0, 5), /* MPIDR_EL1 */440ARM64_SYS_REG(3, 0, 0, 1, 0), /* ID_PFR0_EL1 */441ARM64_SYS_REG(3, 0, 0, 1, 1), /* ID_PFR1_EL1 */442ARM64_SYS_REG(3, 0, 0, 1, 2), /* ID_DFR0_EL1 */443ARM64_SYS_REG(3, 0, 0, 1, 3), /* ID_AFR0_EL1 */444ARM64_SYS_REG(3, 0, 0, 1, 4), /* ID_MMFR0_EL1 */445ARM64_SYS_REG(3, 0, 0, 1, 5), /* ID_MMFR1_EL1 */446ARM64_SYS_REG(3, 0, 0, 1, 6), /* ID_MMFR2_EL1 */447ARM64_SYS_REG(3, 0, 0, 1, 7), /* ID_MMFR3_EL1 */448ARM64_SYS_REG(3, 0, 0, 2, 0), /* ID_ISAR0_EL1 */449ARM64_SYS_REG(3, 0, 0, 2, 1), /* ID_ISAR1_EL1 */450ARM64_SYS_REG(3, 0, 0, 2, 2), /* ID_ISAR2_EL1 */451ARM64_SYS_REG(3, 0, 0, 2, 3), /* ID_ISAR3_EL1 */452ARM64_SYS_REG(3, 0, 0, 2, 4), /* ID_ISAR4_EL1 */453ARM64_SYS_REG(3, 0, 0, 2, 5), /* ID_ISAR5_EL1 */454ARM64_SYS_REG(3, 0, 0, 2, 6), /* ID_MMFR4_EL1 */455ARM64_SYS_REG(3, 0, 0, 2, 7), /* ID_ISAR6_EL1 */456ARM64_SYS_REG(3, 0, 0, 3, 0), /* MVFR0_EL1 */457ARM64_SYS_REG(3, 0, 0, 3, 1), /* MVFR1_EL1 */458ARM64_SYS_REG(3, 0, 0, 3, 2), /* MVFR2_EL1 */459ARM64_SYS_REG(3, 0, 0, 3, 3),460ARM64_SYS_REG(3, 0, 0, 3, 4), /* ID_PFR2_EL1 */461ARM64_SYS_REG(3, 0, 0, 3, 5), /* ID_DFR1_EL1 */462ARM64_SYS_REG(3, 0, 0, 3, 6), /* ID_MMFR5_EL1 */463ARM64_SYS_REG(3, 0, 0, 3, 7),464ARM64_SYS_REG(3, 0, 0, 4, 0), /* ID_AA64PFR0_EL1 */465ARM64_SYS_REG(3, 0, 0, 4, 1), /* ID_AA64PFR1_EL1 */466ARM64_SYS_REG(3, 0, 0, 4, 2), /* ID_AA64PFR2_EL1 */467ARM64_SYS_REG(3, 0, 0, 4, 3),468ARM64_SYS_REG(3, 0, 0, 4, 4), /* ID_AA64ZFR0_EL1 */469ARM64_SYS_REG(3, 0, 0, 4, 5), /* ID_AA64SMFR0_EL1 */470ARM64_SYS_REG(3, 0, 0, 4, 6),471ARM64_SYS_REG(3, 0, 0, 4, 7),472ARM64_SYS_REG(3, 0, 0, 5, 0), /* ID_AA64DFR0_EL1 */473ARM64_SYS_REG(3, 0, 0, 5, 1), /* ID_AA64DFR1_EL1 */474ARM64_SYS_REG(3, 0, 0, 5, 2),475ARM64_SYS_REG(3, 0, 0, 5, 3),476ARM64_SYS_REG(3, 0, 0, 5, 4), /* ID_AA64AFR0_EL1 */477ARM64_SYS_REG(3, 0, 0, 5, 5), /* ID_AA64AFR1_EL1 */478ARM64_SYS_REG(3, 0, 0, 5, 6),479ARM64_SYS_REG(3, 0, 0, 5, 7),480ARM64_SYS_REG(3, 0, 0, 6, 0), /* ID_AA64ISAR0_EL1 */481ARM64_SYS_REG(3, 0, 0, 6, 1), /* ID_AA64ISAR1_EL1 */482ARM64_SYS_REG(3, 0, 0, 6, 2), /* ID_AA64ISAR2_EL1 */483ARM64_SYS_REG(3, 0, 0, 6, 3),484ARM64_SYS_REG(3, 0, 0, 6, 4),485ARM64_SYS_REG(3, 0, 0, 6, 5),486ARM64_SYS_REG(3, 0, 0, 6, 6),487ARM64_SYS_REG(3, 0, 0, 6, 7),488ARM64_SYS_REG(3, 0, 0, 7, 0), /* ID_AA64MMFR0_EL1 */489ARM64_SYS_REG(3, 0, 0, 7, 1), /* ID_AA64MMFR1_EL1 */490ARM64_SYS_REG(3, 0, 0, 7, 2), /* ID_AA64MMFR2_EL1 */491ARM64_SYS_REG(3, 0, 0, 7, 3), /* ID_AA64MMFR3_EL1 */492ARM64_SYS_REG(3, 0, 0, 7, 4), /* ID_AA64MMFR4_EL1 */493ARM64_SYS_REG(3, 0, 0, 7, 5),494ARM64_SYS_REG(3, 0, 0, 7, 6),495ARM64_SYS_REG(3, 0, 0, 7, 7),496ARM64_SYS_REG(3, 0, 1, 0, 0), /* SCTLR_EL1 */497ARM64_SYS_REG(3, 0, 1, 0, 1), /* ACTLR_EL1 */498ARM64_SYS_REG(3, 0, 1, 0, 2), /* CPACR_EL1 */499KVM_ARM64_SYS_REG(SYS_SCTLR2_EL1),500ARM64_SYS_REG(3, 0, 2, 0, 0), /* TTBR0_EL1 */501ARM64_SYS_REG(3, 0, 2, 0, 1), /* TTBR1_EL1 */502ARM64_SYS_REG(3, 0, 2, 0, 2), /* TCR_EL1 */503ARM64_SYS_REG(3, 0, 2, 0, 3), /* TCR2_EL1 */504ARM64_SYS_REG(3, 0, 5, 1, 0), /* AFSR0_EL1 */505ARM64_SYS_REG(3, 0, 5, 1, 1), /* AFSR1_EL1 */506ARM64_SYS_REG(3, 0, 5, 2, 0), /* ESR_EL1 */507ARM64_SYS_REG(3, 0, 6, 0, 0), /* FAR_EL1 */508ARM64_SYS_REG(3, 0, 7, 4, 0), /* PAR_EL1 */509ARM64_SYS_REG(3, 0, 10, 2, 0), /* MAIR_EL1 */510ARM64_SYS_REG(3, 0, 10, 2, 2), /* PIRE0_EL1 */511ARM64_SYS_REG(3, 0, 10, 2, 3), /* PIR_EL1 */512ARM64_SYS_REG(3, 0, 10, 2, 4), /* POR_EL1 */513ARM64_SYS_REG(3, 0, 10, 3, 0), /* AMAIR_EL1 */514ARM64_SYS_REG(3, 0, 12, 0, 0), /* VBAR_EL1 */515ARM64_SYS_REG(3, 0, 12, 1, 1), /* DISR_EL1 */516ARM64_SYS_REG(3, 0, 13, 0, 1), /* CONTEXTIDR_EL1 */517ARM64_SYS_REG(3, 0, 13, 0, 4), /* TPIDR_EL1 */518ARM64_SYS_REG(3, 0, 14, 1, 0), /* CNTKCTL_EL1 */519ARM64_SYS_REG(3, 2, 0, 0, 0), /* CSSELR_EL1 */520ARM64_SYS_REG(3, 3, 10, 2, 4), /* POR_EL0 */521ARM64_SYS_REG(3, 3, 13, 0, 2), /* TPIDR_EL0 */522ARM64_SYS_REG(3, 3, 13, 0, 3), /* TPIDRRO_EL0 */523ARM64_SYS_REG(3, 3, 14, 0, 1), /* CNTPCT_EL0 */524ARM64_SYS_REG(3, 3, 14, 2, 1), /* CNTP_CTL_EL0 */525ARM64_SYS_REG(3, 3, 14, 2, 2), /* CNTP_CVAL_EL0 */526ARM64_SYS_REG(3, 4, 3, 0, 0), /* DACR32_EL2 */527ARM64_SYS_REG(3, 4, 5, 0, 1), /* IFSR32_EL2 */528ARM64_SYS_REG(3, 4, 5, 3, 0), /* FPEXC32_EL2 */529};530531static __u64 pmu_regs[] = {532ARM64_SYS_REG(3, 0, 9, 14, 1), /* PMINTENSET_EL1 */533ARM64_SYS_REG(3, 0, 9, 14, 2), /* PMINTENCLR_EL1 */534ARM64_SYS_REG(3, 3, 9, 12, 0), /* PMCR_EL0 */535ARM64_SYS_REG(3, 3, 9, 12, 1), /* PMCNTENSET_EL0 */536ARM64_SYS_REG(3, 3, 9, 12, 2), /* PMCNTENCLR_EL0 */537ARM64_SYS_REG(3, 3, 9, 12, 3), /* PMOVSCLR_EL0 */538ARM64_SYS_REG(3, 3, 9, 12, 4), /* PMSWINC_EL0 */539ARM64_SYS_REG(3, 3, 9, 12, 5), /* PMSELR_EL0 */540ARM64_SYS_REG(3, 3, 9, 13, 0), /* PMCCNTR_EL0 */541ARM64_SYS_REG(3, 3, 9, 14, 0), /* PMUSERENR_EL0 */542ARM64_SYS_REG(3, 3, 9, 14, 3), /* PMOVSSET_EL0 */543ARM64_SYS_REG(3, 3, 14, 8, 0),544ARM64_SYS_REG(3, 3, 14, 8, 1),545ARM64_SYS_REG(3, 3, 14, 8, 2),546ARM64_SYS_REG(3, 3, 14, 8, 3),547ARM64_SYS_REG(3, 3, 14, 8, 4),548ARM64_SYS_REG(3, 3, 14, 8, 5),549ARM64_SYS_REG(3, 3, 14, 8, 6),550ARM64_SYS_REG(3, 3, 14, 8, 7),551ARM64_SYS_REG(3, 3, 14, 9, 0),552ARM64_SYS_REG(3, 3, 14, 9, 1),553ARM64_SYS_REG(3, 3, 14, 9, 2),554ARM64_SYS_REG(3, 3, 14, 9, 3),555ARM64_SYS_REG(3, 3, 14, 9, 4),556ARM64_SYS_REG(3, 3, 14, 9, 5),557ARM64_SYS_REG(3, 3, 14, 9, 6),558ARM64_SYS_REG(3, 3, 14, 9, 7),559ARM64_SYS_REG(3, 3, 14, 10, 0),560ARM64_SYS_REG(3, 3, 14, 10, 1),561ARM64_SYS_REG(3, 3, 14, 10, 2),562ARM64_SYS_REG(3, 3, 14, 10, 3),563ARM64_SYS_REG(3, 3, 14, 10, 4),564ARM64_SYS_REG(3, 3, 14, 10, 5),565ARM64_SYS_REG(3, 3, 14, 10, 6),566ARM64_SYS_REG(3, 3, 14, 10, 7),567ARM64_SYS_REG(3, 3, 14, 11, 0),568ARM64_SYS_REG(3, 3, 14, 11, 1),569ARM64_SYS_REG(3, 3, 14, 11, 2),570ARM64_SYS_REG(3, 3, 14, 11, 3),571ARM64_SYS_REG(3, 3, 14, 11, 4),572ARM64_SYS_REG(3, 3, 14, 11, 5),573ARM64_SYS_REG(3, 3, 14, 11, 6),574ARM64_SYS_REG(3, 3, 14, 12, 0),575ARM64_SYS_REG(3, 3, 14, 12, 1),576ARM64_SYS_REG(3, 3, 14, 12, 2),577ARM64_SYS_REG(3, 3, 14, 12, 3),578ARM64_SYS_REG(3, 3, 14, 12, 4),579ARM64_SYS_REG(3, 3, 14, 12, 5),580ARM64_SYS_REG(3, 3, 14, 12, 6),581ARM64_SYS_REG(3, 3, 14, 12, 7),582ARM64_SYS_REG(3, 3, 14, 13, 0),583ARM64_SYS_REG(3, 3, 14, 13, 1),584ARM64_SYS_REG(3, 3, 14, 13, 2),585ARM64_SYS_REG(3, 3, 14, 13, 3),586ARM64_SYS_REG(3, 3, 14, 13, 4),587ARM64_SYS_REG(3, 3, 14, 13, 5),588ARM64_SYS_REG(3, 3, 14, 13, 6),589ARM64_SYS_REG(3, 3, 14, 13, 7),590ARM64_SYS_REG(3, 3, 14, 14, 0),591ARM64_SYS_REG(3, 3, 14, 14, 1),592ARM64_SYS_REG(3, 3, 14, 14, 2),593ARM64_SYS_REG(3, 3, 14, 14, 3),594ARM64_SYS_REG(3, 3, 14, 14, 4),595ARM64_SYS_REG(3, 3, 14, 14, 5),596ARM64_SYS_REG(3, 3, 14, 14, 6),597ARM64_SYS_REG(3, 3, 14, 14, 7),598ARM64_SYS_REG(3, 3, 14, 15, 0),599ARM64_SYS_REG(3, 3, 14, 15, 1),600ARM64_SYS_REG(3, 3, 14, 15, 2),601ARM64_SYS_REG(3, 3, 14, 15, 3),602ARM64_SYS_REG(3, 3, 14, 15, 4),603ARM64_SYS_REG(3, 3, 14, 15, 5),604ARM64_SYS_REG(3, 3, 14, 15, 6),605ARM64_SYS_REG(3, 3, 14, 15, 7), /* PMCCFILTR_EL0 */606};607608static __u64 vregs[] = {609KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[0]),610KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[1]),611KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[2]),612KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[3]),613KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[4]),614KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[5]),615KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[6]),616KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[7]),617KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[8]),618KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[9]),619KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[10]),620KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[11]),621KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[12]),622KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[13]),623KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[14]),624KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[15]),625KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[16]),626KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[17]),627KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[18]),628KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[19]),629KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[20]),630KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[21]),631KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[22]),632KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[23]),633KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[24]),634KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[25]),635KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[26]),636KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[27]),637KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[28]),638KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[29]),639KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[30]),640KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG(fp_regs.vregs[31]),641};642643static __u64 sve_regs[] = {644KVM_REG_ARM64_SVE_VLS,645KVM_REG_ARM64_SVE_ZREG(0, 0),646KVM_REG_ARM64_SVE_ZREG(1, 0),647KVM_REG_ARM64_SVE_ZREG(2, 0),648KVM_REG_ARM64_SVE_ZREG(3, 0),649KVM_REG_ARM64_SVE_ZREG(4, 0),650KVM_REG_ARM64_SVE_ZREG(5, 0),651KVM_REG_ARM64_SVE_ZREG(6, 0),652KVM_REG_ARM64_SVE_ZREG(7, 0),653KVM_REG_ARM64_SVE_ZREG(8, 0),654KVM_REG_ARM64_SVE_ZREG(9, 0),655KVM_REG_ARM64_SVE_ZREG(10, 0),656KVM_REG_ARM64_SVE_ZREG(11, 0),657KVM_REG_ARM64_SVE_ZREG(12, 0),658KVM_REG_ARM64_SVE_ZREG(13, 0),659KVM_REG_ARM64_SVE_ZREG(14, 0),660KVM_REG_ARM64_SVE_ZREG(15, 0),661KVM_REG_ARM64_SVE_ZREG(16, 0),662KVM_REG_ARM64_SVE_ZREG(17, 0),663KVM_REG_ARM64_SVE_ZREG(18, 0),664KVM_REG_ARM64_SVE_ZREG(19, 0),665KVM_REG_ARM64_SVE_ZREG(20, 0),666KVM_REG_ARM64_SVE_ZREG(21, 0),667KVM_REG_ARM64_SVE_ZREG(22, 0),668KVM_REG_ARM64_SVE_ZREG(23, 0),669KVM_REG_ARM64_SVE_ZREG(24, 0),670KVM_REG_ARM64_SVE_ZREG(25, 0),671KVM_REG_ARM64_SVE_ZREG(26, 0),672KVM_REG_ARM64_SVE_ZREG(27, 0),673KVM_REG_ARM64_SVE_ZREG(28, 0),674KVM_REG_ARM64_SVE_ZREG(29, 0),675KVM_REG_ARM64_SVE_ZREG(30, 0),676KVM_REG_ARM64_SVE_ZREG(31, 0),677KVM_REG_ARM64_SVE_PREG(0, 0),678KVM_REG_ARM64_SVE_PREG(1, 0),679KVM_REG_ARM64_SVE_PREG(2, 0),680KVM_REG_ARM64_SVE_PREG(3, 0),681KVM_REG_ARM64_SVE_PREG(4, 0),682KVM_REG_ARM64_SVE_PREG(5, 0),683KVM_REG_ARM64_SVE_PREG(6, 0),684KVM_REG_ARM64_SVE_PREG(7, 0),685KVM_REG_ARM64_SVE_PREG(8, 0),686KVM_REG_ARM64_SVE_PREG(9, 0),687KVM_REG_ARM64_SVE_PREG(10, 0),688KVM_REG_ARM64_SVE_PREG(11, 0),689KVM_REG_ARM64_SVE_PREG(12, 0),690KVM_REG_ARM64_SVE_PREG(13, 0),691KVM_REG_ARM64_SVE_PREG(14, 0),692KVM_REG_ARM64_SVE_PREG(15, 0),693KVM_REG_ARM64_SVE_FFR(0),694ARM64_SYS_REG(3, 0, 1, 2, 0), /* ZCR_EL1 */695};696697static __u64 sve_rejects_set[] = {698KVM_REG_ARM64_SVE_VLS,699};700701static __u64 pauth_addr_regs[] = {702ARM64_SYS_REG(3, 0, 2, 1, 0), /* APIAKEYLO_EL1 */703ARM64_SYS_REG(3, 0, 2, 1, 1), /* APIAKEYHI_EL1 */704ARM64_SYS_REG(3, 0, 2, 1, 2), /* APIBKEYLO_EL1 */705ARM64_SYS_REG(3, 0, 2, 1, 3), /* APIBKEYHI_EL1 */706ARM64_SYS_REG(3, 0, 2, 2, 0), /* APDAKEYLO_EL1 */707ARM64_SYS_REG(3, 0, 2, 2, 1), /* APDAKEYHI_EL1 */708ARM64_SYS_REG(3, 0, 2, 2, 2), /* APDBKEYLO_EL1 */709ARM64_SYS_REG(3, 0, 2, 2, 3) /* APDBKEYHI_EL1 */710};711712static __u64 pauth_generic_regs[] = {713ARM64_SYS_REG(3, 0, 2, 3, 0), /* APGAKEYLO_EL1 */714ARM64_SYS_REG(3, 0, 2, 3, 1), /* APGAKEYHI_EL1 */715};716717static __u64 el2_regs[] = {718SYS_REG(VPIDR_EL2),719SYS_REG(VMPIDR_EL2),720SYS_REG(SCTLR_EL2),721SYS_REG(ACTLR_EL2),722SYS_REG(SCTLR2_EL2),723SYS_REG(HCR_EL2),724SYS_REG(MDCR_EL2),725SYS_REG(CPTR_EL2),726SYS_REG(HSTR_EL2),727SYS_REG(HFGRTR_EL2),728SYS_REG(HFGWTR_EL2),729SYS_REG(HFGITR_EL2),730SYS_REG(HACR_EL2),731SYS_REG(ZCR_EL2),732SYS_REG(HCRX_EL2),733SYS_REG(TTBR0_EL2),734SYS_REG(TTBR1_EL2),735SYS_REG(TCR_EL2),736SYS_REG(TCR2_EL2),737SYS_REG(VTTBR_EL2),738SYS_REG(VTCR_EL2),739SYS_REG(VNCR_EL2),740SYS_REG(HDFGRTR2_EL2),741SYS_REG(HDFGWTR2_EL2),742SYS_REG(HFGRTR2_EL2),743SYS_REG(HFGWTR2_EL2),744SYS_REG(HDFGRTR_EL2),745SYS_REG(HDFGWTR_EL2),746SYS_REG(HAFGRTR_EL2),747SYS_REG(HFGITR2_EL2),748SYS_REG(SPSR_EL2),749SYS_REG(ELR_EL2),750SYS_REG(AFSR0_EL2),751SYS_REG(AFSR1_EL2),752SYS_REG(ESR_EL2),753SYS_REG(FAR_EL2),754SYS_REG(HPFAR_EL2),755SYS_REG(MAIR_EL2),756SYS_REG(PIRE0_EL2),757SYS_REG(PIR_EL2),758SYS_REG(POR_EL2),759SYS_REG(AMAIR_EL2),760SYS_REG(VBAR_EL2),761SYS_REG(CONTEXTIDR_EL2),762SYS_REG(TPIDR_EL2),763SYS_REG(CNTVOFF_EL2),764SYS_REG(CNTHCTL_EL2),765SYS_REG(CNTHP_CTL_EL2),766SYS_REG(CNTHP_CVAL_EL2),767SYS_REG(CNTHV_CTL_EL2),768SYS_REG(CNTHV_CVAL_EL2),769SYS_REG(SP_EL2),770SYS_REG(VDISR_EL2),771SYS_REG(VSESR_EL2),772};773774static __u64 el2_e2h0_regs[] = {775/* Empty */776};777778#define BASE_SUBLIST \779{ "base", .regs = base_regs, .regs_n = ARRAY_SIZE(base_regs), }780#define VREGS_SUBLIST \781{ "vregs", .regs = vregs, .regs_n = ARRAY_SIZE(vregs), }782#define PMU_SUBLIST \783{ "pmu", .capability = KVM_CAP_ARM_PMU_V3, .feature = KVM_ARM_VCPU_PMU_V3, \784.regs = pmu_regs, .regs_n = ARRAY_SIZE(pmu_regs), }785#define SVE_SUBLIST \786{ "sve", .capability = KVM_CAP_ARM_SVE, .feature = KVM_ARM_VCPU_SVE, .finalize = true, \787.regs = sve_regs, .regs_n = ARRAY_SIZE(sve_regs), \788.rejects_set = sve_rejects_set, .rejects_set_n = ARRAY_SIZE(sve_rejects_set), }789#define PAUTH_SUBLIST \790{ \791.name = "pauth_address", \792.capability = KVM_CAP_ARM_PTRAUTH_ADDRESS, \793.feature = KVM_ARM_VCPU_PTRAUTH_ADDRESS, \794.regs = pauth_addr_regs, \795.regs_n = ARRAY_SIZE(pauth_addr_regs), \796}, \797{ \798.name = "pauth_generic", \799.capability = KVM_CAP_ARM_PTRAUTH_GENERIC, \800.feature = KVM_ARM_VCPU_PTRAUTH_GENERIC, \801.regs = pauth_generic_regs, \802.regs_n = ARRAY_SIZE(pauth_generic_regs), \803}804#define EL2_SUBLIST \805{ \806.name = "EL2", \807.capability = KVM_CAP_ARM_EL2, \808.feature = KVM_ARM_VCPU_HAS_EL2, \809.regs = el2_regs, \810.regs_n = ARRAY_SIZE(el2_regs), \811}812#define EL2_E2H0_SUBLIST \813EL2_SUBLIST, \814{ \815.name = "EL2 E2H0", \816.capability = KVM_CAP_ARM_EL2_E2H0, \817.feature = KVM_ARM_VCPU_HAS_EL2_E2H0, \818.regs = el2_e2h0_regs, \819.regs_n = ARRAY_SIZE(el2_e2h0_regs), \820}821822static struct vcpu_reg_list vregs_config = {823.sublists = {824BASE_SUBLIST,825VREGS_SUBLIST,826{0},827},828};829static struct vcpu_reg_list vregs_pmu_config = {830.sublists = {831BASE_SUBLIST,832VREGS_SUBLIST,833PMU_SUBLIST,834{0},835},836};837static struct vcpu_reg_list sve_config = {838.sublists = {839BASE_SUBLIST,840SVE_SUBLIST,841{0},842},843};844static struct vcpu_reg_list sve_pmu_config = {845.sublists = {846BASE_SUBLIST,847SVE_SUBLIST,848PMU_SUBLIST,849{0},850},851};852static struct vcpu_reg_list pauth_config = {853.sublists = {854BASE_SUBLIST,855VREGS_SUBLIST,856PAUTH_SUBLIST,857{0},858},859};860static struct vcpu_reg_list pauth_pmu_config = {861.sublists = {862BASE_SUBLIST,863VREGS_SUBLIST,864PAUTH_SUBLIST,865PMU_SUBLIST,866{0},867},868};869870static struct vcpu_reg_list el2_vregs_config = {871.sublists = {872BASE_SUBLIST,873EL2_SUBLIST,874VREGS_SUBLIST,875{0},876},877};878879static struct vcpu_reg_list el2_vregs_pmu_config = {880.sublists = {881BASE_SUBLIST,882EL2_SUBLIST,883VREGS_SUBLIST,884PMU_SUBLIST,885{0},886},887};888889static struct vcpu_reg_list el2_sve_config = {890.sublists = {891BASE_SUBLIST,892EL2_SUBLIST,893SVE_SUBLIST,894{0},895},896};897898static struct vcpu_reg_list el2_sve_pmu_config = {899.sublists = {900BASE_SUBLIST,901EL2_SUBLIST,902SVE_SUBLIST,903PMU_SUBLIST,904{0},905},906};907908static struct vcpu_reg_list el2_pauth_config = {909.sublists = {910BASE_SUBLIST,911EL2_SUBLIST,912VREGS_SUBLIST,913PAUTH_SUBLIST,914{0},915},916};917918static struct vcpu_reg_list el2_pauth_pmu_config = {919.sublists = {920BASE_SUBLIST,921EL2_SUBLIST,922VREGS_SUBLIST,923PAUTH_SUBLIST,924PMU_SUBLIST,925{0},926},927};928929static struct vcpu_reg_list el2_e2h0_vregs_config = {930.sublists = {931BASE_SUBLIST,932EL2_E2H0_SUBLIST,933VREGS_SUBLIST,934{0},935},936};937938static struct vcpu_reg_list el2_e2h0_vregs_pmu_config = {939.sublists = {940BASE_SUBLIST,941EL2_E2H0_SUBLIST,942VREGS_SUBLIST,943PMU_SUBLIST,944{0},945},946};947948static struct vcpu_reg_list el2_e2h0_sve_config = {949.sublists = {950BASE_SUBLIST,951EL2_E2H0_SUBLIST,952SVE_SUBLIST,953{0},954},955};956957static struct vcpu_reg_list el2_e2h0_sve_pmu_config = {958.sublists = {959BASE_SUBLIST,960EL2_E2H0_SUBLIST,961SVE_SUBLIST,962PMU_SUBLIST,963{0},964},965};966967static struct vcpu_reg_list el2_e2h0_pauth_config = {968.sublists = {969BASE_SUBLIST,970EL2_E2H0_SUBLIST,971VREGS_SUBLIST,972PAUTH_SUBLIST,973{0},974},975};976977static struct vcpu_reg_list el2_e2h0_pauth_pmu_config = {978.sublists = {979BASE_SUBLIST,980EL2_E2H0_SUBLIST,981VREGS_SUBLIST,982PAUTH_SUBLIST,983PMU_SUBLIST,984{0},985},986};987988struct vcpu_reg_list *vcpu_configs[] = {989&vregs_config,990&vregs_pmu_config,991&sve_config,992&sve_pmu_config,993&pauth_config,994&pauth_pmu_config,995996&el2_vregs_config,997&el2_vregs_pmu_config,998&el2_sve_config,999&el2_sve_pmu_config,1000&el2_pauth_config,1001&el2_pauth_pmu_config,10021003&el2_e2h0_vregs_config,1004&el2_e2h0_vregs_pmu_config,1005&el2_e2h0_sve_config,1006&el2_e2h0_sve_pmu_config,1007&el2_e2h0_pauth_config,1008&el2_e2h0_pauth_pmu_config,1009};1010int vcpu_configs_n = ARRAY_SIZE(vcpu_configs);101110121013