Index: kernel/arch/sparc32/Makefile.inc
===================================================================
--- kernel/arch/sparc32/Makefile.inc	(revision 817d939a2821130ad692b3cdf9c705fefb2b3f0b)
+++ kernel/arch/sparc32/Makefile.inc	(revision e6a3bfee0d976d9fbe2fc0ae6807ec2a6f68989b)
@@ -40,9 +40,10 @@
 
 BITS = 32
-ENDIANESS = LE
+ENDIANESS = BE
 
 ARCH_SOURCES = \
 	arch/$(KARCH)/src/start.S \
 	arch/$(KARCH)/src/trap_table.S \
+	arch/$(KARCH)/src/regwin_test.S \
 	arch/$(KARCH)/src/context.S \
 	arch/$(KARCH)/src/debug/stacktrace.c \
Index: kernel/arch/sparc32/src/machine/leon3/leon3.c
===================================================================
--- kernel/arch/sparc32/src/machine/leon3/leon3.c	(revision 817d939a2821130ad692b3cdf9c705fefb2b3f0b)
+++ kernel/arch/sparc32/src/machine/leon3/leon3.c	(revision e6a3bfee0d976d9fbe2fc0ae6807ec2a6f68989b)
@@ -107,5 +107,5 @@
 {
 	*start = LEON3_SDRAM_START;
-	*size = machine.bootinfo->memsize;
+	*size = 64 * 1024 * 1024;//machine.bootinfo->memsize;
 }
 
@@ -142,6 +142,7 @@
 static void leon3_input_init(void)
 {
+#if 0
 	grlib_uart_t *scons_inst;
-
+	
 	if (machine.scons_dev) {
 		/* Create input device. */
@@ -158,4 +159,5 @@
 		}
 	}
+#endif
 }
 
Index: kernel/arch/sparc32/src/mm/frame.c
===================================================================
--- kernel/arch/sparc32/src/mm/frame.c	(revision 817d939a2821130ad692b3cdf9c705fefb2b3f0b)
+++ kernel/arch/sparc32/src/mm/frame.c	(revision e6a3bfee0d976d9fbe2fc0ae6807ec2a6f68989b)
@@ -36,4 +36,5 @@
 
 #include <mm/frame.h>
+#include <arch/machine_func.h>
 #include <arch/mm/frame.h>
 #include <config.h>
Index: kernel/arch/sparc32/src/regwin_test.S
===================================================================
--- kernel/arch/sparc32/src/regwin_test.S	(revision e6a3bfee0d976d9fbe2fc0ae6807ec2a6f68989b)
+++ kernel/arch/sparc32/src/regwin_test.S	(revision e6a3bfee0d976d9fbe2fc0ae6807ec2a6f68989b)
@@ -0,0 +1,106 @@
+.global func1
+.global func2
+.global func3
+.global func4
+.global func5
+.global func6
+.global func7
+.global func8
+.global func9
+.global func10
+.global func11
+.global func12
+
+func1:
+	save %sp, -96, %sp
+	set 1, %l7
+	call func2
+	nop
+	ret
+	restore
+
+func2:
+	save %sp, -96, %sp
+	set 2, %l7
+	call func3
+	nop
+	ret
+	restore
+
+func3:
+	save %sp, -96, %sp
+	set 3, %l7
+	call func4
+	nop
+	ret
+	restore
+
+func4:
+	save %sp, -96, %sp
+	set 4, %l7
+	call func5
+	nop
+	ret
+	restore
+
+func5:
+	save %sp, -96, %sp
+	set 5, %l7
+	call func6
+	nop
+	ret
+	restore
+
+func6:
+	save %sp, -96, %sp
+	set 6, %l7
+	call func7
+	nop
+	ret
+	restore
+
+func7:
+	save %sp, -96, %sp
+	set 7, %l7
+	call func8
+	nop
+	ret
+	restore
+
+func8:
+	save %sp, -96, %sp
+	set 8, %l7
+	call func9
+	nop
+	ret
+	restore
+
+func9:
+	save %sp, -96, %sp
+	set 9, %l7
+	call func10
+	nop
+	ret
+	restore
+
+func10:
+	save %sp, -96, %sp
+	set 10, %l7
+	call func11
+	nop
+	ret
+	restore
+
+func11:
+	save %sp, -96, %sp
+	set 11, %l7
+	call func12
+	nop
+	ret
+	restore
+
+func12:
+	save %sp, -96, %sp
+	set 12, %l7
+	ret
+	restore
Index: kernel/arch/sparc32/src/sparc32.c
===================================================================
--- kernel/arch/sparc32/src/sparc32.c	(revision 817d939a2821130ad692b3cdf9c705fefb2b3f0b)
+++ kernel/arch/sparc32/src/sparc32.c	(revision e6a3bfee0d976d9fbe2fc0ae6807ec2a6f68989b)
@@ -78,6 +78,12 @@
 }
 
