diff -dur orig2/hurd-20111206/libthreads/cprocs.c orig/hurd-20111106/libthreads/cprocs.c
--- orig2/hurd-20111206/libthreads/cprocs.c	2011-12-06 00:44:58.000000000 +0000
+++ orig/hurd-20111106/libthreads/cprocs.c	2011-12-28 21:43:19.000000000 +0000
@@ -311,6 +311,8 @@
 private mach_msg_header_t wakeup_msg;	/* prebuilt message used by idle
 					   threads */
 
+extern vm_address_t next_stack_base;
+
 /*
  * Return current value for max kernel threads
  * Note: 0 means no limit
@@ -607,8 +609,11 @@
 		spin_unlock(&waiters_lock);
 #endif  /* STATISTICS */
 		waiter = cproc_alloc();
-		MACH_CALL(vm_allocate(mach_task_self(), &base,
-				      cthread_wait_stack_size, TRUE), r);
+		for (base = next_stack_base;
+		     vm_allocate(mach_task_self(), &base, cthread_wait_stack_size, FALSE) != KERN_SUCCESS;
+		     base += cthread_wait_stack_size)
+			;
+		next_stack_base = base + cthread_wait_stack_size;
 		waiter->stack_base = base;
 		waiter->stack_size = cthread_wait_stack_size;
 	}
diff -dur orig2/hurd-20111206/libthreads/stack.c orig/hurd-20111106/libthreads/stack.c
--- orig2/hurd-20111206/libthreads/stack.c	2011-12-06 00:44:58.000000000 +0000
+++ orig/hurd-20111106/libthreads/stack.c	2011-12-28 21:44:43.000000000 +0000
@@ -145,7 +145,7 @@
 
 vm_offset_t cthread_stack_mask;
 vm_size_t cthread_stack_size;
-private vm_address_t next_stack_base;
+vm_address_t next_stack_base;
 
 /*
  * Set up a stack segment for a thread.
@@ -346,7 +346,7 @@
 	/*
 	 * Guess at first available region for stack.
 	 */
-	next_stack_base = 0;
+	next_stack_base = 0x70000000; /* XXX This is just a guess */
 
 	/*
 	 * Set up stack for main thread.
@@ -420,5 +420,5 @@
  * coincide with the reality that we now have a single cproc and cthread.
  */
 {
-    next_stack_base = 0;
+    next_stack_base = 0x70000000;
 }
