Annotation of lucent/sys/src/9/pc/l.s, revision 1.1.1.1

1.1       root        1: #include "mem.h"
                      2: 
                      3: #define OP16   BYTE    $0x66
                      4: #define NOP    XCHGL   AX,AX
                      5: 
                      6: /*
                      7:  *     about to walk all over ms/dos - turn off interrupts
                      8:  */
                      9: TEXT   origin(SB),$0
                     10: 
                     11:        CLI
                     12: 
                     13: #ifdef BOOT
                     14: /*
                     15:  *     This part of l.s is used only in the boot kernel.
                     16:  *     It assumes that we are in real address mode, i.e.,
                     17:  *     that we look like an 8086.
                     18:  */
                     19: /*
                     20:  *     relocate everything to a half meg and jump there
                     21:  *     - looks wierd because it is being assembled by a 32 bit
                     22:  *       assembler for a 16 bit world
                     23:  */
                     24:        MOVL    $0,BX
                     25:        INCL    BX
                     26:        SHLL    $15,BX
                     27:        MOVL    BX,CX
                     28:        MOVW    BX,ES
                     29:        MOVL    $0,SI
                     30:        MOVL    SI,DI
                     31:        CLD; REP; MOVSL
                     32: /*     JMPFAR  0X8000:$lowcore(SB) /**/
                     33:         BYTE   $0xEA
                     34:         WORD   $lowcore(SB)
                     35:         WORD   $0X8000
                     36: 
                     37: TEXT   lowcore(SB),$0
                     38: 
                     39: /*
                     40:  *     now that we're in low core, update the DS
                     41:  */
                     42: 
                     43:        MOVW    BX,DS
                     44: 
                     45: /*
                     46:  *     goto protected mode
                     47:  */
                     48: /*     MOVL    tgdtptr(SB),GDTR /**/
                     49:         BYTE   $0x0f
                     50:         BYTE   $0x01
                     51:         BYTE   $0x16
                     52:         WORD   $tgdtptr(SB)
                     53:        MOVL    CR0,AX
                     54:        ORL     $1,AX
                     55:        MOVL    AX,CR0
                     56: 
                     57: /*
                     58:  *     clear prefetch queue (weird code to avoid optimizations)
                     59:  */
                     60:        CLC
                     61:        JCC     flush
                     62:        MOVL    AX,AX
                     63: flush:
                     64: 
                     65: /*
                     66:  *     set all segs
                     67:  */
                     68: /*     MOVW    $SELECTOR(1, SELGDT, 0),AX      /**/
                     69:         BYTE   $0xc7
                     70:         BYTE   $0xc0
                     71:         WORD   $SELECTOR(1, SELGDT, 0)
                     72:        MOVW    AX,DS
                     73:        MOVW    AX,SS
                     74:        MOVW    AX,ES
                     75:        MOVW    AX,FS
                     76:        MOVW    AX,GS
                     77: 
                     78: /*     JMPFAR  SELECTOR(2, SELGDT, 0):$mode32bit(SB) /**/
                     79:         BYTE   $0x66
                     80:         BYTE   $0xEA
                     81:         LONG   $mode32bit-KZERO(SB)
                     82:         WORD   $SELECTOR(2, SELGDT, 0)
                     83: 
                     84: TEXT   mode32bit(SB),$0
                     85: 
                     86: #endif BOOT
                     87: 
                     88:        /*
                     89:         * Clear BSS
                     90:         */
                     91:        LEAL    edata-KZERO(SB),SI
                     92:        MOVL    SI,DI
                     93:        ADDL    $4,DI
                     94:        MOVL    $0,AX
                     95:        MOVL    AX,(SI)
                     96:        LEAL    end-KZERO(SB),CX
                     97:        SUBL    DI,CX
                     98:        SHRL    $2,CX
                     99:        CLD; REP; MOVSL
                    100: 
                    101:        /*
                    102:         *  make a bottom level page table page that maps the first
                    103:         *  16 meg of physical memory
                    104:         */
                    105:        LEAL    tpt-KZERO(SB),AX        /* get phys addr of temporary page table */
                    106:        ADDL    $(BY2PG-1),AX           /* must be page alligned */
                    107:        ANDL    $(~(BY2PG-1)),AX        /* ... */
                    108:        MOVL    $(1024),CX              /* pte's per page */
                    109:        MOVL    $((((1024)-1)<<PGSHIFT)|PTEVALID|PTEKERNEL|PTEWRITE),BX
                    110: setpte:
                    111:        MOVL    BX,-4(AX)(CX*4)
                    112:        SUBL    $(1<<PGSHIFT),BX
                    113:        LOOP    setpte
                    114: 
                    115:        /*
                    116:         *  make a top level page table page that maps the first
                    117:         *  16 meg of memory to 0 thru 16meg and to KZERO thru KZERO+16meg
                    118:         */
                    119:        MOVL    AX,BX
                    120:        ADDL    $(BY2PG),AX
                    121:        ADDL    $(PTEVALID|PTEKERNEL|PTEWRITE),BX
                    122:        MOVL    BX,0(AX)
                    123:        MOVL    BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+0)(AX)
                    124: 
                    125:        /*
                    126:         *  point processor to top level page & turn on paging & make
                    127:         *  supervisor obey the R/W bit in the page map
                    128:         */
                    129:        MOVL    AX,CR3
                    130:        MOVL    CR0,AX
                    131:        ORL     $0X80010000,AX
                    132:        ANDL    $~(0x40000000|0x20000000|0x8|0x2),AX    /* CD=0, NW=0, TS=0, MP=0 */
                    133:        MOVL    AX,CR0
                    134: 
                    135:        /*
                    136:         *  use a jump to an absolute location to get the PC into
                    137:         *  KZERO.
                    138:         */
                    139:        LEAL    tokzero(SB),AX
                    140:        JMP*    AX
                    141: 
                    142: TEXT   tokzero(SB),$0
                    143: 
                    144:        /*
                    145:         *  stack and mach
                    146:         */
                    147:        MOVL    $mach0(SB),SP
                    148:        MOVL    SP,m(SB)
                    149:        MOVL    $0,0(SP)
                    150:        ADDL    $(MACHSIZE-4),SP        /* start stack under machine struct */
                    151:        MOVL    $0, u(SB)
                    152: 
                    153:        /*
                    154:         *  clear flags
                    155:         */
                    156:        MOVL    $0,AX
                    157:        PUSHL   AX
                    158:        POPFL
                    159: 
                    160:        CALL    main(SB)
                    161: 
                    162: loop:
                    163:        JMP     loop
                    164: 
                    165: GLOBL  mach0+0(SB), $MACHSIZE
                    166: GLOBL  u(SB), $4
                    167: GLOBL  m(SB), $4
                    168: GLOBL  tpt(SB), $(BY2PG*3)
                    169: 
                    170: /*
                    171:  *  gdt to get us to 32-bit/segmented/unpaged mode
                    172:  */
                    173: TEXT   tgdt(SB),$0
                    174: 
                    175:        /* null descriptor */
                    176:        LONG    $0
                    177:        LONG    $0
                    178: 
                    179:        /* data segment descriptor for 4 gigabytes (PL 0) */
                    180:        LONG    $(0xFFFF)
                    181:        LONG    $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
                    182: 
                    183:        /* exec segment descriptor for 4 gigabytes (PL 0) */
                    184:        LONG    $(0xFFFF)
                    185:        LONG    $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
                    186: 
                    187: /*
                    188:  *  pointer to initial gdt
                    189:  */
                    190: TEXT   tgdtptr(SB),$0
                    191: 
                    192:        WORD    $(3*8)
                    193:        LONG    $tgdt-KZERO(SB)
                    194: 
                    195: /*
                    196:  *  input a byte
                    197:  */
                    198: TEXT   inb(SB),$0
                    199: 
                    200:        MOVL    p+0(FP),DX
                    201:        XORL    AX,AX
                    202:        INB
                    203:        RET
                    204: 
                    205: /*
                    206:  *  input a string of bytes from a port
                    207:  */
                    208: TEXT   insb(SB),$0
                    209: 
                    210:        MOVL    p+0(FP),DX
                    211:        MOVL    a+4(FP),DI
                    212:        MOVL    c+8(FP),CX
                    213:        CLD; REP; INSB
                    214:        RET
                    215: 
                    216: /*
                    217:  *  output a byte
                    218:  */
                    219: TEXT   outb(SB),$0
                    220: 
                    221:        MOVL    p+0(FP),DX
                    222:        MOVL    b+4(FP),AX
                    223:        OUTB
                    224:        RET
                    225: 
                    226: /*
                    227:  *  output a string of bytes to a port
                    228:  */
                    229: TEXT   outsb(SB),$0
                    230: 
                    231:        MOVL    p+0(FP),DX
                    232:        MOVL    a+4(FP),SI
                    233:        MOVL    c+8(FP),CX
                    234:        CLD; REP; OUTSB
                    235:        RET
                    236: 
                    237: /*
                    238:  * input a short from a port
                    239:  */
                    240: TEXT   ins(SB), $0
                    241: 
                    242:        MOVL    p+0(FP), DX
                    243:        XORL    AX, AX
                    244:        OP16; INL
                    245:        RET
                    246: 
                    247: /*
                    248:  *  input a string of shorts from a port
                    249:  */
                    250: TEXT   inss(SB),$0
                    251: 
                    252:        MOVL    p+0(FP),DX
                    253:        MOVL    a+4(FP),DI
                    254:        MOVL    c+8(FP),CX
                    255:        CLD; REP; OP16; INSL
                    256:        RET
                    257: 
                    258: /*
                    259:  * input a long from a port
                    260:  */
                    261: TEXT   inl(SB), $0
                    262: 
                    263:        MOVL    p+0(FP), DX
                    264:        XORL    AX, AX
                    265:        INL
                    266:        RET
                    267: 
                    268: /*
                    269:  *  input a string of longs from a port
                    270:  */
                    271: TEXT   insl(SB),$0
                    272: 
                    273:        MOVL    p+0(FP),DX
                    274:        MOVL    a+4(FP),DI
                    275:        MOVL    c+8(FP),CX
                    276:        CLD; REP; INSL
                    277:        RET
                    278: 
                    279: /*
                    280:  * output a short to a port
                    281:  */
                    282: TEXT   outs(SB), $0
                    283:        MOVL    p+0(FP), DX
                    284:        MOVL    s+4(FP), AX
                    285:        OP16; OUTL
                    286:        RET
                    287: 
                    288: /*
                    289:  *  output a string of shorts to a port
                    290:  */
                    291: TEXT   outss(SB),$0
                    292: 
                    293:        MOVL    p+0(FP),DX
                    294:        MOVL    a+4(FP),SI
                    295:        MOVL    c+8(FP),CX
                    296:        CLD; REP; OP16; OUTSL
                    297:        RET
                    298: 
                    299: /*
                    300:  * output a long to a port
                    301:  */
                    302: TEXT   outl(SB), $0
                    303:        MOVL    p+0(FP), DX
                    304:        MOVL    s+4(FP), AX
                    305:        OUTL
                    306:        RET
                    307: 
                    308: /*
                    309:  *  output a string of longs to a port
                    310:  */
                    311: TEXT   outsl(SB),$0
                    312: 
                    313:        MOVL    p+0(FP),DX
                    314:        MOVL    a+4(FP),SI
                    315:        MOVL    c+8(FP),CX
                    316:        CLD; REP; OUTSL
                    317:        RET
                    318: 
                    319: /*
                    320:  *  test and set
                    321:  */
                    322: TEXT   tas(SB),$0
                    323:        MOVL    $0xdeadead,AX
                    324:        MOVL    l+0(FP),BX
                    325:        XCHGL   AX,(BX)
                    326:        RET
                    327: 
                    328: /*
                    329:  *  exchange 2 32-bit words, this is an interlocked (LOCK#) instruction
                    330:  */
                    331: TEXT   ilputl(SB),$0
                    332:        MOVL    v+4(FP),AX
                    333:        MOVL    a+0(FP),BX
                    334:        XCHGL   AX,(BX)
                    335:        RET
                    336: 
                    337: /*
                    338:  *  routines to load/read various system registers
                    339:  */
                    340: GLOBL  idtptr(SB),$6
                    341: TEXT   putidt(SB),$0           /* interrupt descriptor table */
                    342:        MOVL    t+0(FP),AX
                    343:        MOVL    AX,idtptr+2(SB)
                    344:        MOVL    l+4(FP),AX
                    345:        MOVW    AX,idtptr(SB)
                    346:        MOVL    idtptr(SB),IDTR
                    347:        RET
                    348: 
                    349: GLOBL  gdtptr(SB),$6
                    350: TEXT   putgdt(SB),$0           /* global descriptor table */
                    351:        MOVL    t+0(FP),AX
                    352:        MOVL    AX,gdtptr+2(SB)
                    353:        MOVL    l+4(FP),AX
                    354:        MOVW    AX,gdtptr(SB)
                    355:        MOVL    gdtptr(SB),GDTR
                    356:        RET
                    357: 
                    358: TEXT   putcr3(SB),$0           /* top level page table pointer */
                    359:        MOVL    t+0(FP),AX
                    360:        MOVL    AX,CR3
                    361:        RET
                    362: 
                    363: TEXT   puttr(SB),$0            /* task register */
                    364:        MOVL    t+0(FP),AX
                    365:        MOVW    AX,TASK
                    366:        RET
                    367: 
                    368: TEXT   getcr0(SB),$0           /* coprocessor bits */
                    369:        MOVL    CR0,AX
                    370:        RET
                    371: 
                    372: TEXT   getcr2(SB),$0           /* fault address */
                    373:        MOVL    CR2,AX
                    374:        RET
                    375: 
                    376: #define        FPOFF\
                    377:        WAIT;\
                    378:        MOVL    CR0,AX;\
                    379:        ORL     $0x24,AX        /* EM=1, NE=1 */;\
                    380:        MOVL    AX,CR0
                    381: 
                    382: #define        FPON\
                    383:        MOVL    CR0,AX;\
                    384:        ANDL    $~0x4,AX        /* EM=0 */;\
                    385:        MOVL    AX,CR0
                    386:        
                    387: TEXT   fpoff(SB),$0            /* turn off floating point */
                    388:        FPOFF
                    389:        RET
                    390: 
                    391: TEXT   fpinit(SB),$0           /* turn on & init the floating point */
                    392:        FPON
                    393:        FINIT
                    394:        WAIT
                    395:        PUSHW   $0x033E
                    396:        FLDCW   0(SP)           /* ignore underflow/precision, signal others */
                    397:        POPW    AX
                    398:        WAIT
                    399:        RET
                    400: 
                    401: TEXT   fpsave(SB),$0           /* save floating point state and turn off */
                    402:        MOVL    p+0(FP),AX
                    403:        WAIT
                    404:        FSAVE   0(AX)
                    405:        FPOFF
                    406:        RET
                    407: 
                    408: TEXT   fprestore(SB),$0        /* turn on floating point and restore regs */
                    409:        FPON
                    410:        MOVL    p+0(FP),AX
                    411:        FRSTOR  0(AX)
                    412:        WAIT
                    413:        RET
                    414: 
                    415: TEXT   fpstatus(SB),$0         /* get floating point status */
                    416:        FSTSW   AX
                    417:        RET
                    418: 
                    419: TEXT   fpenv(SB),$0            /* save floating point environment without waiting */
                    420:        MOVL    p+0(FP),AX
                    421:        FSTENV  0(AX)
                    422:        RET
                    423: 
                    424: /*
                    425:  *  special traps
                    426:  */
                    427: TEXT   intr0(SB),$0
                    428:        PUSHL   $0
                    429:        PUSHL   $0
                    430:        JMP     intrcommon
                    431: TEXT   intr1(SB),$0
                    432:        PUSHL   $0
                    433:        PUSHL   $1
                    434:        JMP     intrcommon
                    435: TEXT   intr2(SB),$0
                    436:        PUSHL   $0
                    437:        PUSHL   $2
                    438:        JMP     intrcommon
                    439: TEXT   intr3(SB),$0
                    440:        PUSHL   $0
                    441:        PUSHL   $3
                    442:        JMP     intrcommon
                    443: TEXT   intr4(SB),$0
                    444:        PUSHL   $0
                    445:        PUSHL   $4
                    446:        JMP     intrcommon
                    447: TEXT   intr5(SB),$0
                    448:        PUSHL   $0
                    449:        PUSHL   $5
                    450:        JMP     intrcommon
                    451: TEXT   intr6(SB),$0
                    452:        PUSHL   $0
                    453:        PUSHL   $6
                    454:        JMP     intrcommon
                    455: TEXT   intr7(SB),$0
                    456:        PUSHL   $0
                    457:        PUSHL   $7
                    458:        JMP     intrcommon
                    459: TEXT   intr8(SB),$0
                    460:        PUSHL   $8
                    461:        JMP     intrscommon
                    462: TEXT   intr9(SB),$0
                    463:        PUSHL   $0
                    464:        PUSHL   $9
                    465:        JMP     intrcommon
                    466: TEXT   intr10(SB),$0
                    467:        PUSHL   $10
                    468:        JMP     intrscommon
                    469: TEXT   intr11(SB),$0
                    470:        PUSHL   $11
                    471:        JMP     intrscommon
                    472: TEXT   intr12(SB),$0
                    473:        PUSHL   $12
                    474:        JMP     intrscommon
                    475: TEXT   intr13(SB),$0
                    476:        PUSHL   $13
                    477:        JMP     intrscommon
                    478: TEXT   intr14(SB),$0
                    479:        PUSHL   $14
                    480:        JMP     intrscommon
                    481: TEXT   intr15(SB),$0
                    482:        PUSHL   $0
                    483:        PUSHL   $15
                    484:        JMP     intrcommon
                    485: TEXT   intr16(SB),$0
                    486:        PUSHL   $0
                    487:        PUSHL   $16
                    488:        JMP     intrcommon
                    489: TEXT   intr24(SB),$0
                    490:        PUSHL   $0
                    491:        PUSHL   $24
                    492:        JMP     intrcommon
                    493: TEXT   intr25(SB),$0
                    494:        PUSHL   $0
                    495:        PUSHL   $25
                    496:        JMP     intrcommon
                    497: TEXT   intr26(SB),$0
                    498:        PUSHL   $0
                    499:        PUSHL   $26
                    500:        JMP     intrcommon
                    501: TEXT   intr27(SB),$0
                    502:        PUSHL   $0
                    503:        PUSHL   $27
                    504:        JMP     intrcommon
                    505: TEXT   intr28(SB),$0
                    506:        PUSHL   $0
                    507:        PUSHL   $28
                    508:        JMP     intrcommon
                    509: TEXT   intr29(SB),$0
                    510:        PUSHL   $0
                    511:        PUSHL   $29
                    512:        JMP     intrcommon
                    513: TEXT   intr30(SB),$0
                    514:        PUSHL   $0
                    515:        PUSHL   $30
                    516:        JMP     intrcommon
                    517: TEXT   intr31(SB),$0
                    518:        PUSHL   $0
                    519:        PUSHL   $31
                    520:        JMP     intrcommon
                    521: TEXT   intr32(SB),$0
                    522:        PUSHL   $0
                    523:        PUSHL   $32
                    524:        JMP     intrcommon
                    525: TEXT   intr33(SB),$0
                    526:        PUSHL   $0
                    527:        PUSHL   $33
                    528:        JMP     intrcommon
                    529: TEXT   intr34(SB),$0
                    530:        PUSHL   $0
                    531:        PUSHL   $34
                    532:        JMP     intrcommon
                    533: TEXT   intr35(SB),$0
                    534:        PUSHL   $0
                    535:        PUSHL   $35
                    536:        JMP     intrcommon
                    537: TEXT   intr36(SB),$0
                    538:        PUSHL   $0
                    539:        PUSHL   $36
                    540:        JMP     intrcommon
                    541: TEXT   intr37(SB),$0
                    542:        PUSHL   $0
                    543:        PUSHL   $37
                    544:        JMP     intrcommon
                    545: TEXT   intr38(SB),$0
                    546:        PUSHL   $0
                    547:        PUSHL   $38
                    548:        JMP     intrcommon
                    549: TEXT   intr39(SB),$0
                    550:        PUSHL   $0
                    551:        PUSHL   $39
                    552:        JMP     intrcommon
                    553: TEXT   intr64(SB),$0
                    554:        PUSHL   $0
                    555:        PUSHL   $64
                    556:        JMP     intrcommon
                    557: TEXT   intrbad(SB),$0
                    558:        PUSHL   $0
                    559:        PUSHL   $0x1ff
                    560:        JMP     intrcommon
                    561: 
                    562: intrcommon:
                    563:        PUSHL   DS
                    564:        PUSHL   ES
                    565:        PUSHL   FS
                    566:        PUSHL   GS
                    567:        PUSHAL
                    568:        MOVL    $(KDSEL),AX
                    569:        MOVW    AX,DS
                    570:        MOVW    AX,ES
                    571:        LEAL    0(SP),AX
                    572:        PUSHL   AX
                    573:        CALL    trap(SB)
                    574:        POPL    AX
                    575:        POPAL
                    576:        NOP
                    577:        POPL    GS
                    578:        POPL    FS
                    579:        POPL    ES
                    580:        POPL    DS
                    581:        NOP
                    582:        ADDL    $8,SP   /* error code and trap type */
                    583:        IRETL
                    584: 
                    585: intrscommon:
                    586:        PUSHL   DS
                    587:        PUSHL   ES
                    588:        PUSHL   FS
                    589:        PUSHL   GS
                    590:        PUSHAL
                    591:        MOVL    $(KDSEL),AX
                    592:        MOVW    AX,DS
                    593:        MOVW    AX,ES
                    594:        LEAL    0(SP),AX
                    595:        PUSHL   AX
                    596:        CALL    trap(SB)
                    597:        POPL    AX
                    598:        POPAL
                    599:        NOP
                    600:        POPL    GS
                    601:        POPL    FS
                    602:        POPL    ES
                    603:        POPL    DS
                    604:        NOP
                    605:        ADDL    $8,SP   /* error code and trap type */
                    606:        IRETL
                    607: 
                    608: /*
                    609:  *  interrupt level is interrupts on or off
                    610:  */
                    611: TEXT   spllo(SB),$0
                    612:        PUSHFL
                    613:        POPL    AX
                    614:        STI
                    615:        RET
                    616: 
                    617: TEXT   splhi(SB),$0
                    618:        PUSHFL
                    619:        POPL    AX
                    620:        CLI
                    621:        RET
                    622: 
                    623: TEXT   splx(SB),$0
                    624:        MOVL    s+0(FP),AX
                    625:        PUSHL   AX
                    626:        POPFL
                    627:        RET
                    628: 
                    629: /*
                    630:  *  do nothing whatsoever till interrupt happens
                    631:  */
                    632: TEXT   idle(SB),$0
                    633:        HLT
                    634:        RET
                    635: 
                    636: /*
                    637:  *  label consists of a stack pointer and a PC
                    638:  */
                    639: TEXT   gotolabel(SB),$0
                    640:        MOVL    l+0(FP),AX
                    641:        MOVL    0(AX),SP        /* restore sp */
                    642:        MOVL    4(AX),AX        /* put return pc on the stack */
                    643:        MOVL    AX,0(SP)
                    644:        MOVL    $1,AX           /* return 1 */
                    645:        RET
                    646: 
                    647: TEXT   setlabel(SB),$0
                    648:        MOVL    l+0(FP),AX
                    649:        MOVL    SP,0(AX)        /* store sp */
                    650:        MOVL    0(SP),BX        /* store return pc */
                    651:        MOVL    BX,4(AX)
                    652:        MOVL    $0,AX           /* return 0 */
                    653:        RET
                    654: 
                    655: /*
                    656:  *  Used to get to the first process.
                    657:  *  Set up an interrupt return frame and IRET to user level.
                    658:  */
                    659: TEXT   touser(SB),$0
                    660:        PUSHL   $(UDSEL)                /* old ss */
                    661:        MOVL    sp+0(FP),AX             /* old sp */
                    662:        PUSHL   AX
                    663:        PUSHFL                          /* old flags */
                    664:        PUSHL   $(UESEL)                /* old cs */
                    665:        PUSHL   $(UTZERO+32)            /* old pc */
                    666:        MOVL    $(UDSEL),AX
                    667:        MOVW    AX,DS
                    668:        MOVW    AX,ES
                    669:        MOVW    AX,GS
                    670:        MOVW    AX,FS
                    671:        IRETL
                    672: 
                    673: /*
                    674:  *  set configuration register
                    675:  */
                    676: TEXT   config(SB),$0
                    677:        MOVL    l+0(FP),AX
                    678:        MOVL    $0x3F3,DX
                    679:        OUTB
                    680:        OUTB
                    681:        RET
                    682: 
                    683: /*
                    684:  *  copy bitmap changes to screen memory for ldepth 0 screen.
                    685:  *  reverse the bits since the screen is big-endian
                    686:  *  and the bitmaps are little.
                    687:  */
                    688: TEXT   l0update(SB),$0
                    689:        MOVL    len+8(FP),CX
                    690:        SHRL    $1,CX
                    691:        MOVL    from+4(FP),SI
                    692:        MOVL    to+0(FP),DI
                    693:        XORL    AX,AX
                    694: l00:
                    695:        MOVW    -2(SI)(CX*2),DX
                    696:        MOVB    DH,AL
                    697:        MOVB    revtab0(SB)(AX*1),BX
                    698:        SHLL    $8,BX
                    699:        MOVB    DL,AL
                    700:        ORB     revtab0(SB)(AX*1),BX
                    701:        MOVW    BX,-2(DI)(CX*2)
                    702:        LOOP    l00
                    703:        RET
                    704: 
                    705: #define SRX    0x3C4           /* index to sequence registers */
                    706: #define        SR      0x3C5           /* sequence registers */
                    707: #define Smmask 0x02            /*  map mask */
                    708: 
                    709: /*
                    710:  *  same as l0update but for ldepth 1 (2 bit plane) screens
                    711:  */
                    712: TEXT   l1update(SB),$0
                    713:        XORL    AX,AX
                    714:        MOVL    from+4(FP),SI
                    715:        MOVL    to+0(FP),DI
                    716:        MOVL    len+8(FP),CX
                    717:        MOVB    $(Smmask),AL
                    718:        MOVW    $(SRX),DX
                    719:        OUTB
                    720: l10:
                    721:        MOVL    -4(SI)(CX*2),DX
                    722:        MOVB    DL,AL
                    723:        MOVL    l1revsep(SB)(AX*4),BX
                    724:        SHLL    $4,BX
                    725:        RORL    $8,DX
                    726:        MOVB    DL,AL
                    727:        ORL     l1revsep(SB)(AX*4),BX
                    728:        RORL    $12,BX
                    729:        RORL    $8,DX
                    730:        MOVB    DL,AL
                    731:        ORL     l1revsep(SB)(AX*4),BX
                    732:        SHLL    $4,BX
                    733:        RORL    $8,DX
                    734:        MOVB    DL,AL
                    735:        ORL     l1revsep(SB)(AX*4),BX
                    736:        ROLL    $8,BX
                    737:        MOVW    $(SR),DX
                    738:        MOVB    $0x5,AL                 /* write lo order bits to bit planes 1 & 3 */
                    739:        OUTB
                    740:        MOVW    BX,-2(DI)(CX*1)
                    741:        SHRL    $16,BX                  /* write hi order bits to bit planes 0 & 2 */
                    742:        MOVB    $0xA,AL
                    743:        OUTB
                    744:        MOVW    BX,-2(DI)(CX*1)
                    745:        LOOP    l10
                    746:        RET
                    747: 
                    748: /*
                    749:  *  same as l0update but for ldepth 2 (4 bit plane) screens
                    750:  */
                    751: TEXT   l2update(SB),$0
                    752:        XORL    AX,AX
                    753:        MOVL    from+4(FP),SI
                    754:        MOVL    to+0(FP),DI
                    755:        MOVL    len+8(FP),CX
                    756:        MOVB    $(Smmask),AL
                    757:        MOVW    $(SRX),DX
                    758:        OUTB
                    759: l20:
                    760:        MOVL    -4(SI)(CX*4),DX
                    761:        MOVB    DL,AL
                    762:        MOVL    l2revsep(SB)(AX*4),BX
                    763:        SHLL    $2,BX
                    764:        SHRL    $8,DX
                    765:        MOVB    DL,AL
                    766:        ORL     l2revsep(SB)(AX*4),BX
                    767:        SHLL    $2,BX
                    768:        SHRL    $8,DX
                    769:        MOVB    DL,AL
                    770:        ORL     l2revsep(SB)(AX*4),BX
                    771:        SHLL    $2,BX
                    772:        SHRL    $8,DX
                    773:        MOVB    DL,AL
                    774:        ORL     l2revsep(SB)(AX*4),BX
                    775:        MOVW    $(SR),DX
                    776:        MOVB    $0x1,AL                 /* plane 3 */
                    777:        OUTB
                    778:        MOVB    BX,-1(DI)(CX*1)
                    779:        MOVB    $0x2,AL                 /* plane 2 */
                    780:        OUTB
                    781:        SHRL    $8,BX
                    782:        MOVB    BX,-1(DI)(CX*1)
                    783:        MOVB    $0x4,AL                 /* plane 1 */
                    784:        OUTB
                    785:        SHRL    $8,BX
                    786:        MOVB    BX,-1(DI)(CX*1)
                    787:        MOVB    $0x8,AL                 /* plane 0*/
                    788:        OUTB
                    789:        SHRL    $8,BX
                    790:        MOVB    BX,-1(DI)(CX*1)
                    791:        LOOP    l20
                    792:        RET
                    793: 
                    794: /*
                    795:  * The DP8390 ethernet chip needs some time between
                    796:  * successive chip selects, so we force a jump into
                    797:  * the instruction stream to break the pipeline.
                    798:  */
                    799: TEXT dp8390inb(SB), $0
                    800:        MOVL    p+0(FP),DX
                    801:        XORL    AX,AX                           /* CF = 0 */
                    802:        INB
                    803: 
                    804:        JCC     _dp8390inb0                     /* always true */
                    805:        MOVL    AX,AX
                    806: 
                    807: _dp8390inb0:
                    808:        RET
                    809: 
                    810: TEXT dp8390outb(SB), $0
                    811:        MOVL    p+0(FP),DX
                    812:        MOVL    b+4(FP),AX
                    813:        OUTB
                    814: 
                    815:        CLC                                     /* CF = 0 */
                    816:        JCC     _dp8390outb0                    /* always true */
                    817:        MOVL    AX,AX
                    818: 
                    819: _dp8390outb0:
                    820:        RET
                    821: 
                    822: /*
                    823:  * dsp outb string called from devdsp.c
                    824:  */
                    825:        TEXT    dspoutb+0(SB), $0
                    826: 
                    827:        MOVL    a+4(FP), BX
                    828:        MOVL    n+8(FP), CX
                    829: 
                    830:        MOVL    base+0(FP), DX
                    831:        ADDL    $2, DX                  /* Pcontrol */
                    832: 
                    833:        MOVL    c2+12(FP), DI
                    834:        MOVL    c3+16(FP), SI
                    835: 
                    836: dsploop:
                    837:        MOVL    DI, AX                  /* normal */
                    838:        OUTB
                    839: 
                    840:        SUBL    $1, CX
                    841:        CMPL    CX, $0
                    842:        JLT     dspout
                    843: 
                    844:        SUBL    $2, DX                  /* Pdata */
                    845:        MOVB    (BX), AX
                    846:        ADDL    $1, BX
                    847:        OUTB
                    848: 
                    849:        ADDL    $2, DX                  /* Pcontrol */
                    850:        MOVL    SI, AX                  /* strobe */
                    851:        OUTB
                    852: 
                    853:        JMP     dsploop
                    854: 
                    855: dspout:
                    856:        RET
                    857: 
                    858: 
                    859: /*
                    860:  *  return cpu type (586 == pentium or better)
                    861:  */
                    862: TEXT   x86cpuid(SB),$0
                    863: 
                    864:        PUSHFL
                    865:        MOVL    0(SP),AX
                    866:        XORL    $0x240000,AX
                    867:        PUSHL   AX
                    868:        POPFL
                    869:        PUSHFL
                    870:        MOVL    0(SP),AX
                    871:        XORL    4(SP),AX
                    872:        MOVL    AX, BX
                    873:        ANDL    $0x40000,BX     /* on 386 we can't change this bit */
                    874:        JZ      is386
                    875:        ANDL    $0x200000,AX    /* if we can't change this, there's no CPUID */
                    876:        JZ      is486
                    877:        MOVL    $1,AX
                    878:        /* CPUID */
                    879:         BYTE $0x0F
                    880:         BYTE $0xA2
                    881:        JMP     done
                    882: is486:
                    883:        MOVL    $(4<<8),AX
                    884:        MOVL    $0,DX
                    885:        JMP     done
                    886: is386:
                    887:        MOVL    $(3<<8),AX
                    888:        MOVL    $0,DX
                    889: done:
                    890:        MOVL    a+0(FP),CX
                    891:        MOVL    AX,0(CX)
                    892:        MOVL    d+4(FP),CX
                    893:        MOVL    DX,0(CX)
                    894:        POPFL
                    895:        POPL    BX
                    896:        RET
                    897: 
                    898: /*
                    899:  *  basic timing loop to determine CPU frequency
                    900:  */
                    901: TEXT   aamloop(SB),$0
                    902: 
                    903:        MOVL    c+0(FP),CX
                    904: aaml1:
                    905:        AAM
                    906:        LOOP    aaml1
                    907:        RET

unix.superglobalmegacorp.com

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