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); | ||
