Skip to content

Commit 53d5486

Browse files
author
Marc Zyngier
committed
Merge branch kvm-arm64/fgt-rework into kvmarm-master/next
* kvm-arm64/fgt-rework: (30 commits) : . : Fine Grain Trapping update, courtesy of Fuad Tabba. : : From the cover letter: : : "This patch series has fixes, updates, and code for validating : fine grain trap register masks, as well as some fixes to feature : trapping in pKVM. : : New fine grain trap (FGT) bits have been defined in the latest : Arm Architecture System Registers xml specification (DDI0601 and : DDI0602 2023-09) [1], so the code is updated to reflect them. : Moreover, some of the already-defined masks overlap with RES0, : which this series fixes. : : It also adds FGT register masks that weren't defined earlier, : handling of HAFGRTR_EL2 in nested virt, as well as build time : validation that the bits of the various masks are all accounted : for and without overlap." : : This branch also drags the arm64/for-next/sysregs branch, : which is a dependency on this work. : . KVM: arm64: Trap external trace for protected VMs KVM: arm64: Mark PAuth as a restricted feature for protected VMs KVM: arm64: Fix which features are marked as allowed for protected VMs KVM: arm64: Macros for setting/clearing FGT bits KVM: arm64: Define FGT nMASK bits relative to other fields KVM: arm64: Use generated FGT RES0 bits instead of specifying them KVM: arm64: Add build validation for FGT trap mask values KVM: arm64: Update and fix FGT register masks KVM: arm64: Handle HAFGRTR_EL2 trapping in nested virt KVM: arm64: Add bit masks for HAFGRTR_EL2 KVM: arm64: Add missing HFGITR_EL2 FGT entries to nested virt KVM: arm64: Add missing HFGxTR_EL2 FGT entries to nested virt KVM: arm64: Explicitly trap unsupported HFGxTR_EL2 features arm64/sysreg: Add missing system instruction definitions for FGT arm64/sysreg: Add missing system register definitions for FGT arm64/sysreg: Add missing ExtTrcBuff field definition to ID_AA64DFR0_EL1 arm64/sysreg: Add missing Pauth_LR field definitions to ID_AA64ISAR1_EL1 arm64/sysreg: Add new system registers for GCS arm64/sysreg: Add definition for FPMR arm64/sysreg: Update HCRX_EL2 definition for DDI0601 2023-09 ... Signed-off-by: Marc Zyngier <maz@kernel.org>
2 parents 189f2c8 + 9d52612 commit 53d5486

9 files changed

Lines changed: 513 additions & 70 deletions

File tree

arch/arm64/include/asm/kvm_arm.h

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -346,36 +346,47 @@
346346
* Once we get to a point where the two describe the same thing, we'll
347347
* merge the definitions. One day.
348348
*/
349-
#define __HFGRTR_EL2_RES0 (GENMASK(63, 56) | GENMASK(53, 51))
349+
#define __HFGRTR_EL2_RES0 HFGxTR_EL2_RES0
350350
#define __HFGRTR_EL2_MASK GENMASK(49, 0)
351-
#define __HFGRTR_EL2_nMASK (GENMASK(58, 57) | GENMASK(55, 54) | BIT(50))
351+
#define __HFGRTR_EL2_nMASK ~(__HFGRTR_EL2_RES0 | __HFGRTR_EL2_MASK)
352352

