Index: arch/sparc64/include/context.h
===================================================================
--- arch/sparc64/include/context.h	(revision 1120276ccc8b05501c44caedc58016ff6f503729)
+++ arch/sparc64/include/context.h	(revision 7614565928991ee1b958841cfa45a268038da3f5)
@@ -51,5 +51,6 @@
         (c)->pc = ((__address) _pc) - 8;								\
         (c)->sp = ((__address) stack) + ALIGN_UP((size), STACK_ALIGNMENT) - (STACK_BIAS + SP_DELTA);	\
-	(c)->fp = -STACK_BIAS
+	(c)->fp = -STACK_BIAS;										\
+	(c)->cleanwin = 0
 	
 
@@ -78,4 +79,5 @@
 	__u64 l7;
 	ipl_t ipl;
+	__u64 cleanwin;
 };
 
Index: arch/sparc64/include/context_offset.h
===================================================================
--- arch/sparc64/include/context_offset.h	(revision 1120276ccc8b05501c44caedc58016ff6f503729)
+++ arch/sparc64/include/context_offset.h	(revision 7614565928991ee1b958841cfa45a268038da3f5)
@@ -19,2 +19,3 @@
 #define OFFSET_L6  0x80
 #define OFFSET_L7  0x88
+#define OFFSET_CLEANWIN  0x98
Index: arch/sparc64/include/trap/interrupt.h
===================================================================
--- arch/sparc64/include/trap/interrupt.h	(revision 1120276ccc8b05501c44caedc58016ff6f503729)
+++ arch/sparc64/include/trap/interrupt.h	(revision 7614565928991ee1b958841cfa45a268038da3f5)
@@ -35,4 +35,5 @@
 
 #include <arch/trap/trap_table.h>
+#include <arch/stack.h>
 
 #define TT_INTERRUPT_LEVEL_1			0x41
@@ -59,10 +60,8 @@
 #ifdef __ASM__
 .macro INTERRUPT_LEVEL_N_HANDLER n
-	save %sp, -128, %sp
+	save %sp, -STACK_WINDOW_SAVE_AREA_SIZE, %sp
 	mov \n - 1, %o0
-	call exc_dispatch
 	mov %fp, %o1
-	restore
-	retry
+	SAVING_HANDLER exc_dispatch
 .endm
 
Index: arch/sparc64/include/trap/regwin.h
===================================================================
--- arch/sparc64/include/trap/regwin.h	(revision 1120276ccc8b05501c44caedc58016ff6f503729)
+++ arch/sparc64/include/trap/regwin.h	(revision 7614565928991ee1b958841cfa45a268038da3f5)
@@ -119,10 +119,12 @@
 	mov %r0, %l6
 	mov %r0, %l7
-	mov %r0, %i0
-	mov %r0, %i1
-	mov %r0, %i2
-	mov %r0, %i3
-	mov %r0, %i4
-	mov %r0, %i5
+	mov %r0, %o0
+	mov %r0, %o1
+	mov %r0, %o2
+	mov %r0, %o3
+	mov %r0, %o4
+	mov %r0, %o5
+	mov %r0, %o6
+	mov %r0, %o7
 	retry
 .endm
Index: arch/sparc64/include/trap/trap_table.h
===================================================================
--- arch/sparc64/include/trap/trap_table.h	(revision 1120276ccc8b05501c44caedc58016ff6f503729)
+++ arch/sparc64/include/trap/trap_table.h	(revision 7614565928991ee1b958841cfa45a268038da3f5)
@@ -34,4 +34,6 @@
 #endif /* __ASM__ */
 
+#include <arch/stack.h>
+
 #define TRAP_TABLE_ENTRY_COUNT	1024
 #define TRAP_TABLE_ENTRY_SIZE	32
@@ -49,3 +51,31 @@
 #endif /* !__ASM__ */
 
