summaryrefslogtreecommitdiff
path: root/elksemu
diff options
context:
space:
mode:
authorRobert de Bath <rdebath@poboxes.com>1998-02-01 11:26:21 +0100
committerLubomir Rintel <lkundrak@v3.sk>2013-10-23 23:40:14 +0200
commit48f0b3eb836162d41622cedc1eb5f5168168fb8e (patch)
treec53156383d4682a0a296f6611575dbc1d64d1881 /elksemu
parent48798bf2eb93ec3b99720ac2e16093441156653d (diff)
downloaddev86-48f0b3eb836162d41622cedc1eb5f5168168fb8e.tar.gz
Import Dev86src-0.13.5.tar.gzv0.13.5
Diffstat (limited to 'elksemu')
-rw-r--r--elksemu/elks.c24
-rw-r--r--elksemu/elks_sys.c30
2 files changed, 45 insertions, 9 deletions
diff --git a/elksemu/elks.c b/elksemu/elks.c
index c31e94f..ddcf549 100644
--- a/elksemu/elks.c
+++ b/elksemu/elks.c
@@ -19,6 +19,10 @@
#include <sys/mman.h>
#include "elks.h"
+#ifdef __BCC__
+#define OLD_LIBC_VERSION
+#endif
+
volatile struct vm86_struct elks_cpu;
unsigned char *elks_base; /* Paragraph aligned */
@@ -114,13 +118,33 @@ static int load_elks(int fd)
return 0;
}
+#ifndef OLD_LIBC_VERSION
+ /*
+ * recent versions of libc have changed the proto for vm86()
+ * for now I'll just override ...
+ */
+#define OLD_SYS_vm86 113
+#define NEW_SYS_vm86 166
+
+static inline int vm86_mine(struct vm86_struct* v86)
+{
+ int __res;
+ __asm__ __volatile__("int $0x80\n"
+ :"=a" (__res):"a" ((int)OLD_SYS_vm86), "b" ((int)v86));
+ return __res;
+}
+#endif
void run_elks()
{
/*
* Execute 8086 code for a while.
*/
+#ifndef OLD_LIBC_VERSION
+ int err=vm86_mine((struct vm86_struct*)&elks_cpu);
+#else
int err=vm86((struct vm86_struct*)&elks_cpu);
+#endif
switch(VM86_TYPE(err))
{
/*
diff --git a/elksemu/elks_sys.c b/elksemu/elks_sys.c
index 4cc4368..16a3cec 100644
--- a/elksemu/elks_sys.c
+++ b/elksemu/elks_sys.c
@@ -40,7 +40,7 @@ static int elks_enosys(int bx,int cx,int dx,int di,int si);
DIR * dirtab[DIRCOUNT];
int diropen = 0;
static int elks_opendir(char * dname);
-static int elks_readdir(int bx, int cx, int dx);
+static int elks_readdir(int bx,int cx,int dx,int di,int si);
static int elks_closedir(int bx);
/*
@@ -109,7 +109,7 @@ static int elks_read(int bx,int cx,int dx,int di,int si)
dbprintf(("read(%d, %d, %d)\n",
bx,cx,dx));
if( bx >= 10000 && bx < 10000+DIRCOUNT)
- return elks_readdir(bx, cx, dx);
+ return elks_readdir(bx, cx, dx, di, si);
if( dx < 0 || dx > 1024 ) dx = 1024;
return read(bx, ELKS_PTR(void, cx), dx);
}
@@ -297,8 +297,8 @@ static int elks_getuid(int bx,int cx,int dx,int di,int si)
#define sys_alarm elks_alarm
static int elks_alarm(int bx,int cx,int dx,int di,int si)
{
- dbprintf(("alarm(%d)\n",bx<<16|cx));
- return alarm(bx<<16|cx);
+ dbprintf(("alarm(%d)\n",bx&0xFFFF));
+ return alarm(bx&0xFFFF);
}
#define sys_fstat elks_fstat
@@ -403,8 +403,8 @@ static int elks_getgid(int bx,int cx,int dx,int di,int si)
*
* Of course with the Patch in the Linux kernel we could just run the exe.
*/
-#define sys_exec elks_exec
-static int elks_exec(int bx,int cx,int dx,int di,int si)
+#define sys_execve elks_execve
+static int elks_execve(int bx,int cx,int dx,int di,int si)
{
int fd;
int arg_ct,env_ct;
@@ -512,6 +512,18 @@ static int elks_fcntl(int bx,int cx,int dx,int di,int si)
return -1;
}
+#define sys_dup elks_dup
+static int elks_dup(int bx,int cx,int dx,int di,int si)
+{
+ return dup(bx);
+}
+
+#define sys_dup2 elks_dup2
+static int elks_dup2(int bx,int cx,int dx,int di,int si)
+{
+ return dup2(bx, cx);
+}
+
#define sys_rename elks_rename
static int elks_rename(int bx,int cx,int dx,int di,int si)
{
@@ -651,13 +663,13 @@ elks_opendir(char * dname)
return 10000+rv;
}
-static int
-elks_readdir(int bx, int cx, int dx)
+#define sys_readdir elks_readdir
+static int elks_readdir(int bx,int cx,int dx,int di,int si)
{
struct dirent * ent;
/* Only read _ONE_ _WHOLE_ dirent at a time */
- if( dx != 266 )
+ if( dx != 266 && dx != 1 )
{
errno=EINVAL; return -1;
}