+extern void func1(void);
+
 void arch_post_mm_init(void)
 {
+	/* Test register windows */
+	write_to_invalid(0xdeadbeef, 0xcafebabe, 0xfeedface);
+	func1();
+
 	machine_init(&machine_bootinfo);
 
Index: kernel/arch/sparc32/src/start.S
===================================================================
--- kernel/arch/sparc32/src/start.S	(revision 817d939a2821130ad692b3cdf9c705fefb2b3f0b)
+++ kernel/arch/sparc32/src/start.S	(revision e6a3bfee0d976d9fbe2fc0ae6807ec2a6f68989b)
@@ -54,5 +54,12 @@
 	sub	%sp, 96, %sp
 
-	mov	%o1, %i0
+	mov	%o1, %l1
+	set	0xdeadbeef, %o0
+	set	0xdeadbeef, %o1
+	set	0, %o2
+	call write_to_invalid
+	nop
+
+	mov	%l1, %o1
 	call arch_pre_main
 	nop
Index: kernel/arch/sparc32/src/trap_table.S
===================================================================
--- kernel/arch/sparc32/src/trap_table.S	(revision 817d939a2821130ad692b3cdf9c705fefb2b3f0b)
+++ kernel/arch/sparc32/src/trap_table.S	(revision e6a3bfee0d976d9fbe2fc0ae6807ec2a6f68989b)
@@ -43,9 +43,12 @@
 	clr \reg
 	mov %wim, %g5
-1:	inc \reg
+1:	andcc %g5, 1, %g0
+	bne 2f
+	nop
 	srl %g5, 1, %g5
-	andcc %g5, 1, %g0
-	bne 1b
-	nop
+	inc \reg
+	b 1b
+2:	nop
+
 .endm
 
@@ -60,5 +63,6 @@
 	mov %g0, %wim		! clear WIM
 	mov %psr, \saved_psr	! read PSR
-	or \saved_psr, %g6, %g6	! set CWP
+	and \saved_psr, 0xfffffff0, %l0
+	or %l0, %g6, %g6	! set CWP
 	mov %g6, %psr		! write PSR
 	nop
@@ -79,4 +83,7 @@
 /* Save next window to kernel stack or UWB */
 .macro inline_save_kernel
+	set 0x80000100, %g2
+	set 'k', %g1
+	sta %g1, [%g2] 0x1c
 	save
 	std %l0, [%sp +  0]
@@ -92,4 +99,7 @@
 
 .macro inline_save_uspace uwb
+	set 0x80000100, %g2
+	set 'u', %g1
+	sta %g1, [%g2] 0x1c
 	save
 	ld [\uwb], %g1
@@ -144,10 +154,17 @@
 
 write_to_invalid:
-	mov %o0, %g5
-	mov %o1, %g6
+	! Write value 1
+	mov %o0, %g7
+	switch_to_invalid %g3, %g4
+	mov %g7, %l5
+	switch_back %g3, %g4
+	! Write value 2
+	mov %o1, %g7
+	switch_to_invalid %g3, %g4
+	mov %g7, %l6
+	switch_back %g3, %g4
+	! Write value 3
 	mov %o2, %g7
 	switch_to_invalid %g3, %g4
-	mov %g5, %l5
-	mov %g6, %l6
 	mov %g7, %l7
 	switch_back %g3, %g4
@@ -173,15 +190,22 @@
 	nop; nop; nop
 
-	/* Check whether previous mode was usermode */
-	mov %psr, %l0
-	and %l0, (1 << 6), %l0
-	cmp %l0, 0
-	beq 1f
-	nop
-
 	/* Save invalid window data */
 	mov %l5, %g5		! kernel stack pointer
 	mov %l6, %g6		! kernel wbuf
 	mov %l7, %g7
+
+	/* Check whether previous mode was usermode */
+	and %l0, (1 << 6), %l0
+	cmp %l0, 0
+	beq 1f
+	nop
+
+	/* kernel: */
+	/* we should check whether window needs to be saved
+	 * to kernel stack or uwb
+	 */
+	cmp %g7, 0
+	bne 2f
+	nop
 
 	/* dump registers to stack */
@@ -195,9 +219,15 @@
 	std %i4, [%sp + 48]
 	std %i6, [%sp + 56]
-	b 2f
-	nop
+	b 3f
+	nop
+
+1:	/* uspace: */
+	/* set uspace window mark */
+	mov %psr, %g7
+	and %g7, 0x7, %g7
+	inc %g7
 
 	/* dump registers to uwb */
-1:	save
+2:	save
 	std %l0, [%g4 +  0]
 	std %l2, [%g4 +  8]
@@ -210,5 +240,5 @@
 	add %g4, 64, %g4
 
-2:	/* back to where we should be */
+3:	/* back to where we should be */
 	mov %g5, %l5
 	mov %g6, %l6
@@ -242,9 +272,4 @@
 	beq 1f
 	nop
-
-	/* Save invalid window data */
-	mov %l5, %g5		! kernel stack pointer
-	mov %l6, %g6		! kernel wbuf
-	mov %l7, %g7
 
         /* load registers from stack */
@@ -278,12 +303,17 @@
 	st %g1, [%g2]
 
-2:	/* back to where we should be */
+2:	/* Save invalid window data */
+	mov %l5, %g5		! kernel stack pointer
+	mov %l6, %g6		! kernel wbuf
+	mov %l7, %g7
+	save
+	save
+
+        /* Restore invalid window data */
 	mov %g5, %l5
 	mov %g6, %l6
 	mov %g7, %l7
-	save
-	save
-
-        /* set new value of window */
+
+	/* Set new value of window */
         mov %l3,%wim
         nop; nop; nop
@@ -304,4 +334,136 @@
 	if_from_kernel 3f
 
+	/* Trap originated from uspace */
+	/* Kernel stack pointer is at %l5, uwb is at %l6 */
+	inline_save_uspace %l6
+
+	/* set uspace window mark */
+	mov %psr, %l7
+	and %l7, 0x7, %l7
+	inc %l7
+
+3:	/* Trap originated from kernel */
+	inline_save_kernel 
+
+4:	/* Check whether previous mode was usermode */
+	if_from_kernel 5f
+
+	/* Load kernel stack pointer from invalid window */
+	switch_to_invalid %g5, %g6
+	save
+	/* set uspace window mark */
+	mov %psr, %l7
+	and %l7, 0x7, %l7
+	inc %l7
+	/* Save stack pointer */
+	mov %l5, %g7
+	switch_back %g5, %g6
+	mov %g7, %sp
+	mov %sp, %fp
+
+	/* Set secondary invalid window mark */
+	add %g7, 1, %l7
+
+5:	/* Set up stack frame */
+	sub %sp, 112, %sp
+
+	/* Save trap data on stack */
+	mov %psr, %l0
+	st %l1, [%fp - 4]
+	st %l2, [%fp - 8]
+	st %l0, [%fp - 12]
+
+	/* Enable traps */
+	mov %psr, %l0
+	or %l0, (1 << 5), %l0
+	mov %l0, %psr
+	nop
+	nop
+	nop
+	nop
+
+	/* Jump to actual subroutine */
+	call %o2
+	sub %fp, 12, %o1
+
+	/* Return from handler */
+	ld [%fp - 4], %l1
+	ld [%fp - 8], %l2
+	ld [%fp - 12], %l0
+	mov %l0, %psr
+	nop
+	nop
+	nop
+	nop
+	nop
+
+	/* If trap originated from uspace, clear uspace window mark */
+	if_from_kernel 6f
+	switch_to_invalid %g5, %g6
+	clr %l7
+	switch_back %g5, %g6
+
+6:	jmp %l1
+	rett %l2
+
+interrupt_trap:
+	mov %psr, %l0
+
+	/* Check whether previous mode was usermode */
+	and %l0, (1 << 6), %l0
+	cmp %l0, 0
+	bne 1f
+	nop
+
+	/* Set up stack */
+	set kernel_sp, %l4
+	ld [%l4], %sp
+	mov %sp, %fp
+1:	sub %sp, 112, %sp
+
+	/* Save trap data on stack */
+	mov %psr, %l0
+	st %l1, [%fp - 4]
+	st %l2, [%fp - 8]
+	st %l0, [%fp - 12]
+
+	/* Enable traps */
+	mov %psr, %l0
+	or %l0, (1 << 5), %l0
+	mov %l0, %psr
+	nop
+	nop
+	nop
+	nop
+
+	/* Jump to actual subroutine */
+	mov %g2, %o0
+	call exc_dispatch
+	sub %fp, 12, %o1
+
+	/* Return from handler */
+	ld [%fp - 4], %l1
+	ld [%fp - 8], %l2
+	ld [%fp - 12], %l0
+	mov %l0, %psr
+	nop
+	nop
+	nop
+	nop
+	nop
+	jmp %l1
+	rett %l2
+
+syscall_trap:
+	/* Check whether we landed in invalid window */
+	get_wim_number %g6
+	get_cwp %g7
+	cmp %g6, %g7
+	bne 4f
+	nop
+
+	/* We are in invalid window. Check whether previous mode was usermode */
+	if_from_kernel 3f
+
 	/* Kernel stack pointer is at %l5, uwb is at %l6 */
 	inline_save_uspace %l6
@@ -313,4 +475,5 @@
 	/* Load kernel stack pointer from invalid window */
 	switch_to_invalid %g5, %g6
+	save
 	mov %l5, %g7		! stack pointer
 	switch_back %g5, %g6
@@ -335,96 +498,7 @@
 
 	/* Jump to actual subroutine */
-	call %o2
-	sub %fp, 12, %o1
-
-	/* Return from handler */
-	ld [%fp - 4], %l1
-	ld [%fp - 8], %l2
-	ld [%fp - 12], %l0
-	mov %l0, %psr
-	nop
-	nop
-	nop
-	nop
-	nop
-	jmp %l1
-	rett %l2
-
-interrupt_trap:
-	mov %psr, %l0
-
-	/* Check whether previous mode was usermode */
-	and %l0, (1 << 6), %l0
-	cmp %l0, 0
-	bne 1f
-	nop
-
-	/* Set up stack */
-	set kernel_sp, %l4
-	ld [%l4], %sp
-	mov %sp, %fp
-1:	sub %sp, 112, %sp
-
-	/* Save trap data on stack */
-	mov %psr, %l0
-	st %l1, [%fp - 4]
-	st %l2, [%fp - 8]
-	st %l0, [%fp - 12]
-
-	/* Enable traps */
-	mov %psr, %l0
-	or %l0, (1 << 5), %l0
-	mov %l0, %psr
-	nop
-	nop
-	nop
-	nop
-
-	/* Jump to actual subroutine */
-	mov %g2, %o0
-	call exc_dispatch
-	sub %fp, 12, %o1
-
-	/* Return from handler */
-	ld [%fp - 4], %l1
-	ld [%fp - 8], %l2
-	ld [%fp - 12], %l0
-	mov %l0, %psr
-	nop
-	nop
-	nop
-	nop
-	nop
-	jmp %l1
-	rett %l2
-
-syscall_trap:
-	mov %psr, %l0
-
-	/* Set up stack */
-	set kernel_sp, %l4
-	ld [%l4], %sp
-	mov %sp, %fp
-	sub %sp, 112, %sp
-
-	/* Save trap data on stack */
-	mov %psr, %l0
-	st %l1, [%fp - 4]
-	st %l2, [%fp - 8]
-	st %l0, [%fp - 12]
-
-	/* Enable traps */
-	mov %psr, %l0
-	or %l0, (1 << 5), %l0
-	mov %l0, %psr
-	nop
-	nop
-	nop
-	nop
-
-	/* Jump to actual subroutine */
-	sub %g2, 0x80, %g2
-	st %g2, [ %sp + 92 ]
-	mov %i0, %o1
+	sub %o0, 0x80, %o0
+	st %o0, [ %sp + 92 ]
+	mov %i0, %o0
 	mov %i1, %o1
 	mov %i2, %o2
@@ -463,5 +537,5 @@
 #define	SYSCALL(_vector) \
 	.org trap_table + _vector * TRAP_ENTRY_SIZE; \
-	set _vector, %g2 ; \
+	set _vector, %o0 ; \
 	b syscall_trap ; \
 	nop ;
