[PATCH] ARM: vfp: Fix up exception location in Thumb mode
From: Russell King - ARM Linux <hidden>
Date: 2011-01-14 16:52:39
Also in:
lkml
On Fri, Jan 14, 2011 at 10:24:52AM -0600, Dave Martin wrote:
Is the comment preceding __und_usr_unknown causing some confusion here? /* * The FP module is called with these registers set: * r0 = instruction * r2 = PC+4 ... That reflects the ARM case only: for Thumb, r2 is always PC+2 (?)
Actually, referring to 'PC' here is confusing (and yes, I probably wrote it) - does 'PC' refer to the address of the faulting instruction or the current PC value... Your '(?)' there is exactly the problem I'm referring to - I don't think there's much of a clear idea really what's going on here...
The comment at the start of do_undefinstr() (which receives these registers) is correct though: /* * According to the ARM ARM, PC is 2 or 4 bytes ahead, * depending whether we're in Thumb mode or not. * Correct this offset.
The ARM ARM says that in order to return to the instruction which generated the exception, subtract 2 bytes for thumb or 4 bytes for ARM. So, in order to point at the instruction which generated the exception, we have to subtract this value from the PC value we were passed. I suggest changing this comment to: /* * According to the ARM ARM, the PC is 2 or 4 bytes ahead * depending on Thumb mode. Correct this offset so that * regs->ARM_pc points at the faulting instruction. */