Annotation of coherent/b/STREAMS/i386/fakedma.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * these routines are written in C until the 386 compiler/assembler
        !             3:  * are available
        !             4:  *
        !             5:  * Copyright (c) Ciaran O'Donnell, Bievres (FRANCE), 1991
        !             6:  */
        !             7: 
        !             8: #include <sys/debug.h>
        !             9: #include <kernel/reg.h>
        !            10: 
        !            11: #include <sys/coherent.h>
        !            12: #include <sys/clist.h>
        !            13: #include <sys/errno.h>
        !            14: #include <sys/inode.h>
        !            15: #include <sys/proc.h>
        !            16: #include <sys/seg.h>
        !            17: #include <signal.h>
        !            18: #include <sys/uproc.h>
        !            19: #include <sys/buf.h>
        !            20: 
        !            21: #define        min(a, b)       ((a) < (b) ? (a) : (b))
        !            22: 
        !            23: /*
        !            24:  * dmacopy()
        !            25:  *
        !            26:  * Copy "npage" 4 kbyte pages from phys addr "from" to phys addr "to".
        !            27:  */
        !            28: 
        !            29: dmacopy(npage, from, to) 
        !            30: long   npage;
        !            31: cseg_t *from, *to;
        !            32: {
        !            33:        int work = workAlloc ();        /* Get a virtual click pair. */
        !            34: 
        !            35:        ASSERT (npage > 0);
        !            36: 
        !            37:        for (;;) {
        !            38:                ptable1_v [work] = * from ++ | SEG_SRW;
        !            39:                ptable1_v [work + 1] = * to ++ | SEG_SRW;
        !            40:                memcpy (ctob (work + 1), ctob (work), NBPC);
        !            41: 
        !            42:                if (-- npage == 0)
        !            43:                        break;
        !            44: 
        !            45:                mmuupd ();              /* flush paging TLB */
        !            46:        }
        !            47: 
        !            48:        workFree(work);
        !            49: }
        !            50: 
        !            51: /*
        !            52:  * dmaclear()
        !            53:  *
        !            54:  * Given a byte count, and a system global address, zero-fill the memory.
        !            55:  */
        !            56: 
        !            57: void
        !            58: dmaclear (nbytes, to)
        !            59: long   nbytes;
        !            60: paddr_t        to;
        !            61: {
        !            62:        unsigned off;
        !            63:        int     n;
        !            64:        cseg_t *base;
        !            65:        int work = workAlloc ();        /* Get a virtual click pair. */
        !            66: 
        !            67:        off = to & (NBPC - 1);
        !            68:        base = & sysmem.u.pbase [btocrd (to)];
        !            69:        n = min (nbytes, NBPC - off);
        !            70:        ptable1_v [work] = * base ++ | SEG_SRW;
        !            71: 
        !            72:        memset (ctob (work) + off, 0, n);
        !            73:        nbytes -= n;
        !            74: 
        !            75:        while (nbytes > 0) {
        !            76:                n = min (nbytes, NBPC);
        !            77:                ptable1_v [work] = * base ++ | SEG_SRW;
        !            78:                mmuupd ();
        !            79: 
        !            80:                memset (ctob (work), 0, n);
        !            81:                nbytes -= n;
        !            82:        }
        !            83: 
        !            84:        workFree(work);
        !            85: }
        !            86: 
        !            87: /*
        !            88:  * dmain()
        !            89:  * 
        !            90:  * Copy in "nbytes" from system global address "to" to kernel address
        !            91:  * "vaddr".
        !            92:  */
        !            93: dmain(nbytes, to, vaddr)
        !            94: long   nbytes;
        !            95: paddr_t        to;
        !            96: caddr_t        vaddr;
        !            97: {
        !            98:        unsigned off;
        !            99:        unsigned        n, n1;
        !           100:        cseg_t* base;
        !           101:        int work = workAlloc ();        /* Get a virtual click pair. */
        !           102: 
        !           103:        off = to & (NBPC - 1);
        !           104:        base = & sysmem.u.pbase [btocrd (to)];
        !           105: 
        !           106:        n = min (nbytes, NBPC - off);
        !           107:        ptable1_v [work] = * base ++ | SEG_SRW;
        !           108: 
        !           109:        memcpy (vaddr, ctob (work) + off, n);
        !           110:        vaddr += n;
        !           111:        nbytes -= n;
        !           112: 
        !           113:        while (nbytes > 0) {
        !           114:                n = min (nbytes, NBPC);
        !           115:                ptable1_v [work] = * base ++ | SEG_SRW;
        !           116:                mmuupd ();
        !           117: 
        !           118:                memcpy (vaddr, ctob (work), n);
        !           119:                vaddr += n;
        !           120:                nbytes -= n;
        !           121:        }
        !           122: 
        !           123:        workFree (work);
        !           124: }
        !           125: 
        !           126: /*
        !           127:  * dmaout()
        !           128:  * 
        !           129:  * Copy out "nbytes" from kernel address "vaddr" to system global address
        !           130:  * "to".
        !           131:  */
        !           132: dmaout(nbytes, to, vaddr)
        !           133: long   nbytes;
        !           134: paddr_t        to;
        !           135: caddr_t        vaddr;
        !           136: {
        !           137:        unsigned off;
        !           138:        unsigned        n, n1;
        !           139:        cseg_t *base;
        !           140:        int work = workAlloc ();        /* Get a virtual click pair. */
        !           141: 
        !           142:        off = to & (NBPC - 1);
        !           143:        base = & sysmem.u.pbase [btocrd (to)];
        !           144: 
        !           145:        n = min (nbytes, NBPC - off);
        !           146:        ptable1_v [work] = * base ++ | SEG_SRW;
        !           147: 
        !           148:        memcpy (ctob (work) + off, vaddr, n);
        !           149:        vaddr += n;
        !           150:        nbytes -= n;
        !           151: 
        !           152:        while (nbytes > 0) {
        !           153:                n = min (nbytes, NBPC);
        !           154:                ptable1_v [work] = * base ++ | SEG_SRW;
        !           155:                mmuupd ();
        !           156: 
        !           157:                memcpy (ctob (work), vaddr, n);
        !           158:                vaddr += n;
        !           159:                nbytes -= n;
        !           160:        }
        !           161: 
        !           162:        workFree(work);
        !           163: }
        !           164: 
        !           165: /*
        !           166:  * dmaio2()
        !           167:  * 
        !           168:  * Copy in "nbytes" from an I/O port "port" to the system global address
        !           169:  * "to".
        !           170:  */
        !           171: dmaio2(nbytes, to, port)
        !           172: long   nbytes, port;
        !           173: paddr_t        to;
        !           174: {
        !           175:        unsigned off;
        !           176:        int     n;
        !           177:        cseg_t *base;
        !           178:        int work = workAlloc ();        /* Get a virtual click pair. */
        !           179: 
        !           180:        off = to & (NBPC - 1);
        !           181:        base = & sysmem.u.pbase [btocrd (to)];
        !           182: 
        !           183:        n = min (nbytes, NBPC - off);
        !           184:        ptable1_v [work] = * base ++ | SEG_SRW;
        !           185:        
        !           186:        io2seg (n, ctob (work) + off, port);
        !           187:        nbytes -= n;
        !           188: 
        !           189:        while (nbytes > 0) {
        !           190:                n = min (nbytes, NBPC);
        !           191:                ptable1_v [work] = * base ++ | SEG_SRW;
        !           192:                mmuupd ();
        !           193:                io2seg(n, ctob (work), port);
        !           194:                nbytes -= n;
        !           195:        }
        !           196: 
        !           197:        workFree(work);
        !           198: }
        !           199: 
        !           200: /*
        !           201:  * dma2io()
        !           202:  * 
        !           203:  * Copy out "nbytes" from the system global address "from" to an I/O port
        !           204:  * "port".
        !           205:  */
        !           206: dma2io(nbytes, to, port)
        !           207: long   nbytes, port;
        !           208: paddr_t        to;
        !           209: {
        !           210:        unsigned off;
        !           211:        int     n;
        !           212:        cseg_t *base;
        !           213:        int work = workAlloc ();        /* Get a virtual click pair. */
        !           214: 
        !           215:        off = to & (NBPC - 1);
        !           216:        base = & sysmem.u.pbase [btocrd (to)];
        !           217: 
        !           218:        n = min (nbytes, NBPC - off);
        !           219:        ptable1_v [work] = * base ++ | SEG_SRW;
        !           220:        
        !           221:        seg2io (n, ctob (work) + off, port);
        !           222:        nbytes -= n;
        !           223: 
        !           224:        while (nbytes > 0) {
        !           225:                n = min (nbytes, NBPC);
        !           226:                ptable1_v [work] = * base ++ | SEG_SRW;
        !           227:                mmuupd ();
        !           228:                seg2io (n, ctob (work), port);
        !           229:                nbytes -= n;
        !           230:        }
        !           231: 
        !           232:        workFree(work);
        !           233: }
        !           234: 
        !           235: /*
        !           236:  * pxcopy()
        !           237:  *
        !           238:  * copy "n" bytes of data at kernel address "v" from address "uo" in:
        !           239:  *     system global address space             (space & SEG_VIRT)
        !           240:  *     physical memory                         ! (space & SEG_VIRT)
        !           241:  * Rights are determined by (space & ~ SEG_VIRT):
        !           242:  *     "v" can be anywhere in kernel address space     SEG_386_KD
        !           243:  *     "v" must be an address accessible to the user   SEG_386_UD
        !           244:  * Up to one click of data can be copied. No alignment restrictions
        !           245:  * on "uo" apply.
        !           246:  */
        !           247: pxcopy(uo, v, n, space)
        !           248: unsigned       uo;
        !           249: char   *v;
        !           250: register int n;
        !           251: {
        !           252:        cseg_t        * base;
        !           253:        int             save;
        !           254:        int             err;
        !           255:        int             work;
        !           256: 
        !           257:        if (n > NBPC)
        !           258:                return 0;
        !           259: 
        !           260:        work = workAlloc ();
        !           261: 
        !           262:        if (space & SEG_VIRT) {
        !           263:                space &= ~ SEG_VIRT;
        !           264:                base = & sysmem.u.pbase [btocrd (uo)];
        !           265:                ptable1_v [work] = * base ++ | SEG_SRW;
        !           266:                ptable1_v [work + 1] = * base ++ | SEG_SRW;
        !           267:        } else {
        !           268:                ptable1_v [work] = (uo & ~ (NBPC - 1)) + SEG_SRW;
        !           269:                ptable1_v [work + 1] = (uo & ~ (NBPC - 1)) + NBPC + SEG_SRW;
        !           270:        }
        !           271: 
        !           272:        save = setspace (space);
        !           273:        err = kucopy (ctob (work) + (uo & (NBPC - 1)), v, n);
        !           274:        setspace (save);
        !           275: 
        !           276:        workFree (work);
        !           277:        return err;
        !           278: }
        !           279: 
        !           280: 
        !           281: /*
        !           282:  * xpcopy()
        !           283:  * 
        !           284:  * copy "n" bytes of data from kernel address "v" to address "uo" in:
        !           285:  *      system global address space                      (space&SEG_VIRT)
        !           286:  *      physical memory                                 !(space&SEG_VIRT)
        !           287:  * Rights are determined by (space&~SEG_VIRT):
        !           288:  *      "v" can be anywhere in kernel address space      SEG_386_KD
        !           289:  *      "v" must be an address accessible to the user    SEG_386_UD
        !           290:  * Up to one click of data can be copied. No alignment restrictions on "uo"
        !           291:  * apply.
        !           292:  */
        !           293: 
        !           294: xpcopy(v, uo, n, space)
        !           295: char   *v;
        !           296: unsigned uo;
        !           297: register int n;
        !           298: {
        !           299:        cseg_t        * base;
        !           300:        int             save;
        !           301:        int             err;
        !           302:        int             work;
        !           303: 
        !           304:        if (n > NBPC)
        !           305:                return 0;
        !           306: 
        !           307:        work = workAlloc ();
        !           308: 
        !           309:        if (space & SEG_VIRT) {
        !           310:                space &= ~ SEG_VIRT;
        !           311:                base = & sysmem.u.pbase [btocrd (uo)];
        !           312:                ptable1_v [work] = * base ++ | SEG_SRW;
        !           313:                ptable1_v [work + 1] = * base ++ | SEG_SRW;
        !           314:        } else {
        !           315:                ptable1_v [work] = (uo & ~ (NBPC - 1)) + SEG_SRW;
        !           316:                ptable1_v [work + 1] = (uo & ~ (NBPC - 1)) + NBPC + SEG_SRW;
        !           317:        }
        !           318: 
        !           319:        save = setspace (space);
        !           320:        err = ukcopy (v, ctob (work) + (uo & (NBPC - 1)), n);
        !           321:        setspace (save);
        !           322: 
        !           323:        workFree (work);
        !           324:        return err;
        !           325: }

unix.superglobalmegacorp.com

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