Index: kernel/arch/sparc32/src/trap_table.S
===================================================================
--- kernel/arch/sparc32/src/trap_table.S	(revision dbf4417b8aa11e1e0bcb8e6a191c3aaa0ae37c83)
+++ kernel/arch/sparc32/src/trap_table.S	(revision 3d1956b90cc5922a5ba0c2d5c52750c9aaa24b1b)
@@ -556,6 +556,10 @@
 	/* Load kernel stack pointer from invalid window */
 	switch_to_invalid %g5, %g6
-	restore
-	mov %l5, %g7		! stack pointer
+	/* set uspace window mark */
+	mov %g6, %l7
+	and %l7, 0x7, %l7
+	inc %l7
+	/* Save stack pointer */
+	mov %l5, %g7
 	switch_back %g5, %g6
 	mov %g7, %sp
@@ -565,7 +569,7 @@
 	/* Save trap data on stack */
 	mov %psr, %l0
-	st %l1, [%fp - 4]
-	st %l2, [%fp - 8]
-	st %l0, [%fp - 12]
+	st %l1, [%sp + 92]
+	st %l2, [%sp + 96]
+	st %l0, [%sp + 100]
 
 	/* Enable traps */
@@ -590,7 +594,7 @@
 
 	/* Return from handler */
-	ld [%fp - 4], %l1
-	ld [%fp - 8], %l2
-	ld [%fp - 12], %l0
+	ld [%sp + 92], %l1
+	ld [%sp + 96], %l2
+	ld [%sp + 100], %l0
 	mov %l0, %psr
 	nop
@@ -599,4 +603,12 @@
 	nop
 	nop
+
+	/* If trap originated from uspace, clear uspace window mark and save uwb address for future use */
+	if_from_kernel 6f
+	switch_to_invalid %g5, %g6
+	clr %l7
+	mov %l6, %g7
+	switch_back %g5, %g6
+	mov %g7, %g1
 
 	/* If next window is invalid, do inline restore */
