13e12c5d1SDavid du Colombier/* 23e12c5d1SDavid du Colombier * Memory and machine-specific definitions. Used in C and assembler. 33e12c5d1SDavid du Colombier */ 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier/* 63e12c5d1SDavid du Colombier * Sizes 73e12c5d1SDavid du Colombier */ 83e12c5d1SDavid du Colombier#define BI2BY 8 /* bits per byte */ 93e12c5d1SDavid du Colombier#define BI2WD 32 /* bits per word */ 103e12c5d1SDavid du Colombier#define BY2WD 4 /* bytes per word */ 113e12c5d1SDavid du Colombier#define BY2PG 4096 /* bytes per page */ 123e12c5d1SDavid du Colombier#define WD2PG (BY2PG/BY2WD) /* words per page */ 133e12c5d1SDavid du Colombier#define PGSHIFT 12 /* log(BY2PG) */ 143e12c5d1SDavid du Colombier#define PGROUND(s) (((s)+(BY2PG-1))&~(BY2PG-1)) 153e12c5d1SDavid du Colombier 163e12c5d1SDavid du Colombier#define MAXMACH 1 /* max # cpus system can run */ 173e12c5d1SDavid du Colombier 183e12c5d1SDavid du Colombier/* 193e12c5d1SDavid du Colombier * Time 203e12c5d1SDavid du Colombier */ 213e12c5d1SDavid du Colombier#define HZ (20) /* clock frequency */ 223e12c5d1SDavid du Colombier#define MS2HZ (1000/HZ) /* millisec per clock tick */ 233e12c5d1SDavid du Colombier#define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ 243e12c5d1SDavid du Colombier#define TK2MS(t) ((((ulong)(t))*1000)/HZ) /* ticks to milliseconds */ 253e12c5d1SDavid du Colombier#define MS2TK(t) ((((ulong)(t))*HZ)/1000) /* milliseconds to ticks */ 263e12c5d1SDavid du Colombier 273e12c5d1SDavid du Colombier/* 283e12c5d1SDavid du Colombier * Fundamental addresses 293e12c5d1SDavid du Colombier */ 303e12c5d1SDavid du Colombier 313e12c5d1SDavid du Colombier/* 323e12c5d1SDavid du Colombier * Address spaces 333e12c5d1SDavid du Colombier * 343e12c5d1SDavid du Colombier * User is at 0-2GB 353e12c5d1SDavid du Colombier * Kernel is at 2GB-4GB 363e12c5d1SDavid du Colombier * 373e12c5d1SDavid du Colombier * To avoid an extra page map, both the user stack (USTKTOP) and 383e12c5d1SDavid du Colombier * the temporary user stack (TSTKTOP) should be in the the same 393e12c5d1SDavid du Colombier * 4 meg. 403e12c5d1SDavid du Colombier */ 413e12c5d1SDavid du Colombier#define UZERO 0 /* base of user address space */ 423e12c5d1SDavid du Colombier#define UTZERO (UZERO+BY2PG) /* first address in user text */ 433e12c5d1SDavid du Colombier#define KZERO 0x80000000 /* base of kernel address space */ 443e12c5d1SDavid du Colombier#define KTZERO KZERO /* first address in kernel text */ 453e12c5d1SDavid du Colombier#define USERADDR 0xC0000000 /* struct User */ 463e12c5d1SDavid du Colombier#define UREGADDR (USERADDR+BY2PG-4*19) 473e12c5d1SDavid du Colombier#define TSTKTOP USERADDR /* end of new stack in sysexec */ 483e12c5d1SDavid du Colombier#define TSTKSIZ 10 493e12c5d1SDavid du Colombier#define USTKTOP (TSTKTOP-TSTKSIZ*BY2PG) /* byte just beyond user stack */ 503e12c5d1SDavid du Colombier#define USTKSIZE (16*1024*1024 - TSTKSIZ*BY2PG) /* size of user stack */ 513e12c5d1SDavid du Colombier#define ROMBIOS (KZERO|0xF0000) 523e12c5d1SDavid du Colombier 533e12c5d1SDavid du Colombier#define MACHSIZE 4096 543e12c5d1SDavid du Colombier 553e12c5d1SDavid du Colombier#define isphys(x) (((ulong)x)&KZERO) 563e12c5d1SDavid du Colombier 573e12c5d1SDavid du Colombier/* 583e12c5d1SDavid du Colombier * known 80386 segments (in GDT) and their selectors 593e12c5d1SDavid du Colombier */ 603e12c5d1SDavid du Colombier#define NULLSEG 0 /* null segment */ 613e12c5d1SDavid du Colombier#define KDSEG 1 /* kernel data/stack */ 623e12c5d1SDavid du Colombier#define KESEG 2 /* kernel executable */ 633e12c5d1SDavid du Colombier#define UDSEG 3 /* user data/stack */ 643e12c5d1SDavid du Colombier#define UESEG 4 /* user executable */ 653e12c5d1SDavid du Colombier#define TSSSEG 5 /* task segment */ 663e12c5d1SDavid du Colombier 673e12c5d1SDavid du Colombier#define SELGDT (0<<3) /* selector is in gdt */ 683e12c5d1SDavid du Colombier#define SELLDT (1<<3) /* selector is in ldt */ 693e12c5d1SDavid du Colombier 703e12c5d1SDavid du Colombier#define SELECTOR(i, t, p) (((i)<<3) | (t) | (p)) 713e12c5d1SDavid du Colombier 723e12c5d1SDavid du Colombier#define NULLSEL SELECTOR(NULLSEG, SELGDT, 0) 733e12c5d1SDavid du Colombier#define KESEL SELECTOR(KESEG, SELGDT, 0) 743e12c5d1SDavid du Colombier#define KDSEL SELECTOR(KDSEG, SELGDT, 0) 753e12c5d1SDavid du Colombier#define UESEL SELECTOR(UESEG, SELGDT, 3) 763e12c5d1SDavid du Colombier#define UDSEL SELECTOR(UDSEG, SELGDT, 3) 773e12c5d1SDavid du Colombier#define TSSSEL SELECTOR(TSSSEG, SELGDT, 0) 783e12c5d1SDavid du Colombier 793e12c5d1SDavid du Colombier/* 803e12c5d1SDavid du Colombier * fields in segment descriptors 813e12c5d1SDavid du Colombier */ 823e12c5d1SDavid du Colombier#define SEGDATA (0x10<<8) /* data/stack segment */ 833e12c5d1SDavid du Colombier#define SEGEXEC (0x18<<8) /* executable segment */ 843e12c5d1SDavid du Colombier#define SEGTSS (0x9<<8) /* TSS segment */ 853e12c5d1SDavid du Colombier#define SEGCG (0x0C<<8) /* call gate */ 863e12c5d1SDavid du Colombier#define SEGIG (0x0E<<8) /* interrupt gate */ 873e12c5d1SDavid du Colombier#define SEGTG (0x0F<<8) /* task gate */ 883e12c5d1SDavid du Colombier#define SEGTYPE (0x1F<<8) 893e12c5d1SDavid du Colombier 903e12c5d1SDavid du Colombier#define SEGP (1<<15) /* segment present */ 913e12c5d1SDavid du Colombier#define SEGPL(x) ((x)<<13) /* priority level */ 923e12c5d1SDavid du Colombier#define SEGB (1<<22) /* granularity 1==4k (for expand-down) */ 933e12c5d1SDavid du Colombier#define SEGG (1<<23) /* granularity 1==4k (for other) */ 943e12c5d1SDavid du Colombier#define SEGE (1<<10) /* expand down */ 953e12c5d1SDavid du Colombier#define SEGW (1<<9) /* writable (for data/stack) */ 963e12c5d1SDavid du Colombier#define SEGR (1<<9) /* readable (for code) */ 973e12c5d1SDavid du Colombier#define SEGD (1<<22) /* default 1==32bit (for code) */ 983e12c5d1SDavid du Colombier 993e12c5d1SDavid du Colombier/* 1003e12c5d1SDavid du Colombier * virtual MMU 1013e12c5d1SDavid du Colombier */ 1023e12c5d1SDavid du Colombier#define PTEMAPMEM (1024*1024) /* ??? */ 1033e12c5d1SDavid du Colombier#define SEGMAPSIZE 16 /* ??? */ 1043e12c5d1SDavid du Colombier#define PTEPERTAB (PTEMAPMEM/BY2PG) /* ??? */ 1053e12c5d1SDavid du Colombier#define PPN(x) ((x)&~(BY2PG-1)) 1063e12c5d1SDavid du Colombier 1073e12c5d1SDavid du Colombier/* 1083e12c5d1SDavid du Colombier * physical MMU 1093e12c5d1SDavid du Colombier */ 1103e12c5d1SDavid du Colombier#define PTEVALID (1<<0) 1113e12c5d1SDavid du Colombier#define PTEUNCACHED 0 /* everything is uncached */ 1123e12c5d1SDavid du Colombier#define PTEWRITE (1<<1) 1133e12c5d1SDavid du Colombier#define PTERONLY (0<<1) 1143e12c5d1SDavid du Colombier#define PTEKERNEL (0<<2) 1153e12c5d1SDavid du Colombier#define PTEUSER (1<<2) 1163e12c5d1SDavid du Colombier 1173e12c5d1SDavid du Colombier/* 1183e12c5d1SDavid du Colombier * flag register bits that we care about 1193e12c5d1SDavid du Colombier */ 1203e12c5d1SDavid du Colombier#define IFLAG 0x200 1213e12c5d1SDavid du Colombier 1223e12c5d1SDavid du Colombier#define OP16 BYTE $0x66 1233e12c5d1SDavid du Colombier 1243e12c5d1SDavid du Colombier/* 1253e12c5d1SDavid du Colombier * about to walk all over ms/dos - turn off interrupts 1263e12c5d1SDavid du Colombier */ 1273e12c5d1SDavid du ColombierTEXT origin(SB),$0 1283e12c5d1SDavid du Colombier 1293e12c5d1SDavid du Colombier CLI 1303e12c5d1SDavid du Colombier 1313e12c5d1SDavid du Colombier#ifdef BOOT 1323e12c5d1SDavid du Colombier/* 1333e12c5d1SDavid du Colombier * This part of l.s is used only in the boot kernel. 1343e12c5d1SDavid du Colombier * It assumes that we are in real address mode, i.e., 1353e12c5d1SDavid du Colombier * that we look like an 8086. 1363e12c5d1SDavid du Colombier */ 1373e12c5d1SDavid du Colombier/* 1383e12c5d1SDavid du Colombier * relocate everything to a half meg and jump there 1393e12c5d1SDavid du Colombier * - looks wierd because it is being assembled by a 32 bit 1403e12c5d1SDavid du Colombier * assembler for a 16 bit world 1413e12c5d1SDavid du Colombier */ 1423e12c5d1SDavid du Colombier MOVL $0,BX 1433e12c5d1SDavid du Colombier INCL BX 1443e12c5d1SDavid du Colombier SHLL $15,BX 1453e12c5d1SDavid du Colombier MOVL BX,CX 1463e12c5d1SDavid du Colombier MOVW BX,ES 1473e12c5d1SDavid du Colombier MOVL $0,SI 1483e12c5d1SDavid du Colombier MOVL SI,DI 1493e12c5d1SDavid du Colombier CLD; REP; MOVSL 1503e12c5d1SDavid du Colombier/* JMPFAR 0X8000:$lowcore(SB) /**/ 1513e12c5d1SDavid du Colombier BYTE $0xEA 1523e12c5d1SDavid du Colombier WORD $lowcore(SB) 1533e12c5d1SDavid du Colombier WORD $0X8000 1543e12c5d1SDavid du Colombier 1553e12c5d1SDavid du ColombierTEXT lowcore(SB),$0 1563e12c5d1SDavid du Colombier 1573e12c5d1SDavid du Colombier/* 1583e12c5d1SDavid du Colombier * now that we're in low core, update the DS 1593e12c5d1SDavid du Colombier */ 1603e12c5d1SDavid du Colombier 1613e12c5d1SDavid du Colombier MOVW BX,DS 1623e12c5d1SDavid du Colombier 1633e12c5d1SDavid du Colombier/* 1643e12c5d1SDavid du Colombier * goto protected mode 1653e12c5d1SDavid du Colombier */ 1663e12c5d1SDavid du Colombier/* MOVL tgdtptr(SB),GDTR /**/ 1673e12c5d1SDavid du Colombier BYTE $0x0f 1683e12c5d1SDavid du Colombier BYTE $0x01 1693e12c5d1SDavid du Colombier BYTE $0x16 1703e12c5d1SDavid du Colombier WORD $tgdtptr(SB) 1713e12c5d1SDavid du Colombier MOVL CR0,AX 1723e12c5d1SDavid du Colombier ORL $1,AX 1733e12c5d1SDavid du Colombier MOVL AX,CR0 1743e12c5d1SDavid du Colombier 1753e12c5d1SDavid du Colombier/* 1763e12c5d1SDavid du Colombier * clear prefetch queue (wierd code to avoid optimizations) 1773e12c5d1SDavid du Colombier */ 1783e12c5d1SDavid du Colombier CLC 1793e12c5d1SDavid du Colombier JCC flush 1803e12c5d1SDavid du Colombier MOVL AX,AX 1813e12c5d1SDavid du Colombierflush: 1823e12c5d1SDavid du Colombier 1833e12c5d1SDavid du Colombier/* 1843e12c5d1SDavid du Colombier * set all segs 1853e12c5d1SDavid du Colombier */ 1863e12c5d1SDavid du Colombier/* MOVW $SELECTOR(1, SELGDT, 0),AX /**/ 1873e12c5d1SDavid du Colombier BYTE $0xc7 1883e12c5d1SDavid du Colombier BYTE $0xc0 1893e12c5d1SDavid du Colombier WORD $SELECTOR(1, SELGDT, 0) 1903e12c5d1SDavid du Colombier MOVW AX,DS 1913e12c5d1SDavid du Colombier MOVW AX,SS 1923e12c5d1SDavid du Colombier MOVW AX,ES 1933e12c5d1SDavid du Colombier MOVW AX,FS 1943e12c5d1SDavid du Colombier MOVW AX,GS 1953e12c5d1SDavid du Colombier 1963e12c5d1SDavid du Colombier/* JMPFAR SELECTOR(2, SELGDT, 0):$mode32bit(SB) /**/ 1973e12c5d1SDavid du Colombier BYTE $0x66 1983e12c5d1SDavid du Colombier BYTE $0xEA 1993e12c5d1SDavid du Colombier LONG $mode32bit-KZERO(SB) 2003e12c5d1SDavid du Colombier WORD $SELECTOR(2, SELGDT, 0) 2013e12c5d1SDavid du Colombier 2023e12c5d1SDavid du ColombierTEXT mode32bit(SB),$0 2033e12c5d1SDavid du Colombier 2043e12c5d1SDavid du Colombier#endif BOOT 2053e12c5d1SDavid du Colombier 2063e12c5d1SDavid du Colombier /* 2073e12c5d1SDavid du Colombier * Clear BSS 2083e12c5d1SDavid du Colombier */ 2093e12c5d1SDavid du Colombier LEAL edata-KZERO(SB),SI 2103e12c5d1SDavid du Colombier MOVL SI,DI 2113e12c5d1SDavid du Colombier ADDL $4,DI 2123e12c5d1SDavid du Colombier MOVL $0,AX 2133e12c5d1SDavid du Colombier MOVL AX,(SI) 2143e12c5d1SDavid du Colombier LEAL end-KZERO(SB),CX 2153e12c5d1SDavid du Colombier SUBL DI,CX 2163e12c5d1SDavid du Colombier SHRL $2,CX 2173e12c5d1SDavid du Colombier CLD; REP; MOVSL 2183e12c5d1SDavid du Colombier 2193e12c5d1SDavid du Colombier /* 2203e12c5d1SDavid du Colombier * make a bottom level page table page that maps the first 2213e12c5d1SDavid du Colombier * 16 meg of physical memory 2223e12c5d1SDavid du Colombier */ 2233e12c5d1SDavid du Colombier LEAL tpt-KZERO(SB),AX /* get phys addr of temporary page table */ 224*6520663fSDavid du Colombier ADDL $(BY2PG-1),AX /* must be page aligned */ 2253e12c5d1SDavid du Colombier ANDL $(~(BY2PG-1)),AX /* ... */ 2263e12c5d1SDavid du Colombier MOVL $(4*1024),CX /* pte's per page */ 2273e12c5d1SDavid du Colombier MOVL $((((4*1024)-1)<<PGSHIFT)|PTEVALID|PTEKERNEL|PTEWRITE),BX 2283e12c5d1SDavid du Colombiersetpte: 2293e12c5d1SDavid du Colombier MOVL BX,-4(AX)(CX*4) 2303e12c5d1SDavid du Colombier SUBL $(1<<PGSHIFT),BX 2313e12c5d1SDavid du Colombier LOOP setpte 2323e12c5d1SDavid du Colombier 2333e12c5d1SDavid du Colombier /* 2343e12c5d1SDavid du Colombier * make a top level page table page that maps the first 2353e12c5d1SDavid du Colombier * 16 meg of memory to 0 thru 16meg and to KZERO thru KZERO+16meg 2363e12c5d1SDavid du Colombier */ 2373e12c5d1SDavid du Colombier MOVL AX,BX 2383e12c5d1SDavid du Colombier ADDL $(4*BY2PG),AX 2393e12c5d1SDavid du Colombier ADDL $(PTEVALID|PTEKERNEL|PTEWRITE),BX 2403e12c5d1SDavid du Colombier MOVL BX,0(AX) 2413e12c5d1SDavid du Colombier MOVL BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+0)(AX) 2423e12c5d1SDavid du Colombier ADDL $BY2PG,BX 2433e12c5d1SDavid du Colombier MOVL BX,4(AX) 2443e12c5d1SDavid du Colombier MOVL BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+4)(AX) 2453e12c5d1SDavid du Colombier ADDL $BY2PG,BX 2463e12c5d1SDavid du Colombier MOVL BX,8(AX) 2473e12c5d1SDavid du Colombier MOVL BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+8)(AX) 2483e12c5d1SDavid du Colombier ADDL $BY2PG,BX 2493e12c5d1SDavid du Colombier MOVL BX,12(AX) 2503e12c5d1SDavid du Colombier MOVL BX,((((KZERO>>1)&0x7FFFFFFF)>>(2*PGSHIFT-1-4))+12)(AX) 2513e12c5d1SDavid du Colombier 2523e12c5d1SDavid du Colombier /* 2533e12c5d1SDavid du Colombier * point processor to top level page & turn on paging 2543e12c5d1SDavid du Colombier */ 2553e12c5d1SDavid du Colombier MOVL AX,CR3 2563e12c5d1SDavid du Colombier MOVL CR0,AX 2573e12c5d1SDavid du Colombier ORL $0X80000000,AX 2583e12c5d1SDavid du Colombier ANDL $~(0x8|0x2),AX /* TS=0, MP=0 */ 2593e12c5d1SDavid du Colombier MOVL AX,CR0 2603e12c5d1SDavid du Colombier 2613e12c5d1SDavid du Colombier /* 2623e12c5d1SDavid du Colombier * use a jump to an absolute location to get the PC into 2633e12c5d1SDavid du Colombier * KZERO. 2643e12c5d1SDavid du Colombier */ 2653e12c5d1SDavid du Colombier LEAL tokzero(SB),AX 2663e12c5d1SDavid du Colombier JMP* AX 2673e12c5d1SDavid du Colombier 2683e12c5d1SDavid du ColombierTEXT tokzero(SB),$0 2693e12c5d1SDavid du Colombier 2703e12c5d1SDavid du Colombier /* 2713e12c5d1SDavid du Colombier * stack and mach 2723e12c5d1SDavid du Colombier */ 2733e12c5d1SDavid du Colombier MOVL $mach0(SB),SP 2743e12c5d1SDavid du Colombier MOVL SP,m(SB) 2753e12c5d1SDavid du Colombier MOVL $0,0(SP) 2763e12c5d1SDavid du Colombier ADDL $(MACHSIZE-4),SP /* start stack under machine struct */ 2773e12c5d1SDavid du Colombier MOVL $0, u(SB) 2783e12c5d1SDavid du Colombier 2793e12c5d1SDavid du Colombier /* 2803e12c5d1SDavid du Colombier * clear flags 2813e12c5d1SDavid du Colombier */ 2823e12c5d1SDavid du Colombier MOVL $0,AX 2833e12c5d1SDavid du Colombier PUSHL AX 2843e12c5d1SDavid du Colombier POPFL 2853e12c5d1SDavid du Colombier 2863e12c5d1SDavid du Colombier CALL main(SB) 2873e12c5d1SDavid du Colombier 2883e12c5d1SDavid du Colombierloop: 2893e12c5d1SDavid du Colombier JMP loop 2903e12c5d1SDavid du Colombier 2913e12c5d1SDavid du ColombierGLOBL mach0+0(SB), $MACHSIZE 2923e12c5d1SDavid du ColombierGLOBL u(SB), $4 2933e12c5d1SDavid du ColombierGLOBL m(SB), $4 2943e12c5d1SDavid du ColombierGLOBL tpt(SB), $(BY2PG*6) 2953e12c5d1SDavid du Colombier 2963e12c5d1SDavid du Colombier/* 2973e12c5d1SDavid du Colombier * gdt to get us to 32-bit/segmented/unpaged mode 2983e12c5d1SDavid du Colombier */ 2993e12c5d1SDavid du ColombierTEXT tgdt(SB),$0 3003e12c5d1SDavid du Colombier 3013e12c5d1SDavid du Colombier /* null descriptor */ 3023e12c5d1SDavid du Colombier LONG $0 3033e12c5d1SDavid du Colombier LONG $0 3043e12c5d1SDavid du Colombier 3053e12c5d1SDavid du Colombier /* data segment descriptor for 4 gigabytes (PL 0) */ 3063e12c5d1SDavid du Colombier LONG $(0xFFFF) 3073e12c5d1SDavid du Colombier LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW) 3083e12c5d1SDavid du Colombier 3093e12c5d1SDavid du Colombier /* exec segment descriptor for 4 gigabytes (PL 0) */ 3103e12c5d1SDavid du Colombier LONG $(0xFFFF) 3113e12c5d1SDavid du Colombier LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR) 3123e12c5d1SDavid du Colombier 3133e12c5d1SDavid du Colombier/* 3143e12c5d1SDavid du Colombier * pointer to initial gdt 3153e12c5d1SDavid du Colombier */ 3163e12c5d1SDavid du ColombierTEXT tgdtptr(SB),$0 3173e12c5d1SDavid du Colombier 3183e12c5d1SDavid du Colombier WORD $(3*8) 3193e12c5d1SDavid du Colombier LONG $tgdt-KZERO(SB) 3203e12c5d1SDavid du Colombier 3213e12c5d1SDavid du Colombier/* 3223e12c5d1SDavid du Colombier * input a byte 3233e12c5d1SDavid du Colombier */ 3243e12c5d1SDavid du ColombierTEXT inb(SB),$0 3253e12c5d1SDavid du Colombier 3263e12c5d1SDavid du Colombier MOVL p+0(FP),DX 3273e12c5d1SDavid du Colombier XORL AX,AX 3283e12c5d1SDavid du Colombier INB 3293e12c5d1SDavid du Colombier RET 3303e12c5d1SDavid du Colombier 3313e12c5d1SDavid du Colombier/* 3323e12c5d1SDavid du Colombier * output a byte 3333e12c5d1SDavid du Colombier */ 3343e12c5d1SDavid du ColombierTEXT outb(SB),$0 3353e12c5d1SDavid du Colombier 3363e12c5d1SDavid du Colombier MOVL p+0(FP),DX 3373e12c5d1SDavid du Colombier MOVL b+4(FP),AX 3383e12c5d1SDavid du Colombier OUTB 3393e12c5d1SDavid du Colombier RET 3403e12c5d1SDavid du Colombier 3413e12c5d1SDavid du Colombier/* 3423e12c5d1SDavid du Colombier * input a string of shorts from a port 3433e12c5d1SDavid du Colombier */ 3443e12c5d1SDavid du ColombierTEXT inss(SB),$0 3453e12c5d1SDavid du Colombier MOVL p+0(FP),DX 3463e12c5d1SDavid du Colombier MOVL a+4(FP),DI 3473e12c5d1SDavid du Colombier MOVL c+8(FP),CX 3483e12c5d1SDavid du Colombier CLD; REP; OP16; INSL 3493e12c5d1SDavid du Colombier RET 3503e12c5d1SDavid du Colombier 3513e12c5d1SDavid du Colombier/* 3523e12c5d1SDavid du Colombier * output a string of shorts to a port 3533e12c5d1SDavid du Colombier */ 3543e12c5d1SDavid du ColombierTEXT outss(SB),$0 3553e12c5d1SDavid du Colombier MOVL p+0(FP),DX 3563e12c5d1SDavid du Colombier MOVL a+4(FP),SI 3573e12c5d1SDavid du Colombier MOVL c+8(FP),CX 3583e12c5d1SDavid du Colombier CLD; REP; OP16; OUTSL 3593e12c5d1SDavid du Colombier RET 3603e12c5d1SDavid du Colombier 3613e12c5d1SDavid du Colombier/* 3623e12c5d1SDavid du Colombier * test and set 3633e12c5d1SDavid du Colombier */ 3643e12c5d1SDavid du ColombierTEXT tas(SB),$0 3653e12c5d1SDavid du Colombier MOVL $0xdeadead,AX 3663e12c5d1SDavid du Colombier MOVL l+0(FP),BX 3673e12c5d1SDavid du Colombier XCHGL AX,(BX) 3683e12c5d1SDavid du Colombier RET 3693e12c5d1SDavid du Colombier 3703e12c5d1SDavid du Colombier/* 3713e12c5d1SDavid du Colombier * routines to load/read various system registers 3723e12c5d1SDavid du Colombier */ 3733e12c5d1SDavid du ColombierGLOBL idtptr(SB),$6 3743e12c5d1SDavid du ColombierTEXT putidt(SB),$0 /* interrupt descriptor table */ 3753e12c5d1SDavid du Colombier MOVL t+0(FP),AX 3763e12c5d1SDavid du Colombier MOVL AX,idtptr+2(SB) 3773e12c5d1SDavid du Colombier MOVL l+4(FP),AX 3783e12c5d1SDavid du Colombier MOVW AX,idtptr(SB) 3793e12c5d1SDavid du Colombier MOVL idtptr(SB),IDTR 3803e12c5d1SDavid du Colombier RET 3813e12c5d1SDavid du Colombier 3823e12c5d1SDavid du ColombierGLOBL gdtptr(SB),$6 3833e12c5d1SDavid du ColombierTEXT putgdt(SB),$0 /* global descriptor table */ 3843e12c5d1SDavid du Colombier MOVL t+0(FP),AX 3853e12c5d1SDavid du Colombier MOVL AX,gdtptr+2(SB) 3863e12c5d1SDavid du Colombier MOVL l+4(FP),AX 3873e12c5d1SDavid du Colombier MOVW AX,gdtptr(SB) 3883e12c5d1SDavid du Colombier MOVL gdtptr(SB),GDTR 3893e12c5d1SDavid du Colombier RET 3903e12c5d1SDavid du Colombier 3913e12c5d1SDavid du ColombierTEXT putcr3(SB),$0 /* top level page table pointer */ 3923e12c5d1SDavid du Colombier MOVL t+0(FP),AX 3933e12c5d1SDavid du Colombier MOVL AX,CR3 3943e12c5d1SDavid du Colombier RET 3953e12c5d1SDavid du Colombier 3963e12c5d1SDavid du ColombierTEXT puttr(SB),$0 /* task register */ 3973e12c5d1SDavid du Colombier MOVL t+0(FP),AX 3983e12c5d1SDavid du Colombier MOVW AX,TASK 3993e12c5d1SDavid du Colombier RET 4003e12c5d1SDavid du Colombier 4013e12c5d1SDavid du ColombierTEXT getcr0(SB),$0 /* coprocessor bits */ 4023e12c5d1SDavid du Colombier MOVL CR0,AX 4033e12c5d1SDavid du Colombier RET 4043e12c5d1SDavid du Colombier 4053e12c5d1SDavid du ColombierTEXT getcr2(SB),$0 /* fault address */ 4063e12c5d1SDavid du Colombier MOVL CR2,AX 4073e12c5d1SDavid du Colombier RET 4083e12c5d1SDavid du Colombier 4093e12c5d1SDavid du Colombier#define FPOFF\ 4103e12c5d1SDavid du Colombier WAIT;\ 4113e12c5d1SDavid du Colombier MOVL CR0,AX;\ 4123e12c5d1SDavid du Colombier ORL $0x4,AX /* EM=1 */;\ 4133e12c5d1SDavid du Colombier MOVL AX,CR0 4143e12c5d1SDavid du Colombier 4153e12c5d1SDavid du Colombier#define FPON\ 4163e12c5d1SDavid du Colombier MOVL CR0,AX;\ 4173e12c5d1SDavid du Colombier ANDL $~0x4,AX /* EM=0 */;\ 4183e12c5d1SDavid du Colombier MOVL AX,CR0 4193e12c5d1SDavid du Colombier 4203e12c5d1SDavid du ColombierTEXT fpoff(SB),$0 /* turn off floating point */ 4213e12c5d1SDavid du Colombier FPOFF 4223e12c5d1SDavid du Colombier RET 4233e12c5d1SDavid du Colombier 4243e12c5d1SDavid du ColombierTEXT fpinit(SB),$0 /* turn on & init the floating point */ 4253e12c5d1SDavid du Colombier FPON 4263e12c5d1SDavid du Colombier FINIT 4273e12c5d1SDavid du Colombier WAIT 4283e12c5d1SDavid du Colombier PUSHW $0x0330 4293e12c5d1SDavid du Colombier FLDCW 0(SP) /* ignore underflow/precision, signal others */ 4303e12c5d1SDavid du Colombier POPW AX 4313e12c5d1SDavid du Colombier WAIT 4323e12c5d1SDavid du Colombier RET 4333e12c5d1SDavid du Colombier 4343e12c5d1SDavid du ColombierTEXT fpsave(SB),$0 /* save floating point state and turn off */ 4353e12c5d1SDavid du Colombier MOVL p+0(FP),AX 4363e12c5d1SDavid du Colombier WAIT 4373e12c5d1SDavid du Colombier FSAVE 0(AX) 4383e12c5d1SDavid du Colombier FPOFF 4393e12c5d1SDavid du Colombier RET 4403e12c5d1SDavid du Colombier 4413e12c5d1SDavid du ColombierTEXT fprestore(SB),$0 /* turn on floating point and restore regs */ 4423e12c5d1SDavid du Colombier FPON 4433e12c5d1SDavid du Colombier MOVL p+0(FP),AX 4443e12c5d1SDavid du Colombier FRSTOR 0(AX) 4453e12c5d1SDavid du Colombier WAIT 4463e12c5d1SDavid du Colombier RET 4473e12c5d1SDavid du Colombier 4483e12c5d1SDavid du ColombierTEXT fpstatus(SB),$0 /* get floating point status */ 4493e12c5d1SDavid du Colombier FSTSW AX 4503e12c5d1SDavid du Colombier RET 4513e12c5d1SDavid du Colombier 4523e12c5d1SDavid du Colombier/* 4533e12c5d1SDavid du Colombier * special traps 4543e12c5d1SDavid du Colombier */ 4553e12c5d1SDavid du ColombierTEXT intr0(SB),$0 4563e12c5d1SDavid du Colombier PUSHL $0 4573e12c5d1SDavid du Colombier PUSHL $0 4583e12c5d1SDavid du Colombier JMP intrcommon 4593e12c5d1SDavid du ColombierTEXT intr1(SB),$0 4603e12c5d1SDavid du Colombier PUSHL $0 4613e12c5d1SDavid du Colombier PUSHL $1 4623e12c5d1SDavid du Colombier JMP intrcommon 4633e12c5d1SDavid du ColombierTEXT intr2(SB),$0 4643e12c5d1SDavid du Colombier PUSHL $0 4653e12c5d1SDavid du Colombier PUSHL $2 4663e12c5d1SDavid du Colombier JMP intrcommon 4673e12c5d1SDavid du ColombierTEXT intr3(SB),$0 4683e12c5d1SDavid du Colombier PUSHL $0 4693e12c5d1SDavid du Colombier PUSHL $3 4703e12c5d1SDavid du Colombier JMP intrcommon 4713e12c5d1SDavid du ColombierTEXT intr4(SB),$0 4723e12c5d1SDavid du Colombier PUSHL $0 4733e12c5d1SDavid du Colombier PUSHL $4 4743e12c5d1SDavid du Colombier JMP intrcommon 4753e12c5d1SDavid du ColombierTEXT intr5(SB),$0 4763e12c5d1SDavid du Colombier PUSHL $0 4773e12c5d1SDavid du Colombier PUSHL $5 4783e12c5d1SDavid du Colombier JMP intrcommon 4793e12c5d1SDavid du ColombierTEXT intr6(SB),$0 4803e12c5d1SDavid du Colombier PUSHL $0 4813e12c5d1SDavid du Colombier PUSHL $6 4823e12c5d1SDavid du Colombier JMP intrcommon 4833e12c5d1SDavid du ColombierTEXT intr7(SB),$0 4843e12c5d1SDavid du Colombier PUSHL $0 4853e12c5d1SDavid du Colombier PUSHL $7 4863e12c5d1SDavid du Colombier JMP intrcommon 4873e12c5d1SDavid du ColombierTEXT intr8(SB),$0 4883e12c5d1SDavid du Colombier PUSHL $8 4893e12c5d1SDavid du Colombier JMP intrscommon 4903e12c5d1SDavid du ColombierTEXT intr9(SB),$0 4913e12c5d1SDavid du Colombier PUSHL $0 4923e12c5d1SDavid du Colombier PUSHL $9 4933e12c5d1SDavid du Colombier JMP intrcommon 4943e12c5d1SDavid du ColombierTEXT intr10(SB),$0 4953e12c5d1SDavid du Colombier PUSHL $10 4963e12c5d1SDavid du Colombier JMP intrscommon 4973e12c5d1SDavid du ColombierTEXT intr11(SB),$0 4983e12c5d1SDavid du Colombier PUSHL $11 4993e12c5d1SDavid du Colombier JMP intrscommon 5003e12c5d1SDavid du ColombierTEXT intr12(SB),$0 5013e12c5d1SDavid du Colombier PUSHL $12 5023e12c5d1SDavid du Colombier JMP intrscommon 5033e12c5d1SDavid du ColombierTEXT intr13(SB),$0 5043e12c5d1SDavid du Colombier PUSHL $13 5053e12c5d1SDavid du Colombier JMP intrscommon 5063e12c5d1SDavid du ColombierTEXT intr14(SB),$0 5073e12c5d1SDavid du Colombier PUSHL $14 5083e12c5d1SDavid du Colombier JMP intrscommon 5093e12c5d1SDavid du ColombierTEXT intr15(SB),$0 5103e12c5d1SDavid du Colombier PUSHL $0 5113e12c5d1SDavid du Colombier PUSHL $15 5123e12c5d1SDavid du Colombier JMP intrcommon 5133e12c5d1SDavid du ColombierTEXT intr16(SB),$0 5143e12c5d1SDavid du Colombier PUSHL $0 5153e12c5d1SDavid du Colombier PUSHL $16 5163e12c5d1SDavid du Colombier JMP intrcommon 5173e12c5d1SDavid du ColombierTEXT intr24(SB),$0 5183e12c5d1SDavid du Colombier PUSHL $0 5193e12c5d1SDavid du Colombier PUSHL $24 5203e12c5d1SDavid du Colombier JMP intrcommon 5213e12c5d1SDavid du ColombierTEXT intr25(SB),$0 5223e12c5d1SDavid du Colombier PUSHL $0 5233e12c5d1SDavid du Colombier PUSHL $25 5243e12c5d1SDavid du Colombier JMP intrcommon 5253e12c5d1SDavid du ColombierTEXT intr26(SB),$0 5263e12c5d1SDavid du Colombier PUSHL $0 5273e12c5d1SDavid du Colombier PUSHL $26 5283e12c5d1SDavid du Colombier JMP intrcommon 5293e12c5d1SDavid du ColombierTEXT intr27(SB),$0 5303e12c5d1SDavid du Colombier PUSHL $0 5313e12c5d1SDavid du Colombier PUSHL $27 5323e12c5d1SDavid du Colombier JMP intrcommon 5333e12c5d1SDavid du ColombierTEXT intr28(SB),$0 5343e12c5d1SDavid du Colombier PUSHL $0 5353e12c5d1SDavid du Colombier PUSHL $28 5363e12c5d1SDavid du Colombier JMP intrcommon 5373e12c5d1SDavid du ColombierTEXT intr29(SB),$0 5383e12c5d1SDavid du Colombier PUSHL $0 5393e12c5d1SDavid du Colombier PUSHL $29 5403e12c5d1SDavid du Colombier JMP intrcommon 5413e12c5d1SDavid du ColombierTEXT intr30(SB),$0 5423e12c5d1SDavid du Colombier PUSHL $0 5433e12c5d1SDavid du Colombier PUSHL $30 5443e12c5d1SDavid du Colombier JMP intrcommon 5453e12c5d1SDavid du ColombierTEXT intr31(SB),$0 5463e12c5d1SDavid du Colombier PUSHL $0 5473e12c5d1SDavid du Colombier PUSHL $31 5483e12c5d1SDavid du Colombier JMP intrcommon 5493e12c5d1SDavid du ColombierTEXT intr32(SB),$0 5503e12c5d1SDavid du Colombier PUSHL $0 5513e12c5d1SDavid du Colombier PUSHL $16 5523e12c5d1SDavid du Colombier JMP intrcommon 5533e12c5d1SDavid du ColombierTEXT intr33(SB),$0 5543e12c5d1SDavid du Colombier PUSHL $0 5553e12c5d1SDavid du Colombier PUSHL $33 5563e12c5d1SDavid du Colombier JMP intrcommon 5573e12c5d1SDavid du ColombierTEXT intr34(SB),$0 5583e12c5d1SDavid du Colombier PUSHL $0 5593e12c5d1SDavid du Colombier PUSHL $34 5603e12c5d1SDavid du Colombier JMP intrcommon 5613e12c5d1SDavid du ColombierTEXT intr35(SB),$0 5623e12c5d1SDavid du Colombier PUSHL $0 5633e12c5d1SDavid du Colombier PUSHL $35 5643e12c5d1SDavid du Colombier JMP intrcommon 5653e12c5d1SDavid du ColombierTEXT intr36(SB),$0 5663e12c5d1SDavid du Colombier PUSHL $0 5673e12c5d1SDavid du Colombier PUSHL $36 5683e12c5d1SDavid du Colombier JMP intrcommon 5693e12c5d1SDavid du ColombierTEXT intr37(SB),$0 5703e12c5d1SDavid du Colombier PUSHL $0 5713e12c5d1SDavid du Colombier PUSHL $37 5723e12c5d1SDavid du Colombier JMP intrcommon 5733e12c5d1SDavid du ColombierTEXT intr38(SB),$0 5743e12c5d1SDavid du Colombier PUSHL $0 5753e12c5d1SDavid du Colombier PUSHL $38 5763e12c5d1SDavid du Colombier JMP intrcommon 5773e12c5d1SDavid du ColombierTEXT intr39(SB),$0 5783e12c5d1SDavid du Colombier PUSHL $0 5793e12c5d1SDavid du Colombier PUSHL $39 5803e12c5d1SDavid du Colombier JMP intrcommon 5813e12c5d1SDavid du ColombierTEXT intr64(SB),$0 5823e12c5d1SDavid du Colombier PUSHL $0 5833e12c5d1SDavid du Colombier PUSHL $64 5843e12c5d1SDavid du Colombier JMP intrcommon 5853e12c5d1SDavid du ColombierTEXT intrbad(SB),$0 5863e12c5d1SDavid du Colombier PUSHL $0 5873e12c5d1SDavid du Colombier PUSHL $0x1ff 5883e12c5d1SDavid du Colombier JMP intrcommon 5893e12c5d1SDavid du Colombier 5903e12c5d1SDavid du Colombierintrcommon: 5913e12c5d1SDavid du Colombier PUSHL DS 5923e12c5d1SDavid du Colombier PUSHL ES 5933e12c5d1SDavid du Colombier PUSHL FS 5943e12c5d1SDavid du Colombier PUSHL GS 5953e12c5d1SDavid du Colombier PUSHAL 5963e12c5d1SDavid du Colombier MOVL $(KDSEL),AX 5973e12c5d1SDavid du Colombier MOVW AX,DS 5983e12c5d1SDavid du Colombier MOVW AX,ES 5993e12c5d1SDavid du Colombier LEAL 0(SP),AX 6003e12c5d1SDavid du Colombier PUSHL AX 6013e12c5d1SDavid du Colombier CALL trap(SB) 6023e12c5d1SDavid du Colombier POPL AX 6033e12c5d1SDavid du Colombier POPAL 6043e12c5d1SDavid du Colombier POPL GS 6053e12c5d1SDavid du Colombier POPL FS 6063e12c5d1SDavid du Colombier POPL ES 6073e12c5d1SDavid du Colombier POPL DS 6083e12c5d1SDavid du Colombier ADDL $8,SP /* error code and trap type */ 6093e12c5d1SDavid du Colombier IRETL 6103e12c5d1SDavid du Colombier 6113e12c5d1SDavid du Colombierintrscommon: 6123e12c5d1SDavid du Colombier PUSHL DS 6133e12c5d1SDavid du Colombier PUSHL ES 6143e12c5d1SDavid du Colombier PUSHL FS 6153e12c5d1SDavid du Colombier PUSHL GS 6163e12c5d1SDavid du Colombier PUSHAL 6173e12c5d1SDavid du Colombier MOVL $(KDSEL),AX 6183e12c5d1SDavid du Colombier MOVW AX,DS 6193e12c5d1SDavid du Colombier MOVW AX,ES 6203e12c5d1SDavid du Colombier LEAL 0(SP),AX 6213e12c5d1SDavid du Colombier PUSHL AX 6223e12c5d1SDavid du Colombier CALL trap(SB) 6233e12c5d1SDavid du Colombier POPL AX 6243e12c5d1SDavid du Colombier POPAL 6253e12c5d1SDavid du Colombier POPL GS 6263e12c5d1SDavid du Colombier POPL FS 6273e12c5d1SDavid du Colombier POPL ES 6283e12c5d1SDavid du Colombier POPL DS 6293e12c5d1SDavid du Colombier ADDL $8,SP /* error code and trap type */ 6303e12c5d1SDavid du Colombier IRETL 6313e12c5d1SDavid du Colombier 6323e12c5d1SDavid du Colombier/* 6333e12c5d1SDavid du Colombier * interrupt level is interrupts on or off 6343e12c5d1SDavid du Colombier */ 6353e12c5d1SDavid du ColombierTEXT spllo(SB),$0 6363e12c5d1SDavid du Colombier PUSHFL 6373e12c5d1SDavid du Colombier POPL AX 6383e12c5d1SDavid du Colombier STI 6393e12c5d1SDavid du Colombier RET 6403e12c5d1SDavid du Colombier 6413e12c5d1SDavid du ColombierTEXT splhi(SB),$0 6423e12c5d1SDavid du Colombier PUSHFL 6433e12c5d1SDavid du Colombier POPL AX 6443e12c5d1SDavid du Colombier CLI 6453e12c5d1SDavid du Colombier RET 6463e12c5d1SDavid du Colombier 6473e12c5d1SDavid du ColombierTEXT splx(SB),$0 6483e12c5d1SDavid du Colombier MOVL s+0(FP),AX 6493e12c5d1SDavid du Colombier PUSHL AX 6503e12c5d1SDavid du Colombier POPFL 6513e12c5d1SDavid du Colombier RET 6523e12c5d1SDavid du Colombier 6533e12c5d1SDavid du Colombier/* 6543e12c5d1SDavid du Colombier * do nothing whatsoever till interrupt happens 6553e12c5d1SDavid du Colombier */ 6563e12c5d1SDavid du ColombierTEXT idle(SB),$0 6573e12c5d1SDavid du Colombier HLT 6583e12c5d1SDavid du Colombier RET 6593e12c5d1SDavid du Colombier 6603e12c5d1SDavid du Colombier/* 6613e12c5d1SDavid du Colombier * label consists of a stack pointer and a PC 6623e12c5d1SDavid du Colombier */ 6633e12c5d1SDavid du ColombierTEXT gotolabel(SB),$0 6643e12c5d1SDavid du Colombier MOVL l+0(FP),AX 6653e12c5d1SDavid du Colombier MOVL 0(AX),SP /* restore sp */ 6663e12c5d1SDavid du Colombier MOVL 4(AX),AX /* put return pc on the stack */ 6673e12c5d1SDavid du Colombier MOVL AX,0(SP) 6683e12c5d1SDavid du Colombier MOVL $1,AX /* return 1 */ 6693e12c5d1SDavid du Colombier RET 6703e12c5d1SDavid du Colombier 6713e12c5d1SDavid du ColombierTEXT setlabel(SB),$0 6723e12c5d1SDavid du Colombier MOVL l+0(FP),AX 6733e12c5d1SDavid du Colombier MOVL SP,0(AX) /* store sp */ 6743e12c5d1SDavid du Colombier MOVL 0(SP),BX /* store return pc */ 6753e12c5d1SDavid du Colombier MOVL BX,4(AX) 6763e12c5d1SDavid du Colombier MOVL $0,AX /* return 0 */ 6773e12c5d1SDavid du Colombier RET 6783e12c5d1SDavid du Colombier 6793e12c5d1SDavid du Colombier/* 6803e12c5d1SDavid du Colombier * Used to get to the first process. 6813e12c5d1SDavid du Colombier * Set up an interrupt return frame and IRET to user level. 6823e12c5d1SDavid du Colombier */ 6833e12c5d1SDavid du ColombierTEXT touser(SB),$0 6843e12c5d1SDavid du Colombier PUSHL $(UDSEL) /* old ss */ 6853e12c5d1SDavid du Colombier PUSHL $(USTKTOP) /* old sp */ 6863e12c5d1SDavid du Colombier PUSHFL /* old flags */ 6873e12c5d1SDavid du Colombier PUSHL $(UESEL) /* old cs */ 6883e12c5d1SDavid du Colombier PUSHL $(UTZERO+32) /* old pc */ 6893e12c5d1SDavid du Colombier MOVL $(UDSEL),AX 6903e12c5d1SDavid du Colombier MOVW AX,DS 6913e12c5d1SDavid du Colombier MOVW AX,ES 6923e12c5d1SDavid du Colombier MOVW AX,GS 6933e12c5d1SDavid du Colombier MOVW AX,FS 6943e12c5d1SDavid du Colombier IRETL 6953e12c5d1SDavid du Colombier 6963e12c5d1SDavid du Colombier/* 6973e12c5d1SDavid du Colombier * set configuration register 6983e12c5d1SDavid du Colombier */ 6993e12c5d1SDavid du ColombierTEXT config(SB),$0 7003e12c5d1SDavid du Colombier MOVL l+0(FP),AX 7013e12c5d1SDavid du Colombier MOVL $0x3F3,DX 7023e12c5d1SDavid du Colombier OUTB 7033e12c5d1SDavid du Colombier OUTB 7043e12c5d1SDavid du Colombier RET 705