ibcs2_xenix.c revision 8221
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.2 1995/02/03 21:31:35 bde 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 *retval = (0); 271 break; 272 case 7: /* _SC_VERSION */ 273 *retval = (_POSIX_VERSION); 274 break; 275 default: 276 *retval = -1; 277 return EINVAL; 278 } 279 return 0; 280 } 281 282 case 0x2e: /* pathconf */ 283 case 0x2f: /* fpathconf */ 284 if (ibcs2_trace & IBCS2_TRACE_XENIX) 285 printf("IBCS2: 'cxenix (f)pathconf'\n"); 286 return ibcs2_pathconf(p, args, retval); 287 288 case 0x30: /* rename */ 289 if (ibcs2_trace & IBCS2_TRACE_XENIX) 290 printf("IBCS2: 'cxenix rename'\n"); 291 return ibcs2_rename(p, args, retval); 292 293 case 0x32: /* sco_utsname */ 294 return sco_utsname(p, args, retval); 295 296 case 0x37: /* getitimer */ 297 if (ibcs2_trace & IBCS2_TRACE_XENIX) 298 printf("IBCS2: 'cxenix getitimer'\n"); 299 return getitimer(p, args, retval); 300 301 case 0x38: /* setitimer */ 302 if (ibcs2_trace & IBCS2_TRACE_XENIX) 303 printf("IBCS2: 'cxenix setitimer'\n"); 304 return setitimer(p, args, retval); 305 306 307 /* Not implemented yet SORRY */ 308 case 0x01: /* xlocking */ 309 printf("IBCS2: 'cxenix xlocking'"); 310 break; 311 case 0x02: /* creatsem */ 312 printf("IBCS2: 'cxenix creatsem'"); 313 break; 314 case 0x03: /* opensem */ 315 printf("IBCS2: 'cxenix opensem'"); 316 break; 317 case 0x04: /* sigsem */ 318 printf("IBCS2: 'cxenix sigsem'"); 319 break; 320 case 0x05: /* waitsem */ 321 printf("IBCS2: 'cxenix waitsem'"); 322 break; 323 case 0x06: /* nbwaitsem */ 324 printf("IBCS2: 'cxenix nbwaitsem'"); 325 break; 326 case 0x0d: /* sdget */ 327 printf("IBCS2: 'cxenix sdget'"); 328 break; 329 case 0x0e: /* sdfree */ 330 printf("IBCS2: 'cxenix sdfree'"); 331 break; 332 case 0x0f: /* sdenter */ 333 printf("IBCS2: 'cxenix sdenter'"); 334 break; 335 case 0x10: /* sdleave */ 336 printf("IBCS2: 'cxenix sdleave'"); 337 break; 338 case 0x11: /* sdgetv */ 339 printf("IBCS2: 'cxenix sdgetv'"); 340 break; 341 case 0x12: /* sdwaitv */ 342 printf("IBCS2: 'cxenix sdwaitv'"); 343 break; 344 case 0x20: /* proctl */ 345 printf("IBCS2: 'cxenix proctl'"); 346 break; 347 case 0x21: /* execseg */ 348 printf("IBCS2: 'cxenix execseg'"); 349 break; 350 case 0x22: /* unexecseg */ 351 printf("IBCS2: 'cxenix unexecseg'"); 352 break; 353 case 0x26: /* paccess */ 354 printf("IBCS2: 'cxenix paccess'"); 355 break; 356 default: 357 printf("IBCS2: 'cxenix' function %d(0x%x)", 358 tf->tf_eax>>8, tf->tf_eax>>8); 359 break; 360 } 361 printf(" not implemented yet\n"); 362 return EINVAL; 363} 364