Annotation of lucent/sys/src/9/pc/l.s, revision 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.