Index: kernel/arch/sparc32/include/arch/exception.h
===================================================================
--- kernel/arch/sparc32/include/arch/exception.h	(revision 3d1956b90cc5922a5ba0c2d5c52750c9aaa24b1b)
+++ kernel/arch/sparc32/include/arch/exception.h	(revision 679dc0c9c223ca3698970cbe869686a2c72637b8)
@@ -67,5 +67,5 @@
 extern void data_store_error(int n, istate_t *istate);
 extern void mem_address_not_aligned(int n, istate_t *istate);
-extern void syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id);
+extern sysarg_t syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id);
 
 #endif /* !__ASM__ */
Index: kernel/arch/sparc32/src/exception.c
===================================================================
--- kernel/arch/sparc32/src/exception.c	(revision 3d1956b90cc5922a5ba0c2d5c52750c9aaa24b1b)
+++ kernel/arch/sparc32/src/exception.c	(revision 679dc0c9c223ca3698970cbe869686a2c72637b8)
@@ -140,8 +140,9 @@
 }
 
-void syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id)
+sysarg_t syscall(sysarg_t a1, sysarg_t a2, sysarg_t a3, sysarg_t a4, sysarg_t a5, sysarg_t a6, sysarg_t id)
 {
 	printf("syscall %d\n", id);
-	syscall_handler(a1, a2, a3, a4, a5, a6, id);
+	printf("args: 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", a1, a2, a3, a4, a5, a6);
+	return syscall_handler(a1, a2, a3, a4, a5, a6, id);
 }
 
Index: kernel/arch/sparc32/src/trap_table.S
===================================================================
--- kernel/arch/sparc32/src/trap_table.S	(revision 3d1956b90cc5922a5ba0c2d5c52750c9aaa24b1b)
+++ kernel/arch/sparc32/src/trap_table.S	(revision 679dc0c9c223ca3698970cbe869686a2c72637b8)
@@ -83,5 +83,10 @@
 /* Save next window to kernel stack or UWB */
 .macro inline_save_kernel
-	mov %wim, %g2
+	mov %wim, %l3
+	sll %l3, 7, %l4
+	srl %l3, 1, %l3
+	or  %l3, %l4, %l3
+	and %l3, 0xff, %l3
+
 	mov %g0, %wim
 	save
@@ -95,22 +100,27 @@
 	std %i6, [%sp + 56]
 	restore
-	mov %g2, %wim
+	mov %l3, %wim
 .endm
 
 .macro inline_save_uspace uwb
-	mov %wim, %g2
-	mov %g0, %wim
+	mov %wim, %l3
+	sll %l3, 7, %l4
+	srl %l3, 1, %l3
+	or  %l3, %l4, %l3
+	and %l3, 0xff, %l3
+	mov \uwb, %g3
+
 	save
-	std %l0, [\uwb +  0]
-	std %l2, [\uwb +  8]
-	std %l4, [\uwb + 16]
-	std %l6, [\uwb + 24]
-	std %i0, [\uwb + 32]
-	std %i2, [\uwb + 40]
-	std %i4, [\uwb + 48]
-	std %i6, [\uwb + 56]
+	std %l0, [%g3 +  0]
+	std %l2, [%g3 +  8]
+	std %l4, [%g3 + 16]
+	std %l6, [%g3 + 24]
+	std %i0, [%g3 + 32]
+	std %i2, [%g3 + 40]
+	std %i4, [%g3 + 48]
+	std %i6, [%g3 + 56]
 	add \uwb, 64, \uwb
 	restore
-	mov %g2, %wim
+	mov %l3, %wim
 .endm
 
@@ -165,4 +175,5 @@
 	save	
 
+	sub \uwb, 64, \uwb
 	ldd [\uwb +  0], %l0
 	ldd [\uwb +  8], %l2
@@ -173,5 +184,4 @@
 	ldd [\uwb + 48], %i4
 	ldd [\uwb + 56], %i6
-	sub \uwb, 64, \uwb
 	save
 
@@ -180,7 +190,7 @@
 
 .macro if_from_kernel label
-	mov %psr, %g2
-	and %g2, (1 << 6), %g2
-	cmp %g2, 0
+	mov %psr, %l3
+	and %l3, (1 << 6), %l3
+	cmp %l3, 0
 	bne \label
 	nop
@@ -245,5 +255,4 @@
 	/* dump registers to stack */
 	save
-	st %l0, [%sp + 0] ! XXX
 	std %l0, [%sp +  0]
 	std %l2, [%sp +  8]
