@@ -65,12 +65,41 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
65
65
}
66
66
}
67
67
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
+
68
97
#define compute_clr_set (vcpu , reg , clr , set ) \
69
98
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; \
74
103
} while(0)
75
104
76
105
#define reg_to_fgt_group_id (reg ) \
@@ -101,12 +130,14 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
101
130
#define compute_undef_clr_set (vcpu , kvm , reg , clr , set ) \
102
131
do { \
103
132
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; \
106
136
} while(0)
107
137
108
138
#define update_fgt_traps_cs (hctxt , vcpu , kvm , reg , clr , set ) \
109
139
do { \
140
+ struct fgt_masks *m = reg_to_fgt_masks(reg); \
110
141
u64 c = clr, s = set; \
111
142
u64 val; \
112
143
\
@@ -116,7 +147,7 @@ static inline void __activate_traps_fpsimd32(struct kvm_vcpu *vcpu)
116
147
\
117
148
compute_undef_clr_set(vcpu, kvm, reg, c, s); \
118
149
\
119
- val = __ ## reg ## _nMASK; \
150
+ val = m->nmask; \
120
151
val |= s; \
121
152
val &= ~c; \
122
153
write_sysreg_s(val, SYS_ ## reg); \
0 commit comments