Index: arch/mips/include/context.h
===================================================================
--- arch/mips/include/context.h	(revision 24bd23a618e2bc2235c117d43b2fe92d199ebe83)
+++ arch/mips/include/context.h	(revision 909c6e38dc1bfcf7fcff02cc4a0c1552685c9084)
@@ -31,43 +31,4 @@
 
 #define STACK_ITEM_SIZE	4
-
-/* These are offsets into the register dump saved
- * on exception entry
- */
-#define EOFFSET_AT 0
-#define EOFFSET_V0 4
-#define EOFFSET_V1 8
-#define EOFFSET_A0 12
-#define EOFFSET_A1 16
-#define EOFFSET_A2 20
-#define EOFFSET_A3 24
-#define EOFFSET_A4 28
-#define EOFFSET_T1 32
-#define EOFFSET_T2 36
-#define EOFFSET_T3 40
-#define EOFFSET_T4 44
-#define EOFFSET_T5 48
-#define EOFFSET_T6 52
-#define EOFFSET_T7 56
-#define EOFFSET_T8 60
-#define EOFFSET_T9 64
-#define EOFFSET_S0 68
-#define EOFFSET_S1 72
-#define EOFFSET_S2 76
-#define EOFFSET_S3 80
-#define EOFFSET_S4 84
-#define EOFFSET_S5 88
-#define EOFFSET_S6 92
-#define EOFFSET_S7 96
-#define EOFFSET_S8 100
-#define EOFFSET_GP 104
-#define EOFFSET_RA 108
-#define EOFFSET_SP 112
-
-#define EOFFSET_LO 116
-#define EOFFSET_HI 120
-#define EOFFSET_STATUS 124
-
-#define REGISTER_SPACE 128
 
 /*
Index: arch/mips/include/exception.h
===================================================================
--- arch/mips/include/exception.h	(revision 24bd23a618e2bc2235c117d43b2fe92d199ebe83)
+++ arch/mips/include/exception.h	(revision 909c6e38dc1bfcf7fcff02cc4a0c1552685c9084)
@@ -30,4 +30,8 @@
 #define __EXCEPTION_H__
 
+#ifndef __mips_TYPES_H_
+#  include <arch/types.h>
+#endif
+
 #define EXC_Int		0
 #define EXC_Mod		1
@@ -49,5 +53,43 @@
 #define EXC_VCED	31
 
-extern void exception(void);
+struct exception_regdump {
+	__u32 at;
+	__u32 v0;
+	__u32 v1;
+	__u32 a0;
+	__u32 a1;
+	__u32 a2;
+	__u32 a3;
+	__u32 t0;
+	__u32 t1;
+	__u32 t2;
+	__u32 t3;
+	__u32 t4;
+	__u32 t5;
+	__u32 t6;
+	__u32 t7;
+	__u32 s0;
+	__u32 s1;
+	__u32 s2;
+	__u32 s3;
+	__u32 s4;
+	__u32 s5;
+	__u32 s6;
+	__u32 s7;
+	__u32 t8;
+	__u32 t9;
+	__u32 gp;
+	__u32 sp;
+	__u32 s8;
+	__u32 ra;
+	
+	__u32 lo;
+	__u32 hi;
+
+	__u32 status; /* cp0_status */
+	__u32 epc; /* cp0_epc */
+};
+
+extern void exception(struct exception_regdump *pstate);
 
 #endif
Index: arch/mips/include/mm/tlb.h
===================================================================
--- arch/mips/include/mm/tlb.h	(revision 24bd23a618e2bc2235c117d43b2fe92d199ebe83)
+++ arch/mips/include/mm/tlb.h	(revision 909c6e38dc1bfcf7fcff02cc4a0c1552685c9084)
@@ -29,4 +29,6 @@
 #ifndef __mips_TLB_H__
 #define __mips_TLB_H__
+
+#include <arch/exception.h>
 
 #define PAGE_UNCACHED			2
@@ -64,6 +66,6 @@
 typedef struct entry_lo pte_t;
 
-extern void tlb_refill(void);
-extern void tlb_invalid(void);
+extern void tlb_invalid(struct exception_regdump *pstate);
+extern void tlb_refill(struct exception_regdump *pstate);
 
 #endif
