summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorKanoj Sarcar <kanoj@engr.sgi.com>2000-05-11 20:59:13 +0000
committerKanoj Sarcar <kanoj@engr.sgi.com>2000-05-11 20:59:13 +0000
commite3b4abcb9607063735ea134eca6fad62f8147f20 (patch)
tree3cb2e5fa1795bfc2b2df6b0e72ce4b39e44f4ae0 /include
parentaed9bea016318b0f4cd8b3ac9aae9cb0f78526ef (diff)
SMP FPU management: similar to what sparc does, no lazy fpu context
switching in SMP mode, use PF_USEDFPU to determine whether a program used the fpu in the last time quantum and so needs the fpu context to be saved during context switch.
Diffstat (limited to 'include')
-rw-r--r--include/asm-mips64/processor.h8
-rw-r--r--include/asm-mips64/system.h17
2 files changed, 25 insertions, 0 deletions
diff --git a/include/asm-mips64/processor.h b/include/asm-mips64/processor.h
index 0532dbf0c..1932672e7 100644
--- a/include/asm-mips64/processor.h
+++ b/include/asm-mips64/processor.h
@@ -87,6 +87,14 @@ extern int EISA_bus;
/* Lazy FPU handling on uni-processor */
extern struct task_struct *last_task_used_math;
+#ifndef CONFIG_SMP
+#define IS_FPU_OWNER() (last_task_used_math == current)
+#define CLEAR_FPU_OWNER() last_task_used_math = NULL;
+#else
+#define IS_FPU_OWNER() (current->flags & PF_USEDFPU)
+#define CLEAR_FPU_OWNER() current->flags &= ~PF_USEDFPU;
+#endif
+
/*
* User space process size: 1TB. This is hardcoded into a few places,
* so don't change it unless you know what you are doing. TASK_SIZE
diff --git a/include/asm-mips64/system.h b/include/asm-mips64/system.h
index 7f518a8b8..3592b3821 100644
--- a/include/asm-mips64/system.h
+++ b/include/asm-mips64/system.h
@@ -169,8 +169,25 @@ extern asmlinkage void *resume(void *last, void *next);
#endif /* !defined (_LANGUAGE_ASSEMBLY) */
#define prepare_to_switch() do { } while(0)
+
+extern asmlinkage void lazy_fpu_switch(void *, void *);
+extern asmlinkage void init_fpu(void);
+extern asmlinkage void save_fp(void *);
+
+#ifdef CONFIG_SMP
+#define SWITCH_DO_LAZY_FPU \
+ if (prev->flags & PF_USEDFPU) { \
+ lazy_fpu_switch(prev, 0); \
+ set_cp0_status(ST0_CU1, ~ST0_CU1); \
+ prev->flags &= ~PF_USEDFPU; \
+ }
+#else /* CONFIG_SMP */
+#define SWITCH_DO_LAZY_FPU do { } while(0)
+#endif /* CONFIG_SMP */
+
#define switch_to(prev,next,last) \
do { \
+ SWITCH_DO_LAZY_FPU; \
(last) = resume(prev, next); \
} while(0)