summaryrefslogtreecommitdiff
path: root/elksemu/elks_signal.c
diff options
context:
space:
mode:
authorRobert de Bath <rdebath@poboxes.com>1996-03-24 17:45:55 +0100
committerLubomir Rintel <lkundrak@v3.sk>2013-10-23 23:29:43 +0200
commitfe22c37817ce338fbbc90b239320248c270957fa (patch)
treed9550410c4a20bdd382fcc58d2d3d7c5e04e5245 /elksemu/elks_signal.c
parenta7aba15e8efffb1c5d3097656f1a93955a64f01f (diff)
parent42192453ea219b80d0bf9f41e51e36d3d4d0740b (diff)
downloaddev86-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.c36
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;
+}