summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-12-22 05:57:24 +0000
committerRoland McGrath <roland@gnu.org>1995-12-22 05:57:24 +0000
commite3fa2641f4f296230aa2607f0df9d71ab3f9c7af (patch)
treea2db052db64cb3fa3197df1d94dc3eb6a5ddc32b
parent567676ff8165fb4a222eab681a789ace6c5f4fbb (diff)
Peek __mach_task_self_ value before proc_dostop call to work around kernel paging bug.
-rw-r--r--sysdeps/mach/hurd/fork.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/sysdeps/mach/hurd/fork.c b/sysdeps/mach/hurd/fork.c
index 66b1ba84c7..25279645ee 100644
--- a/sysdeps/mach/hurd/fork.c
+++ b/sysdeps/mach/hurd/fork.c
@@ -109,7 +109,7 @@ __fork (void)
__mutex_lock (*p);
}
__mutex_lock (&_hurd_siglock);
-
+
newtask = MACH_PORT_NULL;
thread = sigthread = MACH_PORT_NULL;
newproc = MACH_PORT_NULL;
@@ -121,6 +121,8 @@ __fork (void)
__spin_lock (&_hurd_ports[i].lock);
ports_locked = 1;
+ *(volatile task_t *) &__mach_task_self_; /* XXX work around kernel bug */
+
/* Stop all other threads while copying the address space,
so nothing changes. */
err = __proc_dostop (_hurd_ports[INIT_PORT_PROC].port, ss->thread);
@@ -189,7 +191,7 @@ __fork (void)
(__task_get_special_port (newtask,
TASK_NOTIFY_PORT,
&notify_port) == 0 &&
- __mach_port_extract_right
+ __mach_port_extract_right
(newtask,
portnames[i],
MACH_MSG_TYPE_MAKE_SEND,
@@ -442,7 +444,7 @@ __fork (void)
if (err)
LOSE;
}
-
+
/* Set the child signal thread up to run the msgport server function
using the same signal thread stack copied from our address space.
We fetch the state before longjmp'ing it so that miscellaneous
@@ -457,7 +459,7 @@ __fork (void)
state.SP = __hurd_sigthread_stack_base;
#else
state.SP = __hurd_sigthread_stack_end;
-#endif
+#endif
MACHINE_THREAD_STATE_SET_PC (&state,
(unsigned long int) _hurd_msgport_receive);
if (err = __thread_set_state (sigthread, MACHINE_THREAD_STATE_FLAVOR,