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

1.1       root        1: #include "mem.h"
                      2: 
                      3: #define OP16   BYTE    $0x66
                      4: 
                      5: /*
                      6:  * Some horrid macros for writing 16-bit code.
                      7:  */
                      8: #define rAX            0               /* rX  */
                      9: #define rCX            1
                     10: #define rDX            2
                     11: #define rBX            3
                     12: #define rSP            4               /* SP */
                     13: #define rBP            5               /* BP */
                     14: #define rSI            6               /* SI */
                     15: #define rDI            7               /* DI */
                     16: 
                     17: #define rAL            0               /* rL  */
                     18: #define rCL            1
                     19: #define rDL            2
                     20: #define rBL            3
                     21: #define rAH            4               /* rH */
                     22: #define rCH            5
                     23: #define rDH            6
                     24: #define rBH            7
                     25: 
                     26: #define rES            0               /* rS */
                     27: #define rCS            1
                     28: #define rSS            2
                     29: #define rDS            3
                     30: #define rFS            4
                     31: #define rGS            5
                     32: 
                     33: #define rCR0           0               /* rC */
                     34: #define rCR2           2
                     35: #define rCR3           3
                     36: #define rCR4           4
                     37: 
                     38: #define OP(o, m, r, rm)        BYTE $o;                /* op + modr/m byte */  \
                     39:                        BYTE $((m<<6)|(r<<3)|rm)
                     40: #define OPrr(o, r0, r1)        OP(o, 0x03, r0, r1);    /* general r -> r */
                     41: 
                     42: #define LWI(i, rX)     BYTE $(0xB8+rX);        /* i -> rX */           \
                     43:                        WORD $i;
                     44: #define LBI(i, rB)     BYTE $(0xB0+rB);        /* i -> r[HL] */        \
                     45:                        BYTE $i
                     46: 
                     47: #define MFSR(rS, rX)   OPrr(0x8C, rS, rX)      /* rS -> rX */
                     48: #define MTSR(rX, rS)   OPrr(0x8E, rS, rX)      /* rX -> rS */
                     49: #define MFCR(rC, rX)   BYTE $0x0F;             /* rC -> rX */          \
                     50:                        OP(0x20, 0x03, rC, rX)
                     51: #define MTCR(rX, rC)   BYTE $0x0F;             /* rX -> rC */          \
                     52:                        OP(0x22, 0x03, rC, rX)
                     53: 
                     54: #define ANDI(i, r)     OP(0x81, 0x03, 0x04, r);/* i & r -> r */        \
                     55:                        WORD $i;
                     56: #define CLR(r)         OPrr(0x31, r, r)        /* r^r -> r */
                     57: 
                     58: #define FARJUMP(s, o)  BYTE $0xEA;             /* far jump to s:o */   \
                     59:                        WORD $o; WORD $s
                     60: #define        DELAY           BYTE $0xEB;             /* jmp .+2 */           \
                     61:                        BYTE $0x00
                     62: #define OUTb(p, d)     LBI(d, rAL);            /* d -> I/O port p */   \
                     63:                        BYTE $0xE6;                                     \
                     64:                        BYTE $p; DELAY
                     65: 
                     66: TEXT origin(SB), $0
                     67:        /*
                     68:         * This part of l.s is used only in the boot kernel.
                     69:         * It assumes that we are in real address mode, i.e.,
                     70:         * that we look like an 8086.
                     71:         *
                     72:         * Make sure the segments are reasonable.
                     73:         * If we were started directly from the BIOS
                     74:         * (i.e. no MS-DOS) then DS may not be
                     75:         * right.
                     76:         */
                     77:        MOVW    CS, AX
                     78:        MOVW    AX, DS
                     79: 
                     80:        /*
                     81:         * Get the current video mode. If it isn't mode 3,
                     82:         * set text mode 3.
                     83:         */
                     84:        XORL    AX, AX
                     85:        MOVB    $0x0F, AH
                     86:        INT     $0x10                   /* get current video mode in AL */
                     87:        CMPB    AL, $03
                     88:        JEQ     _BIOSputs
                     89:        XORL    AX, AX
                     90:        MOVB    $0x03, AL
                     91:        INT     $0x10                   /* set video mode in AL */
                     92: 
                     93: _BIOSputs:
                     94:        MOVW    $hello(SB), SI
                     95:        XORL    BX, BX
                     96: _BIOSputsloop:
                     97:        LODSB
                     98:        ORB     AL, AL
                     99:        JEQ     _BIOSputsret
                    100: 
                    101:        MOVB    $0x0E, AH
                    102:        INT     $0x10
                    103:        JMP     _BIOSputsloop
                    104: 
                    105: _BIOSputsret:
                    106: 
                    107: /*
                    108:  *     relocate everything to a half meg and jump there
                    109:  *     - looks weird because it is being assembled by a 32 bit
                    110:  *       assembler for a 16 bit world
                    111:  */
                    112:        MOVL    $0,BX
                    113:        INCL    BX
                    114:        SHLL    $15,BX
                    115:        MOVL    BX,CX
                    116:        MOVW    BX,ES
                    117:        MOVL    $0,SI
                    118:        MOVL    SI,DI
                    119:        CLD
                    120:        REP
                    121:        MOVSL
                    122: 
                    123:        /*
                    124:         * Jump to the copied image;
                    125:         * fix up the DS for the new location.
                    126:         */
                    127:        FARJUMP(0x8000, _start8000(SB))
                    128: 
                    129: TEXT _start8000(SB), $0
                    130:        MFSR(rCS, rAX)                  /* fix up DS (0x8000) */
                    131:        MTSR(rAX, rDS)
                    132: 
                    133:        /*
                    134:         * If we are already in protected mode, have to get back
                    135:         * to real mode before trying any priveleged operations
                    136:         * (like going into protected mode...).
                    137:         * Try to reset with a restart vector.
                    138:         */
                    139:        MFCR(rCR0, rAX)         /* are we in protected mode? */
                    140:        ANDI(0x0001, rAX)
                    141:        JEQ     _real
                    142: 
                    143:        CLR(rBX)
                    144:        MTSR(rBX, rES)
                    145: 
                    146:        LWI(0x0467, rBX)                /* reset entry point */
                    147:        LWI(_start8000(SB), rAX)        /* offset within segment */
                    148:        BYTE    $0x26
                    149:        BYTE    $0x89
                    150:        BYTE    $0x07                   /* MOVW AX, ES:[BX] */
                    151:        LBI(0x69, rBL)
                    152:        MFSR(rCS, rAX)                  /* segment */
                    153:        BYTE    $0x26
                    154:        BYTE    $0x89
                    155:        BYTE    $0x07                   /* MOVW AX, ES:[BX] */
                    156: 
                    157:        CLR(rDX)
                    158:        OUTb(0x70, 0x8F)
                    159:        OUTb(0x71, 0x0A)
                    160: 
                    161:        FARJUMP(0xFFFF, 0x0000)         /* reset */
                    162: 
                    163: _real:
                    164: 
                    165: /*
                    166:  *     turn off interrupts
                    167:  */
                    168:        CLI
                    169: 
                    170: /*
                    171:  *     goto protected mode
                    172:  */
                    173: /*     MOVL    tgdtptr(SB),GDTR /**/
                    174:         BYTE   $0x0f
                    175:         BYTE   $0x01
                    176:         BYTE   $0x16
                    177:         WORD   $tgdtptr(SB)
                    178:        MOVL    CR0,AX
                    179:        ORL     $1,AX
                    180:        MOVL    AX,CR0
                    181: 
                    182: /*
                    183:  *     clear prefetch queue (weird code to avoid optimizations)
                    184:  */
                    185:        CLC
                    186:        JCC     flush
                    187:        MOVL    AX,AX
                    188: flush:
                    189: 
                    190: /*
                    191:  *     set all segs
                    192:  */
                    193: /*     MOVW    $SELECTOR(1, SELGDT, 0),AX      /**/
                    194:         BYTE   $0xc7
                    195:         BYTE   $0xc0
                    196:         WORD   $SELECTOR(1, SELGDT, 0)
                    197:        MOVW    AX,DS
                    198:        MOVW    AX,SS
                    199:        MOVW    AX,ES
                    200:        MOVW    AX,FS
                    201:        MOVW    AX,GS
                    202: 
                    203: /*     JMPFAR  SELECTOR(2, SELGDT, 0):$mode32bit(SB) /**/
                    204:         BYTE   $0x66
                    205:         BYTE   $0xEA
                    206:         LONG   $mode32bit-KZERO(SB)
                    207:         WORD   $SELECTOR(2, SELGDT, 0)
                    208: 
                    209: TEXT   mode32bit(SB),$0
                    210: 
                    211: 
                    212:        /*
                    213:         * Clear BSS
                    214:         */
                    215:        LEAL    edata-KZERO(SB),SI
                    216:        MOVL    SI,DI
                    217:        ADDL    $4,DI
                    218:        MOVL    $0,AX
                    219:        MOVL    AX,(SI)
                    220:        LEAL    end-KZERO(SB),CX
                    221:        SUBL    DI,CX
                    222:        SHRL    $2,CX
                    223:        REP
                    224:        MOVSL
                    225: 
                    226:        /*
                    227:         *  make a bottom level page table page that maps the first
                    228:         *  16 meg of physical memory
                    229:         */
                    230:        LEAL    tpt-KZERO(SB),AX        /* get phys addr of temporary page table */
                    231:        ADDL    $(BY2PG-1),AX           /* must be page aligned */
                    232:        ANDL    $(~(BY2PG-1)),AX        /* ... */
                    233:        MOVL    $(4*1024),CX            /* pte's per page */
                    234:        MOVL    $((((4*1024)-1)<<PGSHIFT)|PTEVALID|PTEKERNEL|PTEWRITE),BX
                    235: setpte:
                    236:        MOVL    BX,-4(AX)(CX*4)
                    237:        SUBL    $(1<<PGSHIFT),BX
                    238:        LOOP    setpte
                    239: 
                    240:        /*
                    241:         *  make a top level page table page that maps the first
                    242:         *  16 meg of memory to 0 thru 16meg and to KZERO thru KZERO+16meg
                    243:         */
                    244:        MOVL    AX,BX
                    245:        ADDL    $(4*BY2PG),AX
                    246:        ADDL    $(PTEVALID|PTEKERNEL|PTEWRITE),BX
                    247:        MOVL    BX,0(AX)
                    248:        MOVL    BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+0)(AX)
                    249:        ADDL    $BY2PG,BX
                    250:        MOVL    BX,4(AX)
                    251:        MOVL    BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+4)(AX)
                    252:        ADDL    $BY2PG,BX
                    253:        MOVL    BX,8(AX)
                    254:        MOVL    BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+8)(AX)
                    255:        ADDL    $BY2PG,BX
                    256:        MOVL    BX,12(AX)
                    257:        MOVL    BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+12)(AX)
                    258: 
                    259:        /*
                    260:         *  point processor to top level page & turn on paging
                    261:         */
                    262:        MOVL    AX,CR3
                    263:        MOVL    CR0,AX
                    264:        ORL     $0X80000000,AX
                    265:        MOVL    AX,CR0
                    266: 
                    267:        /*
                    268:         *  use a jump to an absolute location to get the PC into
                    269:         *  KZERO.
                    270:         */
                    271:        LEAL    tokzero(SB),AX
                    272:        JMP*    AX
                    273: 
                    274: TEXT   tokzero(SB),$0
                    275: 
                    276:        /*
                    277:         *  stack and mach
                    278:         */
                    279:        MOVL    $mach0(SB),SP
                    280:        MOVL    SP,m(SB)
                    281:        MOVL    $0,0(SP)
                    282:        ADDL    $(MACHSIZE-4),SP        /* start stack above machine struct */
                    283: 
                    284:        CALL    main(SB)
                    285: 
                    286: loop:
                    287:        JMP     loop
                    288: 
                    289: GLOBL  mach0+0(SB), $MACHSIZE
                    290: GLOBL  m(SB), $4
                    291: GLOBL  tpt(SB), $(BY2PG*6)
                    292: 
                    293: /*
                    294:  *  gdt to get us to 32-bit/segmented/unpaged mode
                    295:  */
                    296: TEXT   tgdt(SB),$0
                    297: 
                    298:        /* null descriptor */
                    299:        LONG    $0
                    300:        LONG    $0
                    301: 
                    302:        /* data segment descriptor for 4 gigabytes (PL 0) */
                    303:        LONG    $(0xFFFF)
                    304:        LONG    $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
                    305: 
                    306:        /* exec segment descriptor for 4 gigabytes (PL 0) */
                    307:        LONG    $(0xFFFF)
                    308:        LONG    $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
                    309: 
                    310: /*
                    311:  *  pointer to initial gdt
                    312:  */
                    313: TEXT   tgdtptr(SB),$0
                    314: 
                    315:        WORD    $(3*8)
                    316:        LONG    $tgdt-KZERO(SB)
                    317: 
                    318: /*
                    319:  *  input a byte
                    320:  */
                    321: TEXT   inb(SB),$0
                    322: 
                    323:        MOVL    p+0(FP),DX
                    324:        XORL    AX,AX
                    325:        INB
                    326:        RET
                    327: 
                    328: /*
                    329:  * input a short from a port
                    330:  */
                    331: TEXT   ins(SB), $0
                    332: 
                    333:        MOVL    p+0(FP), DX
                    334:        XORL    AX, AX
                    335:        OP16; INL
                    336:        RET
                    337: 
                    338: /*
                    339:  * input a long from a port
                    340:  */
                    341: TEXT   inl(SB), $0
                    342: 
                    343:        MOVL    p+0(FP), DX
                    344:        XORL    AX, AX
                    345:        INL
                    346:        RET
                    347: 
                    348: /*
                    349:  *  output a byte
                    350:  */
                    351: TEXT   outb(SB),$0
                    352: 
                    353:        MOVL    p+0(FP),DX
                    354:        MOVL    b+4(FP),AX
                    355:        OUTB
                    356:        RET
                    357: 
                    358: /*
                    359:  * output a short to a port
                    360:  */
                    361: TEXT   outs(SB), $0
                    362:        MOVL    p+0(FP), DX
                    363:        MOVL    s+4(FP), AX
                    364:        OP16; OUTL
                    365:        RET
                    366: 
                    367: /*
                    368:  * output a long to a port
                    369:  */
                    370: TEXT   outl(SB), $0
                    371:        MOVL    p+0(FP), DX
                    372:        MOVL    s+4(FP), AX
                    373:        OUTL
                    374:        RET
                    375: 
                    376: /*
                    377:  *  input a string of bytes from a port
                    378:  */
                    379: TEXT   insb(SB),$0
                    380: 
                    381:        MOVL    p+0(FP),DX
                    382:        MOVL    a+4(FP),DI
                    383:        MOVL    c+8(FP),CX
                    384:        CLD; REP; INSB
                    385:        RET
                    386: 
                    387: /*
                    388:  *  input a string of shorts from a port
                    389:  */
                    390: TEXT   inss(SB),$0
                    391:        MOVL    p+0(FP),DX
                    392:        MOVL    a+4(FP),DI
                    393:        MOVL    c+8(FP),CX
                    394:        CLD
                    395:        REP; OP16; INSL
                    396:        RET
                    397: 
                    398: /*
                    399:  *  output a string of bytes to a port
                    400:  */
                    401: TEXT   outsb(SB),$0
                    402: 
                    403:        MOVL    p+0(FP),DX
                    404:        MOVL    a+4(FP),SI
                    405:        MOVL    c+8(FP),CX
                    406:        CLD; REP; OUTSB
                    407:        RET
                    408: 
                    409: /*
                    410:  *  output a string of shorts to a port
                    411:  */
                    412: TEXT   outss(SB),$0
                    413:        MOVL    p+0(FP),DX
                    414:        MOVL    a+4(FP),SI
                    415:        MOVL    c+8(FP),CX
                    416:        CLD
                    417:        REP; OP16; OUTSL
                    418:        RET
                    419: 
                    420: /*
                    421:  *  input a string of longs from a port
                    422:  */
                    423: TEXT   insl(SB),$0
                    424: 
                    425:        MOVL    p+0(FP),DX
                    426:        MOVL    a+4(FP),DI
                    427:        MOVL    c+8(FP),CX
                    428:        CLD; REP; INSL
                    429:        RET
                    430: 
                    431: /*
                    432:  *  output a string of longs to a port
                    433:  */
                    434: TEXT   outsl(SB),$0
                    435: 
                    436:        MOVL    p+0(FP),DX
                    437:        MOVL    a+4(FP),SI
                    438:        MOVL    c+8(FP),CX
                    439:        CLD; REP; OUTSL
                    440:        RET
                    441: 
                    442: /*
                    443:  *  routines to load/read various system registers
                    444:  */
                    445: GLOBL  idtptr(SB),$6
                    446: TEXT   putidt(SB),$0           /* interrupt descriptor table */
                    447:        MOVL    t+0(FP),AX
                    448:        MOVL    AX,idtptr+2(SB)
                    449:        MOVL    l+4(FP),AX
                    450:        MOVW    AX,idtptr(SB)
                    451:        MOVL    idtptr(SB),IDTR
                    452:        RET
                    453: 
                    454: TEXT   putcr3(SB),$0           /* top level page table pointer */
                    455:        MOVL    t+0(FP),AX
                    456:        MOVL    AX,CR3
                    457:        RET
                    458: 
                    459: TEXT   getcr0(SB),$0           /* coprocessor bits */
                    460:        MOVL    CR0,AX
                    461:        RET
                    462: 
                    463: TEXT   getcr2(SB),$0           /* fault address */
                    464:        MOVL    CR2,AX
                    465:        RET
                    466: 
                    467: TEXT   getcr3(SB),$0           /* page directory base */
                    468:        MOVL    CR3,AX
                    469:        RET
                    470: 
                    471: /*
                    472:  *  special traps
                    473:  */
                    474: TEXT   intr0(SB),$0
                    475:        PUSHL   $0
                    476:        PUSHL   $0
                    477:        JMP     intrcommon
                    478: TEXT   intr1(SB),$0
                    479:        PUSHL   $0
                    480:        PUSHL   $1
                    481:        JMP     intrcommon
                    482: TEXT   intr2(SB),$0
                    483:        PUSHL   $0
                    484:        PUSHL   $2
                    485:        JMP     intrcommon
                    486: TEXT   intr3(SB),$0
                    487:        PUSHL   $0
                    488:        PUSHL   $3
                    489:        JMP     intrcommon
                    490: TEXT   intr4(SB),$0
                    491:        PUSHL   $0
                    492:        PUSHL   $4
                    493:        JMP     intrcommon
                    494: TEXT   intr5(SB),$0
                    495:        PUSHL   $0
                    496:        PUSHL   $5
                    497:        JMP     intrcommon
                    498: TEXT   intr6(SB),$0
                    499:        PUSHL   $0
                    500:        PUSHL   $6
                    501:        JMP     intrcommon
                    502: TEXT   intr7(SB),$0
                    503:        PUSHL   $0
                    504:        PUSHL   $7
                    505:        JMP     intrcommon
                    506: TEXT   intr8(SB),$0
                    507:        PUSHL   $8
                    508:        JMP     intrcommon
                    509: TEXT   intr9(SB),$0
                    510:        PUSHL   $0
                    511:        PUSHL   $9
                    512:        JMP     intrcommon
                    513: TEXT   intr10(SB),$0
                    514:        PUSHL   $10
                    515:        JMP     intrcommon
                    516: TEXT   intr11(SB),$0
                    517:        PUSHL   $11
                    518:        JMP     intrcommon
                    519: TEXT   intr12(SB),$0
                    520:        PUSHL   $12
                    521:        JMP     intrcommon
                    522: TEXT   intr13(SB),$0
                    523:        PUSHL   $13
                    524:        JMP     intrcommon
                    525: TEXT   intr14(SB),$0
                    526:        PUSHL   $14
                    527:        JMP     intrcommon
                    528: TEXT   intr15(SB),$0
                    529:        PUSHL   $0
                    530:        PUSHL   $15
                    531:        JMP     intrcommon
                    532: TEXT   intr16(SB),$0
                    533:        PUSHL   $0
                    534:        PUSHL   $16
                    535:        JMP     intrcommon
                    536: TEXT   intr24(SB),$0
                    537:        PUSHL   $0
                    538:        PUSHL   $24
                    539:        JMP     intrcommon
                    540: TEXT   intr25(SB),$0
                    541:        PUSHL   $0
                    542:        PUSHL   $25
                    543:        JMP     intrcommon
                    544: TEXT   intr26(SB),$0
                    545:        PUSHL   $0
                    546:        PUSHL   $26
                    547:        JMP     intrcommon
                    548: TEXT   intr27(SB),$0
                    549:        PUSHL   $0
                    550:        PUSHL   $27
                    551:        JMP     intrcommon
                    552: TEXT   intr28(SB),$0
                    553:        PUSHL   $0
                    554:        PUSHL   $28
                    555:        JMP     intrcommon
                    556: TEXT   intr29(SB),$0
                    557:        PUSHL   $0
                    558:        PUSHL   $29
                    559:        JMP     intrcommon
                    560: TEXT   intr30(SB),$0
                    561:        PUSHL   $0
                    562:        PUSHL   $30
                    563:        JMP     intrcommon
                    564: TEXT   intr31(SB),$0
                    565:        PUSHL   $0
                    566:        PUSHL   $31
                    567:        JMP     intrcommon
                    568: TEXT   intr32(SB),$0
                    569:        PUSHL   $0
                    570:        PUSHL   $32
                    571:        JMP     intrcommon
                    572: TEXT   intr33(SB),$0
                    573:        PUSHL   $0
                    574:        PUSHL   $33
                    575:        JMP     intrcommon
                    576: TEXT   intr34(SB),$0
                    577:        PUSHL   $0
                    578:        PUSHL   $34
                    579:        JMP     intrcommon
                    580: TEXT   intr35(SB),$0
                    581:        PUSHL   $0
                    582:        PUSHL   $35
                    583:        JMP     intrcommon
                    584: TEXT   intr36(SB),$0
                    585:        PUSHL   $0
                    586:        PUSHL   $36
                    587:        JMP     intrcommon
                    588: TEXT   intr37(SB),$0
                    589:        PUSHL   $0
                    590:        PUSHL   $37
                    591:        JMP     intrcommon
                    592: TEXT   intr38(SB),$0
                    593:        PUSHL   $0
                    594:        PUSHL   $38
                    595:        JMP     intrcommon
                    596: TEXT   intr39(SB),$0
                    597:        PUSHL   $0
                    598:        PUSHL   $39
                    599:        JMP     intrcommon
                    600: TEXT   intr64(SB),$0
                    601:        PUSHL   $0
                    602:        PUSHL   $64
                    603:        JMP     intrcommon
                    604: TEXT   intrbad(SB),$0
                    605:        PUSHL   $0
                    606:        PUSHL   $0x1ff
                    607:        JMP     intrcommon
                    608: 
                    609: intrcommon:
                    610:        PUSHL   DS
                    611:        PUSHL   ES
                    612:        PUSHL   FS
                    613:        PUSHL   GS
                    614:        PUSHAL
                    615:        MOVL    $(KDSEL),AX
                    616:        MOVW    AX,DS
                    617:        MOVW    AX,ES
                    618:        LEAL    0(SP),AX
                    619:        PUSHL   AX
                    620:        CALL    trap(SB)
                    621:        POPL    AX
                    622:        POPAL
                    623:        POPL    GS
                    624:        POPL    FS
                    625:        POPL    ES
                    626:        POPL    DS
                    627:        ADDL    $8,SP   /* error code and trap type */
                    628:        IRETL
                    629: 
                    630: 
                    631: /*
                    632:  *  interrupt level is interrupts on or off
                    633:  */
                    634: TEXT   spllo(SB),$0
                    635:        PUSHFL
                    636:        POPL    AX
                    637:        STI
                    638:        RET
                    639: 
                    640: TEXT   splhi(SB),$0
                    641:        PUSHFL
                    642:        POPL    AX
                    643:        CLI
                    644:        RET
                    645: 
                    646: TEXT   splx(SB),$0
                    647:        MOVL    s+0(FP),AX
                    648:        PUSHL   AX
                    649:        POPFL
                    650:        RET
                    651: 
                    652: /*
                    653:  *  do nothing whatsoever till interrupt happens
                    654:  */
                    655: TEXT   idle(SB),$0
                    656:        HLT
                    657:        RET
                    658: 
                    659: /*
                    660:  *  return cpu type (586 == pentium or better)
                    661:  */
                    662: TEXT   x86(SB),$0
                    663: 
                    664:        PUSHFL
                    665:        MOVL    0(SP),AX
                    666:        XORL    $0x240000,AX
                    667:        PUSHL   AX
                    668:        POPFL
                    669:        PUSHFL
                    670:        MOVL    0(SP),AX
                    671:        XORL    4(SP),AX
                    672:        MOVL    AX, BX
                    673:        ANDL    $0x40000,BX     /* on 386 we can't change this bit */
                    674:        JZ      is386
                    675:        ANDL    $0x200000,AX    /* if we can't change this, there's no CPUID */
                    676:        JZ      is486
                    677:        MOVL    $1,AX
                    678:        /* CPUID */
                    679:         BYTE $0x0F
                    680:         BYTE $0xA2
                    681:        SHLL    $20,AX
                    682:        SHRL    $28,AX
                    683:        CMPL    AX, $4
                    684:        JEQ     is486
                    685:        MOVL    $586,AX
                    686:        JMP     done
                    687: is486:
                    688:        MOVL    $486,AX
                    689:        JMP     done
                    690: is386:
                    691:        MOVL    $386,AX
                    692: done:
                    693:        POPL    BX
                    694:        POPFL
                    695:        RET
                    696: 
                    697: /*
                    698:  *  basic timing loop to determine CPU frequency
                    699:  */
                    700: TEXT   aamloop(SB),$0
                    701: 
                    702:        MOVL    c+0(FP),CX
                    703: aaml1:
                    704:        AAM
                    705:        LOOP    aaml1
                    706:        RET
                    707: 
                    708: /*
                    709:  * The DP8390 ethernet chip needs some time between
                    710:  * successive chip selects, so we force a jump into
                    711:  * the instruction stream to break the pipeline.
                    712:  */
                    713: TEXT dp8390inb(SB), $0
                    714:        MOVL    p+0(FP),DX
                    715:        XORL    AX,AX                           /* CF = 0 */
                    716:        INB
                    717: 
                    718:        JCC     _dp8390inb0                     /* always true */
                    719:        MOVL    AX,AX
                    720: 
                    721: _dp8390inb0:
                    722:        RET
                    723: 
                    724: TEXT dp8390outb(SB), $0
                    725:        MOVL    p+0(FP),DX
                    726:        MOVL    b+4(FP),AX
                    727:        OUTB
                    728: 
                    729:        CLC                                     /* CF = 0 */
                    730:        JCC     _dp8390outb0                    /* always true */
                    731:        MOVL    AX,AX
                    732: 
                    733: _dp8390outb0:
                    734:        RET
                    735: 
                    736: GLOBL hello(SB), $0x18
                    737:        DATA hello+0x00(SB)/8, $"Plan 9 f"
                    738:        DATA hello+0x08(SB)/8, $"rom Bell"
                    739:        DATA hello+0x10(SB)/8, $" Labs\r\n\z"

unix.superglobalmegacorp.com

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