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