mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
Initial revision
This commit is contained in:
parent
2a96c10282
commit
6e1bdbcff1
164
sysdeps/unix/bsd/sun/m68k/sigtramp.c
Normal file
164
sysdeps/unix/bsd/sun/m68k/sigtramp.c
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
/* Copyright (C) 1993 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 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. */
|
||||||
|
|
||||||
|
#include <ansidecl.h>
|
||||||
|
|
||||||
|
#ifndef __GNUC__
|
||||||
|
#error This file uses GNU C extensions; you must compile with GCC.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get the definition of `struct sigcontext'. */
|
||||||
|
#define KERNEL
|
||||||
|
#define sigvec sun_sigvec
|
||||||
|
#define sigstack sun_sigstack
|
||||||
|
#define sigcontext sun_sigcontext
|
||||||
|
#include "/usr/include/sys/signal.h"
|
||||||
|
#undef sigvec
|
||||||
|
#undef sigstack
|
||||||
|
#undef sigcontext
|
||||||
|
#undef NSIG
|
||||||
|
#undef SIGABRT
|
||||||
|
#undef SIGCLD
|
||||||
|
#undef SV_ONSTACK
|
||||||
|
#undef SV_RESETHAND
|
||||||
|
#undef SV_INTERRUPT
|
||||||
|
#undef SA_ONSTACK
|
||||||
|
#undef SA_NOCLDSTOP
|
||||||
|
#undef SIG_ERR
|
||||||
|
#undef SIG_DFL
|
||||||
|
#undef SIG_IGN
|
||||||
|
#undef sigmask
|
||||||
|
#undef SIG_BLOCK
|
||||||
|
#undef SIG_UNBLOCK
|
||||||
|
#undef SIG_SETMASK
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
/* Defined in __sigvec.S. */
|
||||||
|
extern int EXFUN(__raw_sigvec, (int sig, CONST struct sigvec *vec,
|
||||||
|
struct sigvec *ovec));
|
||||||
|
|
||||||
|
/* User-specified signal handlers. */
|
||||||
|
#define mytramp 1
|
||||||
|
#ifdef mytramp
|
||||||
|
static __sighandler_t handlers[NSIG];
|
||||||
|
#else
|
||||||
|
#define handlers _sigfunc
|
||||||
|
extern __sighandler_t _sigfunc[];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if mytramp
|
||||||
|
|
||||||
|
/* Handler for all signals that are handled by a user-specified function.
|
||||||
|
Saves and restores the general regs %g2-%g7, the %y register, and
|
||||||
|
all the FPU regs (including %fsr), around calling the user's handler. */
|
||||||
|
static void
|
||||||
|
DEFUN(trampoline, (sig, code, context, addr),
|
||||||
|
int sig AND int code AND struct sigcontext *context AND PTR addr)
|
||||||
|
{
|
||||||
|
register int a0 asm("%a0");
|
||||||
|
register int a1 asm("%a1");
|
||||||
|
register int d0 asm("%d0");
|
||||||
|
register int d1 asm("%d1");
|
||||||
|
|
||||||
|
int savea[2], saved[2];
|
||||||
|
|
||||||
|
double fpsave[16];
|
||||||
|
int fsr;
|
||||||
|
int savefpu;
|
||||||
|
|
||||||
|
/* Save the call-clobbered registers. */
|
||||||
|
savea[0] = a0;
|
||||||
|
savea[1] = a1;
|
||||||
|
saved[0] = d0;
|
||||||
|
saved[1] = d1;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Save the FPU regs if the FPU enable bit is set in the PSR,
|
||||||
|
and the signal isn't an FP exception. */
|
||||||
|
savefpu = (context->sc_psr & 0x1000) && sig != SIGFPE;
|
||||||
|
if (savefpu)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Call the user's handler. */
|
||||||
|
(*((void EXFUN((*), (int sig, int code, struct sigcontext *context,
|
||||||
|
PTR addr))) handlers[sig]))
|
||||||
|
(sig, code, context, addr);
|
||||||
|
|
||||||
|
/* Restore the call-clobbered registers. */
|
||||||
|
a0 = savea[0];
|
||||||
|
a1 = savea[1];
|
||||||
|
d0 = saved[0];
|
||||||
|
d1 = saved[1];
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if (savefpu)
|
||||||
|
;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
DEFUN(__sigvec, (sig, vec, ovec),
|
||||||
|
int sig AND CONST struct sigvec *vec AND struct sigvec *ovec)
|
||||||
|
{
|
||||||
|
#ifndef mytramp
|
||||||
|
extern void _sigtramp (int);
|
||||||
|
#define trampoline _sigtramp
|
||||||
|
#endif
|
||||||
|
struct sigvec myvec;
|
||||||
|
int mask;
|
||||||
|
__sighandler_t ohandler;
|
||||||
|
|
||||||
|
if (sig <= 0 || sig >= NSIG)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mask = __sigblock(sigmask(sig));
|
||||||
|
|
||||||
|
ohandler = handlers[sig];
|
||||||
|
|
||||||
|
if (vec != NULL &&
|
||||||
|
vec->sv_handler != SIG_IGN && vec->sv_handler != SIG_DFL)
|
||||||
|
{
|
||||||
|
handlers[sig] = vec->sv_handler;
|
||||||
|
myvec = *vec;
|
||||||
|
myvec.sv_handler = trampoline;
|
||||||
|
vec = &myvec;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (__raw_sigvec(sig, vec, ovec) < 0)
|
||||||
|
{
|
||||||
|
int save = errno;
|
||||||
|
(void) __sigsetmask(mask);
|
||||||
|
errno = save;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ovec != NULL && ovec->sv_handler == trampoline)
|
||||||
|
ovec->sv_handler = ohandler;
|
||||||
|
|
||||||
|
(void) __sigsetmask(mask);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user