Fri Nov 17 17:57:00 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>

* sysdeps/generic/Makefile (make_siglist): Add missing backslash.

	* sysdeps/generic/dl-sysdep.c (_dl_sysdep_start_cleanup): New
	function.

	* hurd/hurdfault.c: Replace __libc_fatal calls with assert_perror.
	(_hurdsig_fault_init): Remove #if 0 from setting exception port.
	Insert send right for SIGEXC before thread_set_special_port.
	* hurd/hurdsig.c: Replace __libc_fatal calls with assert_perror.
	(_hurdsig_init): Remove #if 0 from setting exception port.

	* sysdeps/mach/hurd/ptrace.c (ptrace: PTRACE_CONT): Use
	HURD_MSGPORT_RPC macro.
This commit is contained in:
Roland McGrath 1995-11-18 10:00:22 +00:00
parent 4cb202902d
commit a5a81fecc7
6 changed files with 74 additions and 51 deletions

View File

@ -1,3 +1,19 @@
Fri Nov 17 17:57:00 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* sysdeps/generic/Makefile (make_siglist): Add missing backslash.
* sysdeps/generic/dl-sysdep.c (_dl_sysdep_start_cleanup): New
function.
* hurd/hurdfault.c: Replace __libc_fatal calls with assert_perror.
(_hurdsig_fault_init): Remove #if 0 from setting exception port.
Insert send right for SIGEXC before thread_set_special_port.
* hurd/hurdsig.c: Replace __libc_fatal calls with assert_perror.
(_hurdsig_init): Remove #if 0 from setting exception port.
* sysdeps/mach/hurd/ptrace.c (ptrace: PTRACE_CONT): Use
HURD_MSGPORT_RPC macro.
Thu Nov 16 06:07:49 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> Thu Nov 16 06:07:49 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_start_cleanup): New * sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_start_cleanup): New

View File

@ -1,5 +1,5 @@
/* Handle faults in the signal thread. /* Handle faults in the signal thread.
Copyright (C) 1994 Free Software Foundation, Inc. Copyright (C) 1994, 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -114,30 +114,33 @@ _hurdsig_fault_init (void)
struct machine_thread_state state; struct machine_thread_state state;
mach_port_t sigexc; mach_port_t sigexc;
if (err = __mach_port_allocate (__mach_task_self (), err = __mach_port_allocate (__mach_task_self (),
MACH_PORT_RIGHT_RECEIVE, &sigexc)) MACH_PORT_RIGHT_RECEIVE, &sigexc);
__libc_fatal ("hurd: Can't create receive right for signal thread exc\n"); assert_perror (err);
if (err = __mach_port_allocate (__mach_task_self (), err = __mach_port_allocate (__mach_task_self (),
MACH_PORT_RIGHT_RECEIVE, &forward_sigexc)) MACH_PORT_RIGHT_RECEIVE, &forward_sigexc);
__libc_fatal ("hurd: Can't create receive right for signal thread exc\n"); assert_perror (err);
err = __mach_port_insert_right (__mach_task_self (),
sigexc, MACH_MSG_TYPE_MAKE_SEND);
assert_perror (err);
err = __thread_set_special_port (_hurd_msgport_thread,
THREAD_EXCEPTION_PORT, sigexc);
__mach_port_deallocate (__mach_task_self (), sigexc);
assert_perror (err);
memset (&state, 0, sizeof state); memset (&state, 0, sizeof state);
MACHINE_THREAD_STATE_SET_PC (&state, faulted); MACHINE_THREAD_STATE_SET_PC (&state, faulted);
MACHINE_THREAD_STATE_SET_SP (&state, faultstack, sizeof faultstack); MACHINE_THREAD_STATE_SET_SP (&state, faultstack, sizeof faultstack);
#if 0 /* Don't confuse gdb. */ err = __USEPORT
__thread_set_special_port (_hurd_msgport_thread, (PROC,
THREAD_EXCEPTION_PORT, sigexc); __proc_handle_exceptions (port,
#endif sigexc,
forward_sigexc, MACH_MSG_TYPE_MAKE_SEND,
if (err = __USEPORT MACHINE_THREAD_STATE_FLAVOR,
(PROC, (natural_t *) &state,
__proc_handle_exceptions (port, MACHINE_THREAD_STATE_COUNT));
sigexc, assert_perror (err);
forward_sigexc, MACH_MSG_TYPE_MAKE_SEND,
MACHINE_THREAD_STATE_FLAVOR,
(natural_t *) &state,
MACHINE_THREAD_STATE_COUNT)))
__libc_fatal ("hurd: proc won't handle signal thread exceptions\n");
} }

