Annotation of coherent/b/STREAMS/i386/sys1632.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * i386/sys1632.c
                      3:  *
                      4:  * This file contains the code for those system calls whose implementation
                      5:  * must vary, according to system call arguments size (16 or 32 bits)
                      6:  *
                      7:  * exec: argv[], envp[] pointers (ingoing and outgoing)
                      8:  * istat:alignment of longs (called by ustat, ufstat in [sys?.c])
                      9:  * ftime:alignment of longs
                     10:  * lseek:argument is a long pointer
                     11:  * dup, dup2: old implementation
                     12:  *
                     13:  * Revised: Fri Jul 16 12:23:39 1993 CDT
                     14:  */
                     15: 
                     16: #include <common/_limits.h>
                     17: #include <common/_tricks.h>
                     18: #include <common/_gregset.h>
                     19: #include <sys/debug.h>
                     20: 
                     21: #include <sys/coherent.h>
                     22: #include <sys/acct.h>
                     23: #include <sys/buf.h>
                     24: #include <canon.h>
                     25: #include <sys/con.h>
                     26: #include <sys/errno.h>
                     27: #include <sys/filsys.h>
                     28: #include <sys/ino.h>
                     29: #include <sys/inode.h>
                     30: #include <l.out.h>
                     31: #include <sys/proc.h>
                     32: #include <sys/sched.h>
                     33: #include <sys/seg.h>
                     34: #include <signal.h>
                     35: #include <sys/oldstat.h>
                     36: #include <sys/timeb.h>
                     37: #include <sys/fd.h>
                     38: 
                     39: #include <kernel/systab.h>
                     40: 
                     41: 
                     42: /*
                     43:  * emulate a 16 bit system call
                     44:  * called from trap.c
                     45:  */
                     46: 
                     47: static char cvtsig [] = 
                     48: {
                     49:        0,
                     50:        SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM, SIGPWR, 
                     51:        SIGSYS, SIGPIPE, SIGKILL, SIGTRAP, SIGSEGV,
                     52:        SIGEMT, /* SIGDIVE */
                     53:        SIGEMT, /* SIGOVFL */
                     54:        SIGUSR1,
                     55:        SIGUSR2,
                     56:        SIGUSR2
                     57: };
                     58: 
                     59: int    ostat();
                     60: int    ofstat();
                     61: int    oftime();
                     62: int    upgrp();
                     63: int    ugetuid();
                     64: int    ugetgid();
                     65: int    usysi86();
                     66: int    ulock();
                     67: int    ufcntl();
                     68: int    uexece();
                     69: int    obrk();
                     70: long   oalarm2 ();
                     71: long   otick ();
                     72: 
                     73: 
                     74: /*
                     75:  * Duplicate a file descriptor number.  This has the same calling
                     76:  * sequence as the dup2 system call and even uses the silly DUP2 bit.
                     77:  */
                     78: 
                     79: coh286dup(ofd, nfd)
                     80: register unsigned ofd;
                     81: register unsigned nfd;
                     82: {
                     83:        register FD *fdp;
                     84: 
                     85:        if ((fdp = fdget (ofd & ~ DUP2)) == NULL)
                     86:                return -1;
                     87:        if ((ofd & DUP2) != 0) {
                     88:                if (nfd >= NOFILE) {
                     89:                        SET_U_ERROR (EBADF, "coh286dup ()");
                     90:                        return -1;
                     91:                }
                     92:                ofd &= ~ DUP2;
                     93:                if (ofd == nfd)
                     94:                        return nfd;
                     95:                if (u.u_filep [nfd] != NULL) {
                     96:                        fdclose (nfd);
                     97:                        if (u.u_error)
                     98:                                return -1;
                     99:                }
                    100:        } else
                    101:                nfd = 0;
                    102: 
                    103:        return fddup (ofd, nfd);
                    104: }
                    105: 
                    106: 
                    107: int
                    108: ostime (timep)
                    109: time_t       * timep;
                    110: {
                    111:        return ustime (getuwd (timep));
                    112: }
                    113: 
                    114: 
                    115: int
                    116: opipe (pipep)
                    117: short        * pipep;
                    118: {
                    119:        short           res;
                    120: 
                    121:        res = upipe ();
                    122: 
                    123:        putusd (pipep, res);
                    124:        putusd (pipep + 1, u.u_rval2);
                    125:        return 0;
                    126: }
                    127: 
                    128: 
                    129: int
                    130: osetpgrp ()
                    131: {
                    132:        upgrp (1);
                    133: }
                    134: 
                    135: int
                    136: ogetpgrp ()
                    137: {
                    138:        upgrp (0);
                    139: }
                    140: 
                    141: 
                    142: int
                    143: ogeteuid ()
                    144: {
                    145:        (void) ugetuid ();
                    146:        return u.u_rval2;
                    147: }
                    148: 
                    149: int
                    150: ogetegid ()
                    151: {
                    152:        (void) ugetgid ();
                    153:        return u.u_rval2;
                    154: }
                    155: 
                    156: 
                    157: int
                    158: ounique ()
                    159: {
                    160:        return usysi86 (SYI86UNEEK);
                    161: }
                    162: 
                    163: 
                    164: int
                    165: okill (pid, signal)
                    166: short          pid;
                    167: unsigned       signal;
                    168: {
                    169:        if (signal >= __ARRAY_LENGTH (cvtsig)) {
                    170:                SET_U_ERROR (EINVAL, "286 kill ()");
                    171:                return -1;
                    172:        }
                    173: 
                    174:        return ukill (pid, cvtsig [signal]);
                    175: }
                    176: 
                    177: 
                    178: __sigfunc_t
                    179: osignal (signal, func, regsetp)
                    180: unsigned       signal;
                    181: __sigfunc_t    func;
                    182: gregset_t     *        regsetp;
                    183: {
                    184:        if (signal >= __ARRAY_LENGTH (cvtsig)) {
                    185:                SET_U_ERROR (EINVAL, "286 signal ()");
                    186:                return -1;
                    187:        }
                    188: 
                    189:        return usigsys (cvtsig [signal], func, regsetp);
                    190: }
                    191: 
                    192: 
                    193: #if    __SHRT_BIT != 16
                    194: # error        This code expects 16-bit shorts
                    195: #endif
                    196: 
                    197: long
                    198: olseek (fd, seeklo, seekhi, whence)
                    199: unsigned       fd;
                    200: unsigned short seeklo;
                    201: unsigned short seekhi;
                    202: unsigned       whence;
                    203: {
                    204:        return ulseek (fd, seeklo + (seekhi << 16), whence);
                    205: }
                    206: 
                    207: 
                    208: /* msgsys, shmsys, and semsys are not emulated */
                    209: /* poll is not emulated;NOTE:the code calls putuwd */
                    210: 
                    211: int
                    212: oldsys (regsetp)
                    213: gregset_t     *        regsetp;
                    214: {
                    215:        register struct systab  *stp;
                    216:        unsigned int    callnum;
                    217:        int             i;
                    218:        int             res;
                    219:        int             args [MSACOUNT];
                    220: 
                    221:        u.u_error = 0;
                    222:        callnum = getusd (NBPS + regsetp->_i286._ip - sizeof (short));
                    223: 
                    224:        /*
                    225:         * Check that we are on an INT instruction, and that the fetch did
                    226:         * not cause a memory fault. Note that the magic NBPS number above,
                    227:         * which presumably means "Number of Bytes Per Segment", is how to
                    228:         * get to 286 code.
                    229:         */
                    230: 
                    231:        if (u.u_error || (callnum & 0xFF) != 0xCD) 
                    232:                return SIGSYS;
                    233:        callnum = (callnum >> 8) & 0x7F;
                    234: 
                    235:        /* Print out this 286 call number only if tracing is on.  */
                    236:        T_PIGGY (0x2, printf ("[%d]", callnum));
                    237: 
                    238:        if (callnum >= __ARRAY_LENGTH (sys286tab))
                    239:                return SIGSYS;
                    240:        stp = sys286tab + callnum;
                    241: 
                    242:        /*
                    243:         * This is crass bullshit which allows fucked code to get away with
                    244:         * not fully intializing a structure which shouldn't even be in the
                    245:         * U area at all.
                    246:         */
                    247: 
                    248: #if    0
                    249:        u.u_io.io_seg = IOUSR;
                    250: #endif
                    251: 
                    252:        if (envsave (& u.u_sigenv)) {
                    253:                u.u_error = EINTR;
                    254:                goto done;
                    255:        }
                    256: 
                    257:        i = stp->s_nargs + 1;
                    258:        while (-- i > 0) {
                    259:                args [i - 1] = getusd (regsetp->_i286._usp +
                    260:                                       i * sizeof (short));
                    261:        }
                    262: 
                    263:        if (u.u_error)
                    264:                return SIGSYS;
                    265: 
                    266:        /*
                    267:         * Perform the system call and collect the return value in "res".
                    268:         */
                    269: 
                    270:        res = __DOSYSCALL (stp->s_nargs, stp->s_func, args, regsetp);
                    271: 
                    272:        if (stp->s_type == __SYSCALL_LONG)
                    273:                regsetp->_i286._dx = res >> 16;
                    274:        else
                    275:                regsetp->_i286._dx = u.u_rval2;
                    276:        regsetp->_i286._ax = res;
                    277: 
                    278: done:
                    279:        if (u.u_error) {
                    280:                regsetp->_i286._ax = regsetp->_i286._dx = -1;
                    281:                putubd (MUERR, u.u_error);
                    282:                if (u.u_error == EFAULT)
                    283:                        return SIGSYS;
                    284:        }
                    285:        return 0;
                    286: }
                    287: 
                    288: 
                    289: /*
                    290:  * Given a file descriptor, return a status structure.
                    291:  */
                    292: 
                    293: ofstat(fd, stp)
                    294: struct oldstat *stp;
                    295: {
                    296:        register INODE *ip;
                    297:        register FD *fdp;
                    298:        struct oldstat stat;
                    299: 
                    300:        if ((fdp = fdget (fd)) == NULL)
                    301:                return -1;
                    302:        ip = fdp->f_ip;
                    303:        oistat (ip, & stat);
                    304:        kucopy (& stat, stp, sizeof (stat));
                    305:        return 0;
                    306: }
                    307: 
                    308: /*
                    309:  * Return a status structure for the given file name.
                    310:  */
                    311: ostat(np, stp)
                    312: char *np;
                    313: struct oldstat *stp;
                    314: {
                    315:        register INODE *ip;
                    316:        struct oldstat stat;
                    317:        IO              io;
                    318:        struct direct   dir;
                    319: 
                    320:        if (ftoi (np, 'r', & io, & dir) != 0)
                    321:                return -1;
                    322: 
                    323:        ip = u.u_cdiri;
                    324:        oistat (ip, & stat);
                    325: 
                    326:        if (kucopy (& stat, stp, sizeof (stat)) != sizeof (stat))
                    327:                SET_U_ERROR (EFAULT, "286 stat ()");
                    328: 
                    329:        idetach(ip);
                    330:        return 0;
                    331: }
                    332: 
                    333: /*
                    334:  * Copy the appropriate information from the inode to the stat buffer.
                    335:  */
                    336: oistat(ip, sbp)
                    337: register INODE *ip;
                    338: register struct oldstat *sbp;
                    339: {
                    340:        sbp->st_dev = ip->i_dev;
                    341:        sbp->st_ino = ip->i_ino;
                    342:        sbp->st_mode = ip->i_mode;
                    343:        sbp->st_nlink = ip->i_nlink;
                    344:        sbp->st_uid = ip->i_uid;
                    345:        sbp->st_gid = ip->i_gid;
                    346:        sbp->st_rdev = NODEV;
                    347:        sbp->st_size = ip->i_size;
                    348:        sbp->st_atime = ip->i_atime;
                    349:        sbp->st_mtime = ip->i_mtime;
                    350:        sbp->st_ctime = ip->i_ctime;
                    351: 
                    352:        switch (ip->i_mode & IFMT) {
                    353:        case IFBLK:
                    354:        case IFCHR:
                    355:                sbp->st_rdev = ip->i_a.i_rdev;
                    356:                sbp->st_size = 0;
                    357:                break;
                    358: 
                    359:        case IFPIPE:
                    360:                sbp->st_size = ip->i_pnc;
                    361:                break;
                    362:        }
                    363: }
                    364: 
                    365: /*
                    366:  * Return date and time.
                    367:  */
                    368: 
                    369: oftime(tbp)
                    370: struct timeb *tbp;
                    371: {
                    372:        struct timeb timeb;
                    373: 
                    374:        timeb.time = timer.t_time;
                    375:        /* This should be a machine.h macro to avoid
                    376:         * unnecessary long arithmetic and roundoff errors
                    377:         */
                    378:        timeb.millitm = timer.t_tick*(1000/HZ);
                    379:        timeb.timezone = timer.t_zone;
                    380:        timeb.dstflag = timer.t_dstf;
                    381: 
                    382:        if (kucopy (& timeb, tbp, sizeof (timeb)) != sizeof (timeb))
                    383:                SET_U_ERROR (EFAULT, "286 ftime ()");
                    384: }
                    385: 
                    386: 
                    387: /*
                    388:  * Send a SIGALARM signal in `n' clock ticks.
                    389:  */
                    390: 
                    391: long
                    392: oalarm2(n)
                    393: long n;
                    394: {
                    395:        register PROC * pp = SELF;
                    396:        long s;
                    397:        extern sigalrm ();
                    398: 
                    399:        /*
                    400:         * Calculate time left before current alarm timeout.
                    401:         */
                    402:        s = 0;
                    403:        if (pp->p_alrmtim.t_last != NULL)
                    404:                s = pp->p_alrmtim.t_lbolt - lbolt;
                    405: 
                    406:        /*
                    407:         * Cancel previous alarm [if any], start new alarm [if n != 0].
                    408:         */
                    409: 
                    410:        timeout2 (& pp->p_alrmtim, (long) n, sigalrm, pp);
                    411: 
                    412:        /*
                    413:         * Return time left before previous alarm timeout.
                    414:         */
                    415:        return s;
                    416: }
                    417: 
                    418: /*
                    419:  * Return elapsed ticks since system startup.
                    420:  */
                    421: 
                    422: long
                    423: otick()
                    424: {
                    425:        return lbolt;
                    426: }
                    427: 
                    428: /*
                    429:  * Cause a signal routine to be executed.
                    430:  * Called from [coh/sig.c]
                    431:  */
                    432: oldsigstart (n, func, regsetp)
                    433: __sigfunc_t    func;
                    434: gregset_t     *        regsetp;
                    435: {
                    436:        int             i;
                    437:        struct {
                    438:                ushort_t        sf_signo;
                    439:                ushort_t        sf_prev_ip;
                    440:                ushort_t        sf_flags;
                    441:        } signal_frame;
                    442: 
                    443:        /*
                    444:         *                 -1
                    445:         * calculate cvtsig  [n]
                    446:         *
                    447:         */
                    448: 
                    449:        signal_frame.sf_signo = n;
                    450:        for (i = 0 ; i < __ARRAY_LENGTH (cvtsig) ; i ++)
                    451:                if (cvtsig [i] == n) {
                    452:                        signal_frame.sf_signo = i;
                    453:                        break;
                    454:                }
                    455: 
                    456:        signal_frame.sf_prev_ip = regsetp->_i286._ip;
                    457:        signal_frame.sf_flags = regsetp->_i286._flags;
                    458: 
                    459:        /*
                    460:         * Turn off single-stepping in signal handler.
                    461:         */
                    462: 
                    463:        regsetp->_i286._flags &= ~ MFTTB;
                    464:        regsetp->_i286._ip = (ushort_t) func;
                    465:        regsetp->_i286._usp -= sizeof (signal_frame);
                    466: 
                    467:        i = kucopy (& signal_frame, regsetp->_i286._usp,
                    468:                    sizeof (signal_frame));
                    469:        ASSERT (i == sizeof (signal_frame));
                    470: }
                    471: 
                    472: /*
                    473:  * obrk()
                    474:  *
                    475:  * Argument is the new linear space value for the end of the PDATA segment.
                    476:  * As was done in COH286, arg of zero asks for the old upper limit.
                    477:  */
                    478: obrk (cp)
                    479: unsigned       cp;
                    480: {
                    481:        register int res;
                    482: 
                    483:        /*
                    484:         * If cp nonzero
                    485:         *      resize user data segment
                    486:         * else
                    487:         *      just give info - current brk address
                    488:         */
                    489: 
                    490:        if (cp)
                    491:                res = ubrk (cp);
                    492:        else
                    493:                res = u.u_segl [SIPDATA].sr_base +
                    494:                        SELF->p_segp [SIPDATA]->s_size;
                    495: 
                    496:        return res; 
                    497: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.