Skip to content

Commit aed34b6

Browse files
author
Marc Zyngier
committed
KVM: arm64: Use computed FGT masks to setup FGT registers
Flip the hyervisor FGT configuration over to the computed FGT masks. Reviewed-by: Joey Gouly <[email protected]> Signed-off-by: Marc Zyngier <[email protected]>
1 parent 311ba55 commit aed34b6

File tree

1 file changed

+38
-7
lines changed

1 file changed

+38
-7
lines changed

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

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,41 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
6565
}
6666
}
6767

68+
#define reg_to_fgt_masks(reg) \
69+
({ \
70+
struct fgt_masks *m; \
71+
switch(reg) { \
72+
case HFGRTR_EL2: \
73+
m = &hfgrtr_masks; \
74+
break; \
75+
case HFGWTR_EL2: \
76+
m = &hfgwtr_masks; \
77+
break; \
78+
case HFGITR_EL2: \
79+
m = &hfgitr_masks; \
80+
break; \
81+
case HDFGRTR_EL2: \
82+
m = &hdfgrtr_masks; \
83+
break; \
84+
case HDFGWTR_EL2: \
85+
m = &hdfgwtr_masks; \
86+
break; \
87+
case HAFGRTR_EL2: \
88+
m = &hafgrtr_masks; \
89+
break; \
90+
default: \
91+
BUILD_BUG_ON(1); \
92+
} \
93+
\
94+
m; \
95+
})
96+
6897
#define compute_clr_set(vcpu, reg, clr, set) \
6998
do { \
70-
u64 hfg; \
71-
hfg = __vcpu_sys_reg(vcpu, reg) & ~__ ## reg ## _RES0; \
72-
set |= hfg & __ ## reg ## _MASK; \
73-
clr |= ~hfg & __ ## reg ## _nMASK; \
99+
u64 hfg = __vcpu_sys_reg(vcpu, reg); \
100+
struct fgt_masks *m = reg_to_fgt_masks(reg); \
101+
set |= hfg & m->mask; \
102+
clr |= ~hfg & m->nmask; \
74103
} while(0)
75104

76105
#define reg_to_fgt_group_id(reg) \
@@ -101,12 +130,14 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
101130
#define compute_undef_clr_set(vcpu, kvm, reg, clr, set) \
102131
do { \
103132
u64 hfg = kvm->arch.fgu[reg_to_fgt_group_id(reg)]; \
104-
set |= hfg & __ ## reg ## _MASK; \
105-
clr |= hfg & __ ## reg ## _nMASK; \
133+
struct fgt_masks *m = reg_to_fgt_masks(reg); \
134+
set |= hfg & m->mask; \
135+
clr |= hfg & m->nmask; \
106136
} while(0)
107137

108138
#define update_fgt_traps_cs(hctxt, vcpu, kvm, reg, clr, set) \
109139
do { \
140+
struct fgt_masks *m = reg_to_fgt_masks(reg); \
110141
u64 c = clr, s = set; \
111142
u64 val; \
112143
\
@@ -116,7 +147,7 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
116147
\
117148
compute_undef_clr_set(vcpu, kvm, reg, c, s); \
118149
\
119-
val = __ ## reg ## _nMASK; \
150+
val = m->nmask; \
120151
val |= s; \
121152
val &= ~c; \
122153
write_sysreg_s(val, SYS_ ## reg); \

0 commit comments

Comments
 (0)