diff options
author | Robert de Bath <rdebath@poboxes.com> | 1998-02-01 11:26:21 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2013-10-23 23:40:14 +0200 |
commit | 48f0b3eb836162d41622cedc1eb5f5168168fb8e (patch) | |
tree | c53156383d4682a0a296f6611575dbc1d64d1881 /elksemu | |
parent | 48798bf2eb93ec3b99720ac2e16093441156653d (diff) | |
download | dev86-48f0b3eb836162d41622cedc1eb5f5168168fb8e.tar.gz |
Import Dev86src-0.13.5.tar.gzv0.13.5
Diffstat (limited to 'elksemu')
-rw-r--r-- | elksemu/elks.c | 24 | ||||
-rw-r--r-- | elksemu/elks_sys.c | 30 |
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; } |