Skip to content

Commit 0ccd901

Browse files
Fuad TabbaMarc Zyngier
authored andcommitted
KVM: arm64: Macros for setting/clearing FGT bits
There's a lot of boilerplate code for setting and clearing FGT bits when activating guest traps. Refactor it into macros. These macros will also be used in future patch series. No functional change intended. Signed-off-by: Fuad Tabba <tabba@google.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20231214100158.2305400-15-tabba@google.com
1 parent 5f6bd3f commit 0ccd901

1 file changed

Lines changed: 27 additions & 42 deletions

File tree

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

Lines changed: 27 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

201186
static 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

Comments
 (0)