Index: arch/mips/include/thread.h
===================================================================
--- arch/mips/include/thread.h	(revision 24bd23a618e2bc2235c117d43b2fe92d199ebe83)
+++ arch/mips/include/thread.h	(revision 909c6e38dc1bfcf7fcff02cc4a0c1552685c9084)
@@ -30,5 +30,5 @@
 #define __mips_THREAD_H__
 
-#define ARCH_THREAD_DATA  __u32	saved_epc;
+#define ARCH_THREAD_DATA
 
 #endif
Index: arch/mips/src/context.S
===================================================================
--- arch/mips/src/context.S	(revision 24bd23a618e2bc2235c117d43b2fe92d199ebe83)
+++ arch/mips/src/context.S	(revision 909c6e38dc1bfcf7fcff02cc4a0c1552685c9084)
@@ -29,5 +29,5 @@
 #define __ASM__
 #include <arch/asm/regname.h>
-#include "context_offset.h"
+#include <arch/context_offset.h>
 	
 .text   
Index: arch/mips/src/exception.c
===================================================================
--- arch/mips/src/exception.c	(revision 24bd23a618e2bc2235c117d43b2fe92d199ebe83)
+++ arch/mips/src/exception.c	(revision 909c6e38dc1bfcf7fcff02cc4a0c1552685c9084)
@@ -35,8 +35,7 @@
 #include <debug.h>
 
-void exception(void)
+void exception(struct exception_regdump *pstate)
 {
 	int excno;
-	__u32 epc;
 	__u32 epc_shift = 0;
 
@@ -46,16 +45,12 @@
 	 * NOTE ON OPERATION ORDERING
 	 *
-	 * On entry, cpu_priority_high() must be called before exception bit is cleared.
-	 * On exit, exception bit must be set before cpu_priority_restore() is called.
+	 * On entry, cpu_priority_high() must be called before 
+	 * exception bit is cleared.
 	 */
 
 	cpu_priority_high();
-	epc = cp0_epc_read();
 	cp0_status_write(cp0_status_read() & ~ (cp0_status_exl_exception_bit |
 						cp0_status_um_bit));
 
-	if (THREAD) {
-		THREAD->saved_epc = epc;
-	}
 	/* decode exception number and process the exception */
 	switch (excno = (cp0_cause_read() >> 2) & 0x1f) {
@@ -65,5 +60,5 @@
 		case EXC_TLBL:
 		case EXC_TLBS:
-			tlb_invalid();
+			tlb_invalid(pstate);
 			break;
 		case EXC_Mod:
@@ -115,11 +110,4 @@
 	}
 	
-	if (THREAD)
-		epc = THREAD->saved_epc;
-	
-	/* Raise EXL bit before epc_write, so that we support
-	 * properly nested exceptions
-	 */
-	cp0_status_write(cp0_status_read() | cp0_status_exl_exception_bit);
-	cp0_epc_write(epc + epc_shift);
+	pstate->epc += epc_shift;
 }
Index: arch/mips/src/mm/tlb.c
===================================================================
--- arch/mips/src/mm/tlb.c	(revision 24bd23a618e2bc2235c117d43b2fe92d199ebe83)
+++ arch/mips/src/mm/tlb.c	(revision 909c6e38dc1bfcf7fcff02cc4a0c1552685c9084)
@@ -36,20 +36,20 @@
 #include <symtab.h>
 
-void tlb_refill(void)
+void tlb_refill(struct exception_regdump *pstate)
 {
 	panic("tlb_refill exception\n");
 }
 
-void tlb_invalid(void)
+void tlb_invalid(struct exception_regdump *pstate)
 {
 	char *symbol = "";
 
 	if (THREAD) {
-		char *s = get_symtab_entry(THREAD->saved_epc);
+		char *s = get_symtab_entry(pstate->epc);
 		if (s)
 			symbol = s;
 	}
 	panic("%X: TLB exception at %X(%s)\n", cp0_badvaddr_read(), 
-	      THREAD ? THREAD->saved_epc : 0, symbol);
+	      pstate->epc, symbol);
 }
 
