Annotation of coherent/b/kernel/i386/sys1632.c, revision 1.1

1.1     ! root        1: /* (lgl-
        !             2:  *     The information contained herein is a trade secret of Mark Williams
        !             3:  *     Company, and  is confidential information.  It is provided  under a
        !             4:  *     license agreement,  and may be  copied or disclosed  only under the
        !             5:  *     terms of  that agreement.  Any  reproduction or disclosure  of this
        !             6:  *     material without the express written authorization of Mark Williams
        !             7:  *     Company or persuant to the license agreement is unlawful.
        !             8:  *
        !             9:  *     Intel 386 port and extensions (16/32 bit compatibility)
        !            10:  *     Copyright (c) Ciaran O'Donnell, Bievres (FRANCE), 1991
        !            11:  -lgl)
        !            12:  */
        !            13: 
        !            14: /*
        !            15:  * i386/sys1632.c
        !            16:  *
        !            17:  * This file contains the code for those system calls whose implementation
        !            18:  * must vary, according to system call arguments size (16 or 32 bits)
        !            19:  *
        !            20:  * exec: argv[], envp[] pointers (ingoing and outgoing)
        !            21:  * istat:alignment of longs (called by ustat, ufstat in [sys?.c])
        !            22:  * ftime:alignment of longs
        !            23:  * lseek:argument is a long pointer
        !            24:  * dup, dup2: old implementation
        !            25:  * 
        !            26:  * Revised: Fri Jun 11 06:36:06 1993 CDT
        !            27:  */
        !            28: #include <sys/coherent.h>
        !            29: #include <sys/acct.h>
        !            30: #include <sys/buf.h>
        !            31: #include <canon.h>
        !            32: #include <sys/con.h>
        !            33: #include <errno.h>
        !            34: #include <sys/filsys.h>
        !            35: #include <sys/ino.h>
        !            36: #include <sys/inode.h>
        !            37: #include <l.out.h>
        !            38: #include <sys/proc.h>
        !            39: #include <sys/sched.h>
        !            40: #include <sys/seg.h>
        !            41: #include <signal.h>
        !            42: #include <sys/systab.h>
        !            43: #include <sys/oldstat.h>
        !            44: #include <sys/timeb.h>
        !            45: #include <sys/fd.h>
        !            46: 
        !            47: /*
        !            48:  * emulate a 16 bit system call
        !            49:  * called from trap.c
        !            50:  */
        !            51: 
        !            52: char cvtsig[] = 
        !            53: {
        !            54:        0,
        !            55:        SIGHUP, SIGINT, SIGQUIT, SIGALRM, SIGTERM, SIGPWR, 
        !            56:        SIGSYS, SIGPIPE, SIGKILL, SIGTRAP, SIGSEGV,
        !            57:        SIGEMT, /* SIGDIVE */
        !            58:        SIGEMT, /* SIGOVFL */
        !            59:        SIGUSR1,
        !            60:        SIGUSR2,
        !            61:        SIGUSR2,
        !            62:        -1
        !            63: };
        !            64: 
        !            65: int    ostat();
        !            66: int    ofstat();
        !            67: int    oftime();
        !            68: int    upgrp();
        !            69: int    ugetuid();
        !            70: int    ugetgid();
        !            71: int    usysi86();
        !            72: int    ulock();
        !            73: int    ufcntl();
        !            74: int    uexece();
        !            75: int    fddup();
        !            76: int    obrk();
        !            77: 
        !            78: static long ualarm2();
        !            79: static long utick();
        !            80: 
        !            81: int
        !            82: oldsys()
        !            83: {
        !            84:        register struct systab  *stp;
        !            85:        register int syscall, callnum, nargs;
        !            86:        int     l;
        !            87:        int     (*func)();
        !            88:        int     swap, res;
        !            89:        int     temp;
        !            90: 
        !            91:        u.u_error = 0;
        !            92:        syscall = getuwd(NBPS+u.u_regl[EIP]-sizeof(short));
        !            93:        if (u.u_error || (syscall&0xFF) != 0xCD) 
        !            94:                return SIGSYS;
        !            95:        callnum = (syscall>>8) & 0x7F;
        !            96:        /* Print out this 286 call number only if tracing is on.  */
        !            97:        T_PIGGY(0x2, printf("[%d]", callnum););
        !            98: 
        !            99:        stp = &sysitab[callnum];
        !           100:        if (callnum >= NMICALL)
        !           101:                return SIGSYS;
        !           102:        u.u_io.io_seg = IOUSR;
        !           103:        if (envsave(&u.u_sigenv)) {
        !           104:                u.u_error = EINTR;
        !           105:                goto done;
        !           106:        }
        !           107: 
        !           108:        func = stp->s_func;
        !           109:        swap = 0;
        !           110:        nargs = stp->s_nargs;
        !           111: 
        !           112:        for (l=0; l<nargs; l++)
        !           113:                u.u_args[l] = (unsigned short)
        !           114:                        getuwd(u.u_regl[UESP]+(l+1)*sizeof(short));
        !           115: 
        !           116:        switch (callnum) {
        !           117:        case 7:
        !           118:                nargs = 1;
        !           119:                goto update;
        !           120:        case 17:                /* brk(0)  was used in old Coherent */
        !           121:                func = obrk;
        !           122:                break;  
        !           123:        case 18:                /* stat and fstat have 32 bit alignment now */
        !           124:                func = ostat;
        !           125:                break;
        !           126:        case 25:                /* ustime() 386 takes a value, not a ptr */
        !           127:                u.u_args[0] = getuwd(u.u_args[0]);
        !           128:                break;
        !           129:        case 28:
        !           130:                func = ofstat;
        !           131:                break;
        !           132:        case 35:                /* ftime system call has gone away */
        !           133:                func = oftime;
        !           134:                nargs = 1;
        !           135:                goto update;
        !           136:        case 41:                /* kludge second argument for dup2() */
        !           137:                nargs = 2;
        !           138:                func = fddup;
        !           139:                goto update;
        !           140:        case 42:                /* pipe - store thru pointer */
        !           141:                nargs = 1;
        !           142:                goto update;
        !           143:        case 72:                /* ualarm2 and utick have disappeared */
        !           144:                func = ualarm2;
        !           145:                nargs = 1;
        !           146:                goto update;
        !           147:        case 73:
        !           148:                func = utick;
        !           149:                nargs = 1;
        !           150:                goto update;
        !           151:        case 62:        /* setpgrp */
        !           152:                u.u_args[0] = 1;
        !           153:                nargs = 1;
        !           154:                func = upgrp;
        !           155:                break;
        !           156:        case 63:        /* getpgrp */
        !           157:                u.u_args[0] = 0;
        !           158:                nargs = 1;
        !           159:                func = upgrp;
        !           160:                break;
        !           161:        case 24:                /* getuid and geteuid are together now */
        !           162:        case 57:
        !           163:                swap = callnum==57;
        !           164:                func = ugetuid;
        !           165:                break;
        !           166:        case 47:
        !           167:        case 56:                /* getgid & getegid are together now */
        !           168:                swap = callnum==56;
        !           169:                func = ugetgid;
        !           170:                break;
        !           171:        case 45:                /* unique is a sys-86 call now */
        !           172:                func = usysi86;
        !           173:                u.u_args[0] = SYI86UNEEK;
        !           174:                nargs = 1;
        !           175:                break;
        !           176:        case 37:                /* kill - signal#'s have changed */
        !           177:                u.u_args[0] = (signed short) u.u_args[0]; /* Sign extend pid. */
        !           178:                u.u_args[1] = cvtsig[u.u_args[1]];
        !           179:                break;
        !           180:        case 48:                /* signal - signal#'s have changed */
        !           181:                u.u_args[0] = cvtsig[u.u_args[0]];
        !           182:                break;  
        !           183:        case 53:                /* ulock has moved */   
        !           184:                func = ulock;
        !           185:                nargs = 1;
        !           186:                goto update;
        !           187:        case 66:                /* fcntl has moved */   
        !           188:                func = ufcntl;
        !           189:                nargs = 3;
        !           190:                goto update;
        !           191:        case 11:                /* exec has only one entry point now */
        !           192:                func = uexece;
        !           193:                nargs = 3;
        !           194:                goto update;
        !           195:        case 19:                /* seek offset is 32 bits now ; shift */
        !           196:                u.u_args[1] |= u.u_args[2]<<16;
        !           197:                u.u_args[2] = (unsigned short)
        !           198:                        getuwd(u.u_regl[UESP]+4*sizeof(short));
        !           199:                break;
        !           200:        update:
        !           201:                for (l=0; l<nargs; l++)
        !           202:                        u.u_args[l] = (unsigned short)
        !           203:                                getuwd(u.u_regl[UESP]+(l+1)*sizeof(short));
        !           204:                break;
        !           205:        }
        !           206: 
        !           207:        if (u.u_error)
        !           208:                return SIGSYS;
        !           209: 
        !           210:        res = (*func)(u.u_args[0], u.u_args[1], u.u_args[2], u.u_args[3],
        !           211:                u.u_args[4], u.u_args[5]);
        !           212:        if (swap)
        !           213:                res = u.u_rval2;
        !           214: 
        !           215:        switch (callnum) {
        !           216:        case 7:                 /* wait - must store u_rval2 thru pointer */
        !           217:                if (u.u_args[0]) {
        !           218:                        putubd(u.u_args[0], u.u_rval2);
        !           219:                        putubd(u.u_args[0]+1, u.u_rval2>>8);
        !           220:                }
        !           221:                break;
        !           222:        case 19:                /* lseek - upper 16 bits of result in dx */
        !           223:                u.u_rval2 = res >> 16;
        !           224:                break;
        !           225:        case 42:                /* pipe - store thru pointer */
        !           226:                putubd(u.u_args[0],   res);
        !           227:                putubd(u.u_args[0]+1, res>>8);
        !           228:                putubd(u.u_args[0]+2, u.u_rval2);
        !           229:                putubd(u.u_args[0]+3, u.u_rval2>>8);
        !           230:                res = 0;
        !           231:                break;
        !           232:        default:
        !           233:                        /* msgsys, shmsys, and semsys are not emulated */
        !           234:                        /* poll is not emulated;NOTE:the code calls putuwd */
        !           235:                ;
        !           236:        }
        !           237:        u.u_regl[EAX] = res;
        !           238:        u.u_regl[EDX] = u.u_rval2;
        !           239: done:
        !           240:        if (u.u_error) {
        !           241:                u.u_regl[EAX] = u.u_regl[EDX] = -1;
        !           242:                putubd(MUERR, u.u_error);
        !           243:                if (u.u_error == EFAULT)
        !           244:                        return SIGSYS;
        !           245:        }
        !           246:        return 0;
        !           247: }
        !           248: 
        !           249: /*
        !           250:  * Given a file descriptor, return a status structure.
        !           251:  */
        !           252: ofstat(fd, stp)
        !           253: struct oldstat *stp;
        !           254: {
        !           255:        register INODE *ip;
        !           256:        register FD *fdp;
        !           257:        struct oldstat stat;
        !           258: 
        !           259:        if ((fdp=fdget(fd)) == NULL)
        !           260:                return;
        !           261:        ip = fdp->f_ip;
        !           262:        oistat(ip, &stat);
        !           263:        kucopy(&stat, stp, sizeof(stat));
        !           264:        return (0);
        !           265: }
        !           266: 
        !           267: /*
        !           268:  * Return a status structure for the given file name.
        !           269:  */
        !           270: ostat(np, stp)
        !           271: char *np;
        !           272: struct oldstat *stp;
        !           273: {
        !           274:        register INODE *ip;
        !           275:        struct oldstat stat;
        !           276: 
        !           277:        if (ftoi(np, 'r') != 0)
        !           278:                return;
        !           279:        ip = u.u_cdiri;
        !           280:        oistat(ip, &stat);
        !           281:        kucopy(&stat, stp, sizeof(stat));
        !           282:        idetach(ip);
        !           283:        return 0;
        !           284: }
        !           285: 
        !           286: /*
        !           287:  * Copy the appropriate information from the inode to the stat buffer.
        !           288:  */
        !           289: oistat(ip, sbp)
        !           290: register INODE *ip;
        !           291: register struct oldstat *sbp;
        !           292: {
        !           293:        sbp->st_dev = ip->i_dev;
        !           294:        sbp->st_ino = ip->i_ino;
        !           295:        sbp->st_mode = ip->i_mode;
        !           296:        sbp->st_nlink = ip->i_nlink;
        !           297:        sbp->st_uid = ip->i_uid;
        !           298:        sbp->st_gid = ip->i_gid;
        !           299:        sbp->st_rdev = NODEV;
        !           300:        sbp->st_size = ip->i_size;
        !           301:        sbp->st_atime = ip->i_atime;
        !           302:        sbp->st_mtime = ip->i_mtime;
        !           303:        sbp->st_ctime = ip->i_ctime;
        !           304:        switch (ip->i_mode&IFMT) {
        !           305:        case IFBLK:
        !           306:        case IFCHR:
        !           307:                sbp->st_rdev = ip->i_a.i_rdev;
        !           308:                sbp->st_size = 0;
        !           309:                break;
        !           310:        case IFPIPE:
        !           311:                sbp->st_size = ip->i_pnc;
        !           312:                break;
        !           313:        }
        !           314: }
        !           315: 
        !           316: /*
        !           317:  * Return date and time.
        !           318:  */
        !           319: oftime(tbp)
        !           320: struct timeb *tbp;
        !           321: {
        !           322:        struct timeb timeb;
        !           323: 
        !           324:        timeb.time = timer.t_time;
        !           325:        /* This should be a machine.h macro to avoid
        !           326:         * unnecessary long arithmetic and roundoff errors
        !           327:         */
        !           328:        timeb.millitm = timer.t_tick*(1000/HZ);
        !           329:        timeb.timezone = timer.t_zone;
        !           330:        timeb.dstflag = timer.t_dstf;
        !           331:        kucopy(&timeb, tbp, sizeof(timeb));
        !           332: }
        !           333: 
        !           334: /*
        !           335:  * Send a SIGALARM signal in `n' clock ticks.
        !           336:  */
        !           337: long
        !           338: ualarm2(n)
        !           339: long n;
        !           340: {
        !           341:        register PROC * pp = SELF;
        !           342:        long s;
        !           343:        extern sigalrm();
        !           344: 
        !           345:        /*
        !           346:         * Calculate time left before current alarm timeout.
        !           347:         */
        !           348:        s = 0;
        !           349:        if (pp->p_alrmtim.t_last != NULL)
        !           350:                s = pp->p_alrmtim.t_lbolt - lbolt;
        !           351: 
        !           352:        /*
        !           353:         * Cancel previous alarm [if any], start new alarm [if n != 0].
        !           354:         */
        !           355:        timeout2(&pp->p_alrmtim, (long) n, sigalrm, pp);
        !           356: 
        !           357:        /*
        !           358:         * Return time left before previous alarm timeout.
        !           359:         */
        !           360:        return(s);
        !           361: }
        !           362: 
        !           363: /*
        !           364:  * Return elapsed ticks since system startup.
        !           365:  */
        !           366: long
        !           367: utick()
        !           368: {
        !           369:        return(lbolt);
        !           370: }
        !           371: 
        !           372: /*
        !           373:  * Cause a signal routine to be executed.
        !           374:  * Called from [coh/sig.c]
        !           375:  */
        !           376: oldsigstart(n, f)
        !           377: {
        !           378:        int i, n1;              
        !           379:        register int    usp;
        !           380: 
        !           381:        usp = u.u_regl[UESP];
        !           382: 
        !           383:        /*
        !           384:         *                 -1
        !           385:         * calculate cvtsig  [n]
        !           386:         *
        !           387:         */
        !           388:        n1 = n; 
        !           389:        for (i=0; cvtsig[i]>=0; i++)
        !           390:                if (cvtsig[i]==n)
        !           391:                        n1 = i;
        !           392:                        
        !           393:        putuwd(usp-3*sizeof(short), n1);
        !           394:        putuwd(usp-2*sizeof(short), u.u_regl[EIP]);
        !           395:        putubd(usp-2, u.u_regl[EFL]);
        !           396:        putubd(usp-1, u.u_regl[EFL]>>8);
        !           397:        u.u_regl[EFL] &= ~MFTTB;
        !           398:        u.u_regl[EIP] = f;
        !           399:        u.u_regl[UESP] -= 3*sizeof(short);
        !           400:        if (n != SIGTRAP)
        !           401:                u.u_sfunc[n-1] = SIG_DFL;
        !           402: }
        !           403: 
        !           404: /*
        !           405:  * Duplicate a file descriptor number.  This has the same calling
        !           406:  * sequence as the dup2 system call and even uses the silly DUP2 bit.
        !           407:  */
        !           408: fddup(ofd, nfd)
        !           409: register unsigned ofd;
        !           410: register unsigned nfd;
        !           411: {
        !           412:        register FD *fdp;
        !           413: 
        !           414:        if ((fdp=fdget(ofd&~DUP2)) == NULL)
        !           415:                return (-1);
        !           416:        if ((ofd&DUP2) != 0) {
        !           417:                if (nfd >= NOFILE) {
        !           418:                        u.u_error = EBADF;
        !           419:                        return (-1);
        !           420:                }
        !           421:                ofd &= ~DUP2;
        !           422:                if (ofd == nfd)
        !           423:                        return (nfd);
        !           424:                if (u.u_filep[nfd] != NULL) {
        !           425:                        fdclose(nfd);
        !           426:                        if (u.u_error)
        !           427:                                return (-1);
        !           428:                }
        !           429:        } else {
        !           430:                for (nfd=0; nfd<NOFILE; nfd++)
        !           431:                        if (u.u_filep[nfd] == NULL)
        !           432:                                break;
        !           433:                if (nfd == NOFILE) {
        !           434:                        u.u_error = EMFILE;
        !           435:                        return (-1);
        !           436:                }
        !           437:        }
        !           438:        u.u_filep[nfd] = fdp;
        !           439:        fdp->f_refc++;
        !           440:        return (nfd);
        !           441: }
        !           442: 
        !           443: /*
        !           444:  * obrk()
        !           445:  *
        !           446:  * Argument is the new linear space value for the end of the PDATA segment.
        !           447:  * As was done in COH286, arg of zero asks for the old upper limit.
        !           448:  */
        !           449: obrk(cp)
        !           450: long cp;
        !           451: {
        !           452:        register int res;
        !           453: 
        !           454:        cp &= 0xffff;   /* Ward off sign extension problems with cp. */
        !           455: 
        !           456:        /*
        !           457:         * If cp nonzero
        !           458:         *      resize user data segment
        !           459:         * else
        !           460:         *      just give info - current brk address
        !           461:         */
        !           462:        if (cp)
        !           463:                res = ubrk(cp);
        !           464:        else
        !           465:                res = u.u_segl[SIPDATA].sr_base + SELF->p_segp[SIPDATA]->s_size;
        !           466: 
        !           467:        return res; 
        !           468: }

unix.superglobalmegacorp.com

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