Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision ba9a150799eb4761d670852aa4aa4df033ca853a)
+++ kernel/generic/src/ipc/ipc.c	(revision abf6c018de8e29f417e189c669b1514cb9a75462)
@@ -213,5 +213,8 @@
 errno_t ipc_call_sync(phone_t *phone, call_t *request)
 {
-	answerbox_t *mybox = slab_alloc(answerbox_cache, 0);
+	answerbox_t *mybox = slab_alloc(answerbox_cache, FRAME_ATOMIC);
+	if (!mybox)
+		return ENOMEM;
+
 	ipc_answerbox_init(mybox, TASK);
 
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision ba9a150799eb4761d670852aa4aa4df033ca853a)
+++ kernel/generic/src/main/kinit.c	(revision abf6c018de8e29f417e189c669b1514cb9a75462)
@@ -120,10 +120,9 @@
 		thread = thread_create(kmp, NULL, TASK,
 		    THREAD_FLAG_UNCOUNTED, "kmp");
-		if (thread != NULL) {
-			thread_wire(thread, &cpus[0]);
-			thread_ready(thread);
-		} else
+		if (!thread)
 			panic("Unable to create kmp thread.");
 
+		thread_wire(thread, &cpus[0]);
+		thread_ready(thread);
 		thread_join(thread);
 		thread_detach(thread);
Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision ba9a150799eb4761d670852aa4aa4df033ca853a)
+++ kernel/generic/src/mm/as.c	(revision abf6c018de8e29f417e189c669b1514cb9a75462)
@@ -151,5 +151,8 @@
 as_t *as_create(unsigned int flags)
 {
-	as_t *as = (as_t *) slab_alloc(as_cache, 0);
+	as_t *as = (as_t *) slab_alloc(as_cache, FRAME_ATOMIC);
+	if (!as)
+		return NULL;
+
 	(void) as_create_arch(as, 0);
 
Index: kernel/generic/src/mm/slab.c
===================================================================
--- kernel/generic/src/mm/slab.c	(revision ba9a150799eb4761d670852aa4aa4df033ca853a)
+++ kernel/generic/src/mm/slab.c	(revision abf6c018de8e29f417e189c669b1514cb9a75462)
@@ -667,5 +667,8 @@
     size_t (*destructor)(void *obj), unsigned int flags)
 {
-	slab_cache_t *cache = slab_alloc(&slab_cache_cache, 0);
+	slab_cache_t *cache = slab_alloc(&slab_cache_cache, FRAME_ATOMIC);
+	if (!cache)
+		panic("Not enough memory to allocate slab cache %s.", name);
+
 	_slab_cache_create(cache, name, size, align, constructor, destructor,
 	    flags);
@@ -730,4 +733,7 @@
 NO_TRACE static void _slab_free(slab_cache_t *cache, void *obj, slab_t *slab)
 {
+	if (!obj)
+		return;
+
 	ipl_t ipl = interrupts_disable();
 
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision ba9a150799eb4761d670852aa4aa4df033ca853a)
+++ kernel/generic/src/proc/task.c	(revision abf6c018de8e29f417e189c669b1514cb9a75462)
@@ -199,8 +199,7 @@
 task_t *task_create(as_t *as, const char *name)
 {
-	task_t *task = (task_t *) slab_alloc(task_cache, 0);
-	if (task == NULL) {
+	task_t *task = (task_t *) slab_alloc(task_cache, FRAME_ATOMIC);
+	if (!task)
 		return NULL;
-	}
 
 	task_create_arch(task);
Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision ba9a150799eb4761d670852aa4aa4df033ca853a)
+++ kernel/generic/src/proc/thread.c	(revision abf6c018de8e29f417e189c669b1514cb9a75462)
@@ -165,5 +165,6 @@
 
 #ifdef CONFIG_FPU
-	thread->saved_fpu_context = slab_alloc(fpu_context_cache, kmflags);
+	thread->saved_fpu_context = slab_alloc(fpu_context_cache,
+	    FRAME_ATOMIC | kmflags);
 	if (!thread->saved_fpu_context)
 		return ENOMEM;
@@ -338,5 +339,5 @@
     thread_flags_t flags, const char *name)
 {
-	thread_t *thread = (thread_t *) slab_alloc(thread_cache, 0);
+	thread_t *thread = (thread_t *) slab_alloc(thread_cache, FRAME_ATOMIC);
 	if (!thread)
 		return NULL;
@@ -652,4 +653,8 @@
 
 	return waitq_sleep_timeout(&thread->join_wq, usec, flags, NULL);
+
+	// FIXME: join should deallocate the thread.
+	//        Current code calls detach after join, that's contrary to how
+	//        join is used in other threading APIs.
 }
 
Index: kernel/generic/src/sysinfo/sysinfo.c
===================================================================
--- kernel/generic/src/sysinfo/sysinfo.c	(revision ba9a150799eb4761d670852aa4aa4df033ca853a)
+++ kernel/generic/src/sysinfo/sysinfo.c	(revision abf6c018de8e29f417e189c669b1514cb9a75462)
@@ -204,5 +204,5 @@
 
 		*psubtree =
-		    (sysinfo_item_t *) slab_alloc(sysinfo_item_cache, 0);
+		    (sysinfo_item_t *) slab_alloc(sysinfo_item_cache, FRAME_ATOMIC);
 		if (!*psubtree)
 			return NULL;
@@ -280,5 +280,5 @@
 
 			sysinfo_item_t *item =
-			    (sysinfo_item_t *) slab_alloc(sysinfo_item_cache, 0);
+			    (sysinfo_item_t *) slab_alloc(sysinfo_item_cache, FRAME_ATOMIC);
 			if (!item)
 				return NULL;
