Skip to content

Commit af2d78d

Browse files
author
Marc Zyngier
committed
KVM: arm64: Add FGT descriptors for FEAT_FGT2
Bulk addition of all the FGT2 traps reported with EC == 0x18, as described in the 2025-03 JSON drop. Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent f654e9e commit af2d78d

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

arch/arm64/kvm/emulate-nested.c

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,24 @@ static const struct encoding_to_trap_config encoding_to_fgt[] __initconst = {
13881388
SR_FGT(SYS_AIDR_EL1, HFGRTR, AIDR_EL1, 1),
13891389
SR_FGT(SYS_AFSR1_EL1, HFGRTR, AFSR1_EL1, 1),
13901390
SR_FGT(SYS_AFSR0_EL1, HFGRTR, AFSR0_EL1, 1),
1391+
1392+
/* HFGRTR2_EL2, HFGWTR2_EL2 */
1393+
SR_FGT(SYS_ACTLRALIAS_EL1, HFGRTR2, nACTLRALIAS_EL1, 0),
1394+
SR_FGT(SYS_ACTLRMASK_EL1, HFGRTR2, nACTLRMASK_EL1, 0),
1395+
SR_FGT(SYS_CPACRALIAS_EL1, HFGRTR2, nCPACRALIAS_EL1, 0),
1396+
SR_FGT(SYS_CPACRMASK_EL1, HFGRTR2, nCPACRMASK_EL1, 0),
1397+
SR_FGT(SYS_PFAR_EL1, HFGRTR2, nPFAR_EL1, 0),
1398+
SR_FGT(SYS_RCWSMASK_EL1, HFGRTR2, nRCWSMASK_EL1, 0),
1399+
SR_FGT(SYS_SCTLR2ALIAS_EL1, HFGRTR2, nSCTLRALIAS2_EL1, 0),
1400+
SR_FGT(SYS_SCTLR2MASK_EL1, HFGRTR2, nSCTLR2MASK_EL1, 0),
1401+
SR_FGT(SYS_SCTLRALIAS_EL1, HFGRTR2, nSCTLRALIAS_EL1, 0),
1402+
SR_FGT(SYS_SCTLRMASK_EL1, HFGRTR2, nSCTLRMASK_EL1, 0),
1403+
SR_FGT(SYS_TCR2ALIAS_EL1, HFGRTR2, nTCR2ALIAS_EL1, 0),
1404+
SR_FGT(SYS_TCR2MASK_EL1, HFGRTR2, nTCR2MASK_EL1, 0),
1405+
SR_FGT(SYS_TCRALIAS_EL1, HFGRTR2, nTCRALIAS_EL1, 0),
1406+
SR_FGT(SYS_TCRMASK_EL1, HFGRTR2, nTCRMASK_EL1, 0),
1407+
SR_FGT(SYS_ERXGSR_EL1, HFGRTR2, nERXGSR_EL1, 0),
1408+
13911409
/* HFGITR_EL2 */
13921410
SR_FGT(OP_AT_S1E1A, HFGITR, ATS1E1A, 1),
13931411
SR_FGT(OP_COSP_RCTX, HFGITR, COSPRCTX, 1),
@@ -1497,6 +1515,11 @@ static const struct encoding_to_trap_config encoding_to_fgt[] __initconst = {
14971515
SR_FGT(SYS_IC_IVAU, HFGITR, ICIVAU, 1),
14981516
SR_FGT(SYS_IC_IALLU, HFGITR, ICIALLU, 1),
14991517
SR_FGT(SYS_IC_IALLUIS, HFGITR, ICIALLUIS, 1),
1518+
1519+
/* HFGITR2_EL2 */
1520+
SR_FGT(SYS_DC_CIGDVAPS, HFGITR2, nDCCIVAPS, 0),
1521+
SR_FGT(SYS_DC_CIVAPS, HFGITR2, nDCCIVAPS, 0),
1522+
15001523
/* HDFGRTR_EL2 */
15011524
SR_FGT(SYS_PMBIDR_EL1, HDFGRTR, PMBIDR_EL1, 1),
15021525
SR_FGT(SYS_PMSNEVFR_EL1, HDFGRTR, nPMSNEVFR_EL1, 0),
@@ -1889,6 +1912,59 @@ static const struct encoding_to_trap_config encoding_to_fgt[] __initconst = {
18891912
SR_FGT(SYS_DBGBCRn_EL1(13), HDFGRTR, DBGBCRn_EL1, 1),
18901913
SR_FGT(SYS_DBGBCRn_EL1(14), HDFGRTR, DBGBCRn_EL1, 1),
18911914
SR_FGT(SYS_DBGBCRn_EL1(15), HDFGRTR, DBGBCRn_EL1, 1),
1915+
1916+
/* HDFGRTR2_EL2 */
1917+
SR_FGT(SYS_MDSELR_EL1, HDFGRTR2, nMDSELR_EL1, 0),
1918+
SR_FGT(SYS_MDSTEPOP_EL1, HDFGRTR2, nMDSTEPOP_EL1, 0),
1919+
SR_FGT(SYS_PMCCNTSVR_EL1, HDFGRTR2, nPMSSDATA, 0),
1920+
SR_FGT_RANGE(SYS_PMEVCNTSVRn_EL1(0),
1921+
SYS_PMEVCNTSVRn_EL1(30),
1922+
HDFGRTR2, nPMSSDATA, 0),
1923+
SR_FGT(SYS_PMICNTSVR_EL1, HDFGRTR2, nPMSSDATA, 0),
1924+
SR_FGT(SYS_PMECR_EL1, HDFGRTR2, nPMECR_EL1, 0),
1925+
SR_FGT(SYS_PMIAR_EL1, HDFGRTR2, nPMIAR_EL1, 0),
1926+
SR_FGT(SYS_PMICFILTR_EL0, HDFGRTR2, nPMICFILTR_EL0, 0),
1927+
SR_FGT(SYS_PMICNTR_EL0, HDFGRTR2, nPMICNTR_EL0, 0),
1928+
SR_FGT(SYS_PMSSCR_EL1, HDFGRTR2, nPMSSCR_EL1, 0),
1929+
SR_FGT(SYS_PMUACR_EL1, HDFGRTR2, nPMUACR_EL1, 0),
1930+
SR_FGT(SYS_SPMACCESSR_EL1, HDFGRTR2, nSPMACCESSR_EL1, 0),
1931+
SR_FGT(SYS_SPMCFGR_EL1, HDFGRTR2, nSPMID, 0),
1932+
SR_FGT(SYS_SPMDEVARCH_EL1, HDFGRTR2, nSPMID, 0),
1933+
SR_FGT(SYS_SPMCGCRn_EL1(0), HDFGRTR2, nSPMID, 0),
1934+
SR_FGT(SYS_SPMCGCRn_EL1(1), HDFGRTR2, nSPMID, 0),
1935+
SR_FGT(SYS_SPMIIDR_EL1, HDFGRTR2, nSPMID, 0),
1936+
SR_FGT(SYS_SPMCNTENCLR_EL0, HDFGRTR2, nSPMCNTEN, 0),
1937+
SR_FGT(SYS_SPMCNTENSET_EL0, HDFGRTR2, nSPMCNTEN, 0),
1938+
SR_FGT(SYS_SPMCR_EL0, HDFGRTR2, nSPMCR_EL0, 0),
1939+
SR_FGT(SYS_SPMDEVAFF_EL1, HDFGRTR2, nSPMDEVAFF_EL1, 0),
1940+
/*
1941+
* We have up to 64 of these registers in ranges of 16, banked via
1942+
* SPMSELR_EL0.BANK. We're only concerned with the accessors here,
1943+
* not the architectural registers.
1944+
*/
1945+
SR_FGT_RANGE(SYS_SPMEVCNTRn_EL0(0),
1946+
SYS_SPMEVCNTRn_EL0(15),
1947+
HDFGRTR2, nSPMEVCNTRn_EL0, 0),
1948+
SR_FGT_RANGE(SYS_SPMEVFILT2Rn_EL0(0),
1949+
SYS_SPMEVFILT2Rn_EL0(15),
1950+
HDFGRTR2, nSPMEVTYPERn_EL0, 0),
1951+
SR_FGT_RANGE(SYS_SPMEVFILTRn_EL0(0),
1952+
SYS_SPMEVFILTRn_EL0(15),
1953+
HDFGRTR2, nSPMEVTYPERn_EL0, 0),
1954+
SR_FGT_RANGE(SYS_SPMEVTYPERn_EL0(0),
1955+
SYS_SPMEVTYPERn_EL0(15),
1956+
HDFGRTR2, nSPMEVTYPERn_EL0, 0),
1957+
SR_FGT(SYS_SPMINTENCLR_EL1, HDFGRTR2, nSPMINTEN, 0),
1958+
SR_FGT(SYS_SPMINTENSET_EL1, HDFGRTR2, nSPMINTEN, 0),
1959+
SR_FGT(SYS_SPMOVSCLR_EL0, HDFGRTR2, nSPMOVS, 0),
1960+
SR_FGT(SYS_SPMOVSSET_EL0, HDFGRTR2, nSPMOVS, 0),
1961+
SR_FGT(SYS_SPMSCR_EL1, HDFGRTR2, nSPMSCR_EL1, 0),
1962+
SR_FGT(SYS_SPMSELR_EL0, HDFGRTR2, nSPMSELR_EL0, 0),
1963+
SR_FGT(SYS_TRCITECR_EL1, HDFGRTR2, nTRCITECR_EL1, 0),
1964+
SR_FGT(SYS_PMBMAR_EL1, HDFGRTR2, nPMBMAR_EL1, 0),
1965+
SR_FGT(SYS_PMSDSFR_EL1, HDFGRTR2, nPMSDSFR_EL1, 0),
1966+
SR_FGT(SYS_TRBMPAM_EL1, HDFGRTR2, nTRBMPAM_EL1, 0),
1967+
18921968
/*
18931969
* HDFGWTR_EL2
18941970
*
@@ -1899,12 +1975,19 @@ static const struct encoding_to_trap_config encoding_to_fgt[] __initconst = {
18991975
* read-side mappings, and only the write-side mappings that
19001976
* differ from the read side, and the trap handler will pick
19011977
* the correct shadow register based on the access type.
1978+
*
1979+
* Same model applies to the FEAT_FGT2 registers.
19021980
*/
19031981
SR_FGT(SYS_TRFCR_EL1, HDFGWTR, TRFCR_EL1, 1),
19041982
SR_FGT(SYS_TRCOSLAR, HDFGWTR, TRCOSLAR, 1),
19051983
SR_FGT(SYS_PMCR_EL0, HDFGWTR, PMCR_EL0, 1),
19061984
SR_FGT(SYS_PMSWINC_EL0, HDFGWTR, PMSWINC_EL0, 1),
19071985
SR_FGT(SYS_OSLAR_EL1, HDFGWTR, OSLAR_EL1, 1),
1986+
1987+
/* HDFGWTR2_EL2 */
1988+
SR_FGT(SYS_PMZR_EL0, HDFGWTR2, nPMZR_EL0, 0),
1989+
SR_FGT(SYS_SPMZR_EL0, HDFGWTR2, nSPMEVCNTRn_EL0, 0),
1990+
19081991
/*
19091992
* HAFGRTR_EL2
19101993
*/

0 commit comments

Comments
 (0)