1*0c0b2b49SDavid du Colombier typedef struct Conf Conf; 2*0c0b2b49SDavid du Colombier typedef struct Confmem Confmem; 3*0c0b2b49SDavid du Colombier typedef struct FPsave FPsave; 4*0c0b2b49SDavid du Colombier typedef struct ISAConf ISAConf; 5*0c0b2b49SDavid du Colombier typedef struct KMap KMap; 6*0c0b2b49SDavid du Colombier typedef struct Lance Lance; 7*0c0b2b49SDavid du Colombier typedef struct Lancemem Lancemem; 8*0c0b2b49SDavid du Colombier typedef struct Label Label; 9*0c0b2b49SDavid du Colombier typedef struct Lock Lock; 10*0c0b2b49SDavid du Colombier typedef struct Mach Mach; 11*0c0b2b49SDavid du Colombier typedef struct MMU MMU; 12*0c0b2b49SDavid du Colombier typedef struct Pcidev Pcidev; 13*0c0b2b49SDavid du Colombier typedef struct PMMU PMMU; 14*0c0b2b49SDavid du Colombier typedef struct Softtlb Softtlb; 15*0c0b2b49SDavid du Colombier typedef struct Ureg Ureg; 16*0c0b2b49SDavid du Colombier typedef struct Proc Proc; 17*0c0b2b49SDavid du Colombier typedef uvlong Tval; 18*0c0b2b49SDavid du Colombier 19*0c0b2b49SDavid du Colombier #pragma incomplete Pcidev 20*0c0b2b49SDavid du Colombier 21*0c0b2b49SDavid du Colombier #define MAXSYSARG 5 /* for mount(fd, afd, mpt, flag, arg) */ 22*0c0b2b49SDavid du Colombier 23*0c0b2b49SDavid du Colombier /* 24*0c0b2b49SDavid du Colombier * parameters for sysproc.c and rebootcmd.c 25*0c0b2b49SDavid du Colombier */ 26*0c0b2b49SDavid du Colombier #define AOUT_MAGIC N_MAGIC || magic==P_MAGIC 27*0c0b2b49SDavid du Colombier /* r3k or r4k boot images */ 28*0c0b2b49SDavid du Colombier #define BOOT_MAGIC (0x160<<16) || magic == ((0x160<<16)|3) 29*0c0b2b49SDavid du Colombier 30*0c0b2b49SDavid du Colombier /* 31*0c0b2b49SDavid du Colombier * machine dependent definitions used by ../port/dat.h 32*0c0b2b49SDavid du Colombier */ 33*0c0b2b49SDavid du Colombier 34*0c0b2b49SDavid du Colombier struct Lock 35*0c0b2b49SDavid du Colombier { 36*0c0b2b49SDavid du Colombier ulong key; /* semaphore (non-zero = locked) */ 37*0c0b2b49SDavid du Colombier ulong sr; 38*0c0b2b49SDavid du Colombier uintptr pc; 39*0c0b2b49SDavid du Colombier Proc *p; 40*0c0b2b49SDavid du Colombier Mach *m; 41*0c0b2b49SDavid du Colombier ushort isilock; 42*0c0b2b49SDavid du Colombier }; 43*0c0b2b49SDavid du Colombier 44*0c0b2b49SDavid du Colombier struct Label 45*0c0b2b49SDavid du Colombier { 46*0c0b2b49SDavid du Colombier uintptr sp; 47*0c0b2b49SDavid du Colombier uintptr pc; 48*0c0b2b49SDavid du Colombier }; 49*0c0b2b49SDavid du Colombier 50*0c0b2b49SDavid du Colombier struct Confmem 51*0c0b2b49SDavid du Colombier { 52*0c0b2b49SDavid du Colombier uintptr base; 53*0c0b2b49SDavid du Colombier ulong npage; 54*0c0b2b49SDavid du Colombier uintptr kbase; 55*0c0b2b49SDavid du Colombier uintptr klimit; 56*0c0b2b49SDavid du Colombier }; 57*0c0b2b49SDavid du Colombier 58*0c0b2b49SDavid du Colombier struct Conf 59*0c0b2b49SDavid du Colombier { 60*0c0b2b49SDavid du Colombier ulong nmach; /* processors */ 61*0c0b2b49SDavid du Colombier ulong nproc; /* processes */ 62*0c0b2b49SDavid du Colombier Confmem mem[2]; /* physical memory */ 63*0c0b2b49SDavid du Colombier ulong npage; /* total physical pages of memory */ 64*0c0b2b49SDavid du Colombier ulong upages; /* user page pool */ 65*0c0b2b49SDavid du Colombier ulong nimage; /* number of page cache image headers */ 66*0c0b2b49SDavid du Colombier ulong nswap; /* number of swap pages */ 67*0c0b2b49SDavid du Colombier int nswppo; /* max # of pageouts per segment pass */ 68*0c0b2b49SDavid du Colombier ulong copymode; /* 0 is copy on write, 1 is copy on reference */ 69*0c0b2b49SDavid du Colombier ulong ialloc; /* bytes available for interrupt-time allocation */ 70*0c0b2b49SDavid du Colombier ulong pipeqsize; /* size in bytes of pipe queues */ 71*0c0b2b49SDavid du Colombier int nuart; /* number of uart devices */ 72*0c0b2b49SDavid du Colombier int monitor; /* has monitor? */ 73*0c0b2b49SDavid du Colombier }; 74*0c0b2b49SDavid du Colombier 75*0c0b2b49SDavid du Colombier /* 76*0c0b2b49SDavid du Colombier * floating point registers 77*0c0b2b49SDavid du Colombier */ 78*0c0b2b49SDavid du Colombier enum 79*0c0b2b49SDavid du Colombier { 80*0c0b2b49SDavid du Colombier /* floating point state */ 81*0c0b2b49SDavid du Colombier FPinit, 82*0c0b2b49SDavid du Colombier FPactive, 83*0c0b2b49SDavid du Colombier FPinactive, 84*0c0b2b49SDavid du Colombier FPemu, 85*0c0b2b49SDavid du Colombier 86*0c0b2b49SDavid du Colombier /* bit meaning floating point illegal */ 87*0c0b2b49SDavid du Colombier FPillegal= 0x100, 88*0c0b2b49SDavid du Colombier }; 89*0c0b2b49SDavid du Colombier 90*0c0b2b49SDavid du Colombier enum { 91*0c0b2b49SDavid du Colombier Nfpregs = 32, /* floats; half as many doubles */ 92*0c0b2b49SDavid du Colombier }; 93*0c0b2b49SDavid du Colombier 94*0c0b2b49SDavid du Colombier /* 95*0c0b2b49SDavid du Colombier * floating point 96*0c0b2b49SDavid du Colombier * fpstate is separate, kept in Proc 97*0c0b2b49SDavid du Colombier */ 98*0c0b2b49SDavid du Colombier struct FPsave 99*0c0b2b49SDavid du Colombier { 100*0c0b2b49SDavid du Colombier /* /dev/proc expects the registers to be first in FPsave */ 101*0c0b2b49SDavid du Colombier ulong reg[Nfpregs]; /* the canonical bits */ 102*0c0b2b49SDavid du Colombier union { 103*0c0b2b49SDavid du Colombier ulong fpstatus; /* both are fcr31 */ 104*0c0b2b49SDavid du Colombier ulong fpcontrol; 105*0c0b2b49SDavid du Colombier }; 106*0c0b2b49SDavid du Colombier 107*0c0b2b49SDavid du Colombier int fpdelayexec; /* executing delay slot of branch */ 108*0c0b2b49SDavid du Colombier uintptr fpdelaypc; /* pc to resume at after */ 109*0c0b2b49SDavid du Colombier ulong fpdelaysts; /* save across user-mode delay-slot execution */ 110*0c0b2b49SDavid du Colombier 111*0c0b2b49SDavid du Colombier /* stuck-fault detection */ 112*0c0b2b49SDavid du Colombier uintptr fppc; /* addr of last fault */ 113*0c0b2b49SDavid du Colombier int fpcnt; /* how many consecutive at that addr */ 114*0c0b2b49SDavid du Colombier }; 115*0c0b2b49SDavid du Colombier 116*0c0b2b49SDavid du Colombier /* 117*0c0b2b49SDavid du Colombier * mmu goo in the Proc structure 118*0c0b2b49SDavid du Colombier */ 119*0c0b2b49SDavid du Colombier struct PMMU 120*0c0b2b49SDavid du Colombier { 121*0c0b2b49SDavid du Colombier int pidonmach[MAXMACH]; 122*0c0b2b49SDavid du Colombier }; 123*0c0b2b49SDavid du Colombier 124*0c0b2b49SDavid du Colombier #include "../port/portdat.h" 125*0c0b2b49SDavid du Colombier 126*0c0b2b49SDavid du Colombier /* First FIVE members' offsets known by l.s */ 127*0c0b2b49SDavid du Colombier struct Mach 128*0c0b2b49SDavid du Colombier { 129*0c0b2b49SDavid du Colombier /* the following are all known by l.s and cannot be moved */ 130*0c0b2b49SDavid du Colombier int machno; /* physical id of processor FIRST @ 0 */ 131*0c0b2b49SDavid du Colombier Softtlb*stb; /* Software tlb simulation SECOND @ 8 */ 132*0c0b2b49SDavid du Colombier Proc* proc; /* process on this processor THIRD @ 16 */ 133*0c0b2b49SDavid du Colombier uintptr splpc; /* pc that called splhi() FOURTH @ 24 */ 134*0c0b2b49SDavid du Colombier ulong tlbfault; /* # of tlb faults FIFTH @ 32 */ 135*0c0b2b49SDavid du Colombier ulong ktlbfault; /* @ 36 */ 136*0c0b2b49SDavid du Colombier ulong utlbfault; /* @ 40 */ 137*0c0b2b49SDavid du Colombier 138*0c0b2b49SDavid du Colombier /* the following is safe to move */ 139*0c0b2b49SDavid du Colombier ulong tlbpurge; 140*0c0b2b49SDavid du Colombier ulong ticks; /* of the clock since boot time */ 141*0c0b2b49SDavid du Colombier Label sched; /* scheduler wakeup */ 142*0c0b2b49SDavid du Colombier void* alarm; /* alarms bound to this clock */ 143*0c0b2b49SDavid du Colombier int lastpid; /* last pid allocated on this machine */ 144*0c0b2b49SDavid du Colombier Proc* pidproc[NTLBPID]; /* proc that owns tlbpid on this mach */ 145*0c0b2b49SDavid du Colombier KMap* kactive; /* active on this machine */ 146*0c0b2b49SDavid du Colombier int knext; 147*0c0b2b49SDavid du Colombier uchar ktlbx[NTLB]; /* tlb index used for kmap */ 148*0c0b2b49SDavid du Colombier uchar ktlbnext; 149*0c0b2b49SDavid du Colombier int speed; /* cpu speed */ 150*0c0b2b49SDavid du Colombier ulong delayloop; /* for the delay() routine */ 151*0c0b2b49SDavid du Colombier ulong fairness; /* for runproc */ 152*0c0b2b49SDavid du Colombier int flushmmu; 153*0c0b2b49SDavid du Colombier int inclockintr; 154*0c0b2b49SDavid du Colombier int ilockdepth; 155*0c0b2b49SDavid du Colombier Perf perf; /* performance counters */ 156*0c0b2b49SDavid du Colombier uvlong cyclefreq; /* Frequency of user readable cycle counter */ 157*0c0b2b49SDavid du Colombier 158*0c0b2b49SDavid du Colombier /* for per-processor timers */ 159*0c0b2b49SDavid du Colombier ulong lastcount; 160*0c0b2b49SDavid du Colombier uvlong fastticks; 161*0c0b2b49SDavid du Colombier ulong hz; 162*0c0b2b49SDavid du Colombier ulong maxperiod; 163*0c0b2b49SDavid du Colombier ulong minperiod; 164*0c0b2b49SDavid du Colombier 165*0c0b2b49SDavid du Colombier Proc* readied; /* for runproc */ 166*0c0b2b49SDavid du Colombier ulong schedticks; /* next forced context switch */ 167*0c0b2b49SDavid du Colombier 168*0c0b2b49SDavid du Colombier int pfault; 169*0c0b2b49SDavid du Colombier int cs; 170*0c0b2b49SDavid du Colombier int syscall; 171*0c0b2b49SDavid du Colombier int load; 172*0c0b2b49SDavid du Colombier int intr; 173*0c0b2b49SDavid du Colombier int hashcoll; /* soft-tlb hash collisions */ 174*0c0b2b49SDavid du Colombier int paststartup; /* for putktlb */ 175*0c0b2b49SDavid du Colombier 176*0c0b2b49SDavid du Colombier uintptr stack[1]; 177*0c0b2b49SDavid du Colombier }; 178*0c0b2b49SDavid du Colombier 179*0c0b2b49SDavid du Colombier struct KMap 180*0c0b2b49SDavid du Colombier { 181*0c0b2b49SDavid du Colombier Ref; 182*0c0b2b49SDavid du Colombier u64int virt; 183*0c0b2b49SDavid du Colombier u64int phys0; 184*0c0b2b49SDavid du Colombier u64int phys1; 185*0c0b2b49SDavid du Colombier KMap* next; 186*0c0b2b49SDavid du Colombier KMap* konmach[MAXMACH]; 187*0c0b2b49SDavid du Colombier Page* pg; 188*0c0b2b49SDavid du Colombier uintptr pc; /* of caller to kmap() */ 189*0c0b2b49SDavid du Colombier }; 190*0c0b2b49SDavid du Colombier 191*0c0b2b49SDavid du Colombier #define VA(k) ((k)->virt) 192*0c0b2b49SDavid du Colombier #define PPN(x) ((uintptr)(x)>>6) /* PPN in TLBPHYS0-1 */ 193*0c0b2b49SDavid du Colombier 194*0c0b2b49SDavid du Colombier /* offsets known by l.s */ 195*0c0b2b49SDavid du Colombier struct Softtlb 196*0c0b2b49SDavid du Colombier { 197*0c0b2b49SDavid du Colombier u64int virt; 198*0c0b2b49SDavid du Colombier u64int phys0; 199*0c0b2b49SDavid du Colombier u64int phys1; 200*0c0b2b49SDavid du Colombier }; 201*0c0b2b49SDavid du Colombier 202*0c0b2b49SDavid du Colombier struct 203*0c0b2b49SDavid du Colombier { 204*0c0b2b49SDavid du Colombier Lock; 205*0c0b2b49SDavid du Colombier long machs; /* bitmap of processors */ 206*0c0b2b49SDavid du Colombier short exiting; 207*0c0b2b49SDavid du Colombier int ispanic; 208*0c0b2b49SDavid du Colombier } active; 209*0c0b2b49SDavid du Colombier 210*0c0b2b49SDavid du Colombier extern KMap kpte[]; 211*0c0b2b49SDavid du Colombier extern register Mach *m; 212*0c0b2b49SDavid du Colombier extern register Proc *up; 213*0c0b2b49SDavid du Colombier 214*0c0b2b49SDavid du Colombier extern FPsave initfp; 215*0c0b2b49SDavid du Colombier extern ulong memsize; 216*0c0b2b49SDavid du Colombier 217*0c0b2b49SDavid du Colombier extern int normalprint; 218*0c0b2b49SDavid du Colombier 219*0c0b2b49SDavid du Colombier /* 220*0c0b2b49SDavid du Colombier * a parsed plan9.ini line 221*0c0b2b49SDavid du Colombier */ 222*0c0b2b49SDavid du Colombier #define NISAOPT 8 223*0c0b2b49SDavid du Colombier 224*0c0b2b49SDavid du Colombier struct ISAConf { 225*0c0b2b49SDavid du Colombier char *type; 226*0c0b2b49SDavid du Colombier ulong port; 227*0c0b2b49SDavid du Colombier int irq; 228*0c0b2b49SDavid du Colombier ulong dma; 229*0c0b2b49SDavid du Colombier ulong mem; 230*0c0b2b49SDavid du Colombier ulong size; 231*0c0b2b49SDavid du Colombier ulong freq; 232*0c0b2b49SDavid du Colombier 233*0c0b2b49SDavid du Colombier int nopt; 234*0c0b2b49SDavid du Colombier char *opt[NISAOPT]; 235*0c0b2b49SDavid du Colombier }; 236*0c0b2b49SDavid du Colombier 237*0c0b2b49SDavid du Colombier typedef struct { 238*0c0b2b49SDavid du Colombier ulong port; 239*0c0b2b49SDavid du Colombier int size; 240*0c0b2b49SDavid du Colombier } Devport; 241*0c0b2b49SDavid du Colombier 242*0c0b2b49SDavid du Colombier struct DevConf 243*0c0b2b49SDavid du Colombier { 244*0c0b2b49SDavid du Colombier ulong intnum; /* interrupt number */ 245*0c0b2b49SDavid du Colombier char *type; /* card type, malloced */ 246*0c0b2b49SDavid du Colombier int nports; /* Number of ports */ 247*0c0b2b49SDavid du Colombier Devport *ports; /* The ports themselves */ 248*0c0b2b49SDavid du Colombier }; 249*0c0b2b49SDavid du Colombier 250*0c0b2b49SDavid du Colombier typedef vlong regint; /* register sized int, ensure single instr'n */ 251