Index: kernel/arch/sparc32/include/arch/arch.h
===================================================================
--- kernel/arch/sparc32/include/arch/arch.h	(revision bf677f61602c7e4b3c7a120fa84b7c59bef4627b)
+++ kernel/arch/sparc32/include/arch/arch.h	(revision 9426f7c42b317a72ead25a5501beee4cae37427e)
@@ -46,6 +46,8 @@
 #define	ASI_CACHEMISS	0x01
 #define	ASI_CACHECTRL	0x02
+#define	ASI_MMUCACHE	0x10
 #define	ASI_MMUREGS	0x19
 #define	ASI_MMUBYPASS	0x1c
+#define	ASI_MMUFLUSH	0x18
 
 #define TASKMAP_MAX_RECORDS  32
Index: kernel/arch/sparc32/src/mm/as.c
===================================================================
--- kernel/arch/sparc32/src/mm/as.c	(revision bf677f61602c7e4b3c7a120fa84b7c59bef4627b)
+++ kernel/arch/sparc32/src/mm/as.c	(revision 9426f7c42b317a72ead25a5501beee4cae37427e)
@@ -54,4 +54,6 @@
 	context_table[as->asid].et = PTE_ET_DESCRIPTOR;
 	asi_u32_write(ASI_MMUREGS, 0x200, as->asid);
+	asi_u32_write(ASI_MMUCACHE, 0, 1);
+	asi_u32_write(ASI_MMUFLUSH, 0, 1);
 }
 
Index: kernel/arch/sparc32/src/trap_table.S
===================================================================
--- kernel/arch/sparc32/src/trap_table.S	(revision bf677f61602c7e4b3c7a120fa84b7c59bef4627b)
+++ kernel/arch/sparc32/src/trap_table.S	(revision 9426f7c42b317a72ead25a5501beee4cae37427e)
@@ -88,6 +88,10 @@
 	or  %l3, %l4, %l3
 	and %l3, 0xff, %l3
-
 	mov %g0, %wim
+
+	mov %l5, %g5
+	mov %l6, %g6
+	mov %l7, %g7
+
 	save
 	std %l0, [%sp +  0]
@@ -99,4 +103,7 @@
 	std %i4, [%sp + 48]
 	std %i6, [%sp + 56]
+	mov %g5, %l5
+	mov %g6, %l6
+	mov %g7, %l7
 	restore
 	mov %l3, %wim
@@ -109,5 +116,10 @@
 	or  %l3, %l4, %l3
 	and %l3, 0xff, %l3
+	mov %g0, %wim
 	mov \uwb, %g3
+
+	mov %l5, %g5
+	mov %l6, %g6
+	mov %l7, %g7
 
 	save
@@ -120,4 +132,7 @@
 	std %i4, [%g3 + 48]
 	std %i6, [%g3 + 56]
+	mov %g5, %l5
+	mov %g6, %l6
+	mov %g7, %l7
 	add \uwb, 64, \uwb
 	restore
@@ -223,4 +238,6 @@
 
 window_overflow_trap:
+	mov %g7, %l0
+
 	/* rotate WIM on bit right, we have 8 windows */
 	mov %wim, %l3
@@ -240,6 +257,7 @@
 
 	/* Check whether previous mode was usermode */
-	and %l0, (1 << 6), %l0
-	cmp %l0, 0
+	mov %psr, %l4
+	and %l4, (1 << 6), %l4
+	cmp %l4, 0
 	beq 1f
 	nop
@@ -305,8 +323,11 @@
 
 	/* go home */
+	mov %l0, %g7
 	jmp %l1
 	rett %l2
 
 window_underflow_trap:
+	mov %g7, %l0
+
         /* rotate WIM on bit LEFT, we have 8 windows */ 
         mov %wim,%l3
@@ -321,7 +342,7 @@
 
 	/* Check whether previous mode was usermode */
-	mov %psr, %l0
-	and %l0, (1 << 6), %l0
-	cmp %l0, 0
+	mov %psr, %l4
+	and %l4, (1 << 6), %l4
+	cmp %l4, 0
 	beq 1f
 	nop
@@ -373,8 +394,12 @@
 
         /* go home */
+	mov %l0, %g7
         jmp %l1
         rett %l2
 
 preemptible_trap:
