summaryrefslogtreecommitdiffstats
path: root/sys/i386/ibcs2/ibcs2_xenix.c
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>1994-10-14 08:53:16 +0000
committersos <sos@FreeBSD.org>1994-10-14 08:53:16 +0000
commit8c25a4d2ace95c98887a2c73b1a1b7ac8c79f8ef (patch)
tree03e7e36f42559e1855d7488025f88b38a06ded17 /sys/i386/ibcs2/ibcs2_xenix.c
parente5a7fbf2bb8340c56fa8524e8b92c32ee9abb588 (diff)
downloadFreeBSD-src-8c25a4d2ace95c98887a2c73b1a1b7ac8c79f8ef.zip
FreeBSD-src-8c25a4d2ace95c98887a2c73b1a1b7ac8c79f8ef.tar.gz
iBCS2 emulator core files.
This is the main files for the iBCS2 emulator. It can be use compiled into the kernel by using: options IBCS2 options COMPAT_IBCS2 or as a lkm module using: options COMPAT_IBCS2 and then loading it via the ibcs2 script in /usr/bin REMEMBER: this code is still experimental ! NO WARRENTY ! Submitted by: sef@kithrup.com, mostyn@mrl.com, sos@kmd-ac.dk
Diffstat (limited to 'sys/i386/ibcs2/ibcs2_xenix.c')
-rw-r--r--sys/i386/ibcs2/ibcs2_xenix.c367
1 files changed, 367 insertions, 0 deletions
diff --git a/sys/i386/ibcs2/ibcs2_xenix.c b/sys/i386/ibcs2/ibcs2_xenix.c
new file mode 100644
index 0000000..051ed58
--- /dev/null
+++ b/sys/i386/ibcs2/ibcs2_xenix.c
@@ -0,0 +1,367 @@
+/*-
+ * Copyright (c) 1994 Sean Eric Fagan
+ * Copyright (c) 1994 Søren Schmidt
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer
+ * in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software withough specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id: ibcs2_xenix.c,v 1.10 1994/10/12 19:38:38 sos Exp $
+ */
+
+#include <i386/ibcs2/ibcs2.h>
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <sys/exec.h>
+#include <sys/sysent.h>
+#include <sys/errno.h>
+#include <sys/ioctl.h>
+#include <sys/signal.h>
+#include <sys/syslimits.h>
+#include <sys/unistd.h>
+#include <sys/timeb.h>
+#include <vm/vm.h>
+#include <machine/cpu.h>
+#include <machine/psl.h>
+#include <machine/reg.h>
+
+struct ibcs2_sco_chsize_args {
+ int fd;
+ ibcs2_off_t size;
+};
+
+static int
+sco_chsize(struct proc *p, struct ibcs2_sco_chsize_args *args, int *retval)
+{
+ struct ftruncate_args {
+ int fd;
+ int pad;
+ off_t length;
+ } tmp;
+
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix chsize'\n");
+ tmp.fd = args->fd;
+ tmp.pad = 0;
+ tmp.length = args->size;
+ return ftruncate(p, &tmp, retval);
+}
+
+struct ibcs2_sco_ftime_args {
+ struct timeb *tp;
+};
+
+static int
+sco_ftime(struct proc *p, struct ibcs2_sco_ftime_args *args, int *retval)
+{
+ struct timeval atv;
+ extern struct timezone tz;
+ struct timeb tb;
+
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix ftime'\n");
+ microtime(&atv);
+ tb.time = atv.tv_sec;
+ tb.millitm = atv.tv_usec / 1000;
+ tb.timezone = tz.tz_minuteswest;
+ tb.dstflag = tz.tz_dsttime != DST_NONE;
+
+ return copyout((caddr_t)&tb, (caddr_t)args->tp, sizeof(struct timeb));
+}
+
+struct ibcs2_sco_nap_args {
+ long time;
+};
+
+static int
+sco_nap(struct proc *p, struct ibcs2_sco_nap_args *args, int *retval)
+{
+ long period;
+ extern int hz;
+
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix nap %d ms'\n", args->time);
+ period = (long)args->time / (1000/hz);
+ if (period)
+ while (tsleep(&period, PUSER, "nap", period)
+ != EWOULDBLOCK) ;
+ return 0;
+}
+
+struct ibcs2_sco_rdchk_args {
+ int fd;
+};
+
+static int
+sco_rdchk(struct proc *p, struct ibcs2_sco_rdchk_args *args, int *retval)
+{
+ struct ioctl_arg {
+ int fd;
+ int cmd;
+ caddr_t arg;
+ } tmp;
+ int error;
+
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix rdchk'\n");
+ tmp.fd = args->fd;
+ tmp.cmd = FIONREAD;
+ tmp.arg = (caddr_t)UA_ALLOC();
+ error = ioctl(p, &tmp, retval);
+ if (!error)
+ *retval = *retval <= 0 ? 0 : 1;
+ return error;
+}
+
+struct ibcs2_sco_utsname_args {
+ long addr;
+};
+
+static int
+sco_utsname(struct proc *p, struct ibcs2_sco_utsname_args *args, int *retval)
+{
+ struct ibcs2_sco_utsname {
+ char sysname[9];
+ char nodename[9];
+ char release[16];
+ char kernelid[20];
+ char machine[9];
+ char bustype[9];
+ char sysserial[10];
+ unsigned short sysorigin;
+ unsigned short sysoem;
+ char numusers[9];
+ unsigned short numcpu;
+ } ibcs2_sco_uname;
+ extern char ostype[], hostname[], osrelease[], version[], machine[];
+
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix sco_utsname'\n");
+ bzero(&ibcs2_sco_uname, sizeof(struct ibcs2_sco_utsname));
+ strncpy(ibcs2_sco_uname.sysname, ostype, 8);
+ strncpy(ibcs2_sco_uname.nodename, hostname, 8);
+ strncpy(ibcs2_sco_uname.release, osrelease, 15);
+ strncpy(ibcs2_sco_uname.kernelid, version, 19);
+ strncpy(ibcs2_sco_uname.machine, machine, 8);
+ bcopy("ISA/EISA", ibcs2_sco_uname.bustype, 8);
+ bcopy("no charge", ibcs2_sco_uname.sysserial, 9);
+ bcopy("unlim", ibcs2_sco_uname.numusers, 8);
+ ibcs2_sco_uname.sysorigin = 0xFFFF;
+ ibcs2_sco_uname.sysoem = 0xFFFF;
+ ibcs2_sco_uname.numcpu = 1;
+ return copyout((caddr_t)&ibcs2_sco_uname, (caddr_t)args->addr,
+ sizeof(struct ibcs2_sco_utsname));
+}
+
+int
+ibcs2_cxenix(struct proc *p, void *args, int *retval)
+{
+ struct trapframe *tf = (struct trapframe *)p->p_md.md_regs;
+
+ switch ((tf->tf_eax & 0xff00) >> 8) {
+
+ case 0x07: /* rdchk */
+ return sco_rdchk(p, args, retval);
+
+ case 0x0a: /* chsize */
+ return sco_chsize(p, args, retval);
+
+ case 0x0b: /* ftime */
+ return sco_ftime(p, args, retval);
+
+ case 0x0c: /* nap */
+ return sco_nap(p, args, retval);
+
+ case 0x15: /* scoinfo (not documented) */
+ *retval = 0;
+ return 0;
+
+ case 0x24: /* select */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix select'\n");
+ return select(p, args, retval);
+
+ case 0x25: /* eaccess */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix eaccess'\n");
+ return ibcs2_access(p, args, retval);
+
+ case 0x27: /* sigaction */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix sigaction'\n");
+ return ibcs2_sigaction (p, args, retval);
+
+ case 0x28: /* sigprocmask */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix sigprocmask'\n");
+ return ibcs2_sigprocmask (p, args, retval);
+
+ case 0x29: /* sigpending */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix sigpending'\n");
+ return ibcs2_sigpending (p, args, retval);
+
+ case 0x2a: /* sigsuspend */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix sigsuspend'\n");
+ return ibcs2_sigsuspend (p, args, retval);
+
+ case 0x2b: /* getgroups */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix getgroups'\n");
+ return ibcs2_getgroups(p, args, retval);
+
+ case 0x2c: /* setgroups */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix setgroups'\n");
+ return ibcs2_setgroups(p, args, retval);
+
+ case 0x2d: { /* sysconf */
+ struct ibcs2_sysconf_args {
+ int num;
+ } *sysconf_args = args;
+
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix sysconf'");
+ switch (sysconf_args->num) {
+ case 0: /* _SC_ARG_MAX */
+ *retval = (ARG_MAX);
+ break;
+ case 1: /* _SC_CHILD_MAX */
+ *retval = (CHILD_MAX);
+ break;
+ case 2: /* _SC_CLK_TCK */
+ *retval = (CLK_TCK);
+ break;
+ case 3: /* _SC_NGROUPS_MAX */
+ *retval = (NGROUPS_MAX);
+ break;
+ case 4: /* _SC_OPEN_MAX */
+ *retval = (OPEN_MAX);
+ break;
+ case 5: /* _SC_JOB_CONTROL */
+#ifdef _POSIX_JOB_CONTORL
+ *retval = _POSIX_JOB_CONTORL;
+#else
+ *retval = (0);
+#endif
+ break;
+ case 6: /* _SC_SAVED_IDS */
+#ifdef _POSIX_SAVED_IDS
+ *retval = (_POSIX_SAVED_IDS);
+#else
+ *retval = (0);
+#endif
+ break;
+ case 7: /* _SC_VERSION */
+ *retval = (_POSIX_VERSION);
+ break;
+ default:
+ *retval = -1;
+ return EINVAL;
+ }
+ return 0;
+ }
+
+ case 0x2e: /* pathconf */
+ case 0x2f: /* fpathconf */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix (f)pathconf'\n");
+ return ibcs2_pathconf(p, args, retval);
+
+ case 0x30: /* rename */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix rename'\n");
+ return ibcs2_rename(p, args, retval);
+
+ case 0x32: /* sco_utsname */
+ return sco_utsname(p, args, retval);
+
+ case 0x37: /* getitimer */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix getitimer'\n");
+ return getitimer(p, args, retval);
+
+ case 0x38: /* setitimer */
+ if (ibcs2_trace & IBCS2_TRACE_XENIX)
+ printf("IBCS2: 'cxenix setitimer'\n");
+ return setitimer(p, args, retval);
+
+
+ /* Not implemented yet SORRY */
+ case 0x01: /* xlocking */
+ printf("IBCS2: 'cxenix xlocking'");
+ break;
+ case 0x02: /* creatsem */
+ printf("IBCS2: 'cxenix creatsem'");
+ break;
+ case 0x03: /* opensem */
+ printf("IBCS2: 'cxenix opensem'");
+ break;
+ case 0x04: /* sigsem */
+ printf("IBCS2: 'cxenix sigsem'");
+ break;
+ case 0x05: /* waitsem */
+ printf("IBCS2: 'cxenix waitsem'");
+ break;
+ case 0x06: /* nbwaitsem */
+ printf("IBCS2: 'cxenix nbwaitsem'");
+ break;
+ case 0x0d: /* sdget */
+ printf("IBCS2: 'cxenix sdget'");
+ break;
+ case 0x0e: /* sdfree */
+ printf("IBCS2: 'cxenix sdfree'");
+ break;
+ case 0x0f: /* sdenter */
+ printf("IBCS2: 'cxenix sdenter'");
+ break;
+ case 0x10: /* sdleave */
+ printf("IBCS2: 'cxenix sdleave'");
+ break;
+ case 0x11: /* sdgetv */
+ printf("IBCS2: 'cxenix sdgetv'");
+ break;
+ case 0x12: /* sdwaitv */
+ printf("IBCS2: 'cxenix sdwaitv'");
+ break;
+ case 0x20: /* proctl */
+ printf("IBCS2: 'cxenix proctl'");
+ break;
+ case 0x21: /* execseg */
+ printf("IBCS2: 'cxenix execseg'");
+ break;
+ case 0x22: /* unexecseg */
+ printf("IBCS2: 'cxenix unexecseg'");
+ break;
+ case 0x26: /* paccess */
+ printf("IBCS2: 'cxenix paccess'");
+ break;
+ default:
+ printf("IBCS2: 'cxenix' function %d(0x%x)",
+ tf->tf_eax>>8, tf->tf_eax>>8);
+ break;
+ }
+ printf(" not implemented yet\n");
+ return EINVAL;
+}
OpenPOWER on IntegriCloud