1*5d9de2d3SDavid du Colombier /* 2*5d9de2d3SDavid du Colombier * Time. 3*5d9de2d3SDavid du Colombier * 4*5d9de2d3SDavid du Colombier * HZ should divide 1000 evenly, ideally. 5*5d9de2d3SDavid du Colombier * 100, 125, 200, 250 and 333 are okay. 6*5d9de2d3SDavid du Colombier */ 7*5d9de2d3SDavid du Colombier #define HZ 100 /* clock frequency */ 8*5d9de2d3SDavid du Colombier #define MS2HZ (1000/HZ) /* millisec per clock tick */ 9*5d9de2d3SDavid du Colombier #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ 10*5d9de2d3SDavid du Colombier 11*5d9de2d3SDavid du Colombier enum { 12*5d9de2d3SDavid du Colombier Mhz = 1000 * 1000, 13*5d9de2d3SDavid du Colombier }; 14*5d9de2d3SDavid du Colombier 15*5d9de2d3SDavid du Colombier typedef struct Conf Conf; 16*5d9de2d3SDavid du Colombier typedef struct Confmem Confmem; 17*5d9de2d3SDavid du Colombier typedef struct FPsave FPsave; 18*5d9de2d3SDavid du Colombier typedef struct ISAConf ISAConf; 19*5d9de2d3SDavid du Colombier typedef struct Label Label; 20*5d9de2d3SDavid du Colombier typedef struct Lock Lock; 21*5d9de2d3SDavid du Colombier typedef struct Memcache Memcache; 22*5d9de2d3SDavid du Colombier typedef struct MMMU MMMU; 23*5d9de2d3SDavid du Colombier typedef struct Mach Mach; 24*5d9de2d3SDavid du Colombier typedef struct Notsave Notsave; 25*5d9de2d3SDavid du Colombier typedef struct Page Page; 26*5d9de2d3SDavid du Colombier typedef struct PhysUart PhysUart; 27*5d9de2d3SDavid du Colombier typedef struct PMMU PMMU; 28*5d9de2d3SDavid du Colombier typedef struct Proc Proc; 29*5d9de2d3SDavid du Colombier typedef u32int PTE; 30*5d9de2d3SDavid du Colombier typedef struct Uart Uart; 31*5d9de2d3SDavid du Colombier typedef struct Ureg Ureg; 32*5d9de2d3SDavid du Colombier typedef uvlong Tval; 33*5d9de2d3SDavid du Colombier 34*5d9de2d3SDavid du Colombier #pragma incomplete Ureg 35*5d9de2d3SDavid du Colombier 36*5d9de2d3SDavid du Colombier #define MAXSYSARG 5 /* for mount(fd, mpt, flag, arg, srv) */ 37*5d9de2d3SDavid du Colombier 38*5d9de2d3SDavid du Colombier /* 39*5d9de2d3SDavid du Colombier * parameters for sysproc.c 40*5d9de2d3SDavid du Colombier */ 41*5d9de2d3SDavid du Colombier #define AOUT_MAGIC (E_MAGIC) 42*5d9de2d3SDavid du Colombier 43*5d9de2d3SDavid du Colombier struct Lock 44*5d9de2d3SDavid du Colombier { 45*5d9de2d3SDavid du Colombier ulong key; 46*5d9de2d3SDavid du Colombier u32int sr; 47*5d9de2d3SDavid du Colombier uintptr pc; 48*5d9de2d3SDavid du Colombier Proc* p; 49*5d9de2d3SDavid du Colombier Mach* m; 50*5d9de2d3SDavid du Colombier int isilock; 51*5d9de2d3SDavid du Colombier }; 52*5d9de2d3SDavid du Colombier 53*5d9de2d3SDavid du Colombier struct Label 54*5d9de2d3SDavid du Colombier { 55*5d9de2d3SDavid du Colombier uintptr sp; 56*5d9de2d3SDavid du Colombier uintptr pc; 57*5d9de2d3SDavid du Colombier }; 58*5d9de2d3SDavid du Colombier 59*5d9de2d3SDavid du Colombier enum { 60*5d9de2d3SDavid du Colombier Maxfpregs = 32, /* could be 16 or 32, see Mach.fpnregs */ 61*5d9de2d3SDavid du Colombier Nfpctlregs = 16, 62*5d9de2d3SDavid du Colombier }; 63*5d9de2d3SDavid du Colombier 64*5d9de2d3SDavid du Colombier /* 65*5d9de2d3SDavid du Colombier * emulated or vfp3 floating point 66*5d9de2d3SDavid du Colombier */ 67*5d9de2d3SDavid du Colombier struct FPsave 68*5d9de2d3SDavid du Colombier { 69*5d9de2d3SDavid du Colombier ulong status; 70*5d9de2d3SDavid du Colombier ulong control; 71*5d9de2d3SDavid du Colombier /* 72*5d9de2d3SDavid du Colombier * vfp3 with ieee fp regs; uvlong is sufficient for hardware but 73*5d9de2d3SDavid du Colombier * each must be able to hold an Internal from fpi.h for sw emulation. 74*5d9de2d3SDavid du Colombier */ 75*5d9de2d3SDavid du Colombier ulong regs[Maxfpregs][3]; 76*5d9de2d3SDavid du Colombier 77*5d9de2d3SDavid du Colombier int fpstate; 78*5d9de2d3SDavid du Colombier uintptr pc; /* of failed fp instr. */ 79*5d9de2d3SDavid du Colombier }; 80*5d9de2d3SDavid du Colombier 81*5d9de2d3SDavid du Colombier /* 82*5d9de2d3SDavid du Colombier * FPsave.fpstate 83*5d9de2d3SDavid du Colombier */ 84*5d9de2d3SDavid du Colombier enum 85*5d9de2d3SDavid du Colombier { 86*5d9de2d3SDavid du Colombier FPinit, 87*5d9de2d3SDavid du Colombier FPactive, 88*5d9de2d3SDavid du Colombier FPinactive, 89*5d9de2d3SDavid du Colombier FPemu, 90*5d9de2d3SDavid du Colombier 91*5d9de2d3SDavid du Colombier /* bits or'd with the state */ 92*5d9de2d3SDavid du Colombier FPillegal= 0x100, 93*5d9de2d3SDavid du Colombier }; 94*5d9de2d3SDavid du Colombier 95*5d9de2d3SDavid du Colombier struct Confmem 96*5d9de2d3SDavid du Colombier { 97*5d9de2d3SDavid du Colombier uintptr base; 98*5d9de2d3SDavid du Colombier usize npage; 99*5d9de2d3SDavid du Colombier uintptr limit; 100*5d9de2d3SDavid du Colombier uintptr kbase; 101*5d9de2d3SDavid du Colombier uintptr klimit; 102*5d9de2d3SDavid du Colombier }; 103*5d9de2d3SDavid du Colombier 104*5d9de2d3SDavid du Colombier struct Conf 105*5d9de2d3SDavid du Colombier { 106*5d9de2d3SDavid du Colombier ulong nmach; /* processors */ 107*5d9de2d3SDavid du Colombier ulong nproc; /* processes */ 108*5d9de2d3SDavid du Colombier Confmem mem[1]; /* physical memory */ 109*5d9de2d3SDavid du Colombier ulong npage; /* total physical pages of memory */ 110*5d9de2d3SDavid du Colombier usize upages; /* user page pool */ 111*5d9de2d3SDavid du Colombier ulong copymode; /* 0 is copy on write, 1 is copy on reference */ 112*5d9de2d3SDavid du Colombier ulong ialloc; /* max interrupt time allocation in bytes */ 113*5d9de2d3SDavid du Colombier ulong pipeqsize; /* size in bytes of pipe queues */ 114*5d9de2d3SDavid du Colombier ulong nimage; /* number of page cache image headers */ 115*5d9de2d3SDavid du Colombier ulong nswap; /* number of swap pages */ 116*5d9de2d3SDavid du Colombier int nswppo; /* max # of pageouts per segment pass */ 117*5d9de2d3SDavid du Colombier ulong hz; /* processor cycle freq */ 118*5d9de2d3SDavid du Colombier ulong mhz; 119*5d9de2d3SDavid du Colombier int monitor; /* flag */ 120*5d9de2d3SDavid du Colombier }; 121*5d9de2d3SDavid du Colombier 122*5d9de2d3SDavid du Colombier /* 123*5d9de2d3SDavid du Colombier * things saved in the Proc structure during a notify 124*5d9de2d3SDavid du Colombier */ 125*5d9de2d3SDavid du Colombier struct Notsave { 126*5d9de2d3SDavid du Colombier int emptiness; 127*5d9de2d3SDavid du Colombier }; 128*5d9de2d3SDavid du Colombier 129*5d9de2d3SDavid du Colombier /* 130*5d9de2d3SDavid du Colombier * MMU stuff in Mach. 131*5d9de2d3SDavid du Colombier */ 132*5d9de2d3SDavid du Colombier struct MMMU 133*5d9de2d3SDavid du Colombier { 134*5d9de2d3SDavid du Colombier PTE* mmul1; /* l1 for this processor */ 135*5d9de2d3SDavid du Colombier int mmul1lo; 136*5d9de2d3SDavid du Colombier int mmul1hi; 137*5d9de2d3SDavid du Colombier int mmupid; 138*5d9de2d3SDavid du Colombier }; 139*5d9de2d3SDavid du Colombier 140*5d9de2d3SDavid du Colombier /* 141*5d9de2d3SDavid du Colombier * MMU stuff in proc 142*5d9de2d3SDavid du Colombier */ 143*5d9de2d3SDavid du Colombier #define NCOLOR 1 /* 1 level cache, don't worry about VCE's */ 144*5d9de2d3SDavid du Colombier struct PMMU 145*5d9de2d3SDavid du Colombier { 146*5d9de2d3SDavid du Colombier Page* mmul2; 147*5d9de2d3SDavid du Colombier Page* mmul2cache; /* free mmu pages */ 148*5d9de2d3SDavid du Colombier }; 149*5d9de2d3SDavid du Colombier 150*5d9de2d3SDavid du Colombier #include "../port/portdat.h" 151*5d9de2d3SDavid du Colombier 152*5d9de2d3SDavid du Colombier struct Mach 153*5d9de2d3SDavid du Colombier { 154*5d9de2d3SDavid du Colombier int machno; /* physical id of processor */ 155*5d9de2d3SDavid du Colombier uintptr splpc; /* pc of last caller to splhi */ 156*5d9de2d3SDavid du Colombier 157*5d9de2d3SDavid du Colombier Proc* proc; /* current process */ 158*5d9de2d3SDavid du Colombier 159*5d9de2d3SDavid du Colombier MMMU; 160*5d9de2d3SDavid du Colombier int flushmmu; /* flush current proc mmu state */ 161*5d9de2d3SDavid du Colombier 162*5d9de2d3SDavid du Colombier ulong ticks; /* of the clock since boot time */ 163*5d9de2d3SDavid du Colombier Label sched; /* scheduler wakeup */ 164*5d9de2d3SDavid du Colombier Lock alarmlock; /* access to alarm list */ 165*5d9de2d3SDavid du Colombier void* alarm; /* alarms bound to this clock */ 166*5d9de2d3SDavid du Colombier 167*5d9de2d3SDavid du Colombier Proc* readied; /* for runproc */ 168*5d9de2d3SDavid du Colombier ulong schedticks; /* next forced context switch */ 169*5d9de2d3SDavid du Colombier 170*5d9de2d3SDavid du Colombier int cputype; 171*5d9de2d3SDavid du Colombier ulong delayloop; 172*5d9de2d3SDavid du Colombier 173*5d9de2d3SDavid du Colombier /* stats */ 174*5d9de2d3SDavid du Colombier int tlbfault; 175*5d9de2d3SDavid du Colombier int tlbpurge; 176*5d9de2d3SDavid du Colombier int pfault; 177*5d9de2d3SDavid du Colombier int cs; 178*5d9de2d3SDavid du Colombier int syscall; 179*5d9de2d3SDavid du Colombier int load; 180*5d9de2d3SDavid du Colombier int intr; 181*5d9de2d3SDavid du Colombier uvlong fastclock; /* last sampled value */ 182*5d9de2d3SDavid du Colombier ulong spuriousintr; 183*5d9de2d3SDavid du Colombier int lastintr; 184*5d9de2d3SDavid du Colombier int ilockdepth; 185*5d9de2d3SDavid du Colombier Perf perf; /* performance counters */ 186*5d9de2d3SDavid du Colombier 187*5d9de2d3SDavid du Colombier 188*5d9de2d3SDavid du Colombier int cpumhz; 189*5d9de2d3SDavid du Colombier uvlong cpuhz; /* speed of cpu */ 190*5d9de2d3SDavid du Colombier uvlong cyclefreq; /* Frequency of user readable cycle counter */ 191*5d9de2d3SDavid du Colombier 192*5d9de2d3SDavid du Colombier /* vfp2 or vfp3 fpu */ 193*5d9de2d3SDavid du Colombier int havefp; 194*5d9de2d3SDavid du Colombier int havefpvalid; 195*5d9de2d3SDavid du Colombier int fpon; 196*5d9de2d3SDavid du Colombier int fpconfiged; 197*5d9de2d3SDavid du Colombier int fpnregs; 198*5d9de2d3SDavid du Colombier ulong fpscr; /* sw copy */ 199*5d9de2d3SDavid du Colombier int fppid; /* pid of last fault */ 200*5d9de2d3SDavid du Colombier uintptr fppc; /* addr of last fault */ 201*5d9de2d3SDavid du Colombier int fpcnt; /* how many consecutive at that addr */ 202*5d9de2d3SDavid du Colombier 203*5d9de2d3SDavid du Colombier /* save areas for exceptions, hold R0-R4 */ 204*5d9de2d3SDavid du Colombier u32int sfiq[5]; 205*5d9de2d3SDavid du Colombier u32int sirq[5]; 206*5d9de2d3SDavid du Colombier u32int sund[5]; 207*5d9de2d3SDavid du Colombier u32int sabt[5]; 208*5d9de2d3SDavid du Colombier u32int smon[5]; /* probably not needed */ 209*5d9de2d3SDavid du Colombier u32int ssys[5]; 210*5d9de2d3SDavid du Colombier 211*5d9de2d3SDavid du Colombier int stack[1]; 212*5d9de2d3SDavid du Colombier }; 213*5d9de2d3SDavid du Colombier 214*5d9de2d3SDavid du Colombier /* 215*5d9de2d3SDavid du Colombier * Fake kmap. 216*5d9de2d3SDavid du Colombier */ 217*5d9de2d3SDavid du Colombier typedef void KMap; 218*5d9de2d3SDavid du Colombier #define VA(k) ((uintptr)(k)) 219*5d9de2d3SDavid du Colombier #define kmap(p) (KMap*)((p)->pa|kseg0) 220*5d9de2d3SDavid du Colombier #define kunmap(k) 221*5d9de2d3SDavid du Colombier 222*5d9de2d3SDavid du Colombier struct 223*5d9de2d3SDavid du Colombier { 224*5d9de2d3SDavid du Colombier Lock; 225*5d9de2d3SDavid du Colombier int machs; /* bitmap of active CPUs */ 226*5d9de2d3SDavid du Colombier int exiting; /* shutdown */ 227*5d9de2d3SDavid du Colombier int ispanic; /* shutdown in response to a panic */ 228*5d9de2d3SDavid du Colombier }active; 229*5d9de2d3SDavid du Colombier 230*5d9de2d3SDavid du Colombier extern register Mach* m; /* R10 */ 231*5d9de2d3SDavid du Colombier extern register Proc* up; /* R9 */ 232*5d9de2d3SDavid du Colombier extern uintptr kseg0; 233*5d9de2d3SDavid du Colombier extern Mach* machaddr[MAXMACH]; 234*5d9de2d3SDavid du Colombier extern ulong memsize; 235*5d9de2d3SDavid du Colombier extern int normalprint; 236*5d9de2d3SDavid du Colombier 237*5d9de2d3SDavid du Colombier /* 238*5d9de2d3SDavid du Colombier * a parsed plan9.ini line 239*5d9de2d3SDavid du Colombier */ 240*5d9de2d3SDavid du Colombier #define NISAOPT 8 241*5d9de2d3SDavid du Colombier 242*5d9de2d3SDavid du Colombier struct ISAConf { 243*5d9de2d3SDavid du Colombier char *type; 244*5d9de2d3SDavid du Colombier ulong port; 245*5d9de2d3SDavid du Colombier int irq; 246*5d9de2d3SDavid du Colombier ulong dma; 247*5d9de2d3SDavid du Colombier ulong mem; 248*5d9de2d3SDavid du Colombier ulong size; 249*5d9de2d3SDavid du Colombier ulong freq; 250*5d9de2d3SDavid du Colombier 251*5d9de2d3SDavid du Colombier int nopt; 252*5d9de2d3SDavid du Colombier char *opt[NISAOPT]; 253*5d9de2d3SDavid du Colombier }; 254*5d9de2d3SDavid du Colombier 255*5d9de2d3SDavid du Colombier #define MACHP(n) (machaddr[n]) 256*5d9de2d3SDavid du Colombier 257*5d9de2d3SDavid du Colombier /* 258*5d9de2d3SDavid du Colombier * Horrid. But the alternative is 'defined'. 259*5d9de2d3SDavid du Colombier */ 260*5d9de2d3SDavid du Colombier #ifdef _DBGC_ 261*5d9de2d3SDavid du Colombier #define DBGFLG (dbgflg[_DBGC_]) 262*5d9de2d3SDavid du Colombier #else 263*5d9de2d3SDavid du Colombier #define DBGFLG (0) 264*5d9de2d3SDavid du Colombier #endif /* _DBGC_ */ 265*5d9de2d3SDavid du Colombier 266*5d9de2d3SDavid du Colombier int vflag; 267*5d9de2d3SDavid du Colombier extern char dbgflg[256]; 268*5d9de2d3SDavid du Colombier 269*5d9de2d3SDavid du Colombier #define dbgprint print /* for now */ 270*5d9de2d3SDavid du Colombier 271*5d9de2d3SDavid du Colombier /* 272*5d9de2d3SDavid du Colombier * hardware info about a device 273*5d9de2d3SDavid du Colombier */ 274*5d9de2d3SDavid du Colombier typedef struct { 275*5d9de2d3SDavid du Colombier ulong port; 276*5d9de2d3SDavid du Colombier int size; 277*5d9de2d3SDavid du Colombier } Devport; 278*5d9de2d3SDavid du Colombier 279*5d9de2d3SDavid du Colombier struct DevConf 280*5d9de2d3SDavid du Colombier { 281*5d9de2d3SDavid du Colombier ulong intnum; /* interrupt number */ 282*5d9de2d3SDavid du Colombier char *type; /* card type, malloced */ 283*5d9de2d3SDavid du Colombier int nports; /* Number of ports */ 284*5d9de2d3SDavid du Colombier Devport *ports; /* The ports themselves */ 285*5d9de2d3SDavid du Colombier }; 286*5d9de2d3SDavid du Colombier 287