ARM9: Fix blx lr
Vicki Pfau vi@endrift.com
Fri, 17 Mar 2017 13:06:11 -0700
2 files changed,
7 insertions(+),
5 deletions(-)
M
src/arm/isa-arm.c
→
src/arm/isa-arm.c
@@ -706,9 +706,10 @@ THUMB_WRITE_PC;)
DEFINE_INSTRUCTION_ARM(BLX2, int rm = opcode & 0x0000000F; + int address = cpu->gprs[rm]; cpu->gprs[ARM_LR] = cpu->gprs[ARM_PC] - WORD_SIZE_ARM; - _ARMSetMode(cpu, cpu->gprs[rm] & 0x00000001); - cpu->gprs[ARM_PC] = cpu->gprs[rm] & 0xFFFFFFFE; + _ARMSetMode(cpu, address & 0x00000001); + cpu->gprs[ARM_PC] = address & 0xFFFFFFFE; if (cpu->executionMode == MODE_THUMB) { THUMB_WRITE_PC; } else {
M
src/arm/isa-thumb.c
→
src/arm/isa-thumb.c
@@ -422,13 +422,14 @@ })
DEFINE_INSTRUCTION_THUMB(BLX2, int rm = (opcode >> 3) & 0xF; - _ARMSetMode(cpu, cpu->gprs[rm] & 0x00000001); + int address = cpu->gprs[rm]; + _ARMSetMode(cpu, address & 0x00000001); int misalign = 0; if (rm == ARM_PC) { - misalign = cpu->gprs[rm] & 0x00000002; + misalign = address & 0x00000002; } cpu->gprs[ARM_LR] = cpu->gprs[ARM_PC] - 1; - cpu->gprs[ARM_PC] = (cpu->gprs[rm] & 0xFFFFFFFE) - misalign; + cpu->gprs[ARM_PC] = (address & 0xFFFFFFFE) - misalign; if (cpu->executionMode == MODE_THUMB) { THUMB_WRITE_PC; } else {