Index: arch/mips/src/start.S
===================================================================
--- arch/mips/src/start.S	(revision 24bd23a618e2bc2235c117d43b2fe92d199ebe83)
+++ arch/mips/src/start.S	(revision 909c6e38dc1bfcf7fcff02cc4a0c1552685c9084)
@@ -32,5 +32,5 @@
 #include <arch/mm/page.h>
 #include <arch/asm/boot.h>
-#include <arch/context.h>
+#include <arch/context_offset.h>
 	
 .text
@@ -56,5 +56,5 @@
 	sw $a2,EOFFSET_A2(\r)
 	sw $a3,EOFFSET_A3(\r)
-	sw $t0,EOFFSET_A4(\r)
+	sw $t0,EOFFSET_T0(\r)
 	sw $t1,EOFFSET_T1(\r)
 	sw $t2,EOFFSET_T2(\r)
@@ -87,4 +87,6 @@
 	mfc0 $at, $status
 	sw $at,EOFFSET_STATUS(\r)
+	mfc0 $at, $epc
+	sw $at,EOFFSET_EPC(\r)
 .endm
 
@@ -96,5 +98,5 @@
 	lw $a2,EOFFSET_A2(\r)
 	lw $a3,EOFFSET_A3(\r)
-	lw $t0,EOFFSET_A4(\r)
+	lw $t0,EOFFSET_T0(\r)
 	lw $t1,EOFFSET_T1(\r)
 	lw $t2,EOFFSET_T2(\r)
@@ -125,4 +127,6 @@
 	lw $at,EOFFSET_STATUS(\r)
 	mtc0 $at, $status
+	lw $at,EOFFSET_EPC(\r)
+	mtc0 $at, $epc
 	
 	lw $at,EOFFSET_AT(\r)
@@ -192,5 +196,6 @@
 	add $sp, $k0, 0
 
-	jal exception
+	add $a0, $sp, 0 
+	jal exception /* exception(register_space) */
 	nop
 
@@ -206,5 +211,6 @@
 	add $sp, $k0, 0
 
-	jal tlb_refill
+	add $a0, $sp, 0 
+	jal tlb_refill /* tlb_refill(register_space) */
 	nop
 
Index: src/clean.mips
===================================================================
--- src/clean.mips	(revision 24bd23a618e2bc2235c117d43b2fe92d199ebe83)
+++ src/clean.mips	(revision 909c6e38dc1bfcf7fcff02cc4a0c1552685c9084)
@@ -4,3 +4,3 @@
 
 rm ../tools/mips/gencontext
-rm ../arch/mips/src/context_offset.h
+rm ../arch/mips/include/context_offset.h
Index: tools/mips/gencontext.c
===================================================================
--- tools/mips/gencontext.c	(revision 24bd23a618e2bc2235c117d43b2fe92d199ebe83)
+++ tools/mips/gencontext.c	(revision 909c6e38dc1bfcf7fcff02cc4a0c1552685c9084)
@@ -7,12 +7,14 @@
 #define __mips_TYPES_H_
 #include "../../arch/mips/include/context.h"
+#include "../../arch/mips/include/exception.h"
 