353-
#define __HFGWTR_EL2_RES0 (GENMASK(63, 56) | GENMASK(53, 51) | \
354-
BIT(46) | BIT(42) | BIT(40) | BIT(28) | \
355-
GENMASK(26, 25) | BIT(21) | BIT(18) | \
353+
/*
354+
* The HFGWTR bits are a subset of HFGRTR bits. To ensure we don't miss any
355+
* future additions, define __HFGWTR* macros relative to __HFGRTR* ones.
356+
*/
357+
#define __HFGRTR_ONLY_MASK (BIT(46) | BIT(42) | BIT(40) | BIT(28) | \
358+
GENMASK(26, 25) | BIT(21) | BIT(18) | \
356359
GENMASK(15, 14) | GENMASK(10, 9) | BIT(2))
357-
#define __HFGWTR_EL2_MASK GENMASK(49, 0)
358-
#define __HFGWTR_EL2_nMASK (GENMASK(58, 57) | GENMASK(55, 54) | BIT(50))
359-
360-
#define __HFGITR_EL2_RES0 GENMASK(63, 57)
361-
#define __HFGITR_EL2_MASK GENMASK(54, 0)
362-
#define __HFGITR_EL2_nMASK GENMASK(56, 55)
363-
364-
#define __HDFGRTR_EL2_RES0 (BIT(49) | BIT(42) | GENMASK(39, 38) | \
365-
GENMASK(21, 20) | BIT(8))
366-
#define __HDFGRTR_EL2_MASK ~__HDFGRTR_EL2_nMASK
367-
#define __HDFGRTR_EL2_nMASK GENMASK(62, 59)
368-
369-
#define __HDFGWTR_EL2_RES0 (BIT(63) | GENMASK(59, 58) | BIT(51) | BIT(47) | \
370-
BIT(43) | GENMASK(40, 38) | BIT(34) | BIT(30) | \
371-
BIT(22) | BIT(9) | BIT(6))
372-
#define __HDFGWTR_EL2_MASK ~__HDFGWTR_EL2_nMASK
373-
#define __HDFGWTR_EL2_nMASK GENMASK(62, 60)
360+
#define __HFGWTR_EL2_RES0 (__HFGRTR_EL2_RES0 | __HFGRTR_ONLY_MASK)
361+
#define __HFGWTR_EL2_MASK (__HFGRTR_EL2_MASK & ~__HFGRTR_ONLY_MASK)
362+
#define __HFGWTR_EL2_nMASK ~(__HFGWTR_EL2_RES0 | __HFGWTR_EL2_MASK)
363+
364+
#define __HFGITR_EL2_RES0 HFGITR_EL2_RES0
365+
#define __HFGITR_EL2_MASK (BIT(62) | BIT(60) | GENMASK(54, 0))
366+
#define __HFGITR_EL2_nMASK ~(__HFGITR_EL2_RES0 | __HFGITR_EL2_MASK)
367+
368+
#define __HDFGRTR_EL2_RES0 HDFGRTR_EL2_RES0
369+
#define __HDFGRTR_EL2_MASK (BIT(63) | GENMASK(58, 50) | GENMASK(48, 43) | \
370+
GENMASK(41, 40) | GENMASK(37, 22) | \
371+
GENMASK(19, 9) | GENMASK(7, 0))
372+
#define __HDFGRTR_EL2_nMASK ~(__HDFGRTR_EL2_RES0 | __HDFGRTR_EL2_MASK)
373+
374+
#define __HDFGWTR_EL2_RES0 HDFGWTR_EL2_RES0
375+
#define __HDFGWTR_EL2_MASK (GENMASK(57, 52) | GENMASK(50, 48) | \
376+
GENMASK(46, 44) | GENMASK(42, 41) | \
377+
GENMASK(37, 35) | GENMASK(33, 31) | \
378+
GENMASK(29, 23) | GENMASK(21, 10) | \
379+
GENMASK(8, 7) | GENMASK(5, 0))
380+
#define __HDFGWTR_EL2_nMASK ~(__HDFGWTR_EL2_RES0 | __HDFGWTR_EL2_MASK)
381+
382+
#define __HAFGRTR_EL2_RES0 HAFGRTR_EL2_RES0
383+
#define __HAFGRTR_EL2_MASK (GENMASK(49, 17) | GENMASK(4, 0))
384+
#define __HAFGRTR_EL2_nMASK ~(__HAFGRTR_EL2_RES0 | __HAFGRTR_EL2_MASK)
374385

375386
/* Similar definitions for HCRX_EL2 */
376-
#define __HCRX_EL2_RES0 (GENMASK(63, 16) | GENMASK(13, 12))
377-
#define __HCRX_EL2_MASK (0)
378-
#define __HCRX_EL2_nMASK (GENMASK(15, 14) | GENMASK(4, 0))
387+
#define __HCRX_EL2_RES0 HCRX_EL2_RES0
388+
#define __HCRX_EL2_MASK (BIT(6))
389+
#define __HCRX_EL2_nMASK ~(__HCRX_EL2_RES0 | __HCRX_EL2_MASK)
379390

380391
/* Hyp Prefetch Fault Address Register (HPFAR/HDFAR) */
381392
#define HPFAR_MASK (~UL(0xf))