View File

@ -1113,17 +1113,17 @@ _hurdsig_init (void)
__mutex_init (&_hurd_siglock); __mutex_init (&_hurd_siglock);
if (err = __mach_port_allocate (__mach_task_self (), err = __mach_port_allocate (__mach_task_self (),
MACH_PORT_RIGHT_RECEIVE, MACH_PORT_RIGHT_RECEIVE,
&_hurd_msgport)) &_hurd_msgport);
__libc_fatal ("hurd: Can't create message port receive right\n"); assert_perror (err);
/* Make a send right to the signal port. */ /* Make a send right to the signal port. */
if (err = __mach_port_insert_right (__mach_task_self (), err = __mach_port_insert_right (__mach_task_self (),
_hurd_msgport, _hurd_msgport,
_hurd_msgport, _hurd_msgport,
MACH_MSG_TYPE_MAKE_SEND)) MACH_MSG_TYPE_MAKE_SEND);
__libc_fatal ("hurd: Can't create send right to message port\n"); assert_perror (err);
/* Set the default thread to receive task-global signals /* Set the default thread to receive task-global signals
to this one, the main (first) user thread. */ to this one, the main (first) user thread. */
@ -1131,15 +1131,15 @@ _hurdsig_init (void)
/* Start the signal thread listening on the message port. */ /* Start the signal thread listening on the message port. */
if (err = __thread_create (__mach_task_self (), &_hurd_msgport_thread)) err = __thread_create (__mach_task_self (), &_hurd_msgport_thread);
__libc_fatal ("hurd: Can't create signal thread\n"); assert_perror (err);
stacksize = __vm_page_size * 4; /* Small stack for signal thread. */ stacksize = __vm_page_size * 4; /* Small stack for signal thread. */
if (err = __mach_setup_thread (__mach_task_self (), _hurd_msgport_thread, err = __mach_setup_thread (__mach_task_self (), _hurd_msgport_thread,
_hurd_msgport_receive, _hurd_msgport_receive,
(vm_address_t *) &__hurd_sigthread_stack_base, (vm_address_t *) &__hurd_sigthread_stack_base,
&stacksize)) &stacksize);
__libc_fatal ("hurd: Can't setup signal thread\n"); assert_perror (err);
__hurd_sigthread_stack_end = __hurd_sigthread_stack_base + stacksize; __hurd_sigthread_stack_end = __hurd_sigthread_stack_base + stacksize;
__hurd_sigthread_variables = __hurd_sigthread_variables =
@ -1151,14 +1151,12 @@ _hurdsig_init (void)
variable for the cached reply port. */ variable for the cached reply port. */
__mig_init ((void *) __hurd_sigthread_stack_base); __mig_init ((void *) __hurd_sigthread_stack_base);
if (err = __thread_resume (_hurd_msgport_thread)) err = __thread_resume (_hurd_msgport_thread);
__libc_fatal ("hurd: Can't resume signal thread\n"); assert_perror (err);
#if 0 /* Don't confuse poor gdb. */
/* Receive exceptions on the signal port. */ /* Receive exceptions on the signal port. */
__task_set_special_port (__mach_task_self (), __task_set_special_port (__mach_task_self (),
TASK_EXCEPTION_PORT, _hurd_msgport); TASK_EXCEPTION_PORT, _hurd_msgport);
#endif
} }
/* XXXX */ /* XXXX */
/* Reauthenticate with the proc server. */ /* Reauthenticate with the proc server. */

View File

@ -52,7 +52,7 @@ $(objpfx)siglist.c: $(objpfx)make_siglist
mv $@-tmp $@ mv $@-tmp $@
$(objpfx)make_siglist: $(sysdep_dir)/generic/make_siglist.c $(objpfx)make_siglist: $(sysdep_dir)/generic/make_siglist.c
$(native-compile) $(native-compile) \
-DSIGNUM_H=\"`cd $(dir $(firstword $(wildcard \ -DSIGNUM_H=\"`cd $(dir $(firstword $(wildcard \
$(+sysdep_dirs:%=%/signum.h)))); pwd`/signum.h\" $(+sysdep_dirs:%=%/signum.h)))); pwd`/signum.h\"

View File

@ -80,6 +80,11 @@ _dl_sysdep_start (void **start_argptr,
return user_entry; return user_entry;
} }
void
_dl_sysdep_start_cleanup (void)
{
}
int int
_dl_sysdep_open_zero_fill (void) _dl_sysdep_open_zero_fill (void)
{ {

View File

@ -106,17 +106,15 @@ ptrace (enum __ptrace_request request, ... )
{ {
/* Send a DATA signal to PID, telling it to take the signal /* Send a DATA signal to PID, telling it to take the signal
normally even if it's traced. */ normally even if it's traced. */
error_t err; task_t task = __pid2task (pid); error_t err;
task_t task = __pid2task (pid);
if (task == MACH_PORT_NULL) if (task == MACH_PORT_NULL)
return -1; return -1;
if (data == SIGKILL) if (data == SIGKILL)
err = __task_terminate (task); err = __task_terminate (task);
else else
{ {
mach_port_t msgport; if (addr != (void *) 1)
err = __USEPORT (PROC, __proc_getmsgport (port, pid, &msgport));
if (!err && addr != (void *) 1)
{ {
/* Move the user thread's PC to ADDR. */ /* Move the user thread's PC to ADDR. */
thread_t thread; thread_t thread;
@ -135,15 +133,18 @@ ptrace (enum __ptrace_request request, ... )
MACHINE_THREAD_STATE_FLAVOR, MACHINE_THREAD_STATE_FLAVOR,
(natural_t *) &state, count); (natural_t *) &state, count);
} }
} }
__mach_port_deallocate (__mach_task_self (), thread); __mach_port_deallocate (__mach_task_self (), thread);
} }
else
err = 0;
if (! err) if (! err)
/* Tell the process to take the signal (or just resume if 0). */ /* Tell the process to take the signal (or just resume if 0). */
err = __msg_sig_post_untraced (msgport, data, task); err = HURD_MSGPORT_RPC
__mach_port_deallocate (__mach_task_self (), msgport); (__USEPORT (PROC, __proc_getmsgport (port, pid, &msgport)),
0, 0, __msg_sig_post_untraced (msgport, data, task));
} }
__mach_port_deallocate (__mach_task_self (), task); __mach_port_deallocate (__mach_task_self (), task);
return err ? __hurd_fail (err) : 0; return err ? __hurd_fail (err) : 0;
@ -201,7 +202,7 @@ ptrace (enum __ptrace_request request, ... )
} }
__mach_port_deallocate (__mach_task_self (), task); __mach_port_deallocate (__mach_task_self (), task);
return err ? __hurd_fail (err) : 0; return err ? __hurd_fail (err) : 0;
} }
case PTRACE_PEEKTEXT: case PTRACE_PEEKTEXT:
case PTRACE_PEEKDATA: case PTRACE_PEEKDATA: