MIPS: Don't save/restore OCTEON wide multiplier state on syscalls.
PATCH 1/1 MIPS: Don't save/restore OCTEON wide multiplier state on syscalls.
From: David Daney <[email protected]>
The ABI allows these to be clobbered on syscalls, so only save and restore the multiplier state when the temporary registers need to be preserved.
Signed-off-by David Daney <[email protected]>
--- arch/mips/include/asm/stackframe.h | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-)
arch/mips/include/asm/stackframe.h +14 -15
@@ -70,6 +70,14 @@#ifndef CONFIG_CPU_HAS_SMARTMIPS LONG_S v1, PT_LO(sp)#endif +#ifdef CONFIG_CPU_CAVIUM_OCTEON +/* +* The Octeon multiplier state is affected by general +* multiply instructions. It must be saved before and +* kernel code might corrupt it +*/ + jal octeon_mult_save +#endif .endm .macro SAVE_STATIC
@@ -218,17 +226,8 @@ori $28, sp, _THREAD_MASK xori $28, _THREAD_MASK #ifdef CONFIG_CPU_CAVIUM_OCTEON - .set mips64 - pref 0, 0($28) /* Prefetch the current pointer */ - pref 0, PT_R31(sp) /* Prefetch the $31(ra) */ - /* The Octeon multiplier state is affected by general multiply - instructions. It must be saved before and kernel code might - corrupt it */ - jal octeon_mult_save - LONG_L v1, 0($28) /* Load the current pointer */ - /* Restore $31(ra) that was changed by the jal */ - LONG_L ra, PT_R31(sp) - pref 0, 0(v1) /* Prefetch the current thread */ + .set mips64 + pref 0, 0($28) /* Prefetch the current pointer */ #endif .set pop .endm
@@ -248,6 +247,10 @@ .endm .macro RESTORE_TEMP +#ifdef CONFIG_CPU_CAVIUM_OCTEON +/* Restore the Octeon multiplier state */ + jal octeon_mult_restore +#endif #ifdef CONFIG_CPU_HAS_SMARTMIPS LONG_L $24, PT_ACX(sp) mtlhx $24
@@ -360,10 +363,6 @@ DVPE 5 # dvpe a1 jal mips_ihb#endif /* CONFIG_MIPS_MT_SMTC */ -#ifdef CONFIG_CPU_CAVIUM_OCTEON -/* Restore the Octeon multiplier state */ - jal octeon_mult_restore -#endif mfc0 a0,CP0_STATUS ori a0, STATMASK xori a0, STATMASK
Signature · 1 line
1.7.11.7