@@ -261,5 +270,5 @@
 	mov %psr, %g7
 	and %g7, 0x7, %g7
-	inc %g7
+	or %g7, 0x10, %g7
 
 2:	save
@@ -272,11 +281,11 @@
 	std %i4, [%g6 + 48]
 	std %i6, [%g6 + 56]
-	add %g4, 64, %g4
+	add %g6, 64, %g6
 
 	/* check whether it's the last user window to be saved */
+	and %g7, 0x7, %l5
 	mov %psr, %l4
 	and %l4, 0x7, %l4
-	inc %l4
-	cmp %g7, %l4
+	cmp %l5, %l4
 	bne 3f
 	nop
@@ -384,6 +393,9 @@
 	/* set uspace window mark */
 	mov %psr, %l7
+	inc %l7
 	and %l7, 0x7, %l7
-	inc %l7
+	or %l7, 0x10, %l7
+	b 4f
+	nop
 
 3:	/* Trap originated from kernel */
@@ -397,6 +409,7 @@
 	/* set uspace window mark */
 	mov %g6, %l7
+	inc %l7
 	and %l7, 0x7, %l7
-	inc %l7
+	or %l7, 0x10, %l7
 	/* Save stack pointer */
 	mov %l5, %g7
@@ -406,5 +419,5 @@
 
 5:	/* Set up stack frame */
-	sub %sp, 112, %sp
+	sub %sp, 120, %sp
 
 	/* Save trap data on stack */
@@ -413,4 +426,8 @@
 	st %l2, [%sp + 96]
 	st %l0, [%sp + 100]
+	st %g1, [%sp + 104]
+	st %g2, [%sp + 108]
+	st %g3, [%sp + 112]
+	st %g4, [%sp + 116]
 
 	/* Enable traps */
@@ -431,4 +448,8 @@
 	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
@@ -450,4 +471,5 @@
 	get_cwp %g7
 	inc %g7
+	and %g7, 0x7, %g7
 	cmp %g6, %g7
 	bne 8f
@@ -456,4 +478,7 @@
 
 	inline_restore_uspace %g1
+	switch_to_invalid %g5, %g6
+	mov %g1, %l6
+	switch_back %g5, %g6
 	b 8f
 	nop
@@ -528,4 +553,7 @@
 
 	inline_restore_uspace %g1
+	switch_to_invalid %g5, %g6
+	mov %g1, %l6
+	switch_back %g5, %g6
 	b 8f
 	nop
@@ -547,7 +575,18 @@
 	if_from_kernel 3f
 
+	/* Trap originated from uspace */
 	/* Kernel stack pointer is at %l5, uwb is at %l6 */
 	inline_save_uspace %l6
-3:	inline_save_kernel 
+
+	/* set uspace window mark */
+	mov %psr, %l7
+	inc %l7
+	and %l7, 0x7, %l7
+	or %l7, 0x10, %l7
+	b 4f
+	nop
+
+3:	/* Trap originated from kernel */
+	inline_save_kernel 
 
 4:	/* Check whether previous mode was usermode */
@@ -556,14 +595,19 @@
 	/* Load kernel stack pointer from invalid window */
 	switch_to_invalid %g5, %g6
+
 	/* set uspace window mark */
 	mov %g6, %l7
+	inc %l7
 	and %l7, 0x7, %l7
-	inc %l7
+	or %l7, 0x10, %l7
+
 	/* Save stack pointer */
 	mov %l5, %g7
 	switch_back %g5, %g6
 	mov %g7, %sp
-	mov %sp, %fp
-5:	sub %sp, 112, %sp
+//	mov %sp, %fp
+
+5:	/* Set up stack frame */
+	sub %sp, 120, %sp
 
 	/* Save trap data on stack */
@@ -572,4 +616,8 @@
 	st %l2, [%sp + 96]
 	st %l0, [%sp + 100]
+	st %g1, [%sp + 104]
+	st %g2, [%sp + 108]
+	st %g3, [%sp + 112]
+	st %g4, [%sp + 116]
 
 	/* Enable traps */
@@ -597,4 +645,10 @@
 	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
 	nop
@@ -616,4 +670,5 @@
 	get_cwp %g7
 	inc %g7
+	and %g7, 0x7, %g7
 	cmp %g6, %g7
 	bne 8f
@@ -622,9 +677,11 @@
 
 	inline_restore_uspace %g1
+	switch_to_invalid %g5, %g6
+	mov %g1, %l6
+	switch_back %g5, %g6
 	b 8f
 	nop
 
 7:	inline_restore_kernel
-
 
 8:	jmp %l2
