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