+#ifdef __ASM__
+.macro SAVE_GLOBALS
+	mov %g1, %l1
+	mov %g2, %l2
+	mov %g3, %l3
+	mov %g4, %l4
+	mov %g5, %l5
+	mov %g6, %l6
+	mov %g7, %l7
+.endm
+
+.macro RESTORE_GLOBALS
+	mov %l1, %g1
+	mov %l2, %g2
+	mov %l3, %g3
+	mov %l4, %g4
+	mov %l5, %g5
+	mov %l6, %g6
+	mov %l7, %g7
+.endm
+
+.macro SAVING_HANDLER f
+	set \f, %l0
+	b saving_handler
+	nop
+.endm
+#endif /* __ASM__ */
+
 #endif
Index: arch/sparc64/src/context.S
===================================================================
--- arch/sparc64/src/context.S	(revision 1120276ccc8b05501c44caedc58016ff6f503729)
+++ arch/sparc64/src/context.S	(revision 7614565928991ee1b958841cfa45a268038da3f5)
@@ -62,4 +62,6 @@
 	stx %l6, [\r + OFFSET_L6]
 	stx %l7, [\r + OFFSET_L7]
+	rdpr %cleanwin, %g1
+	stx %g1, [\r + OFFSET_CLEANWIN]
 .endm
 
@@ -83,4 +85,6 @@
 	ldx [\r + OFFSET_L6], %l6
 	ldx [\r + OFFSET_L7], %l7
+	ldx [\r + OFFSET_CLEANWIN], %g1
+	wrpr %g1, %g0, %cleanwin
 .endm
 
Index: arch/sparc64/src/panic.S
===================================================================
--- arch/sparc64/src/panic.S	(revision 1120276ccc8b05501c44caedc58016ff6f503729)
+++ arch/sparc64/src/panic.S	(revision 7614565928991ee1b958841cfa45a268038da3f5)
@@ -29,6 +29,9 @@
 .text
 
+#include <arch/stack.h>
+
 .global panic_printf
 panic_printf:
+	save %sp, -STACK_WINDOW_SAVE_AREA_SIZE, %sp
 	call printf
 	nop
@@ -36,2 +39,4 @@
 	nop
 	/* Not reached. */
+	restore
+
Index: arch/sparc64/src/trap/trap_table.S
===================================================================
--- arch/sparc64/src/trap/trap_table.S	(revision 1120276ccc8b05501c44caedc58016ff6f503729)
+++ arch/sparc64/src/trap/trap_table.S	(revision 7614565928991ee1b958841cfa45a268038da3f5)
@@ -38,5 +38,10 @@
  * link-time addresses which is good for debugging.
  */
- 
+
+.register %g2, #scratch
+.register %g3, #scratch
+.register %g6, #scratch
+.register %g7, #scratch 
+
 .text
 
@@ -203,2 +208,19 @@
 trap_table_save:
 	.space TABLE_SIZE, 0
+
+
+/* Trap handler that explicitly saves global registers.
+ *
+ * Input registers:
+ * 	%l0	 	Address of function to call.
+ * Output registers:
+ *	 %l1 - %l7 	Copy of %g1 - %g7
+ */
+.global saving_handler
+saving_handler:
+	SAVE_GLOBALS
+	call %l0
+	nop
+	RESTORE_GLOBALS
+	restore		/* matches the save instruction from the top-level handler */
+	retry
Index: tools/sparc64/gencontext.c
===================================================================
--- tools/sparc64/gencontext.c	(revision 1120276ccc8b05501c44caedc58016ff6f503729)
+++ tools/sparc64/gencontext.c	(revision 7614565928991ee1b958841cfa45a268038da3f5)
@@ -46,4 +46,5 @@
 	fprintf(f,"#define OFFSET_L6  0x%x\n",((int)&pctx->l6) - (int )pctx);
 	fprintf(f,"#define OFFSET_L7  0x%x\n",((int)&pctx->l7) - (int )pctx);
+	fprintf(f,"#define OFFSET_CLEANWIN  0x%x\n",((int)&pctx->cleanwin) - (int )pctx);
 
 	fclose(f);
