patch-1.3.93 linux/include/asm-sparc/system.h
Next file: linux/include/asm-sparc/termbits.h
Previous file: linux/include/asm-sparc/swift.h
Back to the patch index
Back to the overall index
- Lines: 64
- Date:
Sun Apr 21 12:30:34 1996
- Orig file:
v1.3.92/linux/include/asm-sparc/system.h
- Orig date:
Mon Mar 4 08:50:03 1996
diff -u --recursive --new-file v1.3.92/linux/include/asm-sparc/system.h linux/include/asm-sparc/system.h
@@ -1,13 +1,16 @@
-/* $Id: system.h,v 1.24 1996/02/11 00:42:39 davem Exp $ */
+/* $Id: system.h,v 1.29 1996/04/03 02:17:52 davem Exp $ */
#ifndef __SPARC_SYSTEM_H
#define __SPARC_SYSTEM_H
#include <linux/kernel.h>
#include <asm/segment.h>
+
+#ifdef __KERNEL__
#include <asm/page.h>
#include <asm/oplib.h>
#include <asm/psr.h>
+#endif
#define EMPTY_PGT (&empty_bad_page)
#define EMPTY_PGE (&empty_bad_page_table)
@@ -44,13 +47,40 @@
extern void flush_user_windows(void);
extern void synchronize_user_stack(void);
extern void sparc_switch_to(void *new_task);
-#define switch_to(p) do { \
+#ifndef __SMP__
+#define switch_to(prev, next) do { \
+ flush_user_windows(); \
+ switch_to_context(next); \
+ prev->tss.current_ds = active_ds; \
+ active_ds = next->tss.current_ds; \
+ if(last_task_used_math != next) \
+ next->tss.kregs->psr &= ~PSR_EF; \
+ sparc_switch_to(next); \
+ } while(0)
+#else
+
+extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
+ void *fpqueue, unsigned long *fpqdepth);
+
+#define switch_to(prev, next) do { \
+ cli(); \
+ if(prev->flags & PF_USEDFPU) { \
+ fpsave(&prev->tss.float_regs[0], &prev->tss.fsr, \
+ &prev->tss.fpqueue[0], &prev->tss.fpqdepth); \
+ prev->flags &= ~PF_USEDFPU; \
+ prev->tss.kregs->psr &= ~PSR_EF; \
+ } \
+ prev->lock_depth = syscall_count; \
+ kernel_counter += (next->lock_depth - prev->lock_depth); \
+ syscall_count = next->lock_depth; \
flush_user_windows(); \
- switch_to_context(p); \
- current->tss.current_ds = active_ds; \
- active_ds = p->tss.current_ds; \
- sparc_switch_to(p); \
+ switch_to_context(next); \
+ prev->tss.current_ds = active_ds; \
+ active_ds = next->tss.current_ds; \
+ sparc_switch_to(next); \
+ sti(); \
} while(0)
+#endif
/* Changing the IRQ level on the Sparc. */
extern inline void setipl(int __new_ipl)
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this