diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/vfp/vfphw.S | 4 | ||||
-rw-r--r-- | arch/arm/vfp/vfpmodule.c | 2 |
2 files changed, 6 insertions, 0 deletions
diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S index 83c4e384b16d..1aeae38725dd 100644 --- a/arch/arm/vfp/vfphw.S +++ b/arch/arm/vfp/vfphw.S | |||
@@ -100,6 +100,7 @@ ENTRY(vfp_support_entry) | |||
100 | beq no_old_VFP_process | 100 | beq no_old_VFP_process |
101 | VFPFSTMIA r4, r5 @ save the working registers | 101 | VFPFSTMIA r4, r5 @ save the working registers |
102 | VFPFMRX r5, FPSCR @ current status | 102 | VFPFMRX r5, FPSCR @ current status |
103 | #ifndef CONFIG_CPU_FEROCEON | ||
103 | tst r1, #FPEXC_EX @ is there additional state to save? | 104 | tst r1, #FPEXC_EX @ is there additional state to save? |
104 | beq 1f | 105 | beq 1f |
105 | VFPFMRX r6, FPINST @ FPINST (only if FPEXC.EX is set) | 106 | VFPFMRX r6, FPINST @ FPINST (only if FPEXC.EX is set) |
@@ -107,6 +108,7 @@ ENTRY(vfp_support_entry) | |||
107 | beq 1f | 108 | beq 1f |
108 | VFPFMRX r8, FPINST2 @ FPINST2 if needed (and present) | 109 | VFPFMRX r8, FPINST2 @ FPINST2 if needed (and present) |
109 | 1: | 110 | 1: |
111 | #endif | ||
110 | stmia r4, {r1, r5, r6, r8} @ save FPEXC, FPSCR, FPINST, FPINST2 | 112 | stmia r4, {r1, r5, r6, r8} @ save FPEXC, FPSCR, FPINST, FPINST2 |
111 | @ and point r4 at the word at the | 113 | @ and point r4 at the word at the |
112 | @ start of the register dump | 114 | @ start of the register dump |
@@ -119,6 +121,7 @@ no_old_VFP_process: | |||
119 | VFPFLDMIA r10, r5 @ reload the working registers while | 121 | VFPFLDMIA r10, r5 @ reload the working registers while |
120 | @ FPEXC is in a safe state | 122 | @ FPEXC is in a safe state |
121 | ldmia r10, {r1, r5, r6, r8} @ load FPEXC, FPSCR, FPINST, FPINST2 | 123 | ldmia r10, {r1, r5, r6, r8} @ load FPEXC, FPSCR, FPINST, FPINST2 |
124 | #ifndef CONFIG_CPU_FEROCEON | ||
122 | tst r1, #FPEXC_EX @ is there additional state to restore? | 125 | tst r1, #FPEXC_EX @ is there additional state to restore? |
123 | beq 1f | 126 | beq 1f |
124 | VFPFMXR FPINST, r6 @ restore FPINST (only if FPEXC.EX is set) | 127 | VFPFMXR FPINST, r6 @ restore FPINST (only if FPEXC.EX is set) |
@@ -126,6 +129,7 @@ no_old_VFP_process: | |||
126 | beq 1f | 129 | beq 1f |
127 | VFPFMXR FPINST2, r8 @ FPINST2 if needed (and present) | 130 | VFPFMXR FPINST2, r8 @ FPINST2 if needed (and present) |
128 | 1: | 131 | 1: |
132 | #endif | ||
129 | VFPFMXR FPSCR, r5 @ restore status | 133 | VFPFMXR FPSCR, r5 @ restore status |
130 | 134 | ||
131 | check_for_exception: | 135 | check_for_exception: |
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c index 01599c4ef726..2d7423af1197 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c | |||
@@ -253,12 +253,14 @@ void VFP_bounce(u32 trigger, u32 fpexc, struct pt_regs *regs) | |||
253 | } | 253 | } |
254 | 254 | ||
255 | if (fpexc & FPEXC_EX) { | 255 | if (fpexc & FPEXC_EX) { |
256 | #ifndef CONFIG_CPU_FEROCEON | ||
256 | /* | 257 | /* |
257 | * Asynchronous exception. The instruction is read from FPINST | 258 | * Asynchronous exception. The instruction is read from FPINST |
258 | * and the interrupted instruction has to be restarted. | 259 | * and the interrupted instruction has to be restarted. |
259 | */ | 260 | */ |
260 | trigger = fmrx(FPINST); | 261 | trigger = fmrx(FPINST); |
261 | regs->ARM_pc -= 4; | 262 | regs->ARM_pc -= 4; |
263 | #endif | ||
262 | } else if (!(fpexc & FPEXC_DEX)) { | 264 | } else if (!(fpexc & FPEXC_DEX)) { |
263 | /* | 265 | /* |
264 | * Illegal combination of bits. It can be caused by an | 266 | * Illegal combination of bits. It can be caused by an |