ibcs2_xenix.c revision 8221
143973Snsouch/*- 270606Snsouch * Copyright (c) 1994 Sean Eric Fagan 343973Snsouch * Copyright (c) 1994 S�ren Schmidt 443973Snsouch * All rights reserved. 543973Snsouch * 643973Snsouch * Redistribution and use in source and binary forms, with or without 743973Snsouch * modification, are permitted provided that the following conditions 843973Snsouch * are met: 943973Snsouch * 1. Redistributions of source code must retain the above copyright 1043973Snsouch * notice, this list of conditions and the following disclaimer 1143973Snsouch * in this position and unchanged. 1243973Snsouch * 2. Redistributions in binary form must reproduce the above copyright 1343973Snsouch * notice, this list of conditions and the following disclaimer in the 1443973Snsouch * documentation and/or other materials provided with the distribution. 1543973Snsouch * 3. The name of the author may not be used to endorse or promote products 1643973Snsouch * derived from this software withough specific prior written permission 1743973Snsouch * 1843973Snsouch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1943973Snsouch * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2043973Snsouch * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2143973Snsouch * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2243973Snsouch * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2343973Snsouch * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2443973Snsouch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2543973Snsouch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2643973Snsouch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2743973Snsouch * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2843973Snsouch * 2943973Snsouch * $Id: ibcs2_xenix.c,v 1.2 1995/02/03 21:31:35 bde Exp $ 30116192Sobrien */ 31116192Sobrien 32116192Sobrien#include <i386/ibcs2/ibcs2.h> 33116192Sobrien#include <sys/param.h> 3443973Snsouch#include <sys/proc.h> 3543973Snsouch#include <sys/exec.h> 3643973Snsouch#include <sys/sysent.h> 3743973Snsouch#include <sys/errno.h> 3843973Snsouch#include <sys/ioctl.h> 3943973Snsouch#include <sys/signal.h> 4043973Snsouch#include <sys/syslimits.h> 4143973Snsouch#include <sys/unistd.h> 4270606Snsouch#include <sys/timeb.h> 4370606Snsouch#include <vm/vm.h> 4443973Snsouch#include <machine/cpu.h> 45119288Simp#include <machine/psl.h> 46119288Simp#include <machine/reg.h> 4743973Snsouch 4843973Snsouchstruct ibcs2_sco_chsize_args { 4943973Snsouch int fd; 5043973Snsouch ibcs2_off_t size; 5143973Snsouch}; 5243973Snsouch 5343973Snsouchstatic int 5443973Snsouchsco_chsize(struct proc *p, struct ibcs2_sco_chsize_args *args, int *retval) 5543973Snsouch{ 5643973Snsouch struct ftruncate_args { 5743973Snsouch int fd; 5843973Snsouch int pad; 5943973Snsouch off_t length; 6043973Snsouch } tmp; 6143973Snsouch 6243973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 6343973Snsouch printf("IBCS2: 'cxenix chsize'\n"); 6443973Snsouch tmp.fd = args->fd; 6543973Snsouch tmp.pad = 0; 6643973Snsouch tmp.length = args->size; 6743973Snsouch return ftruncate(p, &tmp, retval); 6843973Snsouch} 6943973Snsouch 7043973Snsouchstruct ibcs2_sco_ftime_args { 7143973Snsouch struct timeb *tp; 7243973Snsouch}; 7343973Snsouch 7443973Snsouchstatic int 7543973Snsouchsco_ftime(struct proc *p, struct ibcs2_sco_ftime_args *args, int *retval) 7643973Snsouch{ 7743973Snsouch struct timeval atv; 7843973Snsouch extern struct timezone tz; 7943973Snsouch struct timeb tb; 8043973Snsouch 8143973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 8243973Snsouch printf("IBCS2: 'cxenix ftime'\n"); 8343973Snsouch microtime(&atv); 8443973Snsouch tb.time = atv.tv_sec; 8543973Snsouch tb.millitm = atv.tv_usec / 1000; 8643973Snsouch tb.timezone = tz.tz_minuteswest; 8743973Snsouch tb.dstflag = tz.tz_dsttime != DST_NONE; 8843973Snsouch 8943973Snsouch return copyout((caddr_t)&tb, (caddr_t)args->tp, sizeof(struct timeb)); 9043973Snsouch} 9143973Snsouch 9243973Snsouchstruct ibcs2_sco_nap_args { 9343973Snsouch long time; 9443973Snsouch}; 9543973Snsouch 9643973Snsouchstatic int 9743973Snsouchsco_nap(struct proc *p, struct ibcs2_sco_nap_args *args, int *retval) 9843973Snsouch{ 9943973Snsouch long period; 10043973Snsouch extern int hz; 10143973Snsouch 10243973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 10343973Snsouch printf("IBCS2: 'cxenix nap %d ms'\n", args->time); 10443973Snsouch period = (long)args->time / (1000/hz); 10543973Snsouch if (period) 10643973Snsouch while (tsleep(&period, PUSER, "nap", period) 10770606Snsouch != EWOULDBLOCK) ; 10843973Snsouch return 0; 10943973Snsouch} 11043973Snsouch 11143973Snsouchstruct ibcs2_sco_rdchk_args { 11243973Snsouch int fd; 11343973Snsouch}; 11443973Snsouch 11543973Snsouchstatic int 11643973Snsouchsco_rdchk(struct proc *p, struct ibcs2_sco_rdchk_args *args, int *retval) 11743973Snsouch{ 11843973Snsouch struct ioctl_arg { 11943973Snsouch int fd; 12043973Snsouch int cmd; 12143973Snsouch caddr_t arg; 12243973Snsouch } tmp; 12393023Snsouch int error; 12443973Snsouch 12593023Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 12643973Snsouch printf("IBCS2: 'cxenix rdchk'\n"); 12743973Snsouch tmp.fd = args->fd; 12843973Snsouch tmp.cmd = FIONREAD; 12943973Snsouch tmp.arg = (caddr_t)UA_ALLOC(); 13043973Snsouch error = ioctl(p, &tmp, retval); 13193023Snsouch if (!error) 13293023Snsouch *retval = *retval <= 0 ? 0 : 1; 13393023Snsouch return error; 13493023Snsouch} 13543973Snsouch 13693023Snsouchstruct ibcs2_sco_utsname_args { 13793023Snsouch long addr; 13893023Snsouch}; 13993023Snsouch 14093023Snsouchstatic int 14193023Snsouchsco_utsname(struct proc *p, struct ibcs2_sco_utsname_args *args, int *retval) 14243973Snsouch{ 14393023Snsouch struct ibcs2_sco_utsname { 14493023Snsouch char sysname[9]; 14543973Snsouch char nodename[9]; 14693023Snsouch char release[16]; 14793023Snsouch char kernelid[20]; 14893023Snsouch char machine[9]; 14993023Snsouch char bustype[9]; 15043973Snsouch char sysserial[10]; 15193023Snsouch unsigned short sysorigin; 15293023Snsouch unsigned short sysoem; 15393023Snsouch char numusers[9]; 15443973Snsouch unsigned short numcpu; 15593023Snsouch } ibcs2_sco_uname; 15693023Snsouch extern char ostype[], hostname[], osrelease[], version[], machine[]; 15743973Snsouch 15893023Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 15993023Snsouch printf("IBCS2: 'cxenix sco_utsname'\n"); 16043973Snsouch bzero(&ibcs2_sco_uname, sizeof(struct ibcs2_sco_utsname)); 16193023Snsouch strncpy(ibcs2_sco_uname.sysname, ostype, 8); 16293023Snsouch strncpy(ibcs2_sco_uname.nodename, hostname, 8); 16393023Snsouch strncpy(ibcs2_sco_uname.release, osrelease, 15); 16493023Snsouch strncpy(ibcs2_sco_uname.kernelid, version, 19); 16593023Snsouch strncpy(ibcs2_sco_uname.machine, machine, 8); 16693023Snsouch bcopy("ISA/EISA", ibcs2_sco_uname.bustype, 8); 167142398Simp bcopy("no charge", ibcs2_sco_uname.sysserial, 9); 16893023Snsouch bcopy("unlim", ibcs2_sco_uname.numusers, 8); 16943973Snsouch ibcs2_sco_uname.sysorigin = 0xFFFF; 17093023Snsouch ibcs2_sco_uname.sysoem = 0xFFFF; 17143973Snsouch ibcs2_sco_uname.numcpu = 1; 17243973Snsouch return copyout((caddr_t)&ibcs2_sco_uname, (caddr_t)args->addr, 17370606Snsouch sizeof(struct ibcs2_sco_utsname)); 17493023Snsouch} 17543973Snsouch 176115532Sphkint 17770606Snsouchibcs2_cxenix(struct proc *p, void *args, int *retval) 17893023Snsouch{ 17943973Snsouch struct trapframe *tf = (struct trapframe *)p->p_md.md_regs; 18070606Snsouch 18143973Snsouch switch ((tf->tf_eax & 0xff00) >> 8) { 18243973Snsouch 18370606Snsouch case 0x07: /* rdchk */ 18470606Snsouch return sco_rdchk(p, args, retval); 18543973Snsouch 18670606Snsouch case 0x0a: /* chsize */ 18770606Snsouch return sco_chsize(p, args, retval); 18870606Snsouch 18970606Snsouch case 0x0b: /* ftime */ 19070606Snsouch return sco_ftime(p, args, retval); 19170606Snsouch 19270606Snsouch case 0x0c: /* nap */ 19370606Snsouch return sco_nap(p, args, retval); 19493023Snsouch 19570606Snsouch case 0x15: /* scoinfo (not documented) */ 19693023Snsouch *retval = 0; 19743973Snsouch return 0; 19843973Snsouch 19943973Snsouch case 0x24: /* select */ 20070606Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 20143973Snsouch printf("IBCS2: 'cxenix select'\n"); 20243973Snsouch return select(p, args, retval); 20343973Snsouch 20443973Snsouch case 0x25: /* eaccess */ 20543973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 20643973Snsouch printf("IBCS2: 'cxenix eaccess'\n"); 20743973Snsouch return ibcs2_access(p, args, retval); 20843973Snsouch 20943973Snsouch case 0x27: /* sigaction */ 21043973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 21143973Snsouch printf("IBCS2: 'cxenix sigaction'\n"); 21243973Snsouch return ibcs2_sigaction (p, args, retval); 21343973Snsouch 21443973Snsouch case 0x28: /* sigprocmask */ 21543973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 21643973Snsouch printf("IBCS2: 'cxenix sigprocmask'\n"); 21743973Snsouch return ibcs2_sigprocmask (p, args, retval); 21843973Snsouch 21943973Snsouch case 0x29: /* sigpending */ 22093023Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 22193023Snsouch printf("IBCS2: 'cxenix sigpending'\n"); 22293023Snsouch return ibcs2_sigpending (p, args, retval); 22343973Snsouch 22493023Snsouch case 0x2a: /* sigsuspend */ 22543973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 22643973Snsouch printf("IBCS2: 'cxenix sigsuspend'\n"); 22793023Snsouch return ibcs2_sigsuspend (p, args, retval); 228127135Snjl 229127135Snjl case 0x2b: /* getgroups */ 23043973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 23193023Snsouch printf("IBCS2: 'cxenix getgroups'\n"); 23270606Snsouch return ibcs2_getgroups(p, args, retval); 23393023Snsouch 23470606Snsouch case 0x2c: /* setgroups */ 23593023Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 23693023Snsouch printf("IBCS2: 'cxenix setgroups'\n"); 23770606Snsouch return ibcs2_setgroups(p, args, retval); 23893023Snsouch 23993023Snsouch case 0x2d: { /* sysconf */ 24093023Snsouch struct ibcs2_sysconf_args { 24143973Snsouch int num; 24243973Snsouch } *sysconf_args = args; 24343973Snsouch 24443973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 24543973Snsouch printf("IBCS2: 'cxenix sysconf'"); 24693023Snsouch switch (sysconf_args->num) { 24743973Snsouch case 0: /* _SC_ARG_MAX */ 24893023Snsouch *retval = (ARG_MAX); 24943973Snsouch break; 25093023Snsouch case 1: /* _SC_CHILD_MAX */ 25193023Snsouch *retval = (CHILD_MAX); 25293023Snsouch break; 25393023Snsouch case 2: /* _SC_CLK_TCK */ 25443973Snsouch *retval = (_BSD_CLK_TCK_); 25593023Snsouch break; 25693023Snsouch case 3: /* _SC_NGROUPS_MAX */ 25743973Snsouch *retval = (NGROUPS_MAX); 25843973Snsouch break; 25943973Snsouch case 4: /* _SC_OPEN_MAX */ 26043973Snsouch *retval = (OPEN_MAX); 26143973Snsouch break; 262162234Sjhb case 5: /* _SC_JOB_CONTROL */ 26343973Snsouch#ifdef _POSIX_JOB_CONTORL 26443973Snsouch *retval = _POSIX_JOB_CONTORL; 26543973Snsouch#else 26643973Snsouch *retval = (0); 26743973Snsouch#endif 26843973Snsouch break; 26943973Snsouch case 6: /* _SC_SAVED_IDS */ 27043973Snsouch *retval = (0); 27143973Snsouch break; 27243973Snsouch case 7: /* _SC_VERSION */ 27343973Snsouch *retval = (_POSIX_VERSION); 27443973Snsouch break; 27543973Snsouch default: 27643973Snsouch *retval = -1; 27743973Snsouch return EINVAL; 27843973Snsouch } 27993023Snsouch return 0; 28043973Snsouch } 28143973Snsouch 28243973Snsouch case 0x2e: /* pathconf */ 28343973Snsouch case 0x2f: /* fpathconf */ 28443973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 28543973Snsouch printf("IBCS2: 'cxenix (f)pathconf'\n"); 28643973Snsouch return ibcs2_pathconf(p, args, retval); 28743973Snsouch 28843973Snsouch case 0x30: /* rename */ 28993023Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 29043973Snsouch printf("IBCS2: 'cxenix rename'\n"); 29143973Snsouch return ibcs2_rename(p, args, retval); 29243973Snsouch 29343973Snsouch case 0x32: /* sco_utsname */ 29443973Snsouch return sco_utsname(p, args, retval); 29543973Snsouch 29643973Snsouch case 0x37: /* getitimer */ 29743973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 29893023Snsouch printf("IBCS2: 'cxenix getitimer'\n"); 29943973Snsouch return getitimer(p, args, retval); 30043973Snsouch 30143973Snsouch case 0x38: /* setitimer */ 30243973Snsouch if (ibcs2_trace & IBCS2_TRACE_XENIX) 30343973Snsouch printf("IBCS2: 'cxenix setitimer'\n"); 30443973Snsouch return setitimer(p, args, retval); 30543973Snsouch 30643973Snsouch 30743973Snsouch /* Not implemented yet SORRY */ 30843973Snsouch case 0x01: /* xlocking */ 30943973Snsouch printf("IBCS2: 'cxenix xlocking'"); 31043973Snsouch break; 31143973Snsouch case 0x02: /* creatsem */ 31243973Snsouch printf("IBCS2: 'cxenix creatsem'"); 31393023Snsouch break; 31443973Snsouch case 0x03: /* opensem */ 31543973Snsouch printf("IBCS2: 'cxenix opensem'"); 31670606Snsouch break; 31743973Snsouch case 0x04: /* sigsem */ 31843973Snsouch printf("IBCS2: 'cxenix sigsem'"); 31943973Snsouch break; 32043973Snsouch case 0x05: /* waitsem */ 32143973Snsouch printf("IBCS2: 'cxenix waitsem'"); 32243973Snsouch break; 32343973Snsouch case 0x06: /* nbwaitsem */ 32443973Snsouch printf("IBCS2: 'cxenix nbwaitsem'"); 32543973Snsouch break; 32643973Snsouch case 0x0d: /* sdget */ 32743973Snsouch printf("IBCS2: 'cxenix sdget'"); 32843973Snsouch break; 32943973Snsouch case 0x0e: /* sdfree */ 33043973Snsouch printf("IBCS2: 'cxenix sdfree'"); 33143973Snsouch break; 33243973Snsouch case 0x0f: /* sdenter */ 33343973Snsouch printf("IBCS2: 'cxenix sdenter'"); 33443973Snsouch break; 33543973Snsouch case 0x10: /* sdleave */ 33643973Snsouch printf("IBCS2: 'cxenix sdleave'"); 33743973Snsouch break; 33843973Snsouch case 0x11: /* sdgetv */ 33943973Snsouch printf("IBCS2: 'cxenix sdgetv'"); 34043973Snsouch break; 34143973Snsouch case 0x12: /* sdwaitv */ 34243973Snsouch printf("IBCS2: 'cxenix sdwaitv'"); 34343973Snsouch break; 34493023Snsouch case 0x20: /* proctl */ 34543973Snsouch printf("IBCS2: 'cxenix proctl'"); 34643973Snsouch break; 34743973Snsouch case 0x21: /* execseg */ 34843973Snsouch printf("IBCS2: 'cxenix execseg'"); 34943973Snsouch break; 35093023Snsouch case 0x22: /* unexecseg */ 35143973Snsouch printf("IBCS2: 'cxenix unexecseg'"); 35293023Snsouch break; 35343973Snsouch case 0x26: /* paccess */ 35443973Snsouch printf("IBCS2: 'cxenix paccess'"); 35593023Snsouch break; 35693023Snsouch default: 35743973Snsouch printf("IBCS2: 'cxenix' function %d(0x%x)", 35843973Snsouch tf->tf_eax>>8, tf->tf_eax>>8); 35943973Snsouch break; 36043973Snsouch } 36143973Snsouch printf(" not implemented yet\n"); 36243973Snsouch return EINVAL; 36343973Snsouch} 36443973Snsouch