Index: generic/src/main/kinit.c
===================================================================
--- generic/src/main/kinit.c	(revision 6f8a42644f9f520c53d9e649da934ac91623d29f)
+++ generic/src/main/kinit.c	(revision 9bda3af61b1e5c5556bef366d7bcfcbeb1e090a4)
@@ -47,4 +47,5 @@
 #include <interrupt.h>
 #include <console/kconsole.h>
+#include <elf.h>
 
 #ifdef CONFIG_SMP
@@ -72,7 +73,5 @@
 	as_t *as;
 	as_area_t *a;
-	__address frame;
-	count_t frames;
-	int i;
+	int rc;
 	task_t *u;
 
@@ -151,36 +150,25 @@
 		if (!as)
 			panic("as_create\n");
-		u = task_create(as);
-		if (!u)
-			panic("task_create\n");
-		t = thread_create(uinit, NULL, u, THREAD_USER_STACK);
-		if (!t)
-			panic("thread_create\n");
+
+		rc = elf_load((elf_header_t *) config.init_addr, as);
+		if (rc != EE_OK) {
+			printf("elf_load failed: %s\n", elf_error(rc));
+		} else {
+			u = task_create(as);
+			if (!u)
+				panic("task_create\n");
+			t = thread_create(uinit, (void *)((elf_header_t *) config.init_addr)->e_entry, u, THREAD_USER_STACK);
+			if (!t)
+				panic("thread_create\n");
 		
-		/*
-		 * Create the text as_area and initialize its mapping.
-		 */
-		
-		frame = config.init_addr;
-		if (IS_KA(frame))
-			frame = KA2PA(frame);
+			/*
+			 * Create the data as_area.
+			 */
+			a = as_area_create(as, AS_AREA_STACK, 1, USTACK_ADDRESS);
+			if (!a)
+				panic("as_area_create: stack\n");
 
-		frames = SIZE2FRAMES(config.init_size);
-		
-		a = as_area_create(as, AS_AREA_TEXT, frames, UTEXT_ADDRESS);
-		if (!a)
-			panic("as_area_create: text\n");
-
-		for (i = 0; i < frames; i++)
-			as_set_mapping(as, UTEXT_ADDRESS + i * PAGE_SIZE, frame + i * FRAME_SIZE);
-
-		/*
-		 * Create the data as_area.
-		 */
-		a = as_area_create(as, AS_AREA_STACK, 1, USTACK_ADDRESS);
-		if (!a)
-			panic("as_area_create: stack\n");
-
-		thread_ready(t);
+			thread_ready(t);
+		}
 	}
 
Index: generic/src/main/uinit.c
===================================================================
--- generic/src/main/uinit.c	(revision 6f8a42644f9f520c53d9e649da934ac91623d29f)
+++ generic/src/main/uinit.c	(revision 9bda3af61b1e5c5556bef366d7bcfcbeb1e090a4)
@@ -33,8 +33,7 @@
 #include <print.h>
 
-
 void uinit(void *arg)
 {
 	printf("USER task, uinit thread: kernel mode\n");
-	userspace();
+	userspace((__address)(arg));
 }
