Index: uspace/lib/c/generic/thread.c
===================================================================
--- uspace/lib/c/generic/thread.c	(revision c06994673347954891a57710998cf1e087a59e8b)
+++ uspace/lib/c/generic/thread.c	(revision 49c94a3a0434b4b076957742b535ccde31846e07)
@@ -41,8 +41,10 @@
 #include <str.h>
 #include <async.h>
+#include <errno.h>
+#include <as.h>
 #include "private/thread.h"
 
-#ifndef THREAD_INITIAL_STACK_PAGES_NO
-#define THREAD_INITIAL_STACK_PAGES_NO	2 
+#ifndef THREAD_INITIAL_STACK_PAGES
+	#define THREAD_INITIAL_STACK_PAGES  2
 #endif
 
@@ -65,8 +67,10 @@
 	
 	uarg->uspace_thread_function(uarg->uspace_thread_arg);
-	/* XXX: we cannot free the userspace stack while running on it
-		free(uarg->uspace_stack);
-		free(uarg);
-	*/
+	/*
+	 * XXX: we cannot free the userspace stack while running on it
+	 *
+	 * free(uarg->uspace_stack);
+	 * free(uarg);
+	 */
 	
 	/* If there is a manager, destroy it */
@@ -92,36 +96,36 @@
     thread_id_t *tid)
 {
-	char *stack;
-	uspace_arg_t *uarg;
-	int rc;
-
-	stack = (char *) malloc(getpagesize() * THREAD_INITIAL_STACK_PAGES_NO);
-	if (!stack)
-		return -1;
-		
-	uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t));
-	if (!uarg) {
-		free(stack);
-		return -1;
+	uspace_arg_t *uarg =
+	    (uspace_arg_t *) malloc(sizeof(uspace_arg_t));
+	if (!uarg)
+		return ENOMEM;
+	
+	size_t stack_size = getpagesize() * THREAD_INITIAL_STACK_PAGES;
+	void *stack = as_area_create(AS_AREA_ANY, stack_size,
+	    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE);
+	if (stack == AS_MAP_FAILED) {
+		free(uarg);
+		return ENOMEM;
 	}
 	
 	uarg->uspace_entry = (void *) FADDR(__thread_entry);
-	uarg->uspace_stack = (void *) stack;
+	uarg->uspace_stack = stack;
+	uarg->uspace_stack_size = stack_size;
 	uarg->uspace_thread_function = function;
 	uarg->uspace_thread_arg = arg;
 	uarg->uspace_uarg = uarg;
 	
-	rc = __SYSCALL4(SYS_THREAD_CREATE, (sysarg_t) uarg, (sysarg_t) name,
-	    (sysarg_t) str_size(name), (sysarg_t) tid);
+	int rc = __SYSCALL4(SYS_THREAD_CREATE, (sysarg_t) uarg,
+	    (sysarg_t) name, (sysarg_t) str_size(name), (sysarg_t) tid);
 	
-	if (rc) {
+	if (rc != EOK) {
 		/*
 		 * Failed to create a new thread.
-		 * Free up the allocated structures.
+		 * Free up the allocated data.
 		 */
+		as_area_destroy(stack);
 		free(uarg);
-		free(stack);
 	}
-
+	
 	return rc;
 }