+	/* Save %g7 */
+	mov %g7, %l0
+
 	/* Check whether we landed in invalid window */
 	get_wim_number %g6
@@ -407,4 +432,5 @@
 	/* Load kernel stack pointer from invalid window */
 	switch_to_invalid %g5, %g6
+
 	/* set uspace window mark */
 	mov %g6, %l7
@@ -412,4 +438,5 @@
 	and %l7, 0x7, %l7
 	or %l7, 0x10, %l7
+
 	/* Save stack pointer */
 	mov %l5, %g7
@@ -419,15 +446,16 @@
 
 5:	/* Set up stack frame */
-	sub %sp, 120, %sp
+	sub %sp, 128, %sp
 
 	/* Save trap data on stack */
-	mov %psr, %l0
+	mov %psr, %l5
 	st %l1, [%sp + 92]
 	st %l2, [%sp + 96]
-	st %l0, [%sp + 100]
+	st %l5, [%sp + 100]
 	st %g1, [%sp + 104]
 	st %g2, [%sp + 108]
 	st %g3, [%sp + 112]
 	st %g4, [%sp + 116]
+	st %l0, [%sp + 120]
 
 	/* Enable traps */
@@ -448,8 +476,4 @@
 	ld [%sp + 96], %l2
 	ld [%sp + 100], %l0
-	ld [%sp + 104], %g1
-	ld [%sp + 108], %g2
-	ld [%sp + 112], %g3
-	ld [%sp + 116], %g4
 	mov %l0, %psr
 	nop
@@ -486,5 +510,10 @@
 7:	inline_restore_kernel
 
-8:	jmp %l1
+8:	ld [%sp + 104], %g1
+	ld [%sp + 108], %g2
+	ld [%sp + 112], %g3
+	ld [%sp + 116], %g4
+	ld [%sp + 120], %g7
+	jmp %l1
 	rett %l2
 
@@ -565,4 +594,7 @@
 
 syscall_trap:
+	/* Save %g7 */
+	mov %g7, %l0
+
 	/* Check whether we landed in invalid window */
 	get_wim_number %g6
@@ -609,15 +641,16 @@
 
 5:	/* Set up stack frame */
-	sub %sp, 120, %sp
+	sub %sp, 128, %sp
 
 	/* Save trap data on stack */
-	mov %psr, %l0
+	mov %psr, %l5
 	st %l1, [%sp + 92]
 	st %l2, [%sp + 96]
-	st %l0, [%sp + 100]
+	st %l5, [%sp + 100]
 	st %g1, [%sp + 104]
 	st %g2, [%sp + 108]
 	st %g3, [%sp + 112]
 	st %g4, [%sp + 116]
+	st %l0, [%sp + 120]
 
 	/* Enable traps */
@@ -645,9 +678,4 @@
 	ld [%sp + 96], %l2
 	ld [%sp + 100], %l0
-	ld [%sp + 104], %g1
-	ld [%sp + 108], %g2
-	ld [%sp + 112], %g3
-	ld [%sp + 116], %g4
-
 	mov %o0, %i0
 	mov %l0, %psr
@@ -685,5 +713,10 @@
 7:	inline_restore_kernel
 
-8:	jmp %l2
+8:	ld [%sp + 104], %g1
+	ld [%sp + 108], %g2
+	ld [%sp + 112], %g3
+	ld [%sp + 116], %g4
+	ld [%sp + 120], %g7
+	jmp %l2
 	rett %l2 + 4
 
Index: kernel/arch/sparc32/src/userspace.c
===================================================================
--- kernel/arch/sparc32/src/userspace.c	(revision bf677f61602c7e4b3c7a120fa84b7c59bef4627b)
+++ kernel/arch/sparc32/src/userspace.c	(revision 9426f7c42b317a72ead25a5501beee4cae37427e)
@@ -52,7 +52,10 @@
 
 	asm volatile (
+		"flush\n"
 		"mov %[stack], %%sp\n"
+		"mov %[arg], %%o1\n"
 		"jmp %[entry]\n"
 		"mov %[psr], %%psr\n" :: [entry] "r" (kernel_uarg->uspace_entry),
+			   [arg] "r" (kernel_uarg->uspace_uarg),
 			   [psr] "r" (psr),
 			   [stack] "r" (kernel_uarg->uspace_stack + kernel_uarg->uspace_stack_size));
