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