diff options
author | David Daney <ddaney@caviumnetworks.com> | 2008-12-11 18:33:33 -0500 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2009-01-11 04:57:24 -0500 |
commit | 2a219b0eaa7bb9f1a7dae4e8ac5b1bf68adab289 (patch) | |
tree | c1b6be0b186db917c4d4ce3f5ed947e8d93a8ce1 /arch | |
parent | ddcdb1b4a46915b70dce3af3a78582b3ca79cf76 (diff) |
MIPS: Cavium OCTEON multiplier state preservation.
For OCTEON, implement a save and restore of the multiplier state
across context switches.
Signed-off-by: Tomaso Paoletti <tpaoletti@caviumnetworks.com>
Signed-off-by: David Daney <ddaney@caviumnetworks.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/mips/include/asm/stackframe.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/mips/include/asm/stackframe.h b/arch/mips/include/asm/stackframe.h index 4c37c4e5f72e..db0fa7b5aeaf 100644 --- a/arch/mips/include/asm/stackframe.h +++ b/arch/mips/include/asm/stackframe.h | |||
@@ -194,6 +194,19 @@ | |||
194 | LONG_S $31, PT_R31(sp) | 194 | LONG_S $31, PT_R31(sp) |
195 | ori $28, sp, _THREAD_MASK | 195 | ori $28, sp, _THREAD_MASK |
196 | xori $28, _THREAD_MASK | 196 | xori $28, _THREAD_MASK |
197 | #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||
198 | .set mips64 | ||
199 | pref 0, 0($28) /* Prefetch the current pointer */ | ||
200 | pref 0, PT_R31(sp) /* Prefetch the $31(ra) */ | ||
201 | /* The Octeon multiplier state is affected by general multiply | ||
202 | instructions. It must be saved before and kernel code might | ||
203 | corrupt it */ | ||
204 | jal octeon_mult_save | ||
205 | LONG_L v1, 0($28) /* Load the current pointer */ | ||
206 | /* Restore $31(ra) that was changed by the jal */ | ||
207 | LONG_L ra, PT_R31(sp) | ||
208 | pref 0, 0(v1) /* Prefetch the current thread */ | ||
209 | #endif | ||
197 | .set pop | 210 | .set pop |
198 | .endm | 211 | .endm |
199 | 212 | ||
@@ -324,6 +337,10 @@ | |||
324 | DVPE 5 # dvpe a1 | 337 | DVPE 5 # dvpe a1 |
325 | jal mips_ihb | 338 | jal mips_ihb |
326 | #endif /* CONFIG_MIPS_MT_SMTC */ | 339 | #endif /* CONFIG_MIPS_MT_SMTC */ |
340 | #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||
341 | /* Restore the Octeon multiplier state */ | ||
342 | jal octeon_mult_restore | ||
343 | #endif | ||
327 | mfc0 a0, CP0_STATUS | 344 | mfc0 a0, CP0_STATUS |
328 | ori a0, STATMASK | 345 | ori a0, STATMASK |
329 | xori a0, STATMASK | 346 | xori a0, STATMASK |