1*d6dfd9efSDavid du Colombier typedef struct Conf Conf; 2*d6dfd9efSDavid du Colombier typedef struct Confmem Confmem; 3*d6dfd9efSDavid du Colombier typedef struct ISAConf ISAConf; 4*d6dfd9efSDavid du Colombier typedef struct Label Label; 5*d6dfd9efSDavid du Colombier typedef struct Lock Lock; 6*d6dfd9efSDavid du Colombier typedef struct Mach Mach; 7*d6dfd9efSDavid du Colombier typedef u32int Mreg; /* Msr - bloody UART */ 8*d6dfd9efSDavid du Colombier typedef struct Page Page; 9*d6dfd9efSDavid du Colombier typedef struct FPsave FPsave; 10*d6dfd9efSDavid du Colombier typedef struct PMMU PMMU; 11*d6dfd9efSDavid du Colombier typedef struct Proc Proc; 12*d6dfd9efSDavid du Colombier typedef struct Softtlb Softtlb; 13*d6dfd9efSDavid du Colombier typedef struct Sys Sys; 14*d6dfd9efSDavid du Colombier typedef uvlong Tval; 15*d6dfd9efSDavid du Colombier typedef struct Ureg Ureg; 16*d6dfd9efSDavid du Colombier 17*d6dfd9efSDavid du Colombier #pragma incomplete Ureg 18*d6dfd9efSDavid du Colombier 19*d6dfd9efSDavid du Colombier #define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */ 20*d6dfd9efSDavid du Colombier 21*d6dfd9efSDavid du Colombier /* 22*d6dfd9efSDavid du Colombier * parameters for sysproc.c 23*d6dfd9efSDavid du Colombier */ 24*d6dfd9efSDavid du Colombier #define AOUT_MAGIC Q_MAGIC 25*d6dfd9efSDavid du Colombier 26*d6dfd9efSDavid du Colombier /* 27*d6dfd9efSDavid du Colombier * intc bits, as of 18 aug 2009. 28*d6dfd9efSDavid du Colombier * specific to rae's virtex4 design 29*d6dfd9efSDavid du Colombier * vanilla design defines Intuarttx. 30*d6dfd9efSDavid du Colombier */ 31*d6dfd9efSDavid du Colombier enum { 32*d6dfd9efSDavid du Colombier Bitllfifo, 33*d6dfd9efSDavid du Colombier Bittemac, 34*d6dfd9efSDavid du Colombier Bitdma, 35*d6dfd9efSDavid du Colombier Bitdma2, 36*d6dfd9efSDavid du Colombier Bituart, 37*d6dfd9efSDavid du Colombier Bitmiiphy, 38*d6dfd9efSDavid du Colombier Bitqtmmacfail, /* qtm only */ 39*d6dfd9efSDavid du Colombier Bitqtmdraminit, /* qtm only */ 40*d6dfd9efSDavid du Colombier 41*d6dfd9efSDavid du Colombier Intllfifo=1<<Bitllfifo, /* local-link FIFO */ 42*d6dfd9efSDavid du Colombier Inttemac= 1<<Bittemac, 43*d6dfd9efSDavid du Colombier Intdma = 1<<Bitdma, 44*d6dfd9efSDavid du Colombier Intdma2 = 1<<Bitdma2, 45*d6dfd9efSDavid du Colombier Intuart = 1<<Bituart, 46*d6dfd9efSDavid du Colombier Intmiiphy = 1<<Bitmiiphy, 47*d6dfd9efSDavid du Colombier Intqtmmacfail= 1<<Bitqtmmacfail, 48*d6dfd9efSDavid du Colombier Intqtmdraminit= 1<<Bitqtmdraminit, 49*d6dfd9efSDavid du Colombier 50*d6dfd9efSDavid du Colombier /* led bits */ 51*d6dfd9efSDavid du Colombier Ledtrap = 1<<0, /* states: processing a trap */ 52*d6dfd9efSDavid du Colombier Ledkern = 1<<1, /* running a kernel proc */ 53*d6dfd9efSDavid du Colombier Leduser = 1<<2, /* running a user proc */ 54*d6dfd9efSDavid du Colombier Ledidle = 1<<3, /* idling */ 55*d6dfd9efSDavid du Colombier Ledpanic = 1<<4, /* panicing */ 56*d6dfd9efSDavid du Colombier Ledpulse = 1<<5, /* flags: still alive */ 57*d6dfd9efSDavid du Colombier Ledethinwait = 1<<6, /* ethernet i/o waits */ 58*d6dfd9efSDavid du Colombier Ledethoutwait = 1<<7, 59*d6dfd9efSDavid du Colombier }; 60*d6dfd9efSDavid du Colombier 61*d6dfd9efSDavid du Colombier #define LEDKERN 62*d6dfd9efSDavid du Colombier 63*d6dfd9efSDavid du Colombier /* 64*d6dfd9efSDavid du Colombier * machine dependent definitions used by ../port/dat.h 65*d6dfd9efSDavid du Colombier */ 66*d6dfd9efSDavid du Colombier 67*d6dfd9efSDavid du Colombier struct Lock 68*d6dfd9efSDavid du Colombier { 69*d6dfd9efSDavid du Colombier ulong key; 70*d6dfd9efSDavid du Colombier ulong sr; 71*d6dfd9efSDavid du Colombier ulong pc; 72*d6dfd9efSDavid du Colombier Proc *p; 73*d6dfd9efSDavid du Colombier Mach *m; 74*d6dfd9efSDavid du Colombier ushort isilock; 75*d6dfd9efSDavid du Colombier ulong magic; 76*d6dfd9efSDavid du Colombier }; 77*d6dfd9efSDavid du Colombier 78*d6dfd9efSDavid du Colombier struct Label 79*d6dfd9efSDavid du Colombier { 80*d6dfd9efSDavid du Colombier ulong sp; 81*d6dfd9efSDavid du Colombier ulong pc; 82*d6dfd9efSDavid du Colombier }; 83*d6dfd9efSDavid du Colombier 84*d6dfd9efSDavid du Colombier /* 85*d6dfd9efSDavid du Colombier * emulated floating point 86*d6dfd9efSDavid du Colombier */ 87*d6dfd9efSDavid du Colombier struct FPsave 88*d6dfd9efSDavid du Colombier { 89*d6dfd9efSDavid du Colombier union { 90*d6dfd9efSDavid du Colombier double fpscrd; 91*d6dfd9efSDavid du Colombier struct { 92*d6dfd9efSDavid du Colombier ulong pad; 93*d6dfd9efSDavid du Colombier ulong fpscr; 94*d6dfd9efSDavid du Colombier }; 95*d6dfd9efSDavid du Colombier }; 96*d6dfd9efSDavid du Colombier int fpistate; 97*d6dfd9efSDavid du Colombier ulong emreg[32][3]; 98*d6dfd9efSDavid du Colombier }; 99*d6dfd9efSDavid du Colombier 100*d6dfd9efSDavid du Colombier /* 101*d6dfd9efSDavid du Colombier * FPsave.status 102*d6dfd9efSDavid du Colombier */ 103*d6dfd9efSDavid du Colombier enum 104*d6dfd9efSDavid du Colombier { 105*d6dfd9efSDavid du Colombier FPinit, 106*d6dfd9efSDavid du Colombier FPactive, 107*d6dfd9efSDavid du Colombier FPinactive, 108*d6dfd9efSDavid du Colombier 109*d6dfd9efSDavid du Colombier /* bit or'd with the state */ 110*d6dfd9efSDavid du Colombier FPillegal= 0x100, 111*d6dfd9efSDavid du Colombier }; 112*d6dfd9efSDavid du Colombier 113*d6dfd9efSDavid du Colombier struct Confmem 114*d6dfd9efSDavid du Colombier { 115*d6dfd9efSDavid du Colombier ulong base; 116*d6dfd9efSDavid du Colombier ulong npage; 117*d6dfd9efSDavid du Colombier ulong kbase; 118*d6dfd9efSDavid du Colombier ulong klimit; 119*d6dfd9efSDavid du Colombier }; 120*d6dfd9efSDavid du Colombier 121*d6dfd9efSDavid du Colombier struct Conf 122*d6dfd9efSDavid du Colombier { 123*d6dfd9efSDavid du Colombier ulong nmach; /* processors */ 124*d6dfd9efSDavid du Colombier ulong nproc; /* processes */ 125*d6dfd9efSDavid du Colombier Confmem mem[4]; 126*d6dfd9efSDavid du Colombier ulong npage; /* total physical pages of memory */ 127*d6dfd9efSDavid du Colombier ulong upages; /* user page pool */ 128*d6dfd9efSDavid du Colombier ulong nimage; /* number of page cache image headers */ 129*d6dfd9efSDavid du Colombier ulong nswap; /* number of swap pages */ 130*d6dfd9efSDavid du Colombier int nswppo; /* max # of pageouts per segment pass */ 131*d6dfd9efSDavid du Colombier ulong copymode; /* 0 is copy on write, 1 is copy on reference */ 132*d6dfd9efSDavid du Colombier int monitor; /* has display? */ 133*d6dfd9efSDavid du Colombier ulong ialloc; /* bytes available for interrupt time allocation */ 134*d6dfd9efSDavid du Colombier ulong pipeqsize; /* size in bytes of pipe queues */ 135*d6dfd9efSDavid du Colombier }; 136*d6dfd9efSDavid du Colombier 137*d6dfd9efSDavid du Colombier /* 138*d6dfd9efSDavid du Colombier * mmu goo in the Proc structure 139*d6dfd9efSDavid du Colombier */ 140*d6dfd9efSDavid du Colombier #define NCOLOR 1 141*d6dfd9efSDavid du Colombier struct PMMU 142*d6dfd9efSDavid du Colombier { 143*d6dfd9efSDavid du Colombier int mmupid; 144*d6dfd9efSDavid du Colombier }; 145*d6dfd9efSDavid du Colombier 146*d6dfd9efSDavid du Colombier /* debugging */ 147*d6dfd9efSDavid du Colombier #define TRIGGER() *(int *)(PHYSSRAM + 0xf0) = 0 148*d6dfd9efSDavid du Colombier 149*d6dfd9efSDavid du Colombier #include "../port/portdat.h" 150*d6dfd9efSDavid du Colombier 151*d6dfd9efSDavid du Colombier /* 152*d6dfd9efSDavid du Colombier * machine dependent definitions not used by ../port/dat.h 153*d6dfd9efSDavid du Colombier */ 154*d6dfd9efSDavid du Colombier /* 155*d6dfd9efSDavid du Colombier * Fake kmap 156*d6dfd9efSDavid du Colombier */ 157*d6dfd9efSDavid du Colombier typedef void KMap; 158*d6dfd9efSDavid du Colombier #define VA(k) PTR2UINT(k) 159*d6dfd9efSDavid du Colombier #define kmap(p) (KMap*)((p)->pa|KZERO) 160*d6dfd9efSDavid du Colombier #define kmapinval() 161*d6dfd9efSDavid du Colombier #define kunmap(k) 162*d6dfd9efSDavid du Colombier 163*d6dfd9efSDavid du Colombier struct Mach 164*d6dfd9efSDavid du Colombier { 165*d6dfd9efSDavid du Colombier /* OFFSETS OF THE FOLLOWING KNOWN BY l.s */ 166*d6dfd9efSDavid du Colombier int machno; /* physical id of processor [0*4] */ 167*d6dfd9efSDavid du Colombier ulong splpc; /* pc that called splhi() [1*4] */ 168*d6dfd9efSDavid du Colombier Proc *proc; /* current process on this processor [2*4] */ 169*d6dfd9efSDavid du Colombier uintptr pstlb; /* physical address of Mach.stlb [3*4] */ 170*d6dfd9efSDavid du Colombier int utlbhi; /* lowest tlb index in use by kernel [4*4] */ 171*d6dfd9efSDavid du Colombier int utlbnext; /* next tlb entry to use for user (round robin) [5*4] */ 172*d6dfd9efSDavid du Colombier int tlbfault; /* number of tlb i/d misses [6*4] */ 173*d6dfd9efSDavid du Colombier 174*d6dfd9efSDavid du Colombier /* ordering from here on irrelevant */ 175*d6dfd9efSDavid du Colombier 176*d6dfd9efSDavid du Colombier ulong ticks; /* of the clock since boot time */ 177*d6dfd9efSDavid du Colombier Label sched; /* scheduler wakeup */ 178*d6dfd9efSDavid du Colombier Lock alarmlock; /* access to alarm list */ 179*d6dfd9efSDavid du Colombier void *alarm; /* alarms bound to this clock */ 180*d6dfd9efSDavid du Colombier int inclockintr; 181*d6dfd9efSDavid du Colombier 182*d6dfd9efSDavid du Colombier Proc* readied; /* for runproc */ 183*d6dfd9efSDavid du Colombier ulong schedticks; /* next forced context switch */ 184*d6dfd9efSDavid du Colombier 185*d6dfd9efSDavid du Colombier Mach *me; /* debugging: should be my own address */ 186*d6dfd9efSDavid du Colombier 187*d6dfd9efSDavid du Colombier long oscclk; /* oscillator frequency (MHz) */ 188*d6dfd9efSDavid du Colombier long cpuhz; /* general system clock (cycles) */ 189*d6dfd9efSDavid du Colombier long clockgen; /* clock generator frequency (cycles) */ 190*d6dfd9efSDavid du Colombier long vcohz; 191*d6dfd9efSDavid du Colombier long pllhz; 192*d6dfd9efSDavid du Colombier long plbhz; 193*d6dfd9efSDavid du Colombier long opbhz; 194*d6dfd9efSDavid du Colombier long epbhz; 195*d6dfd9efSDavid du Colombier long pcihz; 196*d6dfd9efSDavid du Colombier int cputype; 197*d6dfd9efSDavid du Colombier ulong delayloop; 198*d6dfd9efSDavid du Colombier uvlong cyclefreq; /* frequency of user readable cycle clock */ 199*d6dfd9efSDavid du Colombier 200*d6dfd9efSDavid du Colombier Mach *me2; /* debugging: should be my own address */ 201*d6dfd9efSDavid du Colombier 202*d6dfd9efSDavid du Colombier uvlong fastclock; 203*d6dfd9efSDavid du Colombier Perf perf; /* performance counters */ 204*d6dfd9efSDavid du Colombier 205*d6dfd9efSDavid du Colombier int tlbpurge; /* ... */ 206*d6dfd9efSDavid du Colombier int pfault; 207*d6dfd9efSDavid du Colombier int cs; 208*d6dfd9efSDavid du Colombier int syscall; 209*d6dfd9efSDavid du Colombier int load; 210*d6dfd9efSDavid du Colombier int intr; 211*d6dfd9efSDavid du Colombier int flushmmu; /* make current proc flush its mmu state */ 212*d6dfd9efSDavid du Colombier int ilockdepth; 213*d6dfd9efSDavid du Colombier 214*d6dfd9efSDavid du Colombier int lastpid; /* last TLB pid allocated on this machine */ 215*d6dfd9efSDavid du Colombier QLock stlblock; /* prevent context switch during tlb update */ 216*d6dfd9efSDavid du Colombier Softtlb* stlb; /* software tlb cache (see also pstlb above) */ 217*d6dfd9efSDavid du Colombier Proc* pidproc[NTLBPID]; /* which proc owns a given pid */ 218*d6dfd9efSDavid du Colombier 219*d6dfd9efSDavid du Colombier ulong spuriousintr; 220*d6dfd9efSDavid du Colombier int lastintr; 221*d6dfd9efSDavid du Colombier 222*d6dfd9efSDavid du Colombier ulong magic; /* debugging; also check for stack overflow */ 223*d6dfd9efSDavid du Colombier 224*d6dfd9efSDavid du Colombier /* MUST BE LAST */ 225*d6dfd9efSDavid du Colombier int stack[1]; 226*d6dfd9efSDavid du Colombier }; 227*d6dfd9efSDavid du Colombier 228*d6dfd9efSDavid du Colombier struct Softtlb { 229*d6dfd9efSDavid du Colombier u32int hi; /* tlb hi, except that low order 10 bits have (pid[8]<<2) */ 230*d6dfd9efSDavid du Colombier u32int lo; 231*d6dfd9efSDavid du Colombier }; 232*d6dfd9efSDavid du Colombier 233*d6dfd9efSDavid du Colombier struct 234*d6dfd9efSDavid du Colombier { 235*d6dfd9efSDavid du Colombier Lock; 236*d6dfd9efSDavid du Colombier short machs; 237*d6dfd9efSDavid du Colombier short exiting; 238*d6dfd9efSDavid du Colombier short ispanic; 239*d6dfd9efSDavid du Colombier int thunderbirdsarego; /* lets the added processors continue to schedinit */ 240*d6dfd9efSDavid du Colombier }active; 241*d6dfd9efSDavid du Colombier 242*d6dfd9efSDavid du Colombier /* 243*d6dfd9efSDavid du Colombier * a parsed plan9.ini line 244*d6dfd9efSDavid du Colombier */ 245*d6dfd9efSDavid du Colombier #define NISAOPT 8 246*d6dfd9efSDavid du Colombier 247*d6dfd9efSDavid du Colombier struct ISAConf { 248*d6dfd9efSDavid du Colombier char *type; 249*d6dfd9efSDavid du Colombier ulong port; 250*d6dfd9efSDavid du Colombier int irq; 251*d6dfd9efSDavid du Colombier ulong dma; 252*d6dfd9efSDavid du Colombier ulong mem; 253*d6dfd9efSDavid du Colombier ulong size; 254*d6dfd9efSDavid du Colombier ulong freq; 255*d6dfd9efSDavid du Colombier 256*d6dfd9efSDavid du Colombier int nopt; 257*d6dfd9efSDavid du Colombier char *opt[NISAOPT]; 258*d6dfd9efSDavid du Colombier }; 259*d6dfd9efSDavid du Colombier 260*d6dfd9efSDavid du Colombier #define MACHP(n) ((Mach *)((int)&mach0 + (n)*BY2PG)) 261*d6dfd9efSDavid du Colombier extern Mach mach0; 262*d6dfd9efSDavid du Colombier 263*d6dfd9efSDavid du Colombier extern register Mach *m; 264*d6dfd9efSDavid du Colombier extern register Proc *up; 265*d6dfd9efSDavid du Colombier 266*d6dfd9efSDavid du Colombier /* 267*d6dfd9efSDavid du Colombier * Horrid. But the alternative is 'defined'. 268*d6dfd9efSDavid du Colombier */ 269*d6dfd9efSDavid du Colombier #ifdef _DBGC_ 270*d6dfd9efSDavid du Colombier #define DBGFLG (dbgflg[_DBGC_]) 271*d6dfd9efSDavid du Colombier #else 272*d6dfd9efSDavid du Colombier #define DBGFLG (0) 273*d6dfd9efSDavid du Colombier #endif /* _DBGC_ */ 274*d6dfd9efSDavid du Colombier 275*d6dfd9efSDavid du Colombier // #define DBG(...) if(DBGFLG) dbgprint(__VA_ARGS__) 276*d6dfd9efSDavid du Colombier 277*d6dfd9efSDavid du Colombier typedef struct { 278*d6dfd9efSDavid du Colombier ulong lasttm; /* last mutation start in seconds */ 279*d6dfd9efSDavid du Colombier ulong startticks; 280*d6dfd9efSDavid du Colombier ulong lastticks; 281*d6dfd9efSDavid du Colombier ulong count; 282*d6dfd9efSDavid du Colombier ulong totticks; 283*d6dfd9efSDavid du Colombier 284*d6dfd9efSDavid du Colombier ulong period; /* in seconds */ 285*d6dfd9efSDavid du Colombier } Mutstats; 286*d6dfd9efSDavid du Colombier extern Mutstats mutstats; 287*d6dfd9efSDavid du Colombier 288*d6dfd9efSDavid du Colombier char dbgflg[256]; 289*d6dfd9efSDavid du Colombier ulong intrs1sec; /* count interrupts in this second */ 290*d6dfd9efSDavid du Colombier uintptr memsz; 291*d6dfd9efSDavid du Colombier int okprint; 292*d6dfd9efSDavid du Colombier int securemem; 293*d6dfd9efSDavid du Colombier int vflag; 294*d6dfd9efSDavid du Colombier 295*d6dfd9efSDavid du Colombier #define dbgprint print /* for now */ 296