patch-2.1.44 linux/include/asm-mips/processor.h

Next file: linux/include/asm-mips/ptrace.h
Previous file: linux/include/asm-mips/posix_types.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.43/linux/include/asm-mips/processor.h linux/include/asm-mips/processor.h
@@ -3,8 +3,8 @@
  *
  * Copyright (C) 1994  Waldorf Electronics
  * written by Ralf Baechle
+ * Modified further for R[236]000 compatibility by Paul M. Antoine
  */
-
 #ifndef __ASM_MIPS_PROCESSOR_H
 #define __ASM_MIPS_PROCESSOR_H
 
@@ -19,9 +19,6 @@
  */
 extern char wait_available;		/* only available on R4[26]00 */
 
-extern atomic_t intr_count;
-extern unsigned long event;
-
 /*
  * Bus types (default is ISA, but people can check others with these..)
  * MCA_bus hardcoded to 0 for now.
@@ -41,7 +38,9 @@
 
 /*
  * User space process size: 2GB. This is hardcoded into a few places,
- * so don't change it unless you know what you are doing.
+ * so don't change it unless you know what you are doing.  TASK_SIZE
+ * for a 64 bit kernel expandable to 8192EB, of which the current MIPS
+ * implementations will "only" be able to use 1TB ...
  */
 #define TASK_SIZE	(0x80000000UL)
 
@@ -67,7 +66,7 @@
  */
 struct mips_fpu_soft_struct {
 	long	dummy;
-	};
+};
 
 union mips_fpu_union {
         struct mips_fpu_hard_struct hard;
@@ -82,62 +81,33 @@
  * If you change thread_struct remember to change the #defines below too!
  */
 struct thread_struct {
-        /*
-         * saved main processor registers
-         */
-        unsigned long   reg16, reg17, reg18, reg19, reg20, reg21, reg22, reg23;
-        unsigned long                               reg28, reg29, reg30, reg31;
-	/*
-	 * saved cp0 stuff
-	 */
+        /* Saved main processor registers. */
+        unsigned long reg16 __attribute__ ((aligned (8)));
+	unsigned long reg17, reg18, reg19, reg20, reg21, reg22, reg23;
+        unsigned long reg28, reg29, reg30, reg31;
+
+	/* Saved cp0 stuff. */
 	unsigned long cp0_status;
-	/*
-	 * saved fpu/fpu emulator stuff
-	 */
-	union mips_fpu_union fpu;
-	/*
-	 * Other stuff associated with the thread
-	 */
+
+	/* Saved fpu/fpu emulator stuff. */
+	union mips_fpu_union fpu __attribute__ ((aligned (8)));
+
+	/* Other stuff associated with the thread. */
 	unsigned long cp0_badvaddr;
 	unsigned long error_code;
 	unsigned long trap_no;
-	unsigned long ksp;		/* Top of kernel stack   */
-	unsigned long pg_dir;		/* L1 page table pointer */
-#define MF_FIXADE 1
+	unsigned long ksp;			/* Top of kernel stack   */
+	unsigned long pg_dir;                   /* used in tlb refill    */
+#define MF_FIXADE 1			/* Fix address errors in software */
+#define MF_LOGADE 2			/* Log address errors to syslog */
 	unsigned long mflags;
+	int current_ds;
+	unsigned long irix_trampoline;  /* Wheee... */
+	unsigned long irix_oldctx;
 };
 
 #endif /* !defined (__LANGUAGE_ASSEMBLY__) */
 
-/*
- * If you change the #defines remember to change thread_struct above too!
- */
-#define TOFF_REG16		0
-#define TOFF_REG17		(TOFF_REG16+4)
-#define TOFF_REG18		(TOFF_REG17+4)
-#define TOFF_REG19		(TOFF_REG18+4)
-#define TOFF_REG20		(TOFF_REG19+4)
-#define TOFF_REG21		(TOFF_REG20+4)
-#define TOFF_REG22		(TOFF_REG21+4)
-#define TOFF_REG23		(TOFF_REG22+4)
-#define TOFF_REG28		(TOFF_REG23+4)
-#define TOFF_REG29		(TOFF_REG28+4)
-#define TOFF_REG30		(TOFF_REG29+4)
-#define TOFF_REG31		(TOFF_REG30+4)
-#define TOFF_CP0_STATUS		(TOFF_REG31+4)
-/*
- * Pad for 8 byte boundary!
- */
-#define TOFF_FPU		(((TOFF_CP0_STATUS+4)+(8-1))&~(8-1))
-#define TOFF_CP0_BADVADDR	(TOFF_FPU+264)
-#define TOFF_ERROR_CODE		(TOFF_CP0_BADVADDR+4)
-#define TOFF_TRAP_NO		(TOFF_ERROR_CODE+4)
-#define TOFF_KSP		(TOFF_TRAP_NO+4)
-#define TOFF_PG_DIR		(TOFF_KSP+4)
-#define TOFF_MFLAGS		(TOFF_PG_DIR+4)
-
-#if !defined (__LANGUAGE_ASSEMBLY__)
-
 #define INIT_MMAP { &init_mm, KSEG0, KSEG1, PAGE_SHARED, \
                     VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap }
 
