aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/mach/hurd/alpha/trampoline.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-04-08 07:06:57 +0000
committerRoland McGrath <roland@gnu.org>2002-04-08 07:06:57 +0000
commitf899db60945ef4c080ffe4393e55ef2fbcbbf6c0 (patch)
tree159ec00fc213be47a80546f25d90320fd8c1aaba /sysdeps/mach/hurd/alpha/trampoline.c
parent7ce93726fb9f02c45e45df15d923faabaa8951d3 (diff)
downloadglibc-f899db60945ef4c080ffe4393e55ef2fbcbbf6c0.tar
glibc-f899db60945ef4c080ffe4393e55ef2fbcbbf6c0.tar.gz
glibc-f899db60945ef4c080ffe4393e55ef2fbcbbf6c0.tar.bz2
glibc-f899db60945ef4c080ffe4393e55ef2fbcbbf6c0.zip
* sysdeps/mach/hurd/alpha/trampoline.c: Don't include
<mach/machine/alpha_instruction.h>. (_hurd_setup_sighandler): Take proper arguments for current decls. Update code to use _hurdsig_catch_fault. Use `callsys' instruction instead of `call_pal'. * sysdeps/mach/hurd/alpha/intr-msg.h: New file. * sysdeps/mach/alpha/sysdep.h: Include <mach/alpha/asm.h>. (ALIGN, at, AT, fp): New macros.
Diffstat (limited to 'sysdeps/mach/hurd/alpha/trampoline.c')
-rw-r--r--sysdeps/mach/hurd/alpha/trampoline.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/sysdeps/mach/hurd/alpha/trampoline.c b/sysdeps/mach/hurd/alpha/trampoline.c
index 152f935b13..2360cbb469 100644
--- a/sysdeps/mach/hurd/alpha/trampoline.c
+++ b/sysdeps/mach/hurd/alpha/trampoline.c
@@ -1,5 +1,5 @@
/* Set thread_state for sighandler, and sigcontext to recover. Alpha version.
- Copyright (C) 1994, 1995, 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1994,95,97,98,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -19,7 +19,6 @@
#include <hurd/signal.h>
#include "thread_state.h"
-#include <mach/machine/alpha_instruction.h>
#include "hurdfault.h"
#include <assert.h>
@@ -38,9 +37,8 @@ struct mach_msg_trap_args
struct sigcontext *
_hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
- int signo, long int sigcode,
- int rpc_wait,
- struct machine_thread_all_state *state)
+ int signo, struct hurd_signal_detail *detail,
+ int rpc_wait, struct machine_thread_all_state *state)
{
__label__ trampoline, rpc_wait_trampoline;
void *sigsp;
@@ -51,10 +49,7 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
/* We have a previous sigcontext that sigreturn was about
to restore when another signal arrived. We will just base
our setup on that. */
- if (_hurdsig_catch_fault (SIGSEGV))
- assert (_hurdsig_fault_sigcode >= (long int) ss->context &&
- _hurdsig_fault_sigcode < (long int) (ss->context + 1));
- else
+ if (! _hurdsig_catch_memory_fault (ss->context))
{
memcpy (&state->basic, &ss->context->sc_alpha_thread_state,
sizeof (state->basic));
@@ -79,6 +74,8 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
later. */
ss->intr_port = ss->context->sc_intr_port;
}
+ _hurdsig_end_catch_fault ();
+
/* If the sigreturn context was bogus, just ignore it. */
ss->context = NULL;
}
@@ -101,10 +98,8 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
sigsp -= sizeof (*scp);
scp = sigsp;
- if (_hurdsig_catch_fault (SIGSEGV))
+ if (_hurdsig_catch_memory_fault (scp))
{
- assert (_hurdsig_fault_sigcode >= (long int) scp &&
- _hurdsig_fault_sigcode < (long int) (scp + 1));
/* We got a fault trying to write the stack frame.
We cannot set up the signal handler.
Returning NULL tells our caller, who will nuke us with a SIGILL. */
@@ -137,6 +132,8 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
&scp->sc_alpha_float_state,
sizeof (state->fpu)))
return NULL;
+
+ _hurdsig_end_catch_fault ();
}
/* Modify the thread state to call the trampoline code on the new stack. */
@@ -176,14 +173,14 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
($16..$21, $1). Pass the handler args to the trampoline code in
t8..t10 ($22.$24). */
state->basic.r22 = signo;
- state->basic.r23 = sigcode;
+ state->basic.r23 = detail->code;
state->basic.r24 = (long int) scp;
}
else
{
state->basic.pc = (long int) &&trampoline;
state->basic.r16 = signo;
- state->basic.r17 = sigcode;
+ state->basic.r17 = detail->code;
state->basic.r18 = (long int) scp;
}
@@ -212,7 +209,7 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
asm volatile
(/* Retry the interrupted mach_msg system call. */
"lda $0, -25($31)\n" /* mach_msg_trap */
- "call_pal %0\n" /* Magic system call instruction. */
+ "callsys\n" /* Magic system call instruction. */
/* When the sigcontext was saved, v0 was MACH_RCV_INTERRUPTED. But
now the message receive has completed and the original caller of
the RPC (i.e. the code running when the signal arrived) needs to
@@ -225,8 +222,7 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
in registers t8..t10 ($22..$24). */
"mov $22, $16\n"
"mov $23, $17\n"
- "mov $24, $18\n"
- : : "i" (op_chmk));
+ "mov $24, $18\n");
trampoline:
/* Entry point for running the handler normally. The arguments to the