summaryrefslogtreecommitdiff
path: root/src/arch/arm/insts/static_inst.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm/insts/static_inst.cc')
-rw-r--r--src/arch/arm/insts/static_inst.cc10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/arch/arm/insts/static_inst.cc b/src/arch/arm/insts/static_inst.cc
index aace1de2b..a7ba91e03 100644
--- a/src/arch/arm/insts/static_inst.cc
+++ b/src/arch/arm/insts/static_inst.cc
@@ -1018,7 +1018,17 @@ ArmStaticInst::getPSTATEFromPSR(ThreadContext *tc, CPSR cpsr, CPSR spsr) const
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)) {