diff options
Diffstat (limited to 'arch/arm/vfp/vfphw.S')
-rw-r--r-- | arch/arm/vfp/vfphw.S | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S index d50f0e486cf2..ea0349f63586 100644 --- a/arch/arm/vfp/vfphw.S +++ b/arch/arm/vfp/vfphw.S | |||
@@ -62,13 +62,13 @@ | |||
62 | 62 | ||
63 | @ VFP hardware support entry point. | 63 | @ VFP hardware support entry point. |
64 | @ | 64 | @ |
65 | @ r0 = faulted instruction | 65 | @ r0 = instruction opcode (32-bit ARM or two 16-bit Thumb) |
66 | @ r2 = faulted PC+4 | 66 | @ r2 = PC value to resume execution after successful emulation |
67 | @ r9 = successful return | 67 | @ r9 = normal "successful" return address |
68 | @ r10 = vfp_state union | 68 | @ r10 = vfp_state union |
69 | @ r11 = CPU number | 69 | @ r11 = CPU number |
70 | @ lr = failure return | 70 | @ lr = unrecognised instruction return address |
71 | 71 | @ IRQs enabled. | |
72 | ENTRY(vfp_support_entry) | 72 | ENTRY(vfp_support_entry) |
73 | DBGSTR3 "instr %08x pc %08x state %p", r0, r2, r10 | 73 | DBGSTR3 "instr %08x pc %08x state %p", r0, r2, r10 |
74 | 74 | ||
@@ -162,9 +162,12 @@ vfp_hw_state_valid: | |||
162 | @ exception before retrying branch | 162 | @ exception before retrying branch |
163 | @ out before setting an FPEXC that | 163 | @ out before setting an FPEXC that |
164 | @ stops us reading stuff | 164 | @ stops us reading stuff |
165 | VFPFMXR FPEXC, r1 @ restore FPEXC last | 165 | VFPFMXR FPEXC, r1 @ Restore FPEXC last |
166 | sub r2, r2, #4 | 166 | sub r2, r2, #4 @ Retry current instruction - if Thumb |
167 | str r2, [sp, #S_PC] @ retry the instruction | 167 | str r2, [sp, #S_PC] @ mode it's two 16-bit instructions, |
168 | @ else it's one 32-bit instruction, so | ||
169 | @ always subtract 4 from the following | ||
170 | @ instruction address. | ||
168 | #ifdef CONFIG_PREEMPT | 171 | #ifdef CONFIG_PREEMPT |
169 | get_thread_info r10 | 172 | get_thread_info r10 |
170 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | 173 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count |