ibcs2_xenix.c revision 3584
1/*-
2 * Copyright (c) 1994 Sean Eric Fagan
3 * Copyright (c) 1994 S�ren Schmidt
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer
11 *    in this position and unchanged.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 *    derived from this software withough specific prior written permission
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 *	$Id: ibcs2_xenix.c,v 1.10 1994/10/12 19:38:38 sos Exp $
30 */
31
32#include <i386/ibcs2/ibcs2.h>
33#include <sys/param.h>
34#include <sys/proc.h>
35#include <sys/exec.h>
36#include <sys/sysent.h>
37#include <sys/errno.h>
38#include <sys/ioctl.h>
39#include <sys/signal.h>
40#include <sys/syslimits.h>
41#include <sys/unistd.h>
42#include <sys/timeb.h>
43#include <vm/vm.h>
44#include <machine/cpu.h>
45#include <machine/psl.h>
46#include <machine/reg.h>
47
48struct ibcs2_sco_chsize_args {
49	int fd;
50	ibcs2_off_t size;
51};
52
53static int
54sco_chsize(struct proc *p, struct ibcs2_sco_chsize_args *args, int *retval)
55{
56	struct ftruncate_args {
57		int fd;
58		int pad;
59		off_t length;
60	} tmp;
61
62	if (ibcs2_trace & IBCS2_TRACE_XENIX)
63		printf("IBCS2: 'cxenix chsize'\n");
64	tmp.fd = args->fd;
65	tmp.pad = 0;
66	tmp.length = args->size;
67	return ftruncate(p, &tmp, retval);
68}
69
70struct ibcs2_sco_ftime_args {
71	struct timeb *tp;
72};
73
74static int
75sco_ftime(struct proc *p, struct ibcs2_sco_ftime_args *args, int *retval)
76{
77	struct timeval atv;
78	extern struct timezone tz;
79	struct timeb tb;
80
81	if (ibcs2_trace & IBCS2_TRACE_XENIX)
82		printf("IBCS2: 'cxenix ftime'\n");
83	microtime(&atv);
84	tb.time = atv.tv_sec;
85	tb.millitm = atv.tv_usec / 1000;
86	tb.timezone = tz.tz_minuteswest;
87	tb.dstflag = tz.tz_dsttime != DST_NONE;
88
89	return copyout((caddr_t)&tb, (caddr_t)args->tp, sizeof(struct timeb));
90}
91
92struct ibcs2_sco_nap_args {
93	long time;
94};
95
96static int
97sco_nap(struct proc *p, struct ibcs2_sco_nap_args *args, int *retval)
98{
99	long period;
100	extern int hz;
101
102	if (ibcs2_trace & IBCS2_TRACE_XENIX)
103		printf("IBCS2: 'cxenix nap %d ms'\n", args->time);
104	period = (long)args->time / (1000/hz);
105	if (period)
106		while (tsleep(&period, PUSER, "nap", period)
107		       != EWOULDBLOCK) ;
108	return 0;
109}
110
111struct ibcs2_sco_rdchk_args {
112	int fd;
113};
114
115static int
116sco_rdchk(struct proc *p, struct ibcs2_sco_rdchk_args *args, int *retval)
117{
118	struct ioctl_arg {
119		int fd;
120		int cmd;
121		caddr_t arg;
122	} tmp;
123	int error;
124
125	if (ibcs2_trace & IBCS2_TRACE_XENIX)
126		printf("IBCS2: 'cxenix rdchk'\n");
127	tmp.fd = args->fd;
128	tmp.cmd = FIONREAD;
129	tmp.arg = (caddr_t)UA_ALLOC();
130	error = ioctl(p, &tmp, retval);
131	if (!error)
132		*retval = *retval <= 0 ? 0 : 1;
133  	return error;
134}
135
136struct ibcs2_sco_utsname_args {
137	long addr;
138};
139
140static int
141sco_utsname(struct proc *p, struct ibcs2_sco_utsname_args *args, int *retval)
142{
143	struct ibcs2_sco_utsname {
144		char sysname[9];
145		char nodename[9];
146		char release[16];
147		char kernelid[20];
148		char machine[9];
149		char bustype[9];
150		char sysserial[10];
151		unsigned short sysorigin;
152		unsigned short sysoem;
153		char numusers[9];
154		unsigned short numcpu;
155	} ibcs2_sco_uname;
156	extern char ostype[], hostname[], osrelease[], version[], machine[];
157
158	if (ibcs2_trace & IBCS2_TRACE_XENIX)
159		printf("IBCS2: 'cxenix sco_utsname'\n");
160	bzero(&ibcs2_sco_uname, sizeof(struct ibcs2_sco_utsname));
161	strncpy(ibcs2_sco_uname.sysname, ostype, 8);
162	strncpy(ibcs2_sco_uname.nodename, hostname, 8);
163	strncpy(ibcs2_sco_uname.release, osrelease, 15);
164	strncpy(ibcs2_sco_uname.kernelid, version, 19);
165	strncpy(ibcs2_sco_uname.machine, machine, 8);
166	bcopy("ISA/EISA", ibcs2_sco_uname.bustype, 8);
167	bcopy("no charge", ibcs2_sco_uname.sysserial, 9);
168	bcopy("unlim", ibcs2_sco_uname.numusers, 8);
169	ibcs2_sco_uname.sysorigin = 0xFFFF;
170	ibcs2_sco_uname.sysoem = 0xFFFF;
171	ibcs2_sco_uname.numcpu = 1;
172	return copyout((caddr_t)&ibcs2_sco_uname, (caddr_t)args->addr,
173		       sizeof(struct ibcs2_sco_utsname));
174}
175
176int
177ibcs2_cxenix(struct proc *p, void *args, int *retval)
178{
179	struct trapframe *tf = (struct trapframe *)p->p_md.md_regs;
180
181	switch ((tf->tf_eax & 0xff00) >> 8) {
182
183	case 0x07:	/* rdchk */
184		return sco_rdchk(p, args, retval);
185
186	case 0x0a:	/* chsize */
187		return sco_chsize(p, args, retval);
188
189	case 0x0b: 	/* ftime */
190		return sco_ftime(p, args, retval);
191
192	case 0x0c:	/* nap */
193		return sco_nap(p, args, retval);
194
195	case 0x15:	/* scoinfo (not documented) */
196		*retval = 0;
197		return 0;
198
199	case 0x24:	/* select */
200		if (ibcs2_trace & IBCS2_TRACE_XENIX)
201			printf("IBCS2: 'cxenix select'\n");
202		return select(p, args, retval);
203
204	case 0x25:	/* eaccess */
205		if (ibcs2_trace & IBCS2_TRACE_XENIX)
206			printf("IBCS2: 'cxenix eaccess'\n");
207		return ibcs2_access(p, args, retval);
208
209	case 0x27:	/* sigaction */
210		if (ibcs2_trace & IBCS2_TRACE_XENIX)
211			printf("IBCS2: 'cxenix sigaction'\n");
212	  	return ibcs2_sigaction (p, args, retval);
213
214	case 0x28:	/* sigprocmask */
215		if (ibcs2_trace & IBCS2_TRACE_XENIX)
216			printf("IBCS2: 'cxenix sigprocmask'\n");
217	  	return ibcs2_sigprocmask (p, args, retval);
218
219	case 0x29:	/* sigpending */
220		if (ibcs2_trace & IBCS2_TRACE_XENIX)
221			printf("IBCS2: 'cxenix sigpending'\n");
222	  	return ibcs2_sigpending (p, args, retval);
223
224	case 0x2a:	/* sigsuspend */
225		if (ibcs2_trace & IBCS2_TRACE_XENIX)
226			printf("IBCS2: 'cxenix sigsuspend'\n");
227	  	return ibcs2_sigsuspend (p, args, retval);
228
229	case 0x2b:	/* getgroups */
230		if (ibcs2_trace & IBCS2_TRACE_XENIX)
231			printf("IBCS2: 'cxenix getgroups'\n");
232	      	return ibcs2_getgroups(p, args, retval);
233
234	case 0x2c:	/* setgroups */
235		if (ibcs2_trace & IBCS2_TRACE_XENIX)
236			printf("IBCS2: 'cxenix setgroups'\n");
237	      	return ibcs2_setgroups(p, args, retval);
238
239	case 0x2d: {	/* sysconf */
240	    	struct ibcs2_sysconf_args {
241	      		int num;
242	    	} *sysconf_args = args;
243
244		if (ibcs2_trace & IBCS2_TRACE_XENIX)
245			printf("IBCS2: 'cxenix sysconf'");
246		switch (sysconf_args->num) {
247		case 0: 	/* _SC_ARG_MAX */
248			*retval = (ARG_MAX);
249			break;
250		case 1:		/* _SC_CHILD_MAX */
251			*retval = (CHILD_MAX);
252			break;
253		case 2:		/* _SC_CLK_TCK */
254			*retval = (CLK_TCK);
255			break;
256		case 3:		/* _SC_NGROUPS_MAX */
257			*retval = (NGROUPS_MAX);
258			break;
259		case 4:		/* _SC_OPEN_MAX */
260			*retval = (OPEN_MAX);
261			break;
262		case 5:		/* _SC_JOB_CONTROL */
263#ifdef _POSIX_JOB_CONTORL
264			*retval = _POSIX_JOB_CONTORL;
265#else
266			*retval = (0);
267#endif
268			break;
269		case 6:		/* _SC_SAVED_IDS */
270#ifdef _POSIX_SAVED_IDS
271			*retval = (_POSIX_SAVED_IDS);
272#else
273			*retval = (0);
274#endif
275			break;
276		case 7:		/* _SC_VERSION */
277			*retval = (_POSIX_VERSION);
278			break;
279		default:
280			*retval = -1;
281	      		return EINVAL;
282		}
283	      	return 0;
284	}
285
286	case 0x2e:	/* pathconf */
287	case 0x2f:	/* fpathconf */
288		if (ibcs2_trace & IBCS2_TRACE_XENIX)
289			printf("IBCS2: 'cxenix (f)pathconf'\n");
290	      	return ibcs2_pathconf(p, args, retval);
291
292	case 0x30:	/* rename */
293		if (ibcs2_trace & IBCS2_TRACE_XENIX)
294			printf("IBCS2: 'cxenix rename'\n");
295	      	return ibcs2_rename(p, args, retval);
296
297	case 0x32: 	/* sco_utsname */
298		return sco_utsname(p, args, retval);
299
300	case 0x37:	/* getitimer */
301		if (ibcs2_trace & IBCS2_TRACE_XENIX)
302			printf("IBCS2: 'cxenix getitimer'\n");
303	      	return getitimer(p, args, retval);
304
305	case 0x38:	/* setitimer */
306		if (ibcs2_trace & IBCS2_TRACE_XENIX)
307			printf("IBCS2: 'cxenix setitimer'\n");
308	      	return setitimer(p, args, retval);
309
310
311	/* Not implemented yet SORRY */
312	case 0x01:	/* xlocking */
313		printf("IBCS2: 'cxenix xlocking'");
314		break;
315	case 0x02:	/* creatsem */
316		printf("IBCS2: 'cxenix creatsem'");
317		break;
318	case 0x03:	/* opensem */
319		printf("IBCS2: 'cxenix opensem'");
320		break;
321	case 0x04:	/* sigsem */
322		printf("IBCS2: 'cxenix sigsem'");
323		break;
324	case 0x05:	/* waitsem */
325		printf("IBCS2: 'cxenix waitsem'");
326		break;
327	case 0x06:	/* nbwaitsem */
328		printf("IBCS2: 'cxenix nbwaitsem'");
329		break;
330	case 0x0d:	/* sdget */
331		printf("IBCS2: 'cxenix sdget'");
332		break;
333	case 0x0e:	/* sdfree */
334		printf("IBCS2: 'cxenix sdfree'");
335		break;
336	case 0x0f:	/* sdenter */
337		printf("IBCS2: 'cxenix sdenter'");
338		break;
339	case 0x10:	/* sdleave */
340		printf("IBCS2: 'cxenix sdleave'");
341		break;
342	case 0x11:	/* sdgetv */
343		printf("IBCS2: 'cxenix sdgetv'");
344		break;
345	case 0x12:	/* sdwaitv */
346		printf("IBCS2: 'cxenix sdwaitv'");
347		break;
348	case 0x20:	/* proctl */
349		printf("IBCS2: 'cxenix proctl'");
350		break;
351	case 0x21:	/* execseg */
352		printf("IBCS2: 'cxenix execseg'");
353		break;
354	case 0x22:	/* unexecseg */
355		printf("IBCS2: 'cxenix unexecseg'");
356		break;
357	case 0x26:	/* paccess */
358		printf("IBCS2: 'cxenix paccess'");
359		break;
360	default:
361		printf("IBCS2: 'cxenix' function %d(0x%x)",
362			tf->tf_eax>>8, tf->tf_eax>>8);
363		break;
364	}
365	printf(" not implemented yet\n");
366	return EINVAL;
367}
368