arch/arm64/include/asm/kvm_host.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,7 @@ enum vcpu_sysreg {
443443
HFGITR_EL2,
444444
HDFGRTR_EL2,
445445
HDFGWTR_EL2,
446+
HAFGRTR_EL2,
446447
CNTHP_CTL_EL2,
447448
CNTHP_CVAL_EL2,
448449
CNTHV_CTL_EL2,

arch/arm64/include/asm/sysreg.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,6 +645,7 @@
645645
#define OP_AT_S1E0W sys_insn(AT_Op0, 0, AT_CRn, 8, 3)
646646
#define OP_AT_S1E1RP sys_insn(AT_Op0, 0, AT_CRn, 9, 0)
647647
#define OP_AT_S1E1WP sys_insn(AT_Op0, 0, AT_CRn, 9, 1)
648+
#define OP_AT_S1E1A sys_insn(AT_Op0, 0, AT_CRn, 9, 2)
648649
#define OP_AT_S1E2R sys_insn(AT_Op0, 4, AT_CRn, 8, 0)
649650
#define OP_AT_S1E2W sys_insn(AT_Op0, 4, AT_CRn, 8, 1)
650651
#define OP_AT_S12E1R sys_insn(AT_Op0, 4, AT_CRn, 8, 4)
@@ -781,10 +782,16 @@
781782
#define OP_TLBI_VMALLS12E1NXS sys_insn(1, 4, 9, 7, 6)
782783

783784
/* Misc instructions */
785+
#define OP_GCSPUSHX sys_insn(1, 0, 7, 7, 4)
786+
#define OP_GCSPOPCX sys_insn(1, 0, 7, 7, 5)
787+
#define OP_GCSPOPX sys_insn(1, 0, 7, 7, 6)
788+
#define OP_GCSPUSHM sys_insn(1, 3, 7, 7, 0)
789+
784790
#define OP_BRB_IALL sys_insn(1, 1, 7, 2, 4)
785791
#define OP_BRB_INJ sys_insn(1, 1, 7, 2, 5)
786792
#define OP_CFP_RCTX sys_insn(1, 3, 7, 3, 4)
787793
#define OP_DVP_RCTX sys_insn(1, 3, 7, 3, 5)
794+
#define OP_COSP_RCTX sys_insn(1, 3, 7, 3, 6)
788795
#define OP_CPP_RCTX sys_insn(1, 3, 7, 3, 7)
789796

790797
/* Common SCTLR_ELx flags. */
@@ -1044,6 +1051,19 @@
10441051

10451052
#define PIRx_ELx_PERM(idx, perm) ((perm) << ((idx) * 4))
10461053

1054+
/*
1055+
* Permission Overlay Extension (POE) permission encodings.
1056+
*/
1057+
#define POE_NONE UL(0x0)
1058+
#define POE_R UL(0x1)
1059+
#define POE_X UL(0x2)
1060+
#define POE_RX UL(0x3)
1061+
#define POE_W UL(0x4)
1062+
#define POE_RW UL(0x5)
1063+
#define POE_XW UL(0x6)
1064+
#define POE_RXW UL(0x7)
1065+
#define POE_MASK UL(0xf)
1066+
10471067
#define ARM64_FEATURE_FIELD_BITS 4
10481068

10491069
/* Defined for compatibility only, do not add new users. */

arch/arm64/kvm/emulate-nested.c

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,7 @@ enum fgt_group_id {
10121012
HDFGRTR_GROUP,
10131013
HDFGWTR_GROUP,
10141014
HFGITR_GROUP,
1015+
HAFGRTR_GROUP,
10151016

10161017
/* Must be last */
10171018
__NR_FGT_GROUP_IDS__
@@ -1042,10 +1043,20 @@ enum fg_filter_id {
10421043

10431044
static const struct encoding_to_trap_config encoding_to_fgt[] __initconst = {
10441045
/* HFGRTR_EL2, HFGWTR_EL2 */
1046+
SR_FGT(SYS_AMAIR2_EL1, HFGxTR, nAMAIR2_EL1, 0),
1047+
SR_FGT(SYS_MAIR2_EL1, HFGxTR, nMAIR2_EL1, 0),
1048+
SR_FGT(SYS_S2POR_EL1, HFGxTR, nS2POR_EL1, 0),
1049+
SR_FGT(SYS_POR_EL1, HFGxTR, nPOR_EL1, 0),
1050+
SR_FGT(SYS_POR_EL0, HFGxTR, nPOR_EL0, 0),
10451051
SR_FGT(SYS_PIR_EL1, HFGxTR, nPIR_EL1, 0),
10461052
SR_FGT(SYS_PIRE0_EL1, HFGxTR, nPIRE0_EL1, 0),
1053+
SR_FGT(SYS_RCWMASK_EL1, HFGxTR, nRCWMASK_EL1, 0),
10471054
SR_FGT(SYS_TPIDR2_EL0, HFGxTR, nTPIDR2_EL0, 0),
10481055
SR_FGT(SYS_SMPRI_EL1, HFGxTR, nSMPRI_EL1, 0),
1056+
SR_FGT(SYS_GCSCR_EL1, HFGxTR, nGCS_EL1, 0),
1057+
SR_FGT(SYS_GCSPR_EL1, HFGxTR, nGCS_EL1, 0),
1058+
SR_FGT(SYS_GCSCRE0_EL1, HFGxTR, nGCS_EL0, 0),
1059+
SR_FGT(SYS_GCSPR_EL0, HFGxTR, nGCS_EL0, 0),
10491060
SR_FGT(SYS_ACCDATA_EL1, HFGxTR, nACCDATA_EL1, 0),
10501061
SR_FGT(SYS_ERXADDR_EL1, HFGxTR, ERXADDR_EL1, 1),
10511062
SR_FGT(SYS_ERXPFGCDN_EL1, HFGxTR, ERXPFGCDN_EL1, 1),
@@ -1107,6 +1118,11 @@ static const struct encoding_to_trap_config encoding_to_fgt[] __initconst = {
11071118
SR_FGT(SYS_AFSR1_EL1, HFGxTR, AFSR1_EL1, 1),
11081119
SR_FGT(SYS_AFSR0_EL1, HFGxTR, AFSR0_EL1, 1),
11091120
/* HFGITR_EL2 */
1121+
SR_FGT(OP_AT_S1E1A, HFGITR, ATS1E1A, 1),
1122+
SR_FGT(OP_COSP_RCTX, HFGITR, COSPRCTX, 1),
1123+
SR_FGT(OP_GCSPUSHX, HFGITR, nGCSEPP, 0),
1124+
SR_FGT(OP_GCSPOPX, HFGITR, nGCSEPP, 0),
1125+
SR_FGT(OP_GCSPUSHM, HFGITR, nGCSPUSHM_EL1, 0),
11101126
SR_FGT(OP_BRB_IALL, HFGITR, nBRBIALL, 0),
11111127
SR_FGT(OP_BRB_INJ, HFGITR, nBRBINJ, 0),
11121128
SR_FGT(SYS_DC_CVAC, HFGITR, DCCVAC, 1),
@@ -1674,6 +1690,49 @@ static const struct encoding_to_trap_config encoding_to_fgt[] __initconst = {
16741690
SR_FGT(SYS_PMCR_EL0, HDFGWTR, PMCR_EL0, 1),
16751691
SR_FGT(SYS_PMSWINC_EL0, HDFGWTR, PMSWINC_EL0, 1),
16761692
SR_FGT(SYS_OSLAR_EL1, HDFGWTR, OSLAR_EL1, 1),
1693+
/*
1694+
* HAFGRTR_EL2
1695+
*/
1696+
SR_FGT(SYS_AMEVTYPER1_EL0(15), HAFGRTR, AMEVTYPER115_EL0, 1),
1697+
SR_FGT(SYS_AMEVTYPER1_EL0(14), HAFGRTR, AMEVTYPER114_EL0, 1),
1698+
SR_FGT(SYS_AMEVTYPER1_EL0(13), HAFGRTR, AMEVTYPER113_EL0, 1),
1699+
SR_FGT(SYS_AMEVTYPER1_EL0(12), HAFGRTR, AMEVTYPER112_EL0, 1),
1700+
SR_FGT(SYS_AMEVTYPER1_EL0(11), HAFGRTR, AMEVTYPER111_EL0, 1),
1701+
SR_FGT(SYS_AMEVTYPER1_EL0(10), HAFGRTR, AMEVTYPER110_EL0, 1),
1702+
SR_FGT(SYS_AMEVTYPER1_EL0(9), HAFGRTR, AMEVTYPER19_EL0, 1),
1703+
SR_FGT(SYS_AMEVTYPER1_EL0(8), HAFGRTR, AMEVTYPER18_EL0, 1),
1704+
SR_FGT(SYS_AMEVTYPER1_EL0(7), HAFGRTR, AMEVTYPER17_EL0, 1),
1705+
SR_FGT(SYS_AMEVTYPER1_EL0(6), HAFGRTR, AMEVTYPER16_EL0, 1),
1706+
SR_FGT(SYS_AMEVTYPER1_EL0(5), HAFGRTR, AMEVTYPER15_EL0, 1),
1707+
SR_FGT(SYS_AMEVTYPER1_EL0(4), HAFGRTR, AMEVTYPER14_EL0, 1),
1708+
SR_FGT(SYS_AMEVTYPER1_EL0(3), HAFGRTR, AMEVTYPER13_EL0, 1),
1709+
SR_FGT(SYS_AMEVTYPER1_EL0(2), HAFGRTR, AMEVTYPER12_EL0, 1),
1710+
SR_FGT(SYS_AMEVTYPER1_EL0(1), HAFGRTR, AMEVTYPER11_EL0, 1),
1711+
SR_FGT(SYS_AMEVTYPER1_EL0(0), HAFGRTR, AMEVTYPER10_EL0, 1),
1712+
SR_FGT(SYS_AMEVCNTR1_EL0(15), HAFGRTR, AMEVCNTR115_EL0, 1),
1713+
SR_FGT(SYS_AMEVCNTR1_EL0(14), HAFGRTR, AMEVCNTR114_EL0, 1),
1714+
SR_FGT(SYS_AMEVCNTR1_EL0(13), HAFGRTR, AMEVCNTR113_EL0, 1),
1715+
SR_FGT(SYS_AMEVCNTR1_EL0(12), HAFGRTR, AMEVCNTR112_EL0, 1),
1716+
SR_FGT(SYS_AMEVCNTR1_EL0(11), HAFGRTR, AMEVCNTR111_EL0, 1),
1717+
SR_FGT(SYS_AMEVCNTR1_EL0(10), HAFGRTR, AMEVCNTR110_EL0, 1),
1718+
SR_FGT(SYS_AMEVCNTR1_EL0(9), HAFGRTR, AMEVCNTR19_EL0, 1),
1719+
SR_FGT(SYS_AMEVCNTR1_EL0(8), HAFGRTR, AMEVCNTR18_EL0, 1),
1720+
SR_FGT(SYS_AMEVCNTR1_EL0(7), HAFGRTR, AMEVCNTR17_EL0, 1),
1721+
SR_FGT(SYS_AMEVCNTR1_EL0(6), HAFGRTR, AMEVCNTR16_EL0, 1),
1722+
SR_FGT(SYS_AMEVCNTR1_EL0(5), HAFGRTR, AMEVCNTR15_EL0, 1),
1723+
SR_FGT(SYS_AMEVCNTR1_EL0(4), HAFGRTR, AMEVCNTR14_EL0, 1),
1724+
SR_FGT(SYS_AMEVCNTR1_EL0(3), HAFGRTR, AMEVCNTR13_EL0, 1),
1725+
SR_FGT(SYS_AMEVCNTR1_EL0(2), HAFGRTR, AMEVCNTR12_EL0, 1),
1726+
SR_FGT(SYS_AMEVCNTR1_EL0(1), HAFGRTR, AMEVCNTR11_EL0, 1),
1727+
SR_FGT(SYS_AMEVCNTR1_EL0(0), HAFGRTR, AMEVCNTR10_EL0, 1),
1728+
SR_FGT(SYS_AMCNTENCLR1_EL0, HAFGRTR, AMCNTEN1, 1),
1729+
SR_FGT(SYS_AMCNTENSET1_EL0, HAFGRTR, AMCNTEN1, 1),
1730+
SR_FGT(SYS_AMCNTENCLR0_EL0, HAFGRTR, AMCNTEN0, 1),
1731+
SR_FGT(SYS_AMCNTENSET0_EL0, HAFGRTR, AMCNTEN0, 1),
1732+
SR_FGT(SYS_AMEVCNTR0_EL0(3), HAFGRTR, AMEVCNTR03_EL0, 1),
1733+
SR_FGT(SYS_AMEVCNTR0_EL0(2), HAFGRTR, AMEVCNTR02_EL0, 1),
1734+
SR_FGT(SYS_AMEVCNTR0_EL0(1), HAFGRTR, AMEVCNTR01_EL0, 1),
1735+
SR_FGT(SYS_AMEVCNTR0_EL0(0), HAFGRTR, AMEVCNTR00_EL0, 1),
16771736
};
16781737

16791738
static union trap_config get_trap_config(u32 sysreg)
@@ -1894,6 +1953,10 @@ bool __check_nv_sr_forward(struct kvm_vcpu *vcpu)
18941953
val = sanitised_sys_reg(vcpu, HDFGWTR_EL2);
18951954
break;
18961955

1956+
case HAFGRTR_GROUP:
1957+
val = sanitised_sys_reg(vcpu, HAFGRTR_EL2);
1958+
break;
1959+
18971960
case HFGITR_GROUP:
18981961
val = sanitised_sys_reg(vcpu, HFGITR_EL2);
18991962
switch (tc.fgf) {

arch/arm64/kvm/hyp/include/hyp/switch.h

Lines changed: 61 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,60 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
7979
clr |= ~hfg & __ ## reg ## _nMASK; \
8080
} while(0)
8181

82+
#define update_fgt_traps_cs(vcpu, reg, clr, set) \
83+
do { \
84+
struct kvm_cpu_context *hctxt = \
85+
&this_cpu_ptr(&kvm_host_data)->host_ctxt; \
86+
u64 c = 0, s = 0; \
87+
\
88+
ctxt_sys_reg(hctxt, reg) = read_sysreg_s(SYS_ ## reg); \
89+
compute_clr_set(vcpu, reg, c, s); \
90+
s |= set; \
91+
c |= clr; \
92+
if (c || s) { \
93+
u64 val = __ ## reg ## _nMASK; \
94+
val |= s; \
95+
val &= ~c; \
96+
write_sysreg_s(val, SYS_ ## reg); \
97+
} \
98+
} while(0)
99+
100+
#define update_fgt_traps(vcpu, reg) \
101+
update_fgt_traps_cs(vcpu, reg, 0, 0)
102+
103+
/*
104+
* Validate the fine grain trap masks.
105+
* Check that the masks do not overlap and that all bits are accounted for.
106+
*/
107+
#define CHECK_FGT_MASKS(reg) \
108+
do { \
109+
BUILD_BUG_ON((__ ## reg ## _MASK) & (__ ## reg ## _nMASK)); \
110+
BUILD_BUG_ON(~((__ ## reg ## _RES0) ^ (__ ## reg ## _MASK) ^ \
111+
(__ ## reg ## _nMASK))); \
112+
} while(0)
113+
114+
static inline bool cpu_has_amu(void)
115+
{
116+
u64 pfr0 = read_sysreg_s(SYS_ID_AA64PFR0_EL1);
117+
118+
return cpuid_feature_extract_unsigned_field(pfr0,
119+
ID_AA64PFR0_EL1_AMU_SHIFT);
120+
}
82121

83122
static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
84123
{
85124
struct kvm_cpu_context *hctxt = &this_cpu_ptr(&kvm_host_data)->host_ctxt;
86125
u64 r_clr = 0, w_clr = 0, r_set = 0, w_set = 0, tmp;
87126
u64 r_val, w_val;
88127

128+
CHECK_FGT_MASKS(HFGRTR_EL2);
129+
CHECK_FGT_MASKS(HFGWTR_EL2);
130+
CHECK_FGT_MASKS(HFGITR_EL2);
131+
CHECK_FGT_MASKS(HDFGRTR_EL2);
132+
CHECK_FGT_MASKS(HDFGWTR_EL2);
133+
CHECK_FGT_MASKS(HAFGRTR_EL2);
134+
CHECK_FGT_MASKS(HCRX_EL2);
135+
89136
if (!cpus_have_final_cap(ARM64_HAS_FGT))
90137
return;
91138

@@ -110,12 +157,15 @@ static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
110157
compute_clr_set(vcpu, HFGWTR_EL2, w_clr, w_set);
111158
}
112159

113-
/* The default is not to trap anything but ACCDATA_EL1 */
114-
r_val = __HFGRTR_EL2_nMASK & ~HFGxTR_EL2_nACCDATA_EL1;
160+
/* The default to trap everything not handled or supported in KVM. */
161+
tmp = HFGxTR_EL2_nAMAIR2_EL1 | HFGxTR_EL2_nMAIR2_EL1 | HFGxTR_EL2_nS2POR_EL1 |
162+
HFGxTR_EL2_nPOR_EL1 | HFGxTR_EL2_nPOR_EL0 | HFGxTR_EL2_nACCDATA_EL1;
163+
164+
r_val = __HFGRTR_EL2_nMASK & ~tmp;
115165
r_val |= r_set;
116166
r_val &= ~r_clr;
117167

118-
w_val = __HFGWTR_EL2_nMASK & ~HFGxTR_EL2_nACCDATA_EL1;
168+
w_val = __HFGWTR_EL2_nMASK & ~tmp;
119169
w_val |= w_set;
120170
w_val &= ~w_clr;
121171

@@ -125,34 +175,12 @@ static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
125175
if (!vcpu_has_nv(vcpu) || is_hyp_ctxt(vcpu))
126176
return;
127177

128-
ctxt_sys_reg(hctxt, HFGITR_EL2) = read_sysreg_s(SYS_HFGITR_EL2);
178+
update_fgt_traps(vcpu, HFGITR_EL2);
179+
update_fgt_traps(vcpu, HDFGRTR_EL2);
180+
update_fgt_traps(vcpu, HDFGWTR_EL2);
129181

130-
r_set = r_clr = 0;
131-
compute_clr_set(vcpu, HFGITR_EL2, r_clr, r_set);
132-
r_val = __HFGITR_EL2_nMASK;
133-
r_val |= r_set;
134-
r_val &= ~r_clr;
135-
136-
write_sysreg_s(r_val, SYS_HFGITR_EL2);
137-
138-
ctxt_sys_reg(hctxt, HDFGRTR_EL2) = read_sysreg_s(SYS_HDFGRTR_EL2);
139-
ctxt_sys_reg(hctxt, HDFGWTR_EL2) = read_sysreg_s(SYS_HDFGWTR_EL2);
140-
141-
r_clr = r_set = w_clr = w_set = 0;
142-
143-
compute_clr_set(vcpu, HDFGRTR_EL2, r_clr, r_set);
144-
compute_clr_set(vcpu, HDFGWTR_EL2, w_clr, w_set);
145-
146-
r_val = __HDFGRTR_EL2_nMASK;
147-
r_val |= r_set;
148-
r_val &= ~r_clr;
149-
150-
w_val = __HDFGWTR_EL2_nMASK;
151-
w_val |= w_set;
152-
w_val &= ~w_clr;
153-
154-
write_sysreg_s(r_val, SYS_HDFGRTR_EL2);
155-
write_sysreg_s(w_val, SYS_HDFGWTR_EL2);
182+
if (cpu_has_amu())
183+
update_fgt_traps(vcpu, HAFGRTR_EL2);
156184
}
157185

158186
static inline void __deactivate_traps_hfgxtr(struct kvm_vcpu *vcpu)
@@ -171,6 +199,9 @@ static inline void __deactivate_traps_hfgxtr(struct kvm_vcpu *vcpu)
171199
write_sysreg_s(ctxt_sys_reg(hctxt, HFGITR_EL2), SYS_HFGITR_EL2);
172200
write_sysreg_s(ctxt_sys_reg(hctxt, HDFGRTR_EL2), SYS_HDFGRTR_EL2);
173201
write_sysreg_s(ctxt_sys_reg(hctxt, HDFGWTR_EL2), SYS_HDFGWTR_EL2);
202+
203+
if (cpu_has_amu())
204+
write_sysreg_s(ctxt_sys_reg(hctxt, HAFGRTR_EL2), SYS_HAFGRTR_EL2);
174205
}
175206

176207
static inline void __activate_traps_common(struct kvm_vcpu *vcpu)

0 commit comments

Comments
 (0)