mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 15:54:15 +08:00
MIPS: Simplify EVA FP context handling code
The protected_{save,restore}_fp_context functions had effectively different implementations for EVA. Simplify & unify the code somewhat such that EVA configurations simply guarantee the FPU-not-owned path through the standard code path. Signed-off-by: Paul Burton <paul.burton@imgtec.com> Cc: Markos Chandras <markos.chandras@imgtec.com> Cc: linux-mips@linux-mips.org Cc: Guenter Roeck <linux@roeck-us.net> Cc: Matthew Fortune <matthew.fortune@imgtec.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: linux-kernel@vger.kernel.org Cc: Richard Weinberger <richard@nod.at> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Maciej W. Rozycki <macro@codesourcery.com> Patchwork: https://patchwork.linux-mips.org/patch/10787/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
397d08b006
commit
689ee8565c
@ -101,7 +101,14 @@ static int copy_fp_from_sigcontext(struct sigcontext __user *sc)
|
||||
static int protected_save_fp_context(struct sigcontext __user *sc)
|
||||
{
|
||||
int err;
|
||||
#ifndef CONFIG_EVA
|
||||
|
||||
/*
|
||||
* EVA does not have userland equivalents of ldc1 or sdc1, so
|
||||
* save to the kernel FP context & copy that to userland below.
|
||||
*/
|
||||
if (config_enabled(CONFIG_EVA))
|
||||
lose_fpu(1);
|
||||
|
||||
while (1) {
|
||||
lock_fpu_owner();
|
||||
if (is_fpu_owner()) {
|
||||
@ -120,21 +127,22 @@ static int protected_save_fp_context(struct sigcontext __user *sc)
|
||||
if (err)
|
||||
break; /* really bad sigcontext */
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* EVA does not have FPU EVA instructions so saving fpu context directly
|
||||
* does not work.
|
||||
*/
|
||||
lose_fpu(1);
|
||||
err = save_fp_context(sc); /* this might fail */
|
||||
#endif
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int protected_restore_fp_context(struct sigcontext __user *sc)
|
||||
{
|
||||
int err, tmp __maybe_unused;
|
||||
#ifndef CONFIG_EVA
|
||||
|
||||
/*
|
||||
* EVA does not have userland equivalents of ldc1 or sdc1, so we
|
||||
* disable the FPU here such that the code below simply copies to
|
||||
* the kernel FP context.
|
||||
*/
|
||||
if (config_enabled(CONFIG_EVA))
|
||||
lose_fpu(0);
|
||||
|
||||
while (1) {
|
||||
lock_fpu_owner();
|
||||
if (is_fpu_owner()) {
|
||||
@ -153,14 +161,7 @@ static int protected_restore_fp_context(struct sigcontext __user *sc)
|
||||
if (err)
|
||||
break; /* really bad sigcontext */
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* EVA does not have FPU EVA instructions so restoring fpu context
|
||||
* directly does not work.
|
||||
*/
|
||||
lose_fpu(0);
|
||||
err = restore_fp_context(sc); /* this might fail */
|
||||
#endif
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -629,7 +630,6 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#ifndef CONFIG_EVA
|
||||
static int smp_save_fp_context(struct sigcontext __user *sc)
|
||||
{
|
||||
return raw_cpu_has_fpu
|
||||
@ -643,12 +643,10 @@ static int smp_restore_fp_context(struct sigcontext __user *sc)
|
||||
? _restore_fp_context(sc)
|
||||
: copy_fp_from_sigcontext(sc);
|
||||
}
|
||||
#endif /* CONFIG_EVA */
|
||||
#endif
|
||||
|
||||
static int signal_setup(void)
|
||||
{
|
||||
#ifndef CONFIG_EVA
|
||||
#ifdef CONFIG_SMP
|
||||
/* For now just do the cpu_has_fpu check when the functions are invoked */
|
||||
save_fp_context = smp_save_fp_context;
|
||||
@ -662,10 +660,6 @@ static int signal_setup(void)
|
||||
restore_fp_context = copy_fp_from_sigcontext;
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
#else
|
||||
save_fp_context = copy_fp_to_sigcontext;
|
||||
restore_fp_context = copy_fp_from_sigcontext;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user