diff options
author | Robert de Bath <rdebath@poboxes.com> | 1996-03-24 17:45:55 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2013-10-23 23:29:43 +0200 |
commit | fe22c37817ce338fbbc90b239320248c270957fa (patch) | |
tree | d9550410c4a20bdd382fcc58d2d3d7c5e04e5245 /elksemu/elks_signal.c | |
parent | a7aba15e8efffb1c5d3097656f1a93955a64f01f (diff) | |
parent | 42192453ea219b80d0bf9f41e51e36d3d4d0740b (diff) | |
download | dev86-fe22c37817ce338fbbc90b239320248c270957fa.tar.gz |
Import Dev86-0.0.4.tar.gzv0.0.4
Diffstat (limited to 'elksemu/elks_signal.c')
-rw-r--r-- | elksemu/elks_signal.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/elksemu/elks_signal.c b/elksemu/elks_signal.c new file mode 100644 index 0000000..2bf1e55 --- /dev/null +++ b/elksemu/elks_signal.c @@ -0,0 +1,36 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <fcntl.h> +#include <signal.h> +#include <sys/stat.h> +#include <sys/vm86.h> +#include "elks.h" + +static int elks_sigtrap= -1; + +void sig_trap(int signo) +{ + elks_cpu.regs.esp -= 2; + ELKS_POKE(unsigned short, elks_cpu.regs.esp, signo); + elks_cpu.regs.esp -= 2; + ELKS_POKE(unsigned short, elks_cpu.regs.esp, elks_cpu.regs.eip); + elks_cpu.regs.eip = elks_sigtrap; +} + +int elks_signal(int bx,int cx,int dx,int di,int si) +{ + int rv; + if( bx < 0 || bx >= NSIG ) { errno = EINVAL; return -1; } + if( cx == 0 ) rv = (signal(bx, SIG_DFL) == SIG_ERR); + else if( cx == 1 ) rv = (signal(bx, SIG_IGN) == SIG_ERR); + else + { + elks_sigtrap = cx; + rv = (signal(bx, sig_trap) == SIG_ERR); + } + + return -rv; +} |