Index: arch/mips32/src/asm.S
===================================================================
--- arch/mips32/src/asm.S	(revision 84dd253c8c662703845d21109af33b9cc66c1854)
+++ arch/mips32/src/asm.S	(revision ce031f07ead21cd492a302c2b305510e36f8dfb5)
@@ -63,6 +63,6 @@
 .global cp0_count_read
 .global cp0_count_write
-.global cp0_hi_read
-.global cp0_hi_write
+.global cp0_entry_hi_read
+.global cp0_entry_hi_write
 .global cp0_compare_read
 .global cp0_compare_write
Index: arch/mips32/src/exception.c
===================================================================
--- arch/mips32/src/exception.c	(revision 84dd253c8c662703845d21109af33b9cc66c1854)
+++ arch/mips32/src/exception.c	(revision ce031f07ead21cd492a302c2b305510e36f8dfb5)
@@ -81,5 +81,5 @@
 			break;
 		case EXC_Mod:
-			panic("unhandled TLB Modification Exception\n");
+			tlb_modified(pstate);
 			break;
 		case EXC_AdEL:
Index: arch/mips32/src/mm/tlb.c
===================================================================
--- arch/mips32/src/mm/tlb.c	(revision 84dd253c8c662703845d21109af33b9cc66c1854)
+++ arch/mips32/src/mm/tlb.c	(revision ce031f07ead21cd492a302c2b305510e36f8dfb5)
@@ -33,6 +33,29 @@
 #include <panic.h>
 #include <arch.h>
+#include <symtab.h>
 
-#include <symtab.h>
+void tlb_init_arch(void)
+{
+	int i;
+
+	cp0_pagemask_write(TLB_PAGE_MASK_16K);
+	cp0_entry_hi_write(0);
+	cp0_entry_lo0_write(0);
+	cp0_entry_lo1_write(0);
+
+	/*
+	 * Invalidate all entries.
+	 */
+	for (i = 0; i < TLB_SIZE; i++) {
+		cp0_index_write(0);
+		tlbwi();
+	}
+	
+	/*
+	 * The kernel is going to make use of some wired
+	 * entries (e.g. mapping kernel stacks).
+	 */
+	cp0_wired_write(TLB_WIRED);
+}
 
 void tlb_refill(struct exception_regdump *pstate)
@@ -47,6 +70,6 @@
 	if (s)
 		sym2 = s;
-	panic("%X: tlb_refill exception at %X(%s<-%s)\n", cp0_badvaddr_read(),
-	      pstate->epc, symbol,sym2);
+	panic("%X: TLB Refill Exception at %X(%s<-%s)\n", cp0_badvaddr_read(),
+	      pstate->epc, symbol, sym2);
 }
 
@@ -58,7 +81,19 @@
 	if (s)
 		symbol = s;
-	panic("%X: TLB exception at %X(%s)\n", cp0_badvaddr_read(), 
+	panic("%X: TLB Invalid Exception at %X(%s)\n", cp0_badvaddr_read(),
 	      pstate->epc, symbol);
 }
+
+void tlb_modified(struct exception_regdump *pstate)
+{
+	char *symbol = "";
+
+	char *s = get_symtab_entry(pstate->epc);
+	if (s)
+		symbol = s;
+	panic("%X: TLB Modified Exception at %X(%s)\n", cp0_badvaddr_read(),
+	      pstate->epc, symbol);
+}
+
 
 void tlb_invalidate(int asid)
