Index: arch/sparc64/src/context.S
===================================================================
--- arch/sparc64/src/context.S	(revision 414f59ca675dbed4c5fbbf96fbd18a90f0829ed6)
+++ arch/sparc64/src/context.S	(revision 62e015ffecd917fbbb4245db0a32f65a0246149f)
@@ -32,10 +32,8 @@
 /**
  * Both context_save_arch() and context_restore_arch() are
- * leaf-optimized procedures. Both of them touch %sp and
- * %fp and thus break SCD 2.4 compliance. However, these
- * functions are special enough to be allowed this
- * kind of behavior. Moreover, this kind of optimization
- * is very important and prevents any window spill/
- * fill/clean traps in these very core kernel functions.
+ * leaf-optimized procedures. This kind of optimization
+ * is very important and prevents any implicit window
+ * spill/fill/clean traps in these very core kernel
+ * functions.
  */
 	
Index: arch/sparc64/src/sparc64.c
===================================================================
--- arch/sparc64/src/sparc64.c	(revision 414f59ca675dbed4c5fbbf96fbd18a90f0829ed6)
+++ arch/sparc64/src/sparc64.c	(revision 62e015ffecd917fbbb4245db0a32f65a0246149f)
@@ -28,4 +28,8 @@
 
 #include <arch.h>
+#include <print.h>
+#include <arch/asm.h>
+#include <memstr.h>
+#include <arch/trap_table.h>
 
 void arch_pre_mm_init(void)
@@ -39,4 +43,12 @@
 void arch_pre_smp_init(void)
 {
+	/*
+	 * Copy OFW's trap table into kernel and point TBA there.
+	 */
+	memcpy((void *) trap_table, (void *) tba_read(), TRAP_TABLE_SIZE);
+/*
+ *	TBA cannot be changed until there are means of getting it into TLB.
+ *	tba_write((__u64) trap_table);
+ */
 }
 
Index: arch/sparc64/src/start.S
===================================================================
--- arch/sparc64/src/start.S	(revision 414f59ca675dbed4c5fbbf96fbd18a90f0829ed6)
+++ arch/sparc64/src/start.S	(revision 62e015ffecd917fbbb4245db0a32f65a0246149f)
@@ -52,8 +52,7 @@
 1:
 	set ofw, %l0
-	stx %o4, [%l0]
 
 	call ofw_init
-	nop
+	stx %o4, [%l0]
 
 	call main_bsp
Index: arch/sparc64/src/trap_table.S
===================================================================
--- arch/sparc64/src/trap_table.S	(revision 62e015ffecd917fbbb4245db0a32f65a0246149f)
+++ arch/sparc64/src/trap_table.S	(revision 62e015ffecd917fbbb4245db0a32f65a0246149f)
@@ -0,0 +1,100 @@
+#
+# Copyright (C) 2005 Jakub Jermar
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# - Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# - Redistributions in binary form must reproduce the above copyright
+#   notice, this list of conditions and the following disclaimer in the
+#   documentation and/or other materials provided with the distribution.
+# - The name of the author may not be used to endorse or promote products
+#   derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+/**
+ * This file contains two trap tables. First, trap_table, is the one
+ * to wich kernel copies OFW's own trap table and patches it with
+ * kernel-provided handlers from the second trap table, trap_table_kernel.
+ */
+ 
+.text
+
+#include <arch/trap_table.h>
+
+#define TABLE_SIZE	TRAP_TABLE_SIZE
+#define ENTRY_SIZE	TRAP_TABLE_ENTRY_SIZE
+
+
+/*
+ * Trap table for copy of OFW's own trap table.
+ */
+.align TABLE_SIZE
+.global trap_table
+trap_table:
+	.space TABLE_SIZE, 0
+
+
+/*
+ * Kernel-provided trap handlers.
+ */
+.global trap_table_kernel
+trap_table_kernel:
+
+/*
+ * Hardware interrupts for TL=0.
+ */
+.org trap_table_kernel + 0*ENTRY_SIZE
+tl_0_hardware_traps:
+
+/*
+ * Register window spill/fill/clean traps for TL=0.
+ */
+.org trap_table_kernel + 128*ENTRY_SIZE
+tl_0_regwin_traps:
+
+/*
+ * Software traps for TL=0.
+ */
+.org trap_table_kernel + 256*ENTRY_SIZE
+tl_0_software_traps:
+
+/* Reserved area. */
+.org trap_table_kernel + 384*ENTRY_SIZE
+.space 128*ENTRY_SIZE, 0
+
+/*
+ * Hardware interrupts for TL>0.
+ */
+.org trap_table_kernel + 512*ENTRY_SIZE
+tl_non_0_hardware_traps:
+
+/*
+ * Register window spill/fill/clean traps for TL>0.
+ */
+.org trap_table_kernel + 640*ENTRY_SIZE
+tl_non_0_regwin_traps:
+
+/*
+ * Software traps for TL>0.
+ */
+.org trap_table_kernel + 768*ENTRY_SIZE
+tl_non_0_software_traps:
+
+/* Reserved area. */
+.org trap_table_kernel + 896*ENTRY_SIZE
+.space 128*ENTRY_SIZE, 0
