@@ -1890,6 +1890,32 @@ static unsigned int el2_visibility(const struct kvm_vcpu *vcpu,
18901890 return REG_HIDDEN ;
18911891}
18921892
1893+ static bool bad_vncr_trap (struct kvm_vcpu * vcpu ,
1894+ struct sys_reg_params * p ,
1895+ const struct sys_reg_desc * r )
1896+ {
1897+ /*
1898+ * We really shouldn't be here, and this is likely the result
1899+ * of a misconfigured trap, as this register should target the
1900+ * VNCR page, and nothing else.
1901+ */
1902+ return bad_trap (vcpu , p , r ,
1903+ "trap of VNCR-backed register" );
1904+ }
1905+
1906+ static bool bad_redir_trap (struct kvm_vcpu * vcpu ,
1907+ struct sys_reg_params * p ,
1908+ const struct sys_reg_desc * r )
1909+ {
1910+ /*
1911+ * We really shouldn't be here, and this is likely the result
1912+ * of a misconfigured trap, as this register should target the
1913+ * corresponding EL1, and nothing else.
1914+ */
1915+ return bad_trap (vcpu , p , r ,
1916+ "trap of EL2 register redirected to EL1" );
1917+ }
1918+
18931919#define EL2_REG (name , acc , rst , v ) { \
18941920 SYS_DESC(SYS_##name), \
18951921 .access = acc, \
@@ -1899,6 +1925,9 @@ static unsigned int el2_visibility(const struct kvm_vcpu *vcpu,
18991925 .val = v, \
19001926}
19011927
1928+ #define EL2_REG_VNCR (name , rst , v ) EL2_REG(name, bad_vncr_trap, rst, v)
1929+ #define EL2_REG_REDIR (name , rst , v ) EL2_REG(name, bad_redir_trap, rst, v)
1930+
19021931/*
19031932 * EL{0,1}2 registers are the EL2 view on an EL0 or EL1 register when
19041933 * HCR_EL2.E2H==1, and only in the sysreg table for convenience of
@@ -2513,32 +2542,32 @@ static const struct sys_reg_desc sys_reg_descs[] = {
25132542 { PMU_SYS_REG (PMCCFILTR_EL0 ), .access = access_pmu_evtyper ,
25142543 .reset = reset_val , .reg = PMCCFILTR_EL0 , .val = 0 },
25152544
2516- EL2_REG (VPIDR_EL2 , access_rw , reset_unknown , 0 ),
2517- EL2_REG (VMPIDR_EL2 , access_rw , reset_unknown , 0 ),
2545+ EL2_REG_VNCR (VPIDR_EL2 , reset_unknown , 0 ),
2546+ EL2_REG_VNCR (VMPIDR_EL2 , reset_unknown , 0 ),
25182547 EL2_REG (SCTLR_EL2 , access_rw , reset_val , SCTLR_EL2_RES1 ),
25192548 EL2_REG (ACTLR_EL2 , access_rw , reset_val , 0 ),
2520- EL2_REG (HCR_EL2 , access_rw , reset_val , 0 ),
2549+ EL2_REG_VNCR (HCR_EL2 , reset_val , 0 ),
25212550 EL2_REG (MDCR_EL2 , access_rw , reset_val , 0 ),
25222551 EL2_REG (CPTR_EL2 , access_rw , reset_val , CPTR_NVHE_EL2_RES1 ),
2523- EL2_REG (HSTR_EL2 , access_rw , reset_val , 0 ),
2524- EL2_REG (HFGRTR_EL2 , access_rw , reset_val , 0 ),
2525- EL2_REG (HFGWTR_EL2 , access_rw , reset_val , 0 ),
2526- EL2_REG (HFGITR_EL2 , access_rw , reset_val , 0 ),
2527- EL2_REG (HACR_EL2 , access_rw , reset_val , 0 ),
2552+ EL2_REG_VNCR (HSTR_EL2 , reset_val , 0 ),
2553+ EL2_REG_VNCR (HFGRTR_EL2 , reset_val , 0 ),
2554+ EL2_REG_VNCR (HFGWTR_EL2 , reset_val , 0 ),
2555+ EL2_REG_VNCR (HFGITR_EL2 , reset_val , 0 ),
2556+ EL2_REG_VNCR (HACR_EL2 , reset_val , 0 ),
25282557
2529- EL2_REG (HCRX_EL2 , access_rw , reset_val , 0 ),
2558+ EL2_REG_VNCR (HCRX_EL2 , reset_val , 0 ),
25302559
25312560 EL2_REG (TTBR0_EL2 , access_rw , reset_val , 0 ),
25322561 EL2_REG (TTBR1_EL2 , access_rw , reset_val , 0 ),
25332562 EL2_REG (TCR_EL2 , access_rw , reset_val , TCR_EL2_RES1 ),
2534- EL2_REG (VTTBR_EL2 , access_rw , reset_val , 0 ),
2535- EL2_REG (VTCR_EL2 , access_rw , reset_val , 0 ),
2563+ EL2_REG_VNCR (VTTBR_EL2 , reset_val , 0 ),
2564+ EL2_REG_VNCR (VTCR_EL2 , reset_val , 0 ),
25362565
25372566 { SYS_DESC (SYS_DACR32_EL2 ), trap_undef , reset_unknown , DACR32_EL2 },
2538- EL2_REG (HDFGRTR_EL2 , access_rw , reset_val , 0 ),
2539- EL2_REG (HDFGWTR_EL2 , access_rw , reset_val , 0 ),
2540- EL2_REG (SPSR_EL2 , access_rw , reset_val , 0 ),
2541- EL2_REG (ELR_EL2 , access_rw , reset_val , 0 ),
2567+ EL2_REG_VNCR (HDFGRTR_EL2 , reset_val , 0 ),
2568+ EL2_REG_VNCR (HDFGWTR_EL2 , reset_val , 0 ),
2569+ EL2_REG_REDIR (SPSR_EL2 , reset_val , 0 ),
2570+ EL2_REG_REDIR (ELR_EL2 , reset_val , 0 ),
25422571 { SYS_DESC (SYS_SP_EL1 ), access_sp_el1 },
25432572
25442573 /* AArch32 SPSR_* are RES0 if trapped from a NV guest */
@@ -2554,10 +2583,10 @@ static const struct sys_reg_desc sys_reg_descs[] = {
25542583 { SYS_DESC (SYS_IFSR32_EL2 ), trap_undef , reset_unknown , IFSR32_EL2 },
25552584 EL2_REG (AFSR0_EL2 , access_rw , reset_val , 0 ),
25562585 EL2_REG (AFSR1_EL2 , access_rw , reset_val , 0 ),
2557- EL2_REG (ESR_EL2 , access_rw , reset_val , 0 ),
2586+ EL2_REG_REDIR (ESR_EL2 , reset_val , 0 ),
25582587 { SYS_DESC (SYS_FPEXC32_EL2 ), trap_undef , reset_val , FPEXC32_EL2 , 0x700 },
25592588
2560- EL2_REG (FAR_EL2 , access_rw , reset_val , 0 ),
2589+ EL2_REG_REDIR (FAR_EL2 , reset_val , 0 ),
25612590 EL2_REG (HPFAR_EL2 , access_rw , reset_val , 0 ),
25622591
25632592 EL2_REG (MAIR_EL2 , access_rw , reset_val , 0 ),
@@ -2570,7 +2599,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
25702599 EL2_REG (CONTEXTIDR_EL2 , access_rw , reset_val , 0 ),
25712600 EL2_REG (TPIDR_EL2 , access_rw , reset_val , 0 ),
25722601
2573- EL2_REG (CNTVOFF_EL2 , access_rw , reset_val , 0 ),
2602+ EL2_REG_VNCR (CNTVOFF_EL2 , reset_val , 0 ),
25742603 EL2_REG (CNTHCTL_EL2 , access_rw , reset_val , 0 ),
25752604
25762605 EL12_REG (CNTKCTL , access_rw , reset_val , 0 ),
0 commit comments