Index: arch/ia32/include/atomic.h
===================================================================
--- arch/ia32/include/atomic.h	(revision b4cad8b234012f4ac6c23239284b926c9dd31cbd)
+++ arch/ia32/include/atomic.h	(revision 10c071e7eba787c7e29f0c9d920979d81ea32e19)
@@ -60,25 +60,27 @@
 }
 
-static inline atomic_t atomic_inc_pre(atomic_t *val) 
+static inline count_t atomic_inc_pre(atomic_t *val) 
 {
-	atomic_t r;
+	count_t r;
+
 	__asm__ volatile (
 		"movl $1, %0\n"
 		"lock xaddl %0, %1\n"
-		: "=r"(r), "=m" (val->count)
+		: "=r" (r), "=m" (val->count)
 	);
+
 	return r;
 }
 
-
-
-static inline atomic_t atomic_dec_pre(atomic_t *val) 
+static inline count_t atomic_dec_pre(atomic_t *val) 
 {
-	atomic_t r;
+	count_t r;
+	
 	__asm__ volatile (
 		"movl $-1, %0\n"
 		"lock xaddl %0, %1\n"
-		: "=r"(r), "=m" (*val)
+		: "=r" (r), "=m" (*val)
 	);
+	
 	return r;
 }
Index: arch/ia64/include/atomic.h
===================================================================
--- arch/ia64/include/atomic.h	(revision b4cad8b234012f4ac6c23239284b926c9dd31cbd)
+++ arch/ia64/include/atomic.h	(revision 10c071e7eba787c7e29f0c9d920979d81ea32e19)
@@ -34,9 +34,15 @@
 typedef struct { volatile __u64 count; } atomic_t;
 
-static inline atomic_t atomic_add(atomic_t *val, int imm)
+/** Atomic addition.
+ *
+ * @param val Atomic value.
+ * @param imm Value to add.
+ *
+ * @return Value after addition.
+ */
+static inline count_t atomic_add(atomic_t *val, int imm)
 {
-	atomic_t v;
+	count_t v;
 
-	
  	__asm__ volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (val->count) : "i" (imm));
  
@@ -57,11 +63,9 @@
 static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); }
 
+static inline count_t atomic_inc_pre(atomic_t *val) { return atomic_add(val, 1); }
+static inline count_t atomic_dec_pre(atomic_t *val) { return atomic_add(val, -1); }
 
-static inline atomic_t atomic_inc_pre(atomic_t *val) { return atomic_add(val, 1); }
-static inline atomic_t atomic_dec_pre(atomic_t *val) { return atomic_add(val, -1); }
-
-
-static inline atomic_t atomic_inc_post(atomic_t *val) { return atomic_add(val, 1) + 1; }
-static inline atomic_t atomic_dec_post(atomic_t *val) { return atomic_add(val, -1) - 1; }
+static inline count_t atomic_inc_post(atomic_t *val) { return atomic_add(val, 1) + 1; }
+static inline count_t atomic_dec_post(atomic_t *val) { return atomic_add(val, -1) - 1; }
 
 #endif
Index: arch/mips32/include/atomic.h
===================================================================
--- arch/mips32/include/atomic.h	(revision b4cad8b234012f4ac6c23239284b926c9dd31cbd)
+++ arch/mips32/include/atomic.h	(revision 10c071e7eba787c7e29f0c9d920979d81ea32e19)
@@ -51,7 +51,7 @@
  * @return Value after addition.
  */
-static inline atomic_t atomic_add(atomic_t *val, int i)
+static inline count_t atomic_add(atomic_t *val, int i)
 {
-	atomic_t tmp, v;
+	count_t tmp, v;
 
 	__asm__ volatile (
Index: arch/sparc64/include/atomic.h
===================================================================
--- arch/sparc64/include/atomic.h	(revision b4cad8b234012f4ac6c23239284b926c9dd31cbd)
+++ arch/sparc64/include/atomic.h	(revision 10c071e7eba787c7e29f0c9d920979d81ea32e19)
@@ -39,11 +39,23 @@
  */
 
-static inline void atomic_inc(atomic_t *val) {
+static inline void atomic_inc(atomic_t *val)
+{
 	val->count++;
 }
 
-static inline void atomic_dec(atomic_t *val) {
+static inline void atomic_dec(atomic_t *val)
+{
 	val->count--;
 }
 
+static inline void atomic_set(atomic_t *val, __u64 i)
+{
+	val->count = i;
+}
+
+static inline __u64 atomic_get(atomic_t *val)
+{
+	return val->count;
+}
+
 #endif
Index: arch/sparc64/include/trap.h
===================================================================
--- arch/sparc64/include/trap.h	(revision b4cad8b234012f4ac6c23239284b926c9dd31cbd)
+++ arch/sparc64/include/trap.h	(revision 10c071e7eba787c7e29f0c9d920979d81ea32e19)
@@ -30,4 +30,14 @@
 #define __sparc64_TRAP_H__
 
+#include <arch/trap_table.h>
+#include <arch/asm.h>
+
+/** Switch to in-kernel trap table. */
+static inline void trap_switch_trap_table(void)
+{
+	/* Point TBA to kernel copy of OFW's trap table. */
+	tba_write((__u64) trap_table);
+}
+
 extern void trap_init(void);
 
Index: arch/sparc64/src/mm/tlb.c
===================================================================
--- arch/sparc64/src/mm/tlb.c	(revision b4cad8b234012f4ac6c23239284b926c9dd31cbd)
+++ arch/sparc64/src/mm/tlb.c	(revision 10c071e7eba787c7e29f0c9d920979d81ea32e19)
@@ -36,4 +36,5 @@
 #include <typedefs.h>
 #include <config.h>
+#include <arch/trap.h>
 
 /** Initialize ITLB and DTLB.
@@ -44,4 +45,7 @@
  * After TLB is initialized, MMU is enabled
  * again.
+ *
+ * Switching MMU off imposes the requirement for
+ * the kernel to run in identity mapped environment.
  */
 void tlb_arch_init(void)
@@ -82,4 +86,11 @@
 	dtlb_data_in_write(data.value);
 
+	/*
+	 * Register window traps can occur before MMU is enabled again.
+	 * This ensures that any such traps will be handled from 
+	 * kernel identity mapped trap handler.
+	 */
+	trap_switch_trap_table();
+	
 	tlb_invalidate_all();
 
Index: arch/sparc64/src/sparc64.c
===================================================================
--- arch/sparc64/src/sparc64.c	(revision b4cad8b234012f4ac6c23239284b926c9dd31cbd)
+++ arch/sparc64/src/sparc64.c	(revision 10c071e7eba787c7e29f0c9d920979d81ea32e19)
@@ -36,4 +36,5 @@
 {
 	ofw_sparc64_console_init();
+	trap_init();
 }
 
@@ -44,5 +45,4 @@
 void arch_pre_smp_init(void)
 {
-	trap_init();
 }
 
Index: arch/sparc64/src/trap.c
===================================================================
--- arch/sparc64/src/trap.c	(revision b4cad8b234012f4ac6c23239284b926c9dd31cbd)
+++ arch/sparc64/src/trap.c	(revision 10c071e7eba787c7e29f0c9d920979d81ea32e19)
@@ -32,4 +32,5 @@
 #include <memstr.h>
 
+/** Initialize trap table. */
 void trap_init(void)
 {
@@ -38,6 +39,3 @@
 	 */
 	memcpy((void *) trap_table, (void *) tba_read(), TRAP_TABLE_SIZE);
-
-	/* Point TBA to kernel copy of OFW's trap table. */
-	tba_write((__u64) trap_table);
 }
Index: test/synch/rwlock5/test.c
===================================================================
--- test/synch/rwlock5/test.c	(revision b4cad8b234012f4ac6c23239284b926c9dd31cbd)
+++ test/synch/rwlock5/test.c	(revision 10c071e7eba787c7e29f0c9d920979d81ea32e19)
@@ -86,6 +86,6 @@
 		thread_t *thrd;
 
-		items_read = 0;
-		items_written = 0;
+		atomic_set(&items_read, 0);
+		atomic_set(&items_written, 0);
 
 		readers = i*READERS;
@@ -116,6 +116,6 @@
 		waitq_wakeup(&can_start, WAKEUP_ALL);
 	
-		while (items_read != readers || items_written != writers) {
-			printf("%d readers remaining, %d writers remaining, readers_in=%d\n", readers - items_read, writers - items_written, rwlock.readers_in);
+		while (items_read.count != readers || items_written.count != writers) {
+			printf("%d readers remaining, %d writers remaining, readers_in=%d\n", readers - items_read.count, writers - items_written.count, rwlock.readers_in);
 			thread_usleep(100000);
 		}
Index: test/synch/semaphore1/test.c
===================================================================
--- test/synch/semaphore1/test.c	(revision b4cad8b234012f4ac6c23239284b926c9dd31cbd)
+++ test/synch/semaphore1/test.c	(revision 10c071e7eba787c7e29f0c9d920979d81ea32e19)
@@ -90,6 +90,6 @@
 		thread_t *thrd;
 
-		items_produced = 0;
-		items_consumed = 0;
+		atomic_set(&items_produced, 0);
+		atomic_set(&items_consumed, 0);
 		
 		consumers = i * CONSUMERS;
@@ -120,6 +120,6 @@
 		waitq_wakeup(&can_start, WAKEUP_ALL);
 	
-		while (items_consumed != consumers || items_produced != producers) {
-			printf("%d consumers remaining, %d producers remaining\n", consumers - items_consumed, producers - items_produced);
+		while (items_consumed.count != consumers || items_produced.count != producers) {
+			printf("%d consumers remaining, %d producers remaining\n", consumers - items_consumed.count, producers - items_produced.count);
 			thread_sleep(1);
 		}
