MIPS: Don't save/restore OCTEON wide multiplier state on syscalls.
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 <david.daney@cavium.com> Cc: linux-mips@linux-mips.org Cc: David Daney <david.daney@cavium.com> Patchwork: https://patchwork.linux-mips.org/patch/5540/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
Родитель
a135a9b5d9
Коммит
8dfdd02a4c
|
@ -69,6 +69,14 @@
|
|||
LONG_S $24, PT_R24(sp)
|
||||
#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
|
||||
|
||||
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче