Index: kernel/arch/abs32le/include/mm/page.h
===================================================================
--- kernel/arch/abs32le/include/mm/page.h	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/abs32le/include/mm/page.h	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -105,4 +105,12 @@
 	set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x))
 
+/* Set PTE present bit accessors for each level. */
+#define SET_PTL1_PRESENT_ARCH(ptl0, i)	\
+	set_pt_present((pte_t *) (ptl0), (size_t) (i))
+#define SET_PTL2_PRESENT_ARCH(ptl1, i)
+#define SET_PTL3_PRESENT_ARCH(ptl2, i)
+#define SET_FRAME_PRESENT_ARCH(ptl3, i) \
+	set_pt_present((pte_t *) (ptl3), (size_t) (i))
+
 /* Macros for querying the last level entries. */
 #define PTE_VALID_ARCH(p) \
@@ -173,4 +181,13 @@
 }
 
+NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i)
+    WRITES(ARRAY_RANGE(pt, PTL0_ENTRIES_ARCH))
+    REQUIRES_ARRAY_MUTABLE(pt, PTL0_ENTRIES_ARCH)
+{
+	pte_t *p = &pt[i];
+
+	p->present = 1;
+}
+
 extern void page_arch_init(void);
 extern void page_fault(unsigned int, istate_t *);
Index: kernel/arch/amd64/Makefile.inc
===================================================================
--- kernel/arch/amd64/Makefile.inc	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/amd64/Makefile.inc	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -55,5 +55,4 @@
 GCC_CFLAGS += $(CMN1)
 ICC_CFLAGS += $(CMN1)
-SUNCC_CFLAGS += -m64 -xmodel=kernel
 
 BITS = 64
@@ -67,5 +66,4 @@
 	GCC_CFLAGS += $(CMN2)
 	ICC_CFLAGS += $(CMN2)
-	SUNCC_CFLAGS += -xtarget=opteron
 endif
 
Index: kernel/arch/amd64/include/mm/page.h
===================================================================
--- kernel/arch/amd64/include/mm/page.h	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/amd64/include/mm/page.h	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -33,13 +33,4 @@
  */
 
-/** Paging on AMD64
- *
- * The space is divided in positive numbers (uspace) and
- * negative numbers (kernel). The 'negative' space starting
- * with 0xffff800000000000 and ending with 0xffffffffffffffff
- * is identically mapped physical memory.
- *
- */
-
 #ifndef KERN_amd64_PAGE_H_
 #define KERN_amd64_PAGE_H_
@@ -127,4 +118,14 @@
 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \
 	set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x))
+
+/* Set PTE present bit accessors for each level. */
+#define SET_PTL1_PRESENT_ARCH(ptl0, i) \
+	set_pt_present((pte_t *) (ptl0), (size_t) (i))
+#define SET_PTL2_PRESENT_ARCH(ptl1, i) \
+	set_pt_present((pte_t *) (ptl1), (size_t) (i))
+#define SET_PTL3_PRESENT_ARCH(ptl2, i) \
+	set_pt_present((pte_t *) (ptl2), (size_t) (i))
+#define SET_FRAME_PRESENT_ARCH(ptl3, i) \
+	set_pt_present((pte_t *) (ptl3), (size_t) (i))
 
 /* Macros for querying the last-level PTE entries. */
@@ -224,4 +225,11 @@
 }
 
+NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i)
+{
+	pte_t *p = &pt[i];
+
+	p->present = 1;
+}
+
 extern void page_arch_init(void);
 extern void page_fault(unsigned int, istate_t *);
Index: kernel/arch/amd64/src/mm/page.c
===================================================================
--- kernel/arch/amd64/src/mm/page.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/amd64/src/mm/page.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -57,5 +57,5 @@
 	uintptr_t cur;
 	unsigned int identity_flags =
-	    PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL | PAGE_WRITE;
+	    PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE | PAGE_READ;
 		
 	page_mapping_operations = &pt_mapping_operations;
Index: kernel/arch/amd64/src/userspace.c
===================================================================
--- kernel/arch/amd64/src/userspace.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/amd64/src/userspace.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -55,5 +55,5 @@
 	asm volatile (
 		"pushq %[udata_des]\n"
-		"pushq %[stack_size]\n"
+		"pushq %[stack_top]\n"
 		"pushq %[ipl]\n"
 		"pushq %[utext_des]\n"
@@ -65,5 +65,6 @@
 		"iretq\n"
 		:: [udata_des] "i" (GDT_SELECTOR(UDATA_DES) | PL_USER),
-		   [stack_size] "r" (kernel_uarg->uspace_stack + STACK_SIZE),
+		   [stack_top] "r" ((uint8_t *) kernel_uarg->uspace_stack +
+		       kernel_uarg->uspace_stack_size),
 		   [ipl] "r" (ipl),
 		   [utext_des] "i" (GDT_SELECTOR(UTEXT_DES) | PL_USER),
@@ -74,6 +75,5 @@
 	
 	/* Unreachable */
-	while (1)
-		;
+	while (1);
 }
 
Index: kernel/arch/arm32/include/mm/page.h
===================================================================
--- kernel/arch/arm32/include/mm/page.h	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/arm32/include/mm/page.h	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -40,4 +40,5 @@
 #include <mm/mm.h>
 #include <arch/exception.h>
+#include <arch/barrier.h>
 #include <trace.h>
 
@@ -118,5 +119,13 @@
 #define SET_PTL3_FLAGS_ARCH(ptl2, i, x)
 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \
-        set_pt_level1_flags((pte_t *) (ptl3), (size_t) (i), (x))
+	set_pt_level1_flags((pte_t *) (ptl3), (size_t) (i), (x))
+
+/* Set PTE present bit accessors for each level. */
+#define SET_PTL1_PRESENT_ARCH(ptl0, i) \
+	set_pt_level0_present((pte_t *) (ptl0), (size_t) (i))
+#define SET_PTL2_PRESENT_ARCH(ptl1, i)
+#define SET_PTL3_PRESENT_ARCH(ptl2, i)
+#define SET_FRAME_PRESENT_ARCH(ptl3, i) \
+	set_pt_level1_present((pte_t *) (ptl3), (size_t) (i))
 
 #if defined(PROCESSOR_armv7_a)
@@ -126,4 +135,24 @@
 #endif
 
+#ifndef __ASM__
+NO_TRACE static inline void set_pt_level0_present(pte_t *pt, size_t i)
+{
+	pte_level0_t *p = &pt[i].l0;
+
+	p->should_be_zero = 0;
+	write_barrier();
+	p->descriptor_type = PTE_DESCRIPTOR_COARSE_TABLE;
+}
+
+
+NO_TRACE static inline void set_pt_level1_present(pte_t *pt, size_t i)
+{
+	pte_level1_t *p = &pt[i].l1;
+
+	p->descriptor_type = PTE_DESCRIPTOR_SMALL_PAGE;
+}
+
+#endif /* __ASM__ */
+
 #endif
 
Index: kernel/arch/arm32/include/mm/page_armv4.h
===================================================================
--- kernel/arch/arm32/include/mm/page_armv4.h	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/arm32/include/mm/page_armv4.h	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -215,11 +215,8 @@
 	pte_level1_t *p = &pt[i].l1;
 	
-	if (flags & PAGE_NOT_PRESENT) {
+	if (flags & PAGE_NOT_PRESENT)
 		p->descriptor_type = PTE_DESCRIPTOR_NOT_PRESENT;
-		p->access_permission_3 = 1;
-	} else {
+	else
 		p->descriptor_type = PTE_DESCRIPTOR_SMALL_PAGE;
-		p->access_permission_3 = p->access_permission_0;
-	}
 	
 	p->cacheable = p->bufferable = (flags & PAGE_CACHEABLE) != 0;
Index: kernel/arch/arm32/src/userspace.c
===================================================================
--- kernel/arch/arm32/src/userspace.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/arm32/src/userspace.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -92,5 +92,6 @@
 
 	/* set user stack */
-	ustate.sp = ((uint32_t)kernel_uarg->uspace_stack) + STACK_SIZE;
+	ustate.sp = ((uint32_t) kernel_uarg->uspace_stack) +
+	    kernel_uarg->uspace_stack_size;
 
 	/* set where uspace execution starts */
Index: kernel/arch/ia32/Makefile.inc
===================================================================
--- kernel/arch/ia32/Makefile.inc	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/ia32/Makefile.inc	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -38,5 +38,4 @@
 GCC_CFLAGS += $(CMN1)
 ICC_CFLAGS += $(CMN1)
-SUNCC_CFLAGS += $(CMN1)
 CLANG_CFLAGS += $(CMN1)
 
@@ -50,25 +49,20 @@
 ifeq ($(PROCESSOR),athlon_xp)
 	CMN2 = -march=athlon-xp
-	SUNCC_CFLAGS += -xarch=ssea
 endif
 
 ifeq ($(PROCESSOR),athlon_mp)
 	CMN2 = -march=athlon-mp
-	SUNCC_CFLAGS += xarch=ssea
 endif
 
 ifeq ($(PROCESSOR),pentium3)
 	CMN2 = -march=pentium3
-	SUNCC_CFLAGS += -xarch=sse
 endif
 
 ifeq ($(PROCESSOR),pentium4)
 	CMN2 = -march=pentium4
-	SUNCC_CFLAGS += -xarch=sse2
 endif
 
 ifeq ($(PROCESSOR),core)
 	CMN2 = -march=prescott
-	SUNCC_CFLAGS += -xarch=sse3
 endif
 
Index: kernel/arch/ia32/include/mm/page.h
===================================================================
--- kernel/arch/ia32/include/mm/page.h	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/ia32/include/mm/page.h	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -115,4 +115,12 @@
 	set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x))
 
+/* Set PTE present bit accessors for each level. */
+#define SET_PTL1_PRESENT_ARCH(ptl0, i) \
+	set_pt_present((pte_t *) (ptl0), (size_t) (i))
+#define SET_PTL2_PRESENT_ARCH(ptl1, i)
+#define SET_PTL3_PRESENT_ARCH(ptl2, i)
+#define SET_FRAME_PRESENT_ARCH(ptl3, i) \
+	set_pt_present((pte_t *) (ptl3), (size_t) (i))
+
 /* Macros for querying the last level entries. */
 #define PTE_VALID_ARCH(p) \
@@ -194,4 +202,11 @@
 }
 
+NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i)
+{
+	pte_t *p = &pt[i];
+
+	p->present = 1;
+}
+
 extern void page_arch_init(void);
 extern void page_fault(unsigned int, istate_t *);
Index: kernel/arch/ia32/src/mm/page.c
===================================================================
--- kernel/arch/ia32/src/mm/page.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/ia32/src/mm/page.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -71,8 +71,5 @@
 	for (cur = 0; cur < min(config.identity_size, config.physmem_end);
 	    cur += FRAME_SIZE) {
-		flags = PAGE_CACHEABLE | PAGE_WRITE;
-		if ((PA2KA(cur) >= config.base) &&
-		    (PA2KA(cur) < config.base + config.kernel_size))
-			flags |= PAGE_GLOBAL;
+		flags = PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_WRITE | PAGE_READ;
 		page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
 	}
Index: kernel/arch/ia32/src/smp/apic.c
===================================================================
--- kernel/arch/ia32/src/smp/apic.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/ia32/src/smp/apic.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -259,4 +259,24 @@
 }
 
+#define DELIVS_PENDING_SILENT_RETRIES	4	
+
+static void l_apic_wait_for_delivery(void)
+{
+	icr_t icr;
+	unsigned retries = 0;
+
+	do {
+		if (retries++ > DELIVS_PENDING_SILENT_RETRIES) {
+			retries = 0;
+#ifdef CONFIG_DEBUG
+			printf("IPI is pending.\n");
+#endif
+			delay(20);
+		}
+		icr.lo = l_apic[ICRlo];
+	} while (icr.delivs == DELIVS_PENDING);
+	
+}
+
 /** Send all CPUs excluding CPU IPI vector.
  *
@@ -279,11 +299,6 @@
 	
 	l_apic[ICRlo] = icr.lo;
-	
-	icr.lo = l_apic[ICRlo];
-	if (icr.delivs == DELIVS_PENDING) {
-#ifdef CONFIG_DEBUG
-		printf("IPI is pending.\n");
-#endif
-	}
+
+	l_apic_wait_for_delivery();
 	
 	return apic_poll_errors();
@@ -327,11 +342,7 @@
 		return 0;
 	
+	l_apic_wait_for_delivery();
+
 	icr.lo = l_apic[ICRlo];
-	if (icr.delivs == DELIVS_PENDING) {
-#ifdef CONFIG_DEBUG
-		printf("IPI is pending.\n");
-#endif
-	}
-	
 	icr.delmod = DELMOD_INIT;
 	icr.destmod = DESTMOD_PHYS;
Index: kernel/arch/ia32/src/userspace.c
===================================================================
--- kernel/arch/ia32/src/userspace.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/ia32/src/userspace.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -63,5 +63,5 @@
 		
 		"pushl %[udata_des]\n"
-		"pushl %[stack_size]\n"
+		"pushl %[stack_top]\n"
 		"pushl %[ipl]\n"
 		"pushl %[utext_des]\n"
@@ -75,5 +75,6 @@
 		:
 		: [udata_des] "i" (GDT_SELECTOR(UDATA_DES) | PL_USER),
-		  [stack_size] "r" ((uint8_t *) kernel_uarg->uspace_stack + STACK_SIZE),
+		  [stack_top] "r" ((uint8_t *) kernel_uarg->uspace_stack +
+		      kernel_uarg->uspace_stack_size),
 		  [ipl] "r" (ipl),
 		  [utext_des] "i" (GDT_SELECTOR(UTEXT_DES) | PL_USER),
Index: kernel/arch/ia64/src/drivers/ski.c
===================================================================
--- kernel/arch/ia64/src/drivers/ski.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/ia64/src/drivers/ski.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -150,6 +150,6 @@
 	
 	if (instance) {
-		instance->thread = thread_create(kskipoll, instance, TASK, 0,
-		    "kskipoll", true);
+		instance->thread = thread_create(kskipoll, instance, TASK,
+		    THREAD_FLAG_UNCOUNTED, "kskipoll");
 		
 		if (!instance->thread) {
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/ia64/src/ia64.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -232,14 +232,16 @@
 	 *
 	 * When calculating stack addresses, mind the stack split between the
-	 * memory stack and the RSE stack. Each occuppies STACK_SIZE / 2 bytes.
+	 * memory stack and the RSE stack. Each occuppies
+	 * uspace_stack_size / 2 bytes.
 	 */
 	switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry,
-	    ((uintptr_t) kernel_uarg->uspace_stack) + STACK_SIZE / 2 -
+	    ((uintptr_t) kernel_uarg->uspace_stack) +
+	    kernel_uarg->uspace_stack_size / 2 -
 	    ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT),
-	    ((uintptr_t) kernel_uarg->uspace_stack) + STACK_SIZE / 2,
+	    ((uintptr_t) kernel_uarg->uspace_stack) +
+	    kernel_uarg->uspace_stack_size / 2,
 	    (uintptr_t) kernel_uarg->uspace_uarg, psr.value, rsc.value);
-
-	while (1)
-		;
+	
+	while (1);
 }
 
Index: kernel/arch/mips32/include/mm/page.h
===================================================================
--- kernel/arch/mips32/include/mm/page.h	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/mips32/include/mm/page.h	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -128,4 +128,12 @@
 	set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x))
 
+/* Set PTE present bit accessors for each level. */
+#define SET_PTL1_PRESENT_ARCH(ptl0, i) \
+	set_pt_present((pte_t *) (ptl0), (size_t) (i))
+#define SET_PTL2_PRESENT_ARCH(ptl1, i)
+#define SET_PTL3_PRESENT_ARCH(ptl2, i)
+#define SET_FRAME_PRESENT_ARCH(ptl3, i) \
+	set_pt_present((pte_t *) (ptl3), (size_t) (i))
+
 /* Last-level info macros. */
 #define PTE_VALID_ARCH(pte)			(*((uint32_t *) (pte)) != 0)
@@ -182,4 +190,12 @@
 }
 
+NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i)
+{
+	pte_t *p = &pt[i];
+
+	p->p = 1;
+}
+	
+
 extern void page_arch_init(void);
 
Index: kernel/arch/mips32/src/mips32.c
===================================================================
--- kernel/arch/mips32/src/mips32.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/mips32/src/mips32.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -211,5 +211,6 @@
 	    cp0_status_um_bit | cp0_status_ie_enabled_bit));
 	cp0_epc_write((uintptr_t) kernel_uarg->uspace_entry);
-	userspace_asm(((uintptr_t) kernel_uarg->uspace_stack + STACK_SIZE),
+	userspace_asm(((uintptr_t) kernel_uarg->uspace_stack +
+	    kernel_uarg->uspace_stack_size),
 	    (uintptr_t) kernel_uarg->uspace_uarg,
 	    (uintptr_t) kernel_uarg->uspace_entry);
Index: kernel/arch/mips64/src/mips64.c
===================================================================
--- kernel/arch/mips64/src/mips64.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/mips64/src/mips64.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -188,5 +188,6 @@
 	    cp0_status_um_bit | cp0_status_ie_enabled_bit));
 	cp0_epc_write((uintptr_t) kernel_uarg->uspace_entry);
-	userspace_asm(((uintptr_t) kernel_uarg->uspace_stack + STACK_SIZE),
+	userspace_asm(((uintptr_t) kernel_uarg->uspace_stack +
+	    kernel_uarg->uspace_stack_size),
 	    (uintptr_t) kernel_uarg->uspace_uarg,
 	    (uintptr_t) kernel_uarg->uspace_entry);
Index: kernel/arch/ppc32/include/mm/page.h
===================================================================
--- kernel/arch/ppc32/include/mm/page.h	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/ppc32/include/mm/page.h	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -128,4 +128,14 @@
 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \
 	set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x))
+
+/* Set PTE present accessors for each level. */
+#define SET_PTL1_PRESENT_ARCH(ptl0, i) \
+	set_pt_present((pte_t *) (ptl0), (size_t) (i))
+
+#define SET_PTL2_PRESENT_ARCH(ptl1, i)
+#define SET_PTL3_PRESENT_ARCH(ptl2, i)
+
+#define SET_FRAME_PRESENT_ARCH(ptl3, i) \
+	set_pt_present((pte_t *) (ptl3), (size_t) (i))
 
 /* Macros for querying the last-level PTEs. */
@@ -175,4 +185,11 @@
 }
 
+NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i)
+{
+	pte_t *entry = &pt[i];
+
+	entry->present = 1;
+}
+
 extern void page_arch_init(void);
 
