1988-04-29 14:38:36 +00:00
|
|
|
/*
|
|
|
|
(c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
|
|
See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
|
|
*/
|
|
|
|
|
1988-05-03 13:17:20 +00:00
|
|
|
/*
|
|
|
|
Module: Mapping of Unix signals to EM traps
|
|
|
|
(only when not using the MON instruction)
|
|
|
|
Author: Ceriel J.H. Jacobs
|
|
|
|
Version: $Header$
|
1988-04-29 14:38:36 +00:00
|
|
|
*/
|
|
|
|
|
1991-09-04 15:49:34 +00:00
|
|
|
#if !defined(__em22) && !defined(__em24) && !defined(__em44)
|
1988-04-29 14:38:36 +00:00
|
|
|
|
|
|
|
#define EM_trap(n) TRP(n) /* define to whatever is needed to cause the trap */
|
|
|
|
|
|
|
|
#include <signal.h>
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
int __signo;
|
|
|
|
|
|
|
|
static int __traps[] = {
|
|
|
|
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
|
|
|
|
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
|
|
|
|
-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
|
|
|
|
};
|
|
|
|
|
1993-11-17 16:27:44 +00:00
|
|
|
static void
|
1988-04-29 14:38:36 +00:00
|
|
|
__ctchsig(signo)
|
|
|
|
{
|
|
|
|
signal(signo,__ctchsig);
|
|
|
|
#ifdef __BSD4_2
|
|
|
|
sigsetmask(sigblock(0) & ~(1<<(signo - 1)));
|
|
|
|
#endif
|
|
|
|
__signo = signo;
|
|
|
|
EM_trap(__traps[signo]);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
sigtrp(trapno, signo)
|
|
|
|
{
|
|
|
|
/* Let Unix signal signo cause EM trap trapno to occur.
|
|
|
|
If trapno = -2, restore default,
|
|
|
|
If trapno = -3, ignore.
|
|
|
|
Return old trapnumber.
|
|
|
|
Careful, this could be -2 or -3; But return value of -1
|
|
|
|
indicates failure, with error number in errno.
|
|
|
|
*/
|
|
|
|
extern int errno;
|
1993-11-17 16:27:44 +00:00
|
|
|
void (*ctch)() = __ctchsig;
|
|
|
|
void (*oldctch)();
|
1988-04-29 14:38:36 +00:00
|
|
|
int oldtrap;
|
|
|
|
|
|
|
|
if (signo <= 0 || signo >= sizeof(__traps)/sizeof(__traps[0])) {
|
|
|
|
errno = EINVAL;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (trapno == -3)
|
|
|
|
ctch = SIG_IGN;
|
|
|
|
else if (trapno == -2)
|
|
|
|
ctch = SIG_DFL;
|
|
|
|
else if (trapno >= 0 && trapno <= 252)
|
|
|
|
;
|
|
|
|
else {
|
|
|
|
errno = EINVAL;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
oldtrap = __traps[signo];
|
|
|
|
|
1993-11-17 16:27:44 +00:00
|
|
|
if ((oldctch = signal(signo, ctch)) == (void (*)())-1) /* errno set by signal */
|
1988-04-29 14:38:36 +00:00
|
|
|
return -1;
|
|
|
|
|
1990-08-29 11:44:33 +00:00
|
|
|
else if (oldctch == SIG_IGN) {
|
|
|
|
signal(signo, SIG_IGN);
|
|
|
|
}
|
|
|
|
else __traps[signo] = trapno;
|
1988-04-29 14:38:36 +00:00
|
|
|
|
|
|
|
return oldtrap;
|
|
|
|
}
|
|
|
|
#endif
|