Hurd/MIPS64 patches.
This commit is contained in:
parent
c20a529cc7
commit
ede6d67ba2
|
@ -1,21 +1,21 @@
|
|||
/* Translate Mach exception codes into signal numbers. MIPS version.
|
||||
Copyright (C) 1991, 1992, 1994, 1995 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 1996, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <hurd.h>
|
||||
#include <hurd/signal.h>
|
||||
|
@ -25,56 +25,55 @@ Cambridge, MA 02139, USA. */
|
|||
into a signal number and signal subcode. */
|
||||
|
||||
void
|
||||
_hurd_exception2signal (int exception, int code, int subcode,
|
||||
int *signo, long int *sigcode, int *error)
|
||||
_hurd_exception2signal (struct hurd_signal_detail *detail, int *signo)
|
||||
{
|
||||
*error = 0;
|
||||
detail->error = 0;
|
||||
|
||||
switch (exception)
|
||||
switch (detail->exc)
|
||||
{
|
||||
default:
|
||||
*signo = SIGIOT;
|
||||
*sigcode = exception;
|
||||
detail->code = detail->exc;
|
||||
break;
|
||||
|
||||
case EXC_BAD_ACCESS:
|
||||
if (code == KERN_PROTECTION_FAILURE)
|
||||
if (detail->exc_code == KERN_PROTECTION_FAILURE)
|
||||
*signo = SIGSEGV;
|
||||
else
|
||||
*signo = SIGBUS;
|
||||
*sigcode = subcode;
|
||||
*error = code;
|
||||
detail->code = detail->exc_subcode;
|
||||
detail->error = detail->exc_code;
|
||||
break;
|
||||
|
||||
case EXC_BAD_INSTRUCTION:
|
||||
*signo = SIGILL;
|
||||
if (code == EXC_MIPS_II)
|
||||
*sigcode = code;
|
||||
if (detail->exc_code == EXC_MIPS_II)
|
||||
detail->code = detail->exc_subcode;
|
||||
else
|
||||
*sigcode = 0;
|
||||
detail->code = 0;
|
||||
break;
|
||||
|
||||
case EXC_ARITHMETIC:
|
||||
switch (code)
|
||||
switch (detail->exc_code)
|
||||
{
|
||||
case EXC_MIPS_OV: /* integer overflow */
|
||||
*signo = SIGFPE;
|
||||
*sigcode = EXC_MIPS_FLT_OVERFLOW;
|
||||
detail->code = detail->exc_subcode;
|
||||
break;
|
||||
|
||||
default:
|
||||
*signo = SIGFPE;
|
||||
*sigcode = 0;
|
||||
detail->code = 0;
|
||||
break;
|
||||
|
||||
case EXC_MIPS_INT:
|
||||
/* Subcode is the fp_status word saved by the hardware.
|
||||
Give an error code corresponding to the first bit set. */
|
||||
if (subcode == EXC_MIPS_FLT_UNIMP)
|
||||
if (detail->exc_subcode == EXC_MIPS_FLT_UNIMP)
|
||||
*signo = SIGILL;
|
||||
else
|
||||
*signo = SIGFPE;
|
||||
*sigcode = subcode;
|
||||
detail->code = detail->exc_subcode;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -82,17 +81,17 @@ _hurd_exception2signal (int exception, int code, int subcode,
|
|||
case EXC_EMULATION:
|
||||
/* 3.0 doesn't give this one, why, I don't know. */
|
||||
*signo = SIGEMT;
|
||||
*sigcode = 0;
|
||||
detail->code = 0;
|
||||
break;
|
||||
|
||||
case EXC_SOFTWARE:
|
||||
*signo = SIGEMT;
|
||||
*sigcode = 0;
|
||||
detail->code = 0;
|
||||
break;
|
||||
|
||||
case EXC_BREAKPOINT:
|
||||
*signo = SIGTRAP;
|
||||
*sigcode = code;
|
||||
detail->code = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
/* Perform a `longjmp' on a Mach thread_state. MIPS version.
|
||||
Copyright (C) 1991, 1994 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 1996, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <hurd/signal.h>
|
||||
#include <setjmp.h>
|
||||
|
|
|
@ -1,30 +1,32 @@
|
|||
/* Copyright (C) 1991, 1992, 1994, 1995 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
/* Copyright (C) 1996, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <hurd.h>
|
||||
#include <hurd/signal.h>
|
||||
#include <hurd/threadvar.h>
|
||||
#include <stdlib.h>
|
||||
#include <mach/mips/mips_instruction.h>
|
||||
|
||||
int
|
||||
__sigreturn (struct sigcontext *scp)
|
||||
{
|
||||
struct hurd_sigstate *ss;
|
||||
struct hurd_userlink *link = (void *) &scp[1];
|
||||
mach_port_t *reply_port;
|
||||
|
||||
if (scp == NULL || (scp->sc_mask & _SIG_CANT_MASK))
|
||||
|
@ -36,6 +38,11 @@ __sigreturn (struct sigcontext *scp)
|
|||
ss = _hurd_self_sigstate ();
|
||||
__spin_lock (&ss->lock);
|
||||
|
||||
/* Remove the link on the `active resources' chain added by
|
||||
_hurd_setup_sighandler. Its purpose was to make sure
|
||||
that we got called; now we have, it is done. */
|
||||
_hurd_userlink_unlink (link);
|
||||
|
||||
/* Restore the set of blocked signals, and the intr_port slot. */
|
||||
ss->blocked = scp->sc_mask;
|
||||
ss->intr_port = scp->sc_intr_port;
|
||||
|
@ -48,15 +55,11 @@ __sigreturn (struct sigcontext *scp)
|
|||
the signal thread will notice it if it runs another handler, and
|
||||
arrange to have us called over again in the new reality. */
|
||||
ss->context = scp;
|
||||
/* Clear the intr_port slot, since we are not in fact doing
|
||||
an interruptible RPC right now. If SS->intr_port is not null,
|
||||
the SCP context is doing an interruptible RPC, but the signal
|
||||
thread will examine us while we are blocked in the sig_post RPC. */
|
||||
ss->intr_port = MACH_PORT_NULL;
|
||||
__spin_unlock (&ss->lock);
|
||||
__msg_sig_post (_hurd_msgport, 0, __mach_task_self ());
|
||||
__msg_sig_post (_hurd_msgport, 0, 0, __mach_task_self ());
|
||||
/* If a pending signal was handled, sig_post never returned. */
|
||||
__spin_lock (&ss->lock);
|
||||
ss->context = NULL;
|
||||
}
|
||||
|
||||
if (scp->sc_onstack)
|
||||
|
@ -73,7 +76,17 @@ __sigreturn (struct sigcontext *scp)
|
|||
reply_port =
|
||||
(mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY);
|
||||
if (*reply_port)
|
||||
__mach_port_destroy (__mach_task_self (), *reply_port);
|
||||
{
|
||||
mach_port_t port = *reply_port;
|
||||
|
||||
/* Assigning MACH_PORT_DEAD here tells libc's mig_get_reply_port not to
|
||||
get another reply port, but avoids mig_dealloc_reply_port trying to
|
||||
deallocate it after the receive fails (which it will, because the
|
||||
reply port will be bogus, whether we do this or not). */
|
||||
*reply_port = MACH_PORT_DEAD;
|
||||
|
||||
__mach_port_destroy (__mach_task_self (), port);
|
||||
}
|
||||
*reply_port = scp->sc_reply_port;
|
||||
|
||||
if (scp->sc_coproc_used & SC_COPROC_USE_FPU)
|
||||
|
@ -83,6 +96,40 @@ __sigreturn (struct sigcontext *scp)
|
|||
asm volatile ("l.d $f" #n ",%0" : : "m" (scp->sc_fpr[n]))
|
||||
|
||||
/* Restore floating-point registers. */
|
||||
#ifdef __mips64
|
||||
restore_fpr (0);
|
||||
restore_fpr (1);
|
||||
restore_fpr (2);
|
||||
restore_fpr (3);
|
||||
restore_fpr (4);
|
||||
restore_fpr (5);
|
||||
restore_fpr (6);
|
||||
restore_fpr (7);
|
||||
restore_fpr (8);
|
||||
restore_fpr (9);
|
||||
restore_fpr (10);
|
||||
restore_fpr (11);
|
||||
restore_fpr (12);
|
||||
restore_fpr (13);
|
||||
restore_fpr (14);
|
||||
restore_fpr (15);
|
||||
restore_fpr (16);
|
||||
restore_fpr (17);
|
||||
restore_fpr (18);
|
||||
restore_fpr (19);
|
||||
restore_fpr (20);
|
||||
restore_fpr (21);
|
||||
restore_fpr (22);
|
||||
restore_fpr (23);
|
||||
restore_fpr (24);
|
||||
restore_fpr (25);
|
||||
restore_fpr (26);
|
||||
restore_fpr (27);
|
||||
restore_fpr (28);
|
||||
restore_fpr (29);
|
||||
restore_fpr (30);
|
||||
restore_fpr (31);
|
||||
#else
|
||||
restore_fpr (0);
|
||||
restore_fpr (2);
|
||||
restore_fpr (4);
|
||||
|
@ -99,14 +146,20 @@ __sigreturn (struct sigcontext *scp)
|
|||
restore_fpr (26);
|
||||
restore_fpr (28);
|
||||
restore_fpr (30);
|
||||
#endif
|
||||
|
||||
/* Restore the floating-point control/status register ($f31). */
|
||||
asm volatile ("ctc1 %0,$f31" : : "r" (scp->sc_fpcsr));
|
||||
}
|
||||
|
||||
/* Load all the registers from the sigcontext. */
|
||||
#ifdef __mips64
|
||||
#define restore_gpr(n) \
|
||||
asm volatile ("ld $" #n ",%0" : : "m" (scpreg->sc_gpr[n - 1]))
|
||||
#else
|
||||
#define restore_gpr(n) \
|
||||
asm volatile ("lw $" #n ",%0" : : "m" (scpreg->sc_gpr[n - 1]))
|
||||
#endif
|
||||
|
||||
{
|
||||
register const struct sigcontext *const scpreg asm ("$1") = scp;
|
||||
|
@ -157,9 +210,10 @@ __sigreturn (struct sigcontext *scp)
|
|||
at = &scpreg->sc_pc;
|
||||
/* This is an emulated instruction that will find at the address in $1
|
||||
two words: the PC value to restore, and the $1 value to restore. */
|
||||
asm volatile (".word op_sigreturn");
|
||||
|
||||
asm volatile (".word %0" : : "i" (op_sigreturn));
|
||||
asm volatile (".set reorder; .set at;");
|
||||
/* NOTREACHED */
|
||||
return at; /* To prevent optimization. */
|
||||
}
|
||||
|
||||
/* NOTREACHED */
|
||||
|
|
|
@ -1,56 +1,58 @@
|
|||
/* Set thread_state for sighandler, and sigcontext to recover. MIPS version.
|
||||
Copyright (C) 1994, 1995 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 1996, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <hurd/signal.h>
|
||||
#include <hurd/userlink.h>
|
||||
#include "thread_state.h"
|
||||
|
||||
|
||||
struct mach_msg_trap_args
|
||||
{
|
||||
/* This is the order of arguments to mach_msg_trap. */
|
||||
mach_msg_header_t *msg;
|
||||
mach_msg_option_t option;
|
||||
mach_msg_size_t send_size;
|
||||
mach_msg_size_t rcv_size;
|
||||
mach_port_t rcv_name;
|
||||
mach_msg_timeout_t timeout;
|
||||
mach_port_t notify;
|
||||
};
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include "hurdfault.h"
|
||||
#include "intr-msg.h"
|
||||
|
||||
|
||||
struct sigcontext *
|
||||
_hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
|
||||
int signo, long int sigcode,
|
||||
int rpc_wait,
|
||||
int signo, struct hurd_signal_detail *detail,
|
||||
volatile int rpc_wait,
|
||||
struct machine_thread_all_state *state)
|
||||
{
|
||||
|
||||
__label__ trampoline, rpc_wait_trampoline;
|
||||
void *sigsp;
|
||||
__label__ trampoline, rpc_wait_trampoline, firewall;
|
||||
void *volatile sigsp;
|
||||
struct sigcontext *scp;
|
||||
struct
|
||||
{
|
||||
int signo;
|
||||
long int sigcode;
|
||||
struct sigcontext *scp; /* Points to ctx, below. */
|
||||
void *sigreturn_addr;
|
||||
void *sigreturn_returns_here;
|
||||
struct sigcontext *return_scp; /* Same; arg to sigreturn. */
|
||||
struct sigcontext ctx;
|
||||
struct hurd_userlink link;
|
||||
} *stackframe;
|
||||
|
||||
if (ss->context)
|
||||
{
|
||||
/* We have a previous sigcontext that sigreturn was about
|
||||
to restore when another signal arrived. We will just base
|
||||
our setup on that. */
|
||||
if (! setjmp (_hurd_sigthread_fault_env))
|
||||
if (! _hurdsig_catch_memory_fault (ss->context))
|
||||
{
|
||||
memcpy (&state->basic, &ss->context->sc_mips_thread_state,
|
||||
sizeof (state->basic));
|
||||
|
@ -63,24 +65,17 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
|
|||
sizeof (state->fpu));
|
||||
state->set |= (1 << MIPS_FLOAT_STATE);
|
||||
}
|
||||
assert (! rpc_wait);
|
||||
/* The intr_port slot was cleared before sigreturn sent us the
|
||||
sig_post that made us notice this pending signal, so
|
||||
_hurd_internal_post_signal wouldn't do interrupt_operation.
|
||||
After we return, our caller will set SCP->sc_intr_port (in the
|
||||
new context) from SS->intr_port and clear SS->intr_port. Now
|
||||
that we are restoring this old context recorded by sigreturn,
|
||||
we want to restore its intr_port too; so store it in
|
||||
SS->intr_port now, so it will end up in SCP->sc_intr_port
|
||||
later. */
|
||||
ss->intr_port = ss->context->sc_intr_port;
|
||||
}
|
||||
/* If the sigreturn context was bogus, just ignore it. */
|
||||
ss->context = NULL;
|
||||
}
|
||||
else if (! machine_get_basic_state (ss->thread, state))
|
||||
|
||||
if (! machine_get_basic_state (ss->thread, state))
|
||||
return NULL;
|
||||
|
||||
/* Save the original SP in the gratuitous s0 ($16) slot.
|
||||
We may need to reset the SP (the `r29' slot) to avoid clobbering an
|
||||
interrupted RPC frame. */
|
||||
state->basic.r16 = state->basic.r29;
|
||||
|
||||
if ((ss->actions[signo].sa_flags & SA_ONSTACK) &&
|
||||
!(ss->sigaltstack.ss_flags & (SA_DISABLE|SA_ONSTACK)))
|
||||
{
|
||||
|
@ -92,13 +87,46 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
|
|||
else
|
||||
sigsp = (char *) state->basic.r29;
|
||||
|
||||
/* Set up the sigcontext structure on the stack. This is all the stack
|
||||
needs, since the args are passed in registers (below). */
|
||||
sigsp -= sizeof (*scp);
|
||||
scp = sigsp;
|
||||
/* Push the arguments to call `trampoline' on the stack. */
|
||||
sigsp -= sizeof (*stackframe);
|
||||
stackframe = sigsp;
|
||||
|
||||
if (! setjmp (_hurd_sigthread_fault_env))
|
||||
if (_hurdsig_catch_memory_fault (stackframe))
|
||||
{
|
||||
/* 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. */
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
int ok;
|
||||
|
||||
extern void _hurdsig_longjmp_from_handler (void *, jmp_buf, int);
|
||||
|
||||
/* Add a link to the thread's active-resources list. We mark this as
|
||||
the only user of the "resource", so the cleanup function will be
|
||||
called by any longjmp which is unwinding past the signal frame.
|
||||
The cleanup function (in sigunwind.c) will make sure that all the
|
||||
appropriate cleanups done by sigreturn are taken care of. */
|
||||
stackframe->link.cleanup = &_hurdsig_longjmp_from_handler;
|
||||
stackframe->link.cleanup_data = &stackframe->ctx;
|
||||
stackframe->link.resource.next = NULL;
|
||||
stackframe->link.resource.prevp = NULL;
|
||||
stackframe->link.thread.next = ss->active_resources;
|
||||
stackframe->link.thread.prevp = &ss->active_resources;
|
||||
if (stackframe->link.thread.next)
|
||||
stackframe->link.thread.next->thread.prevp
|
||||
= &stackframe->link.thread.next;
|
||||
ss->active_resources = &stackframe->link;
|
||||
|
||||
/* Set up the arguments for the signal handler. */
|
||||
stackframe->signo = signo;
|
||||
stackframe->sigcode = detail->code;
|
||||
stackframe->scp = stackframe->return_scp = scp = &stackframe->ctx;
|
||||
stackframe->sigreturn_addr = &__sigreturn;
|
||||
stackframe->sigreturn_returns_here = &&firewall; /* Crash on return. */
|
||||
|
||||
/* Set up the sigcontext from the current state of the thread. */
|
||||
|
||||
scp->sc_onstack = ss->sigaltstack.ss_flags & SA_ONSTACK ? 1 : 0;
|
||||
|
@ -110,24 +138,23 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
|
|||
|
||||
/* struct sigcontext is laid out so that starting at sc_cause
|
||||
mimics a struct mips_exc_state. */
|
||||
if (! machine_get_state (ss->thread, state, MIPS_EXC_STATE,
|
||||
&state->exc, &scp->sc_cause,
|
||||
sizeof (state->exc)))
|
||||
return NULL;
|
||||
if ((scp->sc_coproc_used & SC_COPROC_USE_FPU) &&
|
||||
/* struct sigcontext is laid out so that starting at sc_fpr
|
||||
mimics a struct mips_float_state. This state
|
||||
is only meaningful if the coprocessor was used. */
|
||||
! machine_get_state (ss->thread, state, MIPS_FLOAT_STATE,
|
||||
&state->fpu,
|
||||
&scp->sc_mips_float_state, sizeof (state->fpu)))
|
||||
ok = machine_get_state (ss->thread, state, MIPS_EXC_STATE,
|
||||
&state->exc, &scp->sc_cause,
|
||||
sizeof (state->exc));
|
||||
|
||||
if (ok && (scp->sc_coproc_used & SC_COPROC_USE_FPU))
|
||||
/* struct sigcontext is laid out so that starting at sc_fpr
|
||||
mimics a struct mips_float_state. This state
|
||||
is only meaningful if the coprocessor was used. */
|
||||
ok = machine_get_state (ss->thread, state, MIPS_FLOAT_STATE,
|
||||
&state->fpu, &scp->sc_mips_float_state,
|
||||
sizeof (state->fpu));
|
||||
|
||||
_hurdsig_end_catch_fault ();
|
||||
|
||||
if (! ok)
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
/* 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. */
|
||||
return NULL;
|
||||
|
||||
/* Modify the thread state to call the trampoline code on the new stack. */
|
||||
if (rpc_wait)
|
||||
|
@ -145,6 +172,12 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
|
|||
starting with a0 ($4). */
|
||||
struct mach_msg_trap_args *args = (void *) &state->basic.r4;
|
||||
|
||||
if (_hurdsig_catch_memory_fault (args))
|
||||
{
|
||||
/* Faulted accessing ARGS. Bomb. */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
assert (args->option & MACH_RCV_MSG);
|
||||
/* Disable the message-send, since it has already completed. The
|
||||
calls we retry need only wait to receive the reply message. */
|
||||
|
@ -156,17 +189,22 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
|
|||
args->option |= MACH_RCV_TIMEOUT;
|
||||
args->timeout = _hurd_interrupted_rpc_timeout;
|
||||
|
||||
_hurdsig_end_catch_fault ();
|
||||
|
||||
state->basic.pc = (int) &&rpc_wait_trampoline;
|
||||
state->basic.r29 = (int) sigsp; /* $29 is the stack pointer register. */
|
||||
/* The reply-receiving trampoline code runs initially on the original
|
||||
user stack. We pass it the signal stack pointer in s4 ($20). */
|
||||
state->basic.r29 = state->basic.r16; /* Restore mach_msg syscall SP. */
|
||||
state->basic.r20 = (int) sigsp;
|
||||
/* After doing the message receive, the trampoline code will need to
|
||||
update the v0 ($2) value to be restored by sigreturn. To simplify
|
||||
the assembly code, we pass the address of its slot in SCP to the
|
||||
trampoline code in v1 ($3). */
|
||||
state->basic.r3 = (int) &scp->sc_gpr[1];
|
||||
trampoline code in s5 ($21). */
|
||||
state->basic.r21 = (int) &scp->sc_gpr[1];
|
||||
/* We must preserve the mach_msg_trap args in a0..t2 ($4..$10).
|
||||
Pass the handler args to the trampoline code in s1..s3 ($17..$19). */
|
||||
state->basic.r17 = signo;
|
||||
state->basic.r18 = sigcode;
|
||||
state->basic.r18 = detail->code;
|
||||
state->basic.r19 = (int) scp;
|
||||
}
|
||||
else
|
||||
|
@ -174,12 +212,12 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
|
|||
state->basic.pc = (int) &&trampoline;
|
||||
state->basic.r29 = (int) sigsp;
|
||||
state->basic.r4 = signo;
|
||||
state->basic.r5 = sigcode;
|
||||
state->basic.r5 = detail->code;
|
||||
state->basic.r6 = (int) scp;
|
||||
}
|
||||
|
||||
/* We pass the handler function to the trampoline code in at ($1). */
|
||||
state->basic.r1 = (int) handler;
|
||||
/* We pass the handler function to the trampoline code in s6 ($22). */
|
||||
state->basic.r22 = (int) handler;
|
||||
/* In the callee-saved register s0 ($16), we save the SCP value to pass
|
||||
to __sigreturn after the handler returns. */
|
||||
state->basic.r16 = (int) scp;
|
||||
|
@ -197,21 +235,31 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
|
|||
asm volatile
|
||||
(".set noat; .set noreorder; .set nomacro\n"
|
||||
/* Retry the interrupted mach_msg system call. */
|
||||
#ifdef __mips64
|
||||
"dli $2, -25\n" /* mach_msg_trap */
|
||||
#else
|
||||
"li $2, -25\n" /* mach_msg_trap */
|
||||
#endif
|
||||
"syscall\n"
|
||||
/* 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
|
||||
see the final return value of the message receive in v0. So
|
||||
store the new v0 value into the sc_gpr[1] member of the sigcontext
|
||||
(whose address is in v1 to make this code simpler). */
|
||||
"sw $2, ($3)\n"
|
||||
(whose address is in s5 to make this code simpler). */
|
||||
#ifdef __mips64
|
||||
"sd $2, ($21)\n"
|
||||
#else
|
||||
"sw $2, ($21)\n"
|
||||
#endif
|
||||
/* Since the argument registers needed to have the mach_msg_trap
|
||||
arguments, we've stored the arguments to the handler function
|
||||
in registers s1..s3 ($17..$19). */
|
||||
"move $4, $17\n"
|
||||
"move $5, $18\n"
|
||||
"move $6, $19\n");
|
||||
"move $6, $19\n"
|
||||
/* Switch to the signal stack. */
|
||||
"move $29, $20\n");
|
||||
|
||||
trampoline:
|
||||
/* Entry point for running the handler normally. The arguments to the
|
||||
|
@ -222,14 +270,23 @@ _hurd_setup_sighandler (struct hurd_sigstate *ss, __sighandler_t handler,
|
|||
a2 SCP
|
||||
*/
|
||||
asm volatile
|
||||
("jal $1; nop\n" /* Call the handler function. */
|
||||
("move $25, $22\n" /* Copy s6 to t9 for MIPS ABI. */
|
||||
"jal $25; nop\n" /* Call the handler function. */
|
||||
/* Call __sigreturn (SCP); this cannot return. */
|
||||
"j %0\n"
|
||||
#ifdef __mips64
|
||||
"dla $1,%0\n"
|
||||
#else
|
||||
"la $1,%0\n"
|
||||
#endif
|
||||
"j $1\n"
|
||||
"move $4, $16" /* Set up arg from saved SCP in delay slot. */
|
||||
: : "i" (&__sigreturn));
|
||||
|
||||
/* NOTREACHED */
|
||||
asm volatile (".set reorder; .set at; .set macro");
|
||||
|
||||
firewall:
|
||||
asm volatile ("hlt: j hlt");
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -1,28 +1,28 @@
|
|||
/* Flush the insn cache after GCC writes a closure on the stack. Mach/MIPS.
|
||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 1996, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <mach.h>
|
||||
#include <mach/vm_attributes.h>
|
||||
|
||||
/* Stupid name, but this is what GCC generates (config/mips/mips.h). */
|
||||
void
|
||||
cacheflush (void *addr, size_t size, int flag)
|
||||
cacheflush (void *addr, unsigned size, int flag)
|
||||
{
|
||||
vm_machine_attribute_val_t val;
|
||||
|
||||
|
|
|
@ -1,25 +1,28 @@
|
|||
/* Machine-specific definition for spin locks. MIPS version.
|
||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 1996, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef _MACHINE_LOCK_H
|
||||
#define _MACHINE_LOCK_H
|
||||
|
||||
/* To get the TAS pseudo-instruction. */
|
||||
#include <mach/mips/mips_instruction.h>
|
||||
|
||||
/* The type of a spin lock variable. */
|
||||
|
||||
typedef __volatile int __spin_lock_t;
|
||||
|
@ -46,19 +49,35 @@ __spin_unlock (__spin_lock_t *__lock)
|
|||
_EXTERN_INLINE int
|
||||
__spin_try_lock (register __spin_lock_t *__lock)
|
||||
{
|
||||
register int __rtn;
|
||||
#if (__mips >= 2)
|
||||
int __rtn;
|
||||
|
||||
__asm__ __volatile (".set noreorder");
|
||||
#if 0
|
||||
__asm__ __volatile ("lw %0,0(%1)": "=r" (__rtn) : "r" (__lock));
|
||||
__asm__ __volatile ("sw %0,0(%0)": : "r" (__lock));
|
||||
__asm__ __volatile ("xor %0,%1,%0": "=r" (__rtn) : "r" (__lock));
|
||||
#if (__mips64)
|
||||
__asm__ __volatile ("lld %0,0(%1)" : "=r" (__rtn) : "r" (__lock));
|
||||
#else
|
||||
/* Use the Mach microkernel's emulated TAS pseudo-instruction. */
|
||||
register int __rtn __asm__ ("a0");
|
||||
__asm__ __volatile (".word 0xf ! %0 " : "=r" (__rtn) : "0" (__lock));
|
||||
__asm__ __volatile ("ll %0,0(%1)" : "=r" (__rtn) : "r" (__lock));
|
||||
#endif
|
||||
if (__rtn)
|
||||
return 0;
|
||||
__asm__ __volatile ("move %0,%1" : "=r" (__rtn) : "r" (__lock));
|
||||
#if (__mips64)
|
||||
__asm__ __volatile ("scd %0,0(%1)" : "=r" (__rtn) : "r" (__lock));
|
||||
#else
|
||||
__asm__ __volatile ("sc %0,0(%1)" : "=r" (__rtn) : "r" (__lock));
|
||||
#endif
|
||||
__asm__ __volatile (".set reorder");
|
||||
return __rtn;
|
||||
#else
|
||||
register int __rtn __asm__ ("a0");
|
||||
|
||||
/* Use the Mach microkernel's emulated TAS pseudo-instruction. */
|
||||
__asm__ __volatile (".set noreorder");
|
||||
__asm__ __volatile (".word %1" : "=r" (__rtn) : "i" (op_tas), "0" (__lock));
|
||||
__asm__ __volatile ("nop");
|
||||
__asm__ __volatile (".set reorder");
|
||||
return __rtn ^ (int) __lock;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Return nonzero if LOCK is locked. */
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
/* Machine-specific function to return the stack pointer. MIPS version.
|
||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 1996, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#ifndef _MACHINE_SP_H
|
||||
#define _MACHINE_SP_H
|
||||
|
|
|
@ -1,37 +1,48 @@
|
|||
/* Copyright (C) 1994 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
/* Copyright (C) 1996, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
|
||||
#ifdef PIC
|
||||
.option pic2
|
||||
#endif
|
||||
ENTRY (syscall)
|
||||
.frame sp,0,ra
|
||||
move v0, a0 /* Load system call number from first arg. */
|
||||
move a0, a1 /* Move the next three args up a register. */
|
||||
move a1, a2
|
||||
move a2, a3
|
||||
/* Load the remaining possible args (up to 11) from the stack. */
|
||||
lw t0,16(sp)
|
||||
lw t1,20(sp)
|
||||
lw t2,24(sp)
|
||||
lw t3,28(sp)
|
||||
lw t4,32(sp)
|
||||
lw t5,36(sp)
|
||||
lw t6,40(sp)
|
||||
#ifdef __mips64
|
||||
ld t0,4*8(sp)
|
||||
ld t1,5*8(sp)
|
||||
ld t2,6*8(sp)
|
||||
ld t3,7*8(sp)
|
||||
ld t4,8*8(sp)
|
||||
ld t5,9*8(sp)
|
||||
ld t6,10*8(sp)
|
||||
#else
|
||||
lw t0,4*4(sp)
|
||||
lw t1,5*4(sp)
|
||||
lw t2,6*4(sp)
|
||||
lw t3,7*4(sp)
|
||||
lw t4,8*4(sp)
|
||||
lw t5,9*4(sp)
|
||||
lw t6,10*4(sp)
|
||||
#endif
|
||||
syscall /* Do the system call. */
|
||||
j ra /* Return to caller. */
|
||||
.end syscall
|
||||
|
|
|
@ -1,35 +1,40 @@
|
|||
/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
/* Copyright (C) 1996, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#define MOVE(x,y) move y , x
|
||||
|
||||
#if 0
|
||||
#define LOSE asm volatile ("1: b 1b")
|
||||
#endif
|
||||
|
||||
#define START_MACHDEP asm ("\
|
||||
.text\n\
|
||||
.globl _start\n\
|
||||
.ent _start\n\
|
||||
_start:\n\
|
||||
# Put initial SP in a0.\n\
|
||||
move $4, $29\n\
|
||||
# Jump to _start0; don't return.\n\
|
||||
j _start0\n\
|
||||
.end _start\n\
|
||||
");
|
||||
#define START_ARGS int *entry_sp
|
||||
#define SNARF_ARGS(argc, argv, envp) \
|
||||
do \
|
||||
{ \
|
||||
int *entry_sp; \
|
||||
register char **p; \
|
||||
\
|
||||
asm ("addu %0,$30,4" : "=r" (entry_sp)); \
|
||||
\
|
||||
argc = *entry_sp; \
|
||||
argv = (char **) (entry_sp + 1); \
|
||||
p = argv; \
|
||||
|
@ -44,11 +49,20 @@ Cambridge, MA 02139, USA. */
|
|||
({ register int __fn = fn, __sp = (int) sp; \
|
||||
asm volatile ("move $sp,%0; j %1" : : "r" (__sp), "r" (__fn));})
|
||||
|
||||
#define RETURN_TO(sp, pc, retval) \
|
||||
asm volatile ("move $29, %0; move $2, %2; move $25, %1; jr $25" \
|
||||
: : "r" (sp), "r" (pc), "r" (retval))
|
||||
|
||||
#define STACK_GROWTH_DOWN
|
||||
|
||||
#ifdef P40
|
||||
#include <syscall.h>
|
||||
|
||||
#if defined (ASSEMBLER)
|
||||
|
||||
#define ALIGN 2
|
||||
|
||||
#define MOVE(x,y) move y , x
|
||||
|
||||
#define SYSCALL(name, args) \
|
||||
.globl syscall_error; \
|
||||
kernel_trap(name,SYS_##name,args); \
|
||||
|
|
|
@ -1,25 +1,30 @@
|
|||
/* Mach thread state definitions for machine-independent code. MIPS version.
|
||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Copyright (C) 1996, 1997 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
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#define MACHINE_THREAD_STATE_FLAVOR MIPS_THREAD_STATE
|
||||
#define MACHINE_THREAD_STATE_COUNT MIPS_THREAD_STATE_COUNT
|
||||
|
||||
#ifdef PIC
|
||||
#define MACHINE_THREAD_STATE_SET_PC(ts, pc) \
|
||||
((ts)->PC = (ts)->r25 = (unsigned long int) (pc))
|
||||
#endif
|
||||
|
||||
#define machine_thread_state mips_thread_state
|
||||
|
||||
#define PC pc
|
||||
|
|
Loading…
Reference in New Issue