diff options
Diffstat (limited to 'arch/mips/kernel/signal.c')
-rw-r--r-- | arch/mips/kernel/signal.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index 6254041b942f..d0c68b5d717b 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c | |||
@@ -35,6 +35,15 @@ | |||
35 | 35 | ||
36 | #include "signal-common.h" | 36 | #include "signal-common.h" |
37 | 37 | ||
38 | static int (*save_fp_context)(struct sigcontext __user *sc); | ||
39 | static int (*restore_fp_context)(struct sigcontext __user *sc); | ||
40 | |||
41 | extern asmlinkage int _save_fp_context(struct sigcontext __user *sc); | ||
42 | extern asmlinkage int _restore_fp_context(struct sigcontext __user *sc); | ||
43 | |||
44 | extern asmlinkage int fpu_emulator_save_context(struct sigcontext __user *sc); | ||
45 | extern asmlinkage int fpu_emulator_restore_context(struct sigcontext __user *sc); | ||
46 | |||
38 | /* | 47 | /* |
39 | * Horribly complicated - with the bloody RM9000 workarounds enabled | 48 | * Horribly complicated - with the bloody RM9000 workarounds enabled |
40 | * the signal trampolines is moving to the end of the structure so we can | 49 | * the signal trampolines is moving to the end of the structure so we can |
@@ -709,3 +718,40 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused, | |||
709 | key_replace_session_keyring(); | 718 | key_replace_session_keyring(); |
710 | } | 719 | } |
711 | } | 720 | } |
721 | |||
722 | #ifdef CONFIG_SMP | ||
723 | static int smp_save_fp_context(struct sigcontext __user *sc) | ||
724 | { | ||
725 | return raw_cpu_has_fpu | ||
726 | ? _save_fp_context(sc) | ||
727 | : fpu_emulator_save_context(sc); | ||
728 | } | ||
729 | |||
730 | static int smp_restore_fp_context(struct sigcontext __user *sc) | ||
731 | { | ||
732 | return raw_cpu_has_fpu | ||
733 | ? _restore_fp_context(sc) | ||
734 | : fpu_emulator_restore_context(sc); | ||
735 | } | ||
736 | #endif | ||
737 | |||
738 | static int signal_setup(void) | ||
739 | { | ||
740 | #ifdef CONFIG_SMP | ||
741 | /* For now just do the cpu_has_fpu check when the functions are invoked */ | ||
742 | save_fp_context = smp_save_fp_context; | ||
743 | restore_fp_context = smp_restore_fp_context; | ||
744 | #else | ||
745 | if (cpu_has_fpu) { | ||
746 | save_fp_context = _save_fp_context; | ||
747 | restore_fp_context = _restore_fp_context; | ||
748 | } else { | ||
749 | save_fp_context = fpu_emulator_save_context; | ||
750 | restore_fp_context = fpu_emulator_restore_context; | ||
751 | } | ||
752 | #endif | ||
753 | |||
754 | return 0; | ||
755 | } | ||
756 | |||
757 | arch_initcall(signal_setup); | ||