This patch fixes the Illegal Exception return handler. According to the
armarm documentation, when PSTATE.IL is set to one because of an illegal
exception return, PSTATE.{EL, nRW, SP} are unchanged. This means the
Exception level, Execution state, and stack pointer selection do not
change as a result of the return.
Change-Id: I35f2fe68fb2822a54fc4a21930871eab7a1aaab4
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/8021
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
new_cpsr.ss = 0;
if (illegalExceptionReturn(tc, cpsr, spsr)) {
+ // If the SPSR specifies an illegal exception return,
+ // then PSTATE.{M, nRW, EL, SP} are unchanged and PSTATE.IL
+ // is set to 1.
new_cpsr.il = 1;
+ if (cpsr.width) {
+ new_cpsr.mode = cpsr.mode;
+ } else {
+ new_cpsr.width = cpsr.width;
+ new_cpsr.el = cpsr.el;
+ new_cpsr.sp = cpsr.sp;
+ }
} else {
new_cpsr.il = spsr.il;
if (spsr.width && badMode32((OperatingMode)(uint8_t)spsr.mode)) {
CPSR old_cpsr = miscRegs[MISCREG_CPSR];
int old_mode = old_cpsr.mode;
CPSR cpsr = val;
- if (old_mode != cpsr.mode) {
+ if (old_mode != cpsr.mode || cpsr.il != old_cpsr.il) {
getITBPtr(tc)->invalidateMiscReg();
getDTBPtr(tc)->invalidateMiscReg();
}