Index: kernel/arch/ppc32/src/ppc32.c
===================================================================
--- kernel/arch/ppc32/src/ppc32.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/ppc32/src/ppc32.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -269,5 +269,6 @@
 {
 	userspace_asm((uintptr_t) kernel_uarg->uspace_uarg,
-	    (uintptr_t) kernel_uarg->uspace_stack + STACK_SIZE - SP_DELTA,
+	    (uintptr_t) kernel_uarg->uspace_stack +
+	    kernel_uarg->uspace_stack_size - SP_DELTA,
 	    (uintptr_t) kernel_uarg->uspace_entry);
 	
Index: kernel/arch/sparc64/Makefile.inc
===================================================================
--- kernel/arch/sparc64/Makefile.inc	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/sparc64/Makefile.inc	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -32,5 +32,4 @@
 
 GCC_CFLAGS += -m64 -mcpu=ultrasparc -mcmodel=medlow -mno-fpu
-SUNCC_CFLAGS += -m64 -xarch=sparc -xregs=appl,no%float
 
 LFLAGS += -no-check-sections
Index: kernel/arch/sparc64/src/drivers/niagara.c
===================================================================
--- kernel/arch/sparc64/src/drivers/niagara.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/sparc64/src/drivers/niagara.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -184,6 +184,6 @@
 	
 	instance = malloc(sizeof(niagara_instance_t), FRAME_ATOMIC);
-	instance->thread = thread_create(kniagarapoll, NULL, TASK, 0,
-	    "kniagarapoll", true);
+	instance->thread = thread_create(kniagarapoll, NULL, TASK,
+	    THREAD_FLAG_UNCOUNTED, "kniagarapoll");
 	
 	if (!instance->thread) {
Index: kernel/arch/sparc64/src/proc/sun4u/scheduler.c
===================================================================
--- kernel/arch/sparc64/src/proc/sun4u/scheduler.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/sparc64/src/proc/sun4u/scheduler.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -51,5 +51,5 @@
 void before_thread_runs_arch(void)
 {
-	if ((THREAD->flags & THREAD_FLAG_USPACE)) {
+	if (THREAD->uspace) {
 		/*
 		 * Write kernel stack address to %g6 of the alternate and
@@ -74,6 +74,6 @@
 void after_thread_ran_arch(void)
 {
-	if ((THREAD->flags & THREAD_FLAG_USPACE)) {
-		/* sample the state of the userspace window buffer */	
+	if (THREAD->uspace) {
+		/* sample the state of the userspace window buffer */
 		THREAD->arch.uspace_window_buffer = (uint8_t *) read_from_ag_g7();
 	}
Index: kernel/arch/sparc64/src/proc/sun4v/scheduler.c
===================================================================
--- kernel/arch/sparc64/src/proc/sun4v/scheduler.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/sparc64/src/proc/sun4v/scheduler.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -54,5 +54,5 @@
 void before_thread_runs_arch(void)
 {
-	if ((THREAD->flags & THREAD_FLAG_USPACE)) {
+	if (THREAD->uspace) {
 		uint64_t sp = (uintptr_t) THREAD->kstack + STACK_SIZE -
 		    (STACK_BIAS + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT));
@@ -66,6 +66,6 @@
 void after_thread_ran_arch(void)
 {
-	if ((THREAD->flags & THREAD_FLAG_USPACE)) {
-		/* sample the state of the userspace window buffer */	
+	if (THREAD->uspace) {
+		/* sample the state of the userspace window buffer */
 		THREAD->arch.uspace_window_buffer =
 		    (uint8_t *) asi_u64_read(ASI_SCRATCHPAD, SCRATCHPAD_WBUF);
Index: kernel/arch/sparc64/src/proc/thread.c
===================================================================
--- kernel/arch/sparc64/src/proc/thread.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/sparc64/src/proc/thread.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -61,5 +61,5 @@
 void thread_create_arch(thread_t *t)
 {
-	if ((t->flags & THREAD_FLAG_USPACE) && (!t->arch.uspace_window_buffer))
+	if ((t->uspace) && (!t->arch.uspace_window_buffer))
 		{
 		/*
Index: kernel/arch/sparc64/src/smp/sun4u/ipi.c
===================================================================
--- kernel/arch/sparc64/src/smp/sun4u/ipi.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/sparc64/src/smp/sun4u/ipi.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -124,5 +124,5 @@
 			(void) interrupts_disable();
 		}
-	} while (done);
+	} while (!done);
 	
 	preemption_enable();
Index: kernel/arch/sparc64/src/sun4u/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sun4u/sparc64.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/sparc64/src/sun4u/sparc64.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -156,11 +156,11 @@
 	(void) interrupts_disable();
 	switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry,
-	    ((uintptr_t) kernel_uarg->uspace_stack) + STACK_SIZE
-	    - (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS),
+	    ((uintptr_t) kernel_uarg->uspace_stack) +
+	    kernel_uarg->uspace_stack_size -
+	    (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS),
 	    (uintptr_t) kernel_uarg->uspace_uarg);
-
-	for (;;)
-		;
-	/* not reached */
+	
+	/* Not reached */
+	while (1);
 }
 
Index: kernel/arch/sparc64/src/sun4v/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sun4v/sparc64.c	(revision 0747468d84f2b1c59f16a0b00b33c12aa2a95e3f)
+++ kernel/arch/sparc64/src/sun4v/sparc64.c	(revision 97c76825acca82d15cb8daa0e50df4f66ffd6c0b)
@@ -154,11 +154,11 @@
 	(void) interrupts_disable();
 	switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry,
-	    ((uintptr_t) kernel_uarg->uspace_stack) + STACK_SIZE
-	    - (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS),
+	    ((uintptr_t) kernel_uarg->uspace_stack) +
+	    kernel_uarg->uspace_stack_size -
+	    (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS),
 	    (uintptr_t) kernel_uarg->uspace_uarg);
-
-	for (;;)
-		;
-	/* not reached */
+	
+	/* Not reached */
+	while (1);
 }
 
