@samitouri / QOSamiQemu / commits / 342a587ca2

target/arm: migrate system/cp trap syndromes to registerfields

Migrate syn_aa64_sysregtrap and co-processor register trap syndromes to the registerfields API. The co-processor syndromes are split between single and duel register moves. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-id: 20260422125250.1303100-3-alex.bennee@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Alex Bennée committed Apr 22, 2026 at 13:52 UTC 342a587ca2f426beb27cb2fb3ebf476aea5fcdb5
1 file changed +102 -22
target/arm/syndrome.h
+102 -22
@@ -78,7 +78,7 @@ enum arm_exception_class {
78
79 /* Generic syndrome encoding layout for HSR and lower 32 bits of ESR_EL2 */
80 FIELD(SYNDROME, EC, 26, 6)
81 -FIELD(SYNDROME, IL, 25, 1)
81 +FIELD(SYNDROME, IL, 25, 1) /* IL=1 for 32 bit instructions */
82 FIELD(SYNDROME, ISS, 0, 25)
83
84 typedef enum {
@@ -172,7 +172,7 @@ static inline uint32_t syn_aa64_smc(uint32_t imm16)
172 static inline uint32_t syn_aa32_svc(uint32_t imm16, bool is_16bit)
173 {
174 uint32_t res = syn_set_ec(0, EC_AA32_SVC);
175 - res = FIELD_DP32(res, SYNDROME, IL, is_16bit ? 0 : 1);
175 + res = FIELD_DP32(res, SYNDROME, IL, !is_16bit);
176 res = FIELD_DP32(res, ISS_IMM16, IMM16, imm16);
177 return res;
178 }
@@ -203,58 +203,138 @@ static inline uint32_t syn_aa64_bkpt(uint32_t imm16)
203 static inline uint32_t syn_aa32_bkpt(uint32_t imm16, bool is_16bit)
204 {
205 uint32_t res = syn_set_ec(0, EC_AA32_BKPT);
206 - res = FIELD_DP32(res, SYNDROME, IL, is_16bit ? 0 : 1);
206 + res = FIELD_DP32(res, SYNDROME, IL, !is_16bit);
207 res = FIELD_DP32(res, ISS_IMM16, IMM16, imm16);
208 return res;
209 }
210
211 +/*
212 + * ISS encoding for an exception from MSR, MRS, or System instruction
213 + * in AArch64 state.
214 + */
215 +FIELD(SYSREG_ISS, ISREAD, 0, 1) /* Direction, 1 is read */
216 +FIELD(SYSREG_ISS, CRM, 1, 4)
217 +FIELD(SYSREG_ISS, RT, 5, 5)
218 +FIELD(SYSREG_ISS, CRN, 10, 4)
219 +FIELD(SYSREG_ISS, OP1, 14, 3)
220 +FIELD(SYSREG_ISS, OP2, 17, 3)
221 +FIELD(SYSREG_ISS, OP0, 20, 2)
222 +
223 static inline uint32_t syn_aa64_sysregtrap(int op0, int op1, int op2,
224 int crn, int crm, int rt,
225 int isread)
226 {
215 - return (EC_SYSTEMREGISTERTRAP << ARM_EL_EC_SHIFT) | ARM_EL_IL
216 - | (op0 << 20) | (op2 << 17) | (op1 << 14) | (crn << 10) | (rt << 5)
217 - | (crm << 1) | isread;
227 + uint32_t res = syn_set_ec(0, EC_SYSTEMREGISTERTRAP);
228 + res = FIELD_DP32(res, SYNDROME, IL, 1);
229 +
230 + res = FIELD_DP32(res, SYSREG_ISS, OP0, op0);
231 + res = FIELD_DP32(res, SYSREG_ISS, OP2, op2);
232 + res = FIELD_DP32(res, SYSREG_ISS, OP1, op1);
233 + res = FIELD_DP32(res, SYSREG_ISS, CRN, crn);
234 + res = FIELD_DP32(res, SYSREG_ISS, RT, rt);
235 + res = FIELD_DP32(res, SYSREG_ISS, CRM, crm);
236 + res = FIELD_DP32(res, SYSREG_ISS, ISREAD, isread);
237 +
238 + return res;
239 }
240
241 +/*
242 + * ISS encoding for an exception from an MCR or MRC access
243 + * (move to/from co-processor)
244 + */
245 +FIELD(COPROC_ISS, ISREAD, 0, 1)
246 +FIELD(COPROC_ISS, CRM, 1, 4)
247 +FIELD(COPROC_ISS, RT, 5, 5)
248 +FIELD(COPROC_ISS, CRN, 10, 4)
249 +FIELD(COPROC_ISS, OP1, 14, 3)
250 +FIELD(COPROC_ISS, OP2, 17, 3)
251 +FIELD(COPROC_ISS, COND, 20, 4)
252 +FIELD(COPROC_ISS, CV, 24, 1)
253 +
254 static inline uint32_t syn_cp14_rt_trap(int cv, int cond, int opc1, int opc2,
255 int crn, int crm, int rt, int isread,
256 bool is_16bit)
257 {
224 - return (EC_CP14RTTRAP << ARM_EL_EC_SHIFT)
225 - | (is_16bit ? 0 : ARM_EL_IL)
226 - | (cv << 24) | (cond << 20) | (opc2 << 17) | (opc1 << 14)
227 - | (crn << 10) | (rt << 5) | (crm << 1) | isread;
258 + uint32_t res = syn_set_ec(0, EC_CP14RTTRAP);
259 + res = FIELD_DP32(res, SYNDROME, IL, !is_16bit);
260 +
261 + res = FIELD_DP32(res, COPROC_ISS, CV, cv);
262 + res = FIELD_DP32(res, COPROC_ISS, COND, cond);
263 + res = FIELD_DP32(res, COPROC_ISS, OP2, opc2);
264 + res = FIELD_DP32(res, COPROC_ISS, OP1, opc1);
265 + res = FIELD_DP32(res, COPROC_ISS, CRN, crn);
266 + res = FIELD_DP32(res, COPROC_ISS, RT, rt);
267 + res = FIELD_DP32(res, COPROC_ISS, CRM, crm);
268 + res = FIELD_DP32(res, COPROC_ISS, ISREAD, isread);
269 +
270 + return res;
271 }
272
273 static inline uint32_t syn_cp15_rt_trap(int cv, int cond, int opc1, int opc2,
274 int crn, int crm, int rt, int isread,
275 bool is_16bit)
276 {
234 - return (EC_CP15RTTRAP << ARM_EL_EC_SHIFT)
235 - | (is_16bit ? 0 : ARM_EL_IL)
236 - | (cv << 24) | (cond << 20) | (opc2 << 17) | (opc1 << 14)
237 - | (crn << 10) | (rt << 5) | (crm << 1) | isread;
277 + uint32_t res = syn_set_ec(0, EC_CP15RTTRAP);
278 + res = FIELD_DP32(res, SYNDROME, IL, !is_16bit);
279 +
280 + res = FIELD_DP32(res, COPROC_ISS, CV, cv);
281 + res = FIELD_DP32(res, COPROC_ISS, COND, cond);
282 + res = FIELD_DP32(res, COPROC_ISS, OP2, opc2);
283 + res = FIELD_DP32(res, COPROC_ISS, OP1, opc1);
284 + res = FIELD_DP32(res, COPROC_ISS, CRN, crn);
285 + res = FIELD_DP32(res, COPROC_ISS, RT, rt);
286 + res = FIELD_DP32(res, COPROC_ISS, CRM, crm);
287 + res = FIELD_DP32(res, COPROC_ISS, ISREAD, isread);
288 +
289 + return res;
290 }
291
292 +/*
293 + * ISS encoding for an exception from an MCRR or MRRC access
294 + * (move to/from co-processor with 2 regs)
295 + */
296 +FIELD(COPROC_R2_ISS, ISREAD, 0, 1)
297 +FIELD(COPROC_R2_ISS, CRM, 1, 4)
298 +FIELD(COPROC_R2_ISS, RT, 5, 5)
299 +FIELD(COPROC_R2_ISS, RT2, 10, 5)
300 +FIELD(COPROC_R2_ISS, OP1, 16, 4)
301 +FIELD(COPROC_R2_ISS, COND, 20, 4)
302 +FIELD(COPROC_R2_ISS, CV, 24, 1)
303 +
304 static inline uint32_t syn_cp14_rrt_trap(int cv, int cond, int opc1, int crm,
305 int rt, int rt2, int isread,
306 bool is_16bit)
307 {
244 - return (EC_CP14RRTTRAP << ARM_EL_EC_SHIFT)
245 - | (is_16bit ? 0 : ARM_EL_IL)
246 - | (cv << 24) | (cond << 20) | (opc1 << 16)
247 - | (rt2 << 10) | (rt << 5) | (crm << 1) | isread;
308 + uint32_t res = syn_set_ec(0, EC_CP14RRTTRAP);
309 + res = FIELD_DP32(res, SYNDROME, IL, !is_16bit);
310 +
311 + res = FIELD_DP32(res, COPROC_R2_ISS, CV, cv);
312 + res = FIELD_DP32(res, COPROC_R2_ISS, COND, cond);
313 + res = FIELD_DP32(res, COPROC_R2_ISS, OP1, opc1);
314 + res = FIELD_DP32(res, COPROC_R2_ISS, RT2, rt2);
315 + res = FIELD_DP32(res, COPROC_R2_ISS, RT, rt);
316 + res = FIELD_DP32(res, COPROC_R2_ISS, CRM, crm);
317 + res = FIELD_DP32(res, COPROC_R2_ISS, ISREAD, isread);
318 +
319 + return res;
320 }
321
322 static inline uint32_t syn_cp15_rrt_trap(int cv, int cond, int opc1, int crm,
323 int rt, int rt2, int isread,
324 bool is_16bit)
325 {
254 - return (EC_CP15RRTTRAP << ARM_EL_EC_SHIFT)
255 - | (is_16bit ? 0 : ARM_EL_IL)
256 - | (cv << 24) | (cond << 20) | (opc1 << 16)
257 - | (rt2 << 10) | (rt << 5) | (crm << 1) | isread;
326 + uint32_t res = syn_set_ec(0, EC_CP15RRTTRAP);
327 + res = FIELD_DP32(res, SYNDROME, IL, !is_16bit);
328 +
329 + res = FIELD_DP32(res, COPROC_R2_ISS, CV, cv);
330 + res = FIELD_DP32(res, COPROC_R2_ISS, COND, cond);
331 + res = FIELD_DP32(res, COPROC_R2_ISS, OP1, opc1);
332 + res = FIELD_DP32(res, COPROC_R2_ISS, RT2, rt2);
333 + res = FIELD_DP32(res, COPROC_R2_ISS, RT, rt);
334 + res = FIELD_DP32(res, COPROC_R2_ISS, CRM, crm);
335 + res = FIELD_DP32(res, COPROC_R2_ISS, ISREAD, isread);
336 +
337 + return res;
338 }
339
340 static inline uint32_t syn_fp_access_trap(int cv, int cond, bool is_16bit,