File tree Expand file tree Collapse file tree 3 files changed +21
-6
lines changed
Expand file tree Collapse file tree 3 files changed +21
-6
lines changed Original file line number Diff line number Diff line change 315315 GENMASK(19, 18) | \
316316 GENMASK(15, 0))
317317
318- /* Polarity masks for HCRX_EL2 */
319- #define __HCRX_EL2_RES0 HCRX_EL2_RES0
320- #define __HCRX_EL2_MASK (BIT(6))
321- #define __HCRX_EL2_nMASK ~(__HCRX_EL2_RES0 | __HCRX_EL2_MASK)
318+ /*
319+ * Polarity masks for HCRX_EL2, limited to the bits that we know about
320+ * at this point in time. It doesn't mean that we actually *handle*
321+ * them, but that at least those that are not advertised to a guest
322+ * will be RES0 for that guest.
323+ */
324+ #define __HCRX_EL2_MASK (BIT_ULL(6))
325+ #define __HCRX_EL2_nMASK (GENMASK_ULL(24, 14) | \
326+ GENMASK_ULL(11, 7) | \
327+ GENMASK_ULL(5, 0))
328+ #define __HCRX_EL2_RES0 ~(__HCRX_EL2_nMASK | __HCRX_EL2_MASK)
329+ #define __HCRX_EL2_RES1 ~(__HCRX_EL2_nMASK | \
330+ __HCRX_EL2_MASK | \
331+ __HCRX_EL2_RES0)
322332
323333/* Hyp Prefetch Fault Address Register (HPFAR/HDFAR) */
324334#define HPFAR_MASK (~UL(0xf))
Original file line number Diff line number Diff line change @@ -2157,6 +2157,7 @@ int __init populate_nv_trap_config(void)
21572157 BUILD_BUG_ON (__NR_CGT_GROUP_IDS__ > BIT (TC_CGT_BITS ));
21582158 BUILD_BUG_ON (__NR_FGT_GROUP_IDS__ > BIT (TC_FGT_BITS ));
21592159 BUILD_BUG_ON (__NR_FG_FILTER_IDS__ > BIT (TC_FGF_BITS ));
2160+ BUILD_BUG_ON (__HCRX_EL2_MASK & __HCRX_EL2_nMASK );
21602161
21612162 for (int i = 0 ; i < ARRAY_SIZE (encoding_to_cgt ); i ++ ) {
21622163 const struct encoding_to_trap_config * cgt = & encoding_to_cgt [i ];
@@ -2182,6 +2183,10 @@ int __init populate_nv_trap_config(void)
21822183 }
21832184 }
21842185
2186+ if (__HCRX_EL2_RES0 != HCRX_EL2_RES0 )
2187+ kvm_info ("Sanitised HCR_EL2_RES0 = %016llx, expecting %016llx\n" ,
2188+ __HCRX_EL2_RES0 , HCRX_EL2_RES0 );
2189+
21852190 kvm_info ("nv: %ld coarse grained trap handlers\n" ,
21862191 ARRAY_SIZE (encoding_to_cgt ));
21872192
Original file line number Diff line number Diff line change @@ -1058,8 +1058,8 @@ int kvm_init_nv_sysregs(struct kvm_vcpu *vcpu)
10581058 set_sysreg_masks (kvm , HCR_EL2 , res0 , res1 );
10591059
10601060 /* HCRX_EL2 */
1061- res0 = HCRX_EL2_RES0 ;
1062- res1 = HCRX_EL2_RES1 ;
1061+ res0 = __HCRX_EL2_RES0 ;
1062+ res1 = __HCRX_EL2_RES1 ;
10631063 if (!kvm_has_feat (kvm , ID_AA64ISAR3_EL1 , PACM , TRIVIAL_IMP ))
10641064 res0 |= HCRX_EL2_PACMEn ;
10651065 if (!kvm_has_feat (kvm , ID_AA64PFR2_EL1 , FPMR , IMP ))
You can’t perform that action at this time.
0 commit comments