@@ -79,6 +79,27 @@ 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+
82103/*
83104 * Validate the fine grain trap masks.
84105 * Check that the masks do not overlap and that all bits are accounted for.
@@ -154,48 +175,12 @@ static inline void __activate_traps_hfgxtr(struct kvm_vcpu *vcpu)
154175 if (!vcpu_has_nv (vcpu ) || is_hyp_ctxt (vcpu ))
155176 return ;
156177
157- ctxt_sys_reg (hctxt , HFGITR_EL2 ) = read_sysreg_s (SYS_HFGITR_EL2 );
158-
159- r_set = r_clr = 0 ;
160- compute_clr_set (vcpu , HFGITR_EL2 , r_clr , r_set );
161- r_val = __HFGITR_EL2_nMASK ;
162- r_val |= r_set ;
163- r_val &= ~r_clr ;
164-
165- write_sysreg_s (r_val , SYS_HFGITR_EL2 );
166-
167- ctxt_sys_reg (hctxt , HDFGRTR_EL2 ) = read_sysreg_s (SYS_HDFGRTR_EL2 );
168- ctxt_sys_reg (hctxt , HDFGWTR_EL2 ) = read_sysreg_s (SYS_HDFGWTR_EL2 );
169-
170- r_clr = r_set = w_clr = w_set = 0 ;
171-
172- compute_clr_set (vcpu , HDFGRTR_EL2 , r_clr , r_set );
173- compute_clr_set (vcpu , HDFGWTR_EL2 , w_clr , w_set );
174-
175- r_val = __HDFGRTR_EL2_nMASK ;
176- r_val |= r_set ;
177- r_val &= ~r_clr ;
178-
179- w_val = __HDFGWTR_EL2_nMASK ;
180- w_val |= w_set ;
181- w_val &= ~w_clr ;
182-
183- write_sysreg_s (r_val , SYS_HDFGRTR_EL2 );
184- write_sysreg_s (w_val , SYS_HDFGWTR_EL2 );
185-
186- if (!cpu_has_amu ())
187- return ;
188-
189- ctxt_sys_reg (hctxt , HAFGRTR_EL2 ) = read_sysreg_s (SYS_HAFGRTR_EL2 );
190-
191- r_clr = r_set = 0 ;
192- compute_clr_set (vcpu , HAFGRTR_EL2 , r_clr , r_set );
193-
194- r_val = __HAFGRTR_EL2_nMASK ;
195- r_val |= r_set ;
196- r_val &= ~r_clr ;
178+ update_fgt_traps (vcpu , HFGITR_EL2 );
179+ update_fgt_traps (vcpu , HDFGRTR_EL2 );
180+ update_fgt_traps (vcpu , HDFGWTR_EL2 );
197181
198- write_sysreg_s (r_val , SYS_HAFGRTR_EL2 );
182+ if (cpu_has_amu ())
183+ update_fgt_traps (vcpu , HAFGRTR_EL2 );
199184}
200185
201186static inline void __deactivate_traps_hfgxtr (struct kvm_vcpu * vcpu )
@@ -215,7 +200,7 @@ static inline void __deactivate_traps_hfgxtr(struct kvm_vcpu *vcpu)
215200 write_sysreg_s (ctxt_sys_reg (hctxt , HDFGRTR_EL2 ), SYS_HDFGRTR_EL2 );
216201 write_sysreg_s (ctxt_sys_reg (hctxt , HDFGWTR_EL2 ), SYS_HDFGWTR_EL2 );
217202
218- if (vcpu_has_amu ())
203+ if (cpu_has_amu ())
219204 write_sysreg_s (ctxt_sys_reg (hctxt , HAFGRTR_EL2 ), SYS_HAFGRTR_EL2 );
220205}
221206
0 commit comments