Index: arch/sparc64/include/memstr.h
===================================================================
--- arch/sparc64/include/memstr.h	(revision 49b6d32c4bf731f668a2569fb78160da0299283f)
+++ arch/sparc64/include/memstr.h	(revision 5753fbb46440d4f6fb6f2bbc7cfe0f3b24ba615a)
@@ -30,5 +30,5 @@
 #define __sparc64_MEMSTR_H__
 
-#define memcpy(dst, src, cnt)  __builtin_memcpy((dst), (src), (cnt));
+#define memcpy(dst, src, cnt)  __builtin_memcpy((dst), (src), (cnt))
 
 extern void memsetw(__address dst, size_t cnt, __u16 x);
Index: arch/sparc64/include/trap/regwin.h
===================================================================
--- arch/sparc64/include/trap/regwin.h	(revision 49b6d32c4bf731f668a2569fb78160da0299283f)
+++ arch/sparc64/include/trap/regwin.h	(revision 5753fbb46440d4f6fb6f2bbc7cfe0f3b24ba615a)
@@ -64,4 +64,5 @@
 #define I7_OFFSET	120
 
+#ifdef __ASM__
 .macro SPILL_NORMAL_HANDLER
 	stx %l0, [%sp + STACK_BIAS + L0_OFFSET]	
@@ -126,4 +127,5 @@
 	retry
 .endm
+#endif /* __ASM__ */
 
 #endif
Index: arch/sparc64/include/trap/trap.h
===================================================================
--- arch/sparc64/include/trap/trap.h	(revision 49b6d32c4bf731f668a2569fb78160da0299283f)
+++ arch/sparc64/include/trap/trap.h	(revision 5753fbb46440d4f6fb6f2bbc7cfe0f3b24ba615a)
@@ -41,4 +41,5 @@
 
 extern void trap_init(void);
+extern void trap_install_handler(index_t tt, size_t len, bool tlnonz);
 
 #endif
Index: arch/sparc64/include/trap/trap_table.h
===================================================================
--- arch/sparc64/include/trap/trap_table.h	(revision 49b6d32c4bf731f668a2569fb78160da0299283f)
+++ arch/sparc64/include/trap/trap_table.h	(revision 5753fbb46440d4f6fb6f2bbc7cfe0f3b24ba615a)
@@ -47,5 +47,5 @@
 extern trap_table_entry_t trap_table[TRAP_TABLE_ENTRY_COUNT];
 extern trap_table_entry_t trap_table_kernel[TRAP_TABLE_ENTRY_COUNT];
-#endif /* __ASM__ */
+#endif /* !__ASM__ */
 
 #endif
Index: arch/sparc64/src/trap/trap.c
===================================================================
--- arch/sparc64/src/trap/trap.c	(revision 49b6d32c4bf731f668a2569fb78160da0299283f)
+++ arch/sparc64/src/trap/trap.c	(revision 5753fbb46440d4f6fb6f2bbc7cfe0f3b24ba615a)
@@ -29,6 +29,10 @@
 #include <arch/trap/trap.h>
 #include <arch/trap/trap_table.h>
+#include <arch/trap/regwin.h>
 #include <arch/asm.h>
 #include <memstr.h>
+#include <debug.h>
+#include <arch/types.h>
+#include <typedefs.h>
 
 /** Initialize trap table. */
@@ -39,3 +43,36 @@
 	 */
 	memcpy((void *) trap_table, (void *) tba_read(), TRAP_TABLE_SIZE);
+	
+	/*
+	 * Install kernel-provided handlers.
+	 */
+	trap_install_handler(TT_CLEAN_WINDOW, CLEAN_WINDOW_HANDLER_SIZE, false);
+	trap_install_handler(TT_SPILL_0_NORMAL, SPILL_HANDLER_SIZE, false);
+	trap_install_handler(TT_FILL_0_NORMAL, FILL_HANDLER_SIZE, false);
 }
+
+/** Copy trap handler to active trap table.
+ *
+ * The handler is copied from trap_table_kernel to trap_handler.
+ *
+ * @param tt Trap type. An index that uniquelly identifies handler code.
+ * @param len Length of the handler in bytes. Must be multiple of TRAP_TABLE_ENTRY_SIZE (i.e. 32).
+ * @param tlnonz If false, tt is considered from the lower half of trap table. If true, the upper half is chosen.
+ */
+void trap_install_handler(index_t tt, size_t len, bool tlnonz)
+{
+	count_t cnt;
+	int i;
+
+	ASSERT(tt < TRAP_TABLE_ENTRY_COUNT/2);
+	ASSERT(len % TRAP_TABLE_ENTRY_SIZE == 0);
+
+	if (tlnonz)
+		tt += TRAP_TABLE_ENTRY_COUNT/2;
+
+	cnt = len/TRAP_TABLE_ENTRY_SIZE;
+	
+	for (i = tt; i < tt + cnt; i++) {
+		trap_table[i] = trap_table_kernel[i];
+	}	
+}
