19ef1f84bSDavid du Colombier typedef struct Asm Asm; 29ef1f84bSDavid du Colombier typedef struct Fxsave Fxsave; 39ef1f84bSDavid du Colombier typedef struct ISAConf ISAConf; 49ef1f84bSDavid du Colombier typedef struct Label Label; 59ef1f84bSDavid du Colombier typedef struct Lock Lock; 69ef1f84bSDavid du Colombier typedef struct MCPU MCPU; 79ef1f84bSDavid du Colombier typedef struct MFPU MFPU; 89ef1f84bSDavid du Colombier typedef struct MMMU MMMU; 99ef1f84bSDavid du Colombier typedef struct Mach Mach; 109ef1f84bSDavid du Colombier typedef u64int Mpl; 119ef1f84bSDavid du Colombier typedef Mpl Mreg; /* GAK */ 129ef1f84bSDavid du Colombier typedef struct Page Page; 139ef1f84bSDavid du Colombier typedef struct Pcidev Pcidev; 149ef1f84bSDavid du Colombier typedef struct PFPU PFPU; 159ef1f84bSDavid du Colombier typedef struct PMMU PMMU; 169ef1f84bSDavid du Colombier typedef struct PNOTIFY PNOTIFY; 179ef1f84bSDavid du Colombier typedef u64int PTE; 189ef1f84bSDavid du Colombier typedef struct Proc Proc; 199ef1f84bSDavid du Colombier typedef struct Sys Sys; 209ef1f84bSDavid du Colombier typedef u64int uintmem; /* horrible name */ 21406c76faSDavid du Colombier typedef vlong Tval; 229ef1f84bSDavid du Colombier typedef struct Ureg Ureg; 239ef1f84bSDavid du Colombier typedef struct Vctl Vctl; 249ef1f84bSDavid du Colombier 259ef1f84bSDavid du Colombier #pragma incomplete Ureg 269ef1f84bSDavid du Colombier 279ef1f84bSDavid du Colombier #define MAXSYSARG 5 /* for mount(fd, afd, mpt, flag, arg) */ 289ef1f84bSDavid du Colombier 299ef1f84bSDavid du Colombier /* 309ef1f84bSDavid du Colombier * parameters for sysproc.c 319ef1f84bSDavid du Colombier */ 329ef1f84bSDavid du Colombier #define AOUT_MAGIC (S_MAGIC) 339ef1f84bSDavid du Colombier 349ef1f84bSDavid du Colombier /* 359ef1f84bSDavid du Colombier * machine dependent definitions used by ../port/portdat.h 369ef1f84bSDavid du Colombier */ 379ef1f84bSDavid du Colombier struct Lock 389ef1f84bSDavid du Colombier { 399ef1f84bSDavid du Colombier u32int key; 409ef1f84bSDavid du Colombier int isilock; 419ef1f84bSDavid du Colombier union { /* GAK */ 429ef1f84bSDavid du Colombier Mpl pl; 439ef1f84bSDavid du Colombier Mreg sr; 449ef1f84bSDavid du Colombier }; 459ef1f84bSDavid du Colombier uintptr pc; 469ef1f84bSDavid du Colombier Proc* p; 479ef1f84bSDavid du Colombier Mach* m; 489ef1f84bSDavid du Colombier }; 499ef1f84bSDavid du Colombier 509ef1f84bSDavid du Colombier struct Label 519ef1f84bSDavid du Colombier { 529ef1f84bSDavid du Colombier uintptr sp; 539ef1f84bSDavid du Colombier uintptr pc; 549ef1f84bSDavid du Colombier }; 559ef1f84bSDavid du Colombier 569ef1f84bSDavid du Colombier struct Fxsave { 579ef1f84bSDavid du Colombier u16int fcw; /* x87 control word */ 589ef1f84bSDavid du Colombier u16int fsw; /* x87 status word */ 599ef1f84bSDavid du Colombier u8int ftw; /* x87 tag word */ 609ef1f84bSDavid du Colombier u8int zero; /* 0 */ 619ef1f84bSDavid du Colombier u16int fop; /* last x87 opcode */ 629ef1f84bSDavid du Colombier u64int rip; /* last x87 instruction pointer */ 639ef1f84bSDavid du Colombier u64int rdp; /* last x87 data pointer */ 649ef1f84bSDavid du Colombier u32int mxcsr; /* MMX control and status */ 659ef1f84bSDavid du Colombier u32int mxcsrmask; /* supported MMX feature bits */ 669ef1f84bSDavid du Colombier uchar st[128]; /* shared 64-bit media and x87 regs */ 679ef1f84bSDavid du Colombier uchar xmm[256]; /* 128-bit media regs */ 689ef1f84bSDavid du Colombier uchar ign[96]; /* reserved, ignored */ 699ef1f84bSDavid du Colombier }; 709ef1f84bSDavid du Colombier 719ef1f84bSDavid du Colombier /* 729ef1f84bSDavid du Colombier * FPU stuff in Proc 739ef1f84bSDavid du Colombier */ 749ef1f84bSDavid du Colombier struct PFPU { 759ef1f84bSDavid du Colombier int fpustate; 769ef1f84bSDavid du Colombier uchar fxsave[sizeof(Fxsave)+15]; 779ef1f84bSDavid du Colombier void* fpusave; 789ef1f84bSDavid du Colombier }; 799ef1f84bSDavid du Colombier 809ef1f84bSDavid du Colombier /* 819ef1f84bSDavid du Colombier * MMU stuff in Proc 829ef1f84bSDavid du Colombier */ 839ef1f84bSDavid du Colombier #define NCOLOR 8 849ef1f84bSDavid du Colombier struct PMMU 859ef1f84bSDavid du Colombier { 869ef1f84bSDavid du Colombier Page* mmuptp[4]; /* page table pages for each level */ 879ef1f84bSDavid du Colombier }; 889ef1f84bSDavid du Colombier 899ef1f84bSDavid du Colombier /* 909ef1f84bSDavid du Colombier * things saved in the Proc structure during a notify 919ef1f84bSDavid du Colombier */ 929ef1f84bSDavid du Colombier struct PNOTIFY 939ef1f84bSDavid du Colombier { 949ef1f84bSDavid du Colombier void emptiness; 959ef1f84bSDavid du Colombier }; 969ef1f84bSDavid du Colombier 979ef1f84bSDavid du Colombier /* 989ef1f84bSDavid du Colombier * Address Space Map. 999ef1f84bSDavid du Colombier * Low duty cycle. 1009ef1f84bSDavid du Colombier */ 1019ef1f84bSDavid du Colombier struct Asm 1029ef1f84bSDavid du Colombier { 1039ef1f84bSDavid du Colombier uintmem addr; 1049ef1f84bSDavid du Colombier uintmem size; 1059ef1f84bSDavid du Colombier int type; 1069ef1f84bSDavid du Colombier int location; 1079ef1f84bSDavid du Colombier Asm* next; 1089ef1f84bSDavid du Colombier uintmem base; /* used by port; ROUNDUP(addr, PGSZ) */ 1099ef1f84bSDavid du Colombier uintmem limit; /* used by port; ROUNDDN(addr+size, PGSZ) */ 1109ef1f84bSDavid du Colombier uintptr kbase; /* used by port; kernel for base, used by devproc */ 1119ef1f84bSDavid du Colombier }; 1129ef1f84bSDavid du Colombier extern Asm* asmlist; 1139ef1f84bSDavid du Colombier 1149ef1f84bSDavid du Colombier #include "../port/portdat.h" 1159ef1f84bSDavid du Colombier 1169ef1f84bSDavid du Colombier /* 1179ef1f84bSDavid du Colombier * CPU stuff in Mach. 1189ef1f84bSDavid du Colombier */ 1199ef1f84bSDavid du Colombier struct MCPU { 1209ef1f84bSDavid du Colombier u32int cpuinfo[2][4]; /* CPUID instruction output E[ABCD]X */ 1219ef1f84bSDavid du Colombier int ncpuinfos; /* number of standard entries */ 1229ef1f84bSDavid du Colombier int ncpuinfoe; /* number of extended entries */ 1239ef1f84bSDavid du Colombier int isintelcpu; /* */ 1249ef1f84bSDavid du Colombier }; 1259ef1f84bSDavid du Colombier 1269ef1f84bSDavid du Colombier /* 1279ef1f84bSDavid du Colombier * FPU stuff in Mach. 1289ef1f84bSDavid du Colombier */ 1299ef1f84bSDavid du Colombier struct MFPU { 1309ef1f84bSDavid du Colombier u16int fcw; /* x87 control word */ 1319ef1f84bSDavid du Colombier u32int mxcsr; /* MMX control and status */ 1329ef1f84bSDavid du Colombier u32int mxcsrmask; /* supported MMX feature bits */ 1339ef1f84bSDavid du Colombier }; 1349ef1f84bSDavid du Colombier 1359ef1f84bSDavid du Colombier /* 1369ef1f84bSDavid du Colombier * MMU stuff in Mach. 1379ef1f84bSDavid du Colombier */ 1389ef1f84bSDavid du Colombier enum 1399ef1f84bSDavid du Colombier { 1409ef1f84bSDavid du Colombier NPGSZ = 4 1419ef1f84bSDavid du Colombier }; 1429ef1f84bSDavid du Colombier 1439ef1f84bSDavid du Colombier struct MMMU 1449ef1f84bSDavid du Colombier { 1459ef1f84bSDavid du Colombier Page* pml4; /* pml4 for this processor */ 1469ef1f84bSDavid du Colombier PTE* pmap; /* unused as of yet */ 1479ef1f84bSDavid du Colombier 1489ef1f84bSDavid du Colombier uint pgszlg2[NPGSZ]; /* per Mach or per Sys? */ 1499ef1f84bSDavid du Colombier uintmem pgszmask[NPGSZ]; 1509ef1f84bSDavid du Colombier uint pgsz[NPGSZ]; 1519ef1f84bSDavid du Colombier int npgsz; 1529ef1f84bSDavid du Colombier 1539ef1f84bSDavid du Colombier Page pml4kludge; /* GAK: we need a page */ 1549ef1f84bSDavid du Colombier }; 1559ef1f84bSDavid du Colombier 1569ef1f84bSDavid du Colombier /* 1579ef1f84bSDavid du Colombier * Per processor information. 1589ef1f84bSDavid du Colombier * 1599ef1f84bSDavid du Colombier * The offsets of the first few elements may be known 1609ef1f84bSDavid du Colombier * to low-level assembly code, so do not re-order: 1619ef1f84bSDavid du Colombier * machno - no dependency, convention 1629ef1f84bSDavid du Colombier * splpc - splhi, spllo, splx 1639ef1f84bSDavid du Colombier * proc - syscallentry 1649ef1f84bSDavid du Colombier */ 1659ef1f84bSDavid du Colombier struct Mach 1669ef1f84bSDavid du Colombier { 1679ef1f84bSDavid du Colombier int machno; /* physical id of processor */ 1689ef1f84bSDavid du Colombier uintptr splpc; /* pc of last caller to splhi */ 1699ef1f84bSDavid du Colombier 1709ef1f84bSDavid du Colombier Proc* proc; /* current process on this processor */ 1719ef1f84bSDavid du Colombier 1729ef1f84bSDavid du Colombier int apicno; 1739ef1f84bSDavid du Colombier int online; 1749ef1f84bSDavid du Colombier int mode; /* fold into online? GAK */ 1759ef1f84bSDavid du Colombier 1769ef1f84bSDavid du Colombier MMMU; 1779ef1f84bSDavid du Colombier 1789ef1f84bSDavid du Colombier uintptr stack; 1799ef1f84bSDavid du Colombier uchar* vsvm; 1809ef1f84bSDavid du Colombier void* gdt; 1819ef1f84bSDavid du Colombier void* tss; 1829ef1f84bSDavid du Colombier 1839ef1f84bSDavid du Colombier ulong ticks; /* of the clock since boot time */ 1849ef1f84bSDavid du Colombier Label sched; /* scheduler wakeup */ 1859ef1f84bSDavid du Colombier Lock alarmlock; /* access to alarm list */ 1869ef1f84bSDavid du Colombier void* alarm; /* alarms bound to this clock */ 1879ef1f84bSDavid du Colombier int inclockintr; 1889ef1f84bSDavid du Colombier 1899ef1f84bSDavid du Colombier Proc* readied; /* for runproc */ 1909ef1f84bSDavid du Colombier ulong schedticks; /* next forced context switch */ 1919ef1f84bSDavid du Colombier 1929ef1f84bSDavid du Colombier int color; 1939ef1f84bSDavid du Colombier 1949ef1f84bSDavid du Colombier int tlbfault; 1959ef1f84bSDavid du Colombier int tlbpurge; 1969ef1f84bSDavid du Colombier int pfault; 1979ef1f84bSDavid du Colombier int cs; 1989ef1f84bSDavid du Colombier int syscall; 1999ef1f84bSDavid du Colombier int load; 2009ef1f84bSDavid du Colombier int intr; 2019ef1f84bSDavid du Colombier int mmuflush; /* make current proc flush it's mmu state */ 2029ef1f84bSDavid du Colombier int ilockdepth; 2039ef1f84bSDavid du Colombier uintptr ilockpc; 2049ef1f84bSDavid du Colombier Perf perf; /* performance counters */ 2059ef1f84bSDavid du Colombier 2069ef1f84bSDavid du Colombier int lastintr; 2079ef1f84bSDavid du Colombier 2089ef1f84bSDavid du Colombier Lock apictimerlock; 2099ef1f84bSDavid du Colombier uvlong cyclefreq; /* Frequency of user readable cycle counter */ 2109ef1f84bSDavid du Colombier vlong cpuhz; 2119ef1f84bSDavid du Colombier int cpumhz; 2129ef1f84bSDavid du Colombier u64int rdtsc; 2139ef1f84bSDavid du Colombier 2149ef1f84bSDavid du Colombier MFPU; 2159ef1f84bSDavid du Colombier MCPU; 2169ef1f84bSDavid du Colombier }; 2179ef1f84bSDavid du Colombier 2189ef1f84bSDavid du Colombier /* 2199ef1f84bSDavid du Colombier * This is the low memory map, between 0x100000 and 0x110000. 2209ef1f84bSDavid du Colombier * It is located there to allow fundamental datastructures to be 2219ef1f84bSDavid du Colombier * created and used before knowing where free memory begins 2229ef1f84bSDavid du Colombier * (e.g. there may be modules located after the kernel BSS end). 2239ef1f84bSDavid du Colombier * The layout is known in the bootstrap code in l32p.s. 2249ef1f84bSDavid du Colombier * It is logically two parts: the per processor data structures 2259ef1f84bSDavid du Colombier * for the bootstrap processor (stack, Mach, vsvm, and page tables), 2269ef1f84bSDavid du Colombier * and the global information about the system (syspage, ptrpage). 2279ef1f84bSDavid du Colombier * Some of the elements must be aligned on page boundaries, hence 2289ef1f84bSDavid du Colombier * the unions. 2299ef1f84bSDavid du Colombier */ 2309ef1f84bSDavid du Colombier struct Sys { 2319ef1f84bSDavid du Colombier uchar machstk[MACHSTKSZ]; 2329ef1f84bSDavid du Colombier 2339ef1f84bSDavid du Colombier PTE pml4[PTSZ/sizeof(PTE)]; /* */ 2349ef1f84bSDavid du Colombier PTE pdp[PTSZ/sizeof(PTE)]; 2359ef1f84bSDavid du Colombier PTE pd[PTSZ/sizeof(PTE)]; 2369ef1f84bSDavid du Colombier PTE pt[PTSZ/sizeof(PTE)]; 2379ef1f84bSDavid du Colombier 2389ef1f84bSDavid du Colombier uchar vsvmpage[4*KiB]; 2399ef1f84bSDavid du Colombier 2409ef1f84bSDavid du Colombier union { 2419ef1f84bSDavid du Colombier Mach mach; 2429ef1f84bSDavid du Colombier uchar machpage[MACHSZ]; 2439ef1f84bSDavid du Colombier }; 2449ef1f84bSDavid du Colombier 2459ef1f84bSDavid du Colombier union { 2469ef1f84bSDavid du Colombier struct { 2479ef1f84bSDavid du Colombier u64int pmstart; /* physical memory */ 2489ef1f84bSDavid du Colombier u64int pmoccupied; /* how much is occupied */ 2499ef1f84bSDavid du Colombier u64int pmend; /* total span */ 250*094d6818SDavid du Colombier u64int pmpaged; /* how much assigned to page pool */ 2519ef1f84bSDavid du Colombier 2529ef1f84bSDavid du Colombier uintptr vmstart; /* base address for malloc */ 2539ef1f84bSDavid du Colombier uintptr vmunused; /* 1st unused va */ 2549ef1f84bSDavid du Colombier uintptr vmunmapped; /* 1st unmapped va */ 2559ef1f84bSDavid du Colombier uintptr vmend; /* 1st unusable va */ 2569ef1f84bSDavid du Colombier 2579ef1f84bSDavid du Colombier u64int epoch; /* crude time synchronisation */ 2589ef1f84bSDavid du Colombier int nmach; /* how many machs */ 2599ef1f84bSDavid du Colombier int nonline; /* how many machs are online */ 2609ef1f84bSDavid du Colombier uint ticks; /* since boot (type?) */ 2619ef1f84bSDavid du Colombier uint copymode; /* 0 is COW, 1 is copy on ref */ 2629ef1f84bSDavid du Colombier }; 2639ef1f84bSDavid du Colombier uchar syspage[4*KiB]; 2649ef1f84bSDavid du Colombier }; 2659ef1f84bSDavid du Colombier 2669ef1f84bSDavid du Colombier union { 2679ef1f84bSDavid du Colombier Mach* machptr[MACHMAX]; 2689ef1f84bSDavid du Colombier uchar ptrpage[4*KiB]; 2699ef1f84bSDavid du Colombier }; 2709ef1f84bSDavid du Colombier 2719ef1f84bSDavid du Colombier uchar _57344_[2][4*KiB]; /* unused */ 2729ef1f84bSDavid du Colombier }; 2739ef1f84bSDavid du Colombier 2749ef1f84bSDavid du Colombier extern Sys* sys; 2759ef1f84bSDavid du Colombier 2769ef1f84bSDavid du Colombier /* 2779ef1f84bSDavid du Colombier * KMap 2789ef1f84bSDavid du Colombier */ 2799ef1f84bSDavid du Colombier typedef void KMap; 2809ef1f84bSDavid du Colombier extern KMap* kmap(Page*); 2819ef1f84bSDavid du Colombier 2829ef1f84bSDavid du Colombier #define kunmap(k) 2839ef1f84bSDavid du Colombier #define VA(k) PTR2UINT(k) 2849ef1f84bSDavid du Colombier 2859ef1f84bSDavid du Colombier struct 2869ef1f84bSDavid du Colombier { 2879ef1f84bSDavid du Colombier Lock; 2889ef1f84bSDavid du Colombier uint machs; /* bitmap of active CPUs */ 2899ef1f84bSDavid du Colombier int exiting; /* shutdown */ 2909ef1f84bSDavid du Colombier int ispanic; /* shutdown in response to a panic */ 2919ef1f84bSDavid du Colombier int thunderbirdsarego; /* F.A.B. */ 2929ef1f84bSDavid du Colombier }active; 2939ef1f84bSDavid du Colombier 2949ef1f84bSDavid du Colombier /* 2959ef1f84bSDavid du Colombier * a parsed plan9.ini line 2969ef1f84bSDavid du Colombier */ 2979ef1f84bSDavid du Colombier #define NISAOPT 8 2989ef1f84bSDavid du Colombier 2999ef1f84bSDavid du Colombier struct ISAConf { 3009ef1f84bSDavid du Colombier char *type; 3019ef1f84bSDavid du Colombier uintptr port; 3029ef1f84bSDavid du Colombier int irq; 3039ef1f84bSDavid du Colombier ulong dma; 3049ef1f84bSDavid du Colombier uintptr mem; 3059ef1f84bSDavid du Colombier usize size; 3069ef1f84bSDavid du Colombier ulong freq; 3079ef1f84bSDavid du Colombier 3089ef1f84bSDavid du Colombier int nopt; 3099ef1f84bSDavid du Colombier char *opt[NISAOPT]; 3109ef1f84bSDavid du Colombier }; 3119ef1f84bSDavid du Colombier 3129ef1f84bSDavid du Colombier /* 3139ef1f84bSDavid du Colombier * The Mach structures must be available via the per-processor 3149ef1f84bSDavid du Colombier * MMU information array machptr, mainly for disambiguation and access to 3159ef1f84bSDavid du Colombier * the clock which is only maintained by the bootstrap processor (0). 3169ef1f84bSDavid du Colombier */ 3179ef1f84bSDavid du Colombier extern register Mach* m; /* R15 */ 3189ef1f84bSDavid du Colombier extern register Proc* up; /* R14 */ 3199ef1f84bSDavid du Colombier 3209ef1f84bSDavid du Colombier extern uintptr kseg0; 3219ef1f84bSDavid du Colombier 3229ef1f84bSDavid du Colombier /* 3239ef1f84bSDavid du Colombier * Horrid. 3249ef1f84bSDavid du Colombier */ 3259ef1f84bSDavid du Colombier #ifdef _DBGC_ 3269ef1f84bSDavid du Colombier #define DBGFLG (dbgflg[_DBGC_]) 3279ef1f84bSDavid du Colombier #else 3289ef1f84bSDavid du Colombier #define DBGFLG (0) 3299ef1f84bSDavid du Colombier #endif /* _DBGC_ */ 3309ef1f84bSDavid du Colombier 3319ef1f84bSDavid du Colombier #define DBG(...) if(!DBGFLG){}else dbgprint(__VA_ARGS__) 3329ef1f84bSDavid du Colombier 3339ef1f84bSDavid du Colombier extern char dbgflg[256]; 3349ef1f84bSDavid du Colombier 3359ef1f84bSDavid du Colombier #define dbgprint print /* for now */ 3369ef1f84bSDavid du Colombier 3379ef1f84bSDavid du Colombier #pragma varargck type "P" uintmem /* GAK */ 338