@@ -156,81 +126,79 @@
 	 */ \
 	INIT_FPU, \
 	/* \
-	 * Other stuff associated with the process\
+	 * Other stuff associated with the process \
+	 */ \
+	0, 0, 0, (unsigned long)&init_task_union + KERNEL_STACK_SIZE - 8, \
+	(unsigned long) swapper_pg_dir, \
+	/* \
+	 * For now the default is to fix address errors \
 	 */ \
-	0, 0, 0, sizeof(init_kernel_stack) + (unsigned long)init_kernel_stack - 8, \
-	(unsigned long) swapper_pg_dir - PT_OFFSET, 0 \
+	MF_FIXADE, 0, 0, 0 \
 }
 
+#ifdef __KERNEL__
+
+#define KERNEL_STACK_SIZE 8192
+
+#if !defined (__LANGUAGE_ASSEMBLY__)
+
+/* Free all resources held by a thread. */
+extern void release_thread(struct task_struct *);
+
 /*
  * Return saved PC of a blocked thread.
  */
 extern inline unsigned long thread_saved_pc(struct thread_struct *t)
 {
-	return ((unsigned long *)t->reg29)[EF_CP0_EPC];
+	return ((struct pt_regs *)(long)t->reg29)->cp0_epc;
 }
 
 /*
  * Do necessary setup to start up a newly executed thread.
  */
-static __inline__
-void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp)
-{
-	/*
-	 * Pure paranoia; probably not needed.
-	 */
-	sys_cacheflush(0, ~0, BCACHE);
-	sync_mem();
-	regs->cp0_epc = pc;
-	/*
-	 * New thread loses kernel privileges.
-	 */
-	regs->cp0_status = (regs->cp0_status & ~(ST0_CU0|ST0_KSU)) | KSU_USER;
-	/*
-	 * Reserve argument save space for registers a0 - a3.
-	regs->reg29 = sp - 4 * sizeof(unsigned long);
-	 */
-	regs->reg29 = sp;
-}
-
-/* Free all resources held by a thread. */
-extern void release_thread(struct task_struct *);
-
-#ifdef __KERNEL__
-
-/*
- * switch_to(n) should switch tasks to task nr n, first
- * checking that n isn't the current task, in which case it does nothing.
- */
-asmlinkage void resume(struct task_struct *tsk, int offset);
-
-#define switch_to(n) \
-	resume(n, ((int)(&((struct task_struct *)0)->tss)))
+extern void start_thread(struct pt_regs * regs, unsigned long pc, unsigned long sp);
 
 /*
  * Does the process account for user or for system time?
  */
-#if defined (__R4000__)
-
 #define USES_USER_TIME(regs) (!((regs)->cp0_status & 0x18))
 
-#else /* !defined (__R4000__) */
-
-#define USES_USER_TIME(regs) (!((regs)->cp0_status & 0x4))
-
-#endif /* !defined (__R4000__) */
+/* Allocation and freeing of basic task resources. */
+/*
+ * NOTE! The task struct and the stack go together
+ */
+#define alloc_task_struct() \
+	((struct task_struct *) __get_free_pages(GFP_KERNEL,1,0))
+#define free_task_struct(p)	free_pages((unsigned long)(p),1)
 
-#endif /* __KERNEL__ */
+#define init_task	(init_task_union.task)
+#define init_stack	(init_task_union.stack)
 
 #endif /* !defined (__LANGUAGE_ASSEMBLY__) */
+#endif /* __KERNEL__ */
 
 /*
- * ELF support
- *
- * Using EM_MIPS is actually wrong - this one is reserved for big endian
- * machines only
+ * Return_address is a replacement for __builtin_return_address(count)
+ * which on certain architectures cannot reasonably be implemented in GCC
+ * (MIPS, Alpha) or is unuseable with -fomit-frame-pointer (i386).
+ * Note that __builtin_return_address(x>=1) is forbidden because GCC
+ * aborts compilation on some CPUs.  It's simply not possible to unwind
+ * some CPU's stackframes.
+ */
+#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8))
+/*
+ * __builtin_return_address works only for non-leaf functions.  We avoid the
+ * overhead of a function call by forcing the compiler to save the return
+ * address register on the stack.
+ */
+#define return_address() ({__asm__ __volatile__("":::"$31");__builtin_return_address(0);})
+#else
+/*
+ * __builtin_return_address is not implemented at all.  Calling it
+ * will return senseless values.  Return NULL which at least is an obviously
+ * senseless value.
  */
-#define INCOMPATIBLE_MACHINE(m) ((m) != EM_MIPS && (m) != EM_MIPS_RS4_BE)
-#define ELF_EM_CPU EM_MIPS
+#define return_address() NULL
+#endif
 
 #endif /* __ASM_MIPS_PROCESSOR_H */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov