ibcs2_xenix.c revision 6163
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.1 1994/10/14 08:53:12 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 = (_BSD_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