-#define FILENAME "../../arch/mips/src/context_offset.h"
+#define FILENAME "../../arch/mips/include/context_offset.h"
 
 int main(void)
 {
 	FILE *f;
-	struct context ctx;
-	struct context *pctx = &ctx;
+	struct context *pctx = NULL;
+	struct exception_regdump *edmp = NULL;
+	
 
 	f = fopen(FILENAME,"w");
@@ -23,4 +25,6 @@
 
 	fprintf(f, "/* This file is automatically generated by %s. */\n", __FILE__);	
+
+	fprintf(f,"/* struct context */\n");
 
 	fprintf(f,"#define OFFSET_SP  0x%x\n",((int)&pctx->sp) - (int )pctx);
@@ -37,4 +41,40 @@
 	fprintf(f,"#define OFFSET_GP  0x%x\n",((int)&pctx->gp) - (int )pctx);
 
+	fprintf(f,"\n\n/* struct register_dump */\n");
+	fprintf(f,"#define EOFFSET_AT  0x%x\n",((int)&edmp->at) - (int )edmp);
+	fprintf(f,"#define EOFFSET_V0  0x%x\n",((int)&edmp->v0) - (int )edmp);
+	fprintf(f,"#define EOFFSET_V1  0x%x\n",((int)&edmp->v1) - (int )edmp);
+	fprintf(f,"#define EOFFSET_A0  0x%x\n",((int)&edmp->a0) - (int )edmp);
+	fprintf(f,"#define EOFFSET_A1  0x%x\n",((int)&edmp->a1) - (int )edmp);
+	fprintf(f,"#define EOFFSET_A2  0x%x\n",((int)&edmp->a2) - (int )edmp);
+	fprintf(f,"#define EOFFSET_A3  0x%x\n",((int)&edmp->a3) - (int )edmp);
+	fprintf(f,"#define EOFFSET_T0  0x%x\n",((int)&edmp->t0) - (int )edmp);
+	fprintf(f,"#define EOFFSET_T1  0x%x\n",((int)&edmp->t1) - (int )edmp);
+	fprintf(f,"#define EOFFSET_T2  0x%x\n",((int)&edmp->t2) - (int )edmp);
+	fprintf(f,"#define EOFFSET_T3  0x%x\n",((int)&edmp->t3) - (int )edmp);
+	fprintf(f,"#define EOFFSET_T4  0x%x\n",((int)&edmp->t4) - (int )edmp);
+	fprintf(f,"#define EOFFSET_T5  0x%x\n",((int)&edmp->t5) - (int )edmp);
+	fprintf(f,"#define EOFFSET_T6  0x%x\n",((int)&edmp->t6) - (int )edmp);
+	fprintf(f,"#define EOFFSET_T7  0x%x\n",((int)&edmp->t7) - (int )edmp);
+	fprintf(f,"#define EOFFSET_S0  0x%x\n",((int)&edmp->s0) - (int )edmp);
+	fprintf(f,"#define EOFFSET_S1  0x%x\n",((int)&edmp->s1) - (int )edmp);
+	fprintf(f,"#define EOFFSET_S2  0x%x\n",((int)&edmp->s2) - (int )edmp);
+	fprintf(f,"#define EOFFSET_S3  0x%x\n",((int)&edmp->s3) - (int )edmp);
+	fprintf(f,"#define EOFFSET_S4  0x%x\n",((int)&edmp->s4) - (int )edmp);
+	fprintf(f,"#define EOFFSET_S5  0x%x\n",((int)&edmp->s5) - (int )edmp);
+	fprintf(f,"#define EOFFSET_S6  0x%x\n",((int)&edmp->s6) - (int )edmp);
+	fprintf(f,"#define EOFFSET_S7  0x%x\n",((int)&edmp->s7) - (int )edmp);
+	fprintf(f,"#define EOFFSET_T8  0x%x\n",((int)&edmp->t8) - (int )edmp);
+	fprintf(f,"#define EOFFSET_T9  0x%x\n",((int)&edmp->t9) - (int )edmp);
+	fprintf(f,"#define EOFFSET_GP  0x%x\n",((int)&edmp->gp) - (int )edmp);
+	fprintf(f,"#define EOFFSET_SP  0x%x\n",((int)&edmp->sp) - (int )edmp);
+	fprintf(f,"#define EOFFSET_S8  0x%x\n",((int)&edmp->s8) - (int )edmp);
+	fprintf(f,"#define EOFFSET_RA  0x%x\n",((int)&edmp->ra) - (int )edmp);
+	fprintf(f,"#define EOFFSET_LO  0x%x\n",((int)&edmp->lo) - (int )edmp);
+	fprintf(f,"#define EOFFSET_HI  0x%x\n",((int)&edmp->hi) - (int )edmp);
+	fprintf(f,"#define EOFFSET_STATUS  0x%x\n",((int)&edmp->status) - (int )edmp);
+	fprintf(f,"#define EOFFSET_EPC  0x%x\n",((int)&edmp->epc) - (int )edmp);
+
+	fprintf(f,"#define REGISTER_SPACE  %d\n",sizeof(*edmp));
 
 	fclose(f);
