Annotation of coherent/b/kernel/io.386/qq.c, revision 1.1.1.1

1.1       root        1: static int blocked;
                      2: static int sg_hal;
                      3: 
                      4: /*
                      5:  * qq - sample device driver using absolute memory addressing
                      6:  *
                      7:  * All this device does is read/write video ram.
                      8:  * It assumes that there is a monochrome adapter in use, so that video
                      9:  * ram starts at segment B000;  if color, this should be changed to B800.
                     10:  *
                     11:  * This driver does not do anything useful;  it is intended to serve as
                     12:  * an example.
                     13:  */
                     14: #include <sys/coherent.h>
                     15: #include <sys/stat.h>
                     16: #include <sys/uproc.h>
                     17: #include <sys/proc.h>
                     18: #include <sys/con.h>
                     19: #include <errno.h>
                     20: #include <sys/sched.h>
                     21: #include <sys/seg.h>
                     22: #include <sys/types.h>
                     23: #include <sys/mmu.h>
                     24: 
                     25: /*
                     26:  * Definitions.
                     27:  *
                     28:  */
                     29: #define        MONOVIDEO       0xB000          /* monochrome text RAM segment */
                     30: #define        VIDLENGTH       (2048*2)        /* screen locations (2 bytes each) */
                     31: 
                     32: #define QQ_MAJOR       7               /* device major number */
                     33: 
                     34: /*
                     35:  * Export Functions.
                     36:  */
                     37: int    qqload();
                     38: int    qqopen();
                     39: int    qqclose();
                     40: int    qqread();
                     41: int    qqwrite();
                     42: int    qqunload();
                     43: int    qqioctl();
                     44: int    qqtime();
                     45: 
                     46: /*
                     47:  * Import Functions
                     48:  */
                     49: int    nulldev();
                     50: int    nonedev();
                     51: 
                     52: /*
                     53:  * Configuration table.
                     54:  */
                     55: CON qqcon ={
                     56:        DFCHR,                          /* Flags */
                     57:        QQ_MAJOR,                       /* Major index */
                     58:        qqopen,                         /* Open */
                     59:        qqclose,                        /* Close */
                     60:        nulldev,                        /* Block */
                     61:        qqread,                         /* Read */
                     62:        qqwrite,                        /* Write */
                     63:        qqioctl,                        /* Ioctl */
                     64:        nulldev,                        /* Powerfail */
                     65:        qqtime,                         /* Timeout */
                     66:        qqload,                         /* Load */
                     67:        qqunload,                       /* Unload */
                     68:        nulldev                         /* Poll */
                     69: };
                     70: 
                     71: /*
                     72:  * Local variables.
                     73:  */
                     74: #ifdef _I386
                     75: static paddr_t screen_fp;              /* virtual address of screen base */
                     76: #else
                     77: static faddr_t screen_fp;              /* (far *) to access screen */
                     78: static paddr_t screen_base;            /* physical address of screen base */
                     79: #endif
                     80: int    qqopct;
                     81: 
                     82: /*
                     83:  * Load Routine.
                     84:  */
                     85: qqload()
                     86: {
                     87:        /*
                     88:         * Allocate a selector to map onto the video RAM.  ptov() will
                     89:         * return the first available selector of the 8,192 possible.
                     90:         * This is time consuming, so we only want to do this as part
                     91:         * of our initialization code and not on every access.
                     92:         *
                     93:         * Since we are operating in 286 protected mode (ugh), the
                     94:         * second argument to ptov() must not exceed 0x10000L.
                     95:         */
                     96: #ifdef _I386
                     97:        screen_fp = map_pv(MONOVIDEO<<4, VIDLENGTH);
                     98:        printf("qqload:  screen_fp = %x = map_pv(%x, %x)\n",
                     99:                screen_fp, MONOVIDEO<<4, VIDLENGTH);
                    100: #else
                    101:        screen_base = (paddr_t)((long)(unsigned)MONOVIDEO << 4);
                    102:        screen_fp = ptov(screen_base, (fsize_t)VIDLENGTH);
                    103: #endif
                    104: }
                    105: 
                    106: qqunload()
                    107: {
                    108:        /*
                    109:         * We have to free up the selector now that we're done using it.
                    110:         */
                    111: #ifdef _I386
                    112:        unmap_pv(screen_fp);
                    113: #else
                    114:        vrelse(screen_fp);
                    115: #endif
                    116: }
                    117: 
                    118: /*
                    119:  * Open Routine.
                    120:  */
                    121: qqopen( dev, mode )
                    122: dev_t dev;
                    123: {
                    124:        qqopct++;
                    125:        printf("qqopen %d\n", qqopct);
                    126: }
                    127: 
                    128: /*
                    129:  * Close Routine.
                    130:  */
                    131: qqclose( dev )
                    132: dev_t dev;
                    133: {
                    134:        qqopct--;
                    135:        printf("qqclose %d\n", qqopct);
                    136: }
                    137: 
                    138: /*
                    139:  * Read Routine.
                    140:  */
                    141: qqread( dev, iop )
                    142: dev_t dev;
                    143: register IO * iop;
                    144: {
                    145:        static int offset;
                    146:        int c;
                    147:        /*
                    148:         * Read a character code from video RAM
                    149:         * Start reading RAM just after where previous read ended
                    150:         *
                    151:         * Note that "offset" is the value of the displacement into
                    152:         * the screen RAM. Any expression which results in a value
                    153:         * which is less than VIDLENGTH is OK here.
                    154:         */
                    155:        while(iop->io_ioc) {
                    156:                c = ((char *)screen_fp)[offset];
                    157:                if(ioputc(c, iop) == -1)
                    158:                        break;
                    159:                offset += 2;
                    160:                offset %= VIDLENGTH;
                    161:        }
                    162: }
                    163: 
                    164: /*
                    165:  * Write Routine.
                    166:  */
                    167: static char flab [] = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ";
                    168: 
                    169: qqwrite( dev, iop )
                    170: dev_t dev;
                    171: register IO * iop;
                    172: {
                    173:        int offset = 0;
                    174:        int c;
                    175: 
                    176:        struct foob { long la, lb; } f;
                    177: 
                    178:        while (iop->io_ioc >= sizeof(f)) {
                    179:                ioread(iop, &f, sizeof(f));
                    180: #if MEMCPY
                    181:                /* memcpy from struct f to virtual address */
                    182:                memcpy(screen_fp + offset, &f, sizeof(f));
                    183: #else
                    184:                /* struct assignment to virtual address (implicit memcpy) */
                    185:                * (struct foob *)(screen_fp + offset) = f;
                    186: #endif
                    187:                offset += 2 * sizeof(f);        /* skip attribute byte */
                    188:        }
                    189: 
                    190:        /* single character writes to virtual address */
                    191:        while ((c = iogetc(iop)) >= 0 && offset < VIDLENGTH) {
                    192:                *(char *)(screen_fp + offset) = c;
                    193:                *(char *)(screen_fp + offset + 1) ^= 0xff;
                    194:                offset += 2;    /* skip attribute byte */
                    195:        }
                    196: 
                    197: 
                    198:        /* no virtual address used - xpcopy to physical destination */
                    199:        xpcopy(flab, (MONOVIDEO<<4)+320, 52, SEG_386_KD);
                    200: }
                    201: 
                    202: int qqct;
                    203: 
                    204: int
                    205: qqioctl(dev, com, vec)
                    206: dev_t  dev;
                    207: int    com;
                    208: struct sgttyb *vec;
                    209: {
                    210:        if (com == 333) {
                    211:                ukcopy(vec, screen_fp, 20);
                    212:                sg_hal = vtosg(vec, 20);
                    213:                drvl[QQ_MAJOR].d_time = 30;
                    214:                blocked = 1;
                    215: qqct = 0;
                    216:        }
                    217:        while (blocked) {
                    218: #ifdef _I386
                    219:                x_sleep(&blocked, pritty, slpriSigCatch, "qqioctl");
                    220: #else
                    221:                v_sleep(&blocked, CVTTOUT, IVTTOUT, SVTTOUT, "qqioctl");
                    222: #endif
                    223:                if (SELF->p_ssig && nondsig()) {  /* signal? */
                    224:                        u.u_error = EINTR;
                    225:                        break;
                    226:                }
                    227:        }
                    228: }
                    229: 
                    230: int
                    231: qqtime()
                    232: {
                    233:        int j;
                    234:        char buffer[20 + 1];
                    235: 
                    236:        buffer[20] = '\0';
                    237: 
                    238:        j = --drvl[QQ_MAJOR].d_time;
                    239: 
                    240:        if ((j % 2) == 0) {
                    241:                if (sg_hal) {
                    242: qqct += 20;
                    243: printf("qqtime:  j=%d  pxcopy(sg_hal=%x, dest=%x, len=%x, space=%x  ",
                    244:   j, sg_hal, screen_fp + qqct, 20, SEG_386_KD|SEG_VIRT);
                    245:                        pxcopy(sg_hal, buffer, 20,
                    246:                          SEG_386_KD|SEG_VIRT);
                    247: printf("buffer=%s\n", buffer);
                    248:                        pxcopy(sg_hal, screen_fp + qqct, 20,
                    249:                          SEG_386_KD|SEG_VIRT);
                    250:                } else
                    251:                        putchar('?');
                    252:        }
                    253: 
                    254:        if (j == 0) {
                    255:                printf("wakeup\n");
                    256:                blocked = 0;
                    257:                wakeup(&blocked);
                    258:        }
                    259: }
                    260: 
                    261: int
                    262: vtosg(virt, size)
                    263: int virt;
                    264: int size;
                    265: {
                    266:        register SR *srp;
                    267:        register SEG *sp;
                    268:        register caddr_t base;
                    269:        int ret = 0;
                    270: 
                    271:        for (srp=u.u_segl; srp<&u.u_segl[NUSEG]; srp++) {
                    272:                if ((sp=srp->sr_segp) == NULL)
                    273:                        continue;
                    274: #if 0
                    275:                /*
                    276:                 * Doing this check means string constants in text
                    277:                 * are inaccessible to system global memory.
                    278:                 */
                    279:                if ((srp->sr_flag&SRFDATA) == 0)
                    280:                        continue;
                    281: #endif
                    282:                /*
                    283:                 * The following calculation is because the system represents
                    284:                 * the 'base' of a stack as its upper limit (because it is the
                    285:                 * upper limit that is fixed).
                    286:                 */
                    287:                base = srp->sr_base;
                    288:                if (srp==&u.u_segl[SISTACK])
                    289:                        base -= srp->sr_size;
                    290: 
                    291:                if (virt < base)
                    292:                        continue;
                    293:                if (virt + size > base + sp->s_size)
                    294:                        continue;
                    295:                ret = MAPIO(sp->s_vmem, virt - base);
                    296:        }
                    297:        return ret;
                    298: }

unix.superglobalmegacorp.com

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