1*74a4d8c2SCharles.Forsyth typedef struct Alarm Alarm; 2*74a4d8c2SCharles.Forsyth typedef struct Block Block; 3*74a4d8c2SCharles.Forsyth typedef struct IMM IMM; 4*74a4d8c2SCharles.Forsyth typedef struct Queue Queue; 5*74a4d8c2SCharles.Forsyth 6*74a4d8c2SCharles.Forsyth typedef struct List { 7*74a4d8c2SCharles.Forsyth void *next; 8*74a4d8c2SCharles.Forsyth } List; 9*74a4d8c2SCharles.Forsyth 10*74a4d8c2SCharles.Forsyth typedef struct { 11*74a4d8c2SCharles.Forsyth int fake; 12*74a4d8c2SCharles.Forsyth int pri; 13*74a4d8c2SCharles.Forsyth } Lock; 14*74a4d8c2SCharles.Forsyth #define lock(x) 15*74a4d8c2SCharles.Forsyth #define unlock(x) 16*74a4d8c2SCharles.Forsyth 17*74a4d8c2SCharles.Forsyth struct Alarm { 18*74a4d8c2SCharles.Forsyth List; 19*74a4d8c2SCharles.Forsyth int busy; 20*74a4d8c2SCharles.Forsyth long dt; 21*74a4d8c2SCharles.Forsyth void (*f)(Alarm*); 22*74a4d8c2SCharles.Forsyth void *arg; 23*74a4d8c2SCharles.Forsyth }; 24*74a4d8c2SCharles.Forsyth 25*74a4d8c2SCharles.Forsyth enum { 26*74a4d8c2SCharles.Forsyth Eaddrlen = 6, 27*74a4d8c2SCharles.Forsyth ETHERMINTU = 60, /* minimum transmit size */ 28*74a4d8c2SCharles.Forsyth ETHERMAXTU = 1514, /* maximum transmit size */ 29*74a4d8c2SCharles.Forsyth ETHERHDRSIZE = 14, /* size of an ethernet header */ 30*74a4d8c2SCharles.Forsyth 31*74a4d8c2SCharles.Forsyth MaxEther = 4, 32*74a4d8c2SCharles.Forsyth }; 33*74a4d8c2SCharles.Forsyth 34*74a4d8c2SCharles.Forsyth typedef struct { 35*74a4d8c2SCharles.Forsyth uchar d[Eaddrlen]; 36*74a4d8c2SCharles.Forsyth uchar s[Eaddrlen]; 37*74a4d8c2SCharles.Forsyth uchar type[2]; 38*74a4d8c2SCharles.Forsyth uchar data[1500]; 39*74a4d8c2SCharles.Forsyth uchar crc[4]; 40*74a4d8c2SCharles.Forsyth } Etherpkt; 41*74a4d8c2SCharles.Forsyth 42*74a4d8c2SCharles.Forsyth extern uchar broadcast[Eaddrlen]; 43*74a4d8c2SCharles.Forsyth 44*74a4d8c2SCharles.Forsyth enum { 45*74a4d8c2SCharles.Forsyth Npart = 20+2, /* 8 sub partitions, disk, and partition */ 46*74a4d8c2SCharles.Forsyth Maxxfer = 16*1024, /* maximum transfer size/cmd */ 47*74a4d8c2SCharles.Forsyth }; 48*74a4d8c2SCharles.Forsyth 49*74a4d8c2SCharles.Forsyth typedef struct { 50*74a4d8c2SCharles.Forsyth ulong start; 51*74a4d8c2SCharles.Forsyth ulong end; 52*74a4d8c2SCharles.Forsyth char name[NAMELEN+1]; 53*74a4d8c2SCharles.Forsyth } Partition; 54*74a4d8c2SCharles.Forsyth 55*74a4d8c2SCharles.Forsyth typedef struct { 56*74a4d8c2SCharles.Forsyth int online; 57*74a4d8c2SCharles.Forsyth int npart; /* number of real partitions */ 58*74a4d8c2SCharles.Forsyth Partition p[Npart]; 59*74a4d8c2SCharles.Forsyth ulong offset; 60*74a4d8c2SCharles.Forsyth Partition *current; /* current partition */ 61*74a4d8c2SCharles.Forsyth 62*74a4d8c2SCharles.Forsyth ulong cap; /* total bytes */ 63*74a4d8c2SCharles.Forsyth int bytes; /* bytes/sector */ 64*74a4d8c2SCharles.Forsyth int sectors; /* sectors/track */ 65*74a4d8c2SCharles.Forsyth int heads; /* heads/cyl */ 66*74a4d8c2SCharles.Forsyth long cyl; /* cylinders/drive */ 67*74a4d8c2SCharles.Forsyth 68*74a4d8c2SCharles.Forsyth char lba; /* true if drive has logical block addressing */ 69*74a4d8c2SCharles.Forsyth char multi; /* non-zero if drive does multiple block xfers */ 70*74a4d8c2SCharles.Forsyth } Disc; 71*74a4d8c2SCharles.Forsyth 72*74a4d8c2SCharles.Forsyth enum { 73*74a4d8c2SCharles.Forsyth ScsiTestunit = 0x00, 74*74a4d8c2SCharles.Forsyth ScsiExtsens = 0x03, 75*74a4d8c2SCharles.Forsyth ScsiInquiry = 0x12, 76*74a4d8c2SCharles.Forsyth ScsiModesense = 0x1a, 77*74a4d8c2SCharles.Forsyth ScsiStartunit = 0x1B, 78*74a4d8c2SCharles.Forsyth ScsiStopunit = 0x1B, 79*74a4d8c2SCharles.Forsyth ScsiGetcap = 0x25, 80*74a4d8c2SCharles.Forsyth ScsiRead = 0x08, 81*74a4d8c2SCharles.Forsyth ScsiWrite = 0x0a, 82*74a4d8c2SCharles.Forsyth ScsiExtread = 0x28, 83*74a4d8c2SCharles.Forsyth ScsiExtwrite = 0x2a, 84*74a4d8c2SCharles.Forsyth 85*74a4d8c2SCharles.Forsyth /* data direction */ 86*74a4d8c2SCharles.Forsyth ScsiIn = 1, 87*74a4d8c2SCharles.Forsyth ScsiOut = 0, 88*74a4d8c2SCharles.Forsyth }; 89*74a4d8c2SCharles.Forsyth 90*74a4d8c2SCharles.Forsyth typedef struct Scsibuf Scsibuf; 91*74a4d8c2SCharles.Forsyth typedef struct Scsibuf { 92*74a4d8c2SCharles.Forsyth void* virt; 93*74a4d8c2SCharles.Forsyth void* phys; 94*74a4d8c2SCharles.Forsyth Scsibuf* next; 95*74a4d8c2SCharles.Forsyth }; 96*74a4d8c2SCharles.Forsyth 97*74a4d8c2SCharles.Forsyth typedef struct Scsidata { 98*74a4d8c2SCharles.Forsyth uchar* base; 99*74a4d8c2SCharles.Forsyth uchar* lim; 100*74a4d8c2SCharles.Forsyth uchar* ptr; 101*74a4d8c2SCharles.Forsyth } Scsidata; 102*74a4d8c2SCharles.Forsyth 103*74a4d8c2SCharles.Forsyth typedef struct Ureg Ureg; 104*74a4d8c2SCharles.Forsyth 105*74a4d8c2SCharles.Forsyth typedef struct Scsi { 106*74a4d8c2SCharles.Forsyth ulong pid; 107*74a4d8c2SCharles.Forsyth ushort target; 108*74a4d8c2SCharles.Forsyth ushort lun; 109*74a4d8c2SCharles.Forsyth ushort rflag; 110*74a4d8c2SCharles.Forsyth ushort status; 111*74a4d8c2SCharles.Forsyth Scsidata cmd; 112*74a4d8c2SCharles.Forsyth Scsidata data; 113*74a4d8c2SCharles.Forsyth Scsibuf* b; 114*74a4d8c2SCharles.Forsyth uchar* save; 115*74a4d8c2SCharles.Forsyth uchar cmdblk[16]; 116*74a4d8c2SCharles.Forsyth } Scsi; 117*74a4d8c2SCharles.Forsyth 118*74a4d8c2SCharles.Forsyth typedef struct Segdesc { 119*74a4d8c2SCharles.Forsyth ulong d0; 120*74a4d8c2SCharles.Forsyth ulong d1; 121*74a4d8c2SCharles.Forsyth } Segdesc; 122*74a4d8c2SCharles.Forsyth 123*74a4d8c2SCharles.Forsyth typedef struct Mach { 124*74a4d8c2SCharles.Forsyth ulong ticks; /* of the clock since boot time */ 125*74a4d8c2SCharles.Forsyth ulong delayloop; 126*74a4d8c2SCharles.Forsyth long cpuhz; /* general system clock (cycles) */ 127*74a4d8c2SCharles.Forsyth long clockgen; /* clock generator frequency (cycles) */ 128*74a4d8c2SCharles.Forsyth ulong cpupvr; /* cpu type in processor version register */ 129*74a4d8c2SCharles.Forsyth ulong cputype; /* cpu variant in BCD (eg, 0x823xx) */ 130*74a4d8c2SCharles.Forsyth void* alarm; /* alarms bound to this clock */ 131*74a4d8c2SCharles.Forsyth ulong* bcsr; 132*74a4d8c2SCharles.Forsyth IMM* iomem; 133*74a4d8c2SCharles.Forsyth } Mach; 134*74a4d8c2SCharles.Forsyth 135*74a4d8c2SCharles.Forsyth /* Mach.cputype */ 136*74a4d8c2SCharles.Forsyth #define MPCREV(x) ((x) & 0xFF) 137*74a4d8c2SCharles.Forsyth #define MPCMODEL(x) (((x)>>8) & 0xFFF) 138*74a4d8c2SCharles.Forsyth #define MPCFAMILY(x) (((x)>>24) & 0x0F) 139*74a4d8c2SCharles.Forsyth 140*74a4d8c2SCharles.Forsyth 141*74a4d8c2SCharles.Forsyth extern Mach *m; 142*74a4d8c2SCharles.Forsyth 143*74a4d8c2SCharles.Forsyth #define Q_MAGIC ((((4*21)+0)*21)+7) 144*74a4d8c2SCharles.Forsyth 145*74a4d8c2SCharles.Forsyth typedef struct Exec Exec; 146*74a4d8c2SCharles.Forsyth struct Exec 147*74a4d8c2SCharles.Forsyth { 148*74a4d8c2SCharles.Forsyth uchar magic[4]; /* magic number */ 149*74a4d8c2SCharles.Forsyth uchar text[4]; /* size of text segment */ 150*74a4d8c2SCharles.Forsyth uchar data[4]; /* size of initialized data */ 151*74a4d8c2SCharles.Forsyth uchar bss[4]; /* size of uninitialized data */ 152*74a4d8c2SCharles.Forsyth uchar syms[4]; /* size of symbol table */ 153*74a4d8c2SCharles.Forsyth uchar entry[4]; /* entry point */ 154*74a4d8c2SCharles.Forsyth uchar spsz[4]; /* size of sp/pc offset table */ 155*74a4d8c2SCharles.Forsyth uchar pcsz[4]; /* size of pc/line number table */ 156*74a4d8c2SCharles.Forsyth }; 157*74a4d8c2SCharles.Forsyth 158*74a4d8c2SCharles.Forsyth /* 159*74a4d8c2SCharles.Forsyth * bootline passed by boot program 160*74a4d8c2SCharles.Forsyth */ 161*74a4d8c2SCharles.Forsyth #define BOOTLINE ((char *)0x200000-150) 162*74a4d8c2SCharles.Forsyth 163*74a4d8c2SCharles.Forsyth /* 164*74a4d8c2SCharles.Forsyth * Where we leave configuration info. 165*74a4d8c2SCharles.Forsyth */ 166*74a4d8c2SCharles.Forsyth #define BOOTARGS ((char*)(0x200000)) 167*74a4d8c2SCharles.Forsyth #define BOOTARGSLEN 1024 168*74a4d8c2SCharles.Forsyth #define MAXCONF 32 169*74a4d8c2SCharles.Forsyth 170*74a4d8c2SCharles.Forsyth /* 171*74a4d8c2SCharles.Forsyth * a parsed plan9.ini line 172*74a4d8c2SCharles.Forsyth */ 173*74a4d8c2SCharles.Forsyth #define ISAOPTLEN 16 174*74a4d8c2SCharles.Forsyth #define NISAOPT 8 175*74a4d8c2SCharles.Forsyth 176*74a4d8c2SCharles.Forsyth typedef struct ISAConf { 177*74a4d8c2SCharles.Forsyth char type[NAMELEN]; 178*74a4d8c2SCharles.Forsyth ulong port; 179*74a4d8c2SCharles.Forsyth ulong irq; 180*74a4d8c2SCharles.Forsyth ulong mem; 181*74a4d8c2SCharles.Forsyth ulong size; 182*74a4d8c2SCharles.Forsyth uchar ea[6]; 183*74a4d8c2SCharles.Forsyth 184*74a4d8c2SCharles.Forsyth int nopt; 185*74a4d8c2SCharles.Forsyth char opt[NISAOPT][ISAOPTLEN]; 186*74a4d8c2SCharles.Forsyth } ISAConf; 187*74a4d8c2SCharles.Forsyth 188*74a4d8c2SCharles.Forsyth typedef struct { 189*74a4d8c2SCharles.Forsyth int size; 190*74a4d8c2SCharles.Forsyth ulong addr; 191*74a4d8c2SCharles.Forsyth } Map; 192*74a4d8c2SCharles.Forsyth 193*74a4d8c2SCharles.Forsyth typedef struct { 194*74a4d8c2SCharles.Forsyth char* name; 195*74a4d8c2SCharles.Forsyth Map* map; 196*74a4d8c2SCharles.Forsyth Map* mapend; 197*74a4d8c2SCharles.Forsyth 198*74a4d8c2SCharles.Forsyth Lock; 199*74a4d8c2SCharles.Forsyth } RMap; 200*74a4d8c2SCharles.Forsyth 201*74a4d8c2SCharles.Forsyth typedef struct PCIcfg PCIcfg; 202*74a4d8c2SCharles.Forsyth 203*74a4d8c2SCharles.Forsyth extern uchar* vgamem; 204*74a4d8c2SCharles.Forsyth 205*74a4d8c2SCharles.Forsyth struct Block { 206*74a4d8c2SCharles.Forsyth uchar *rp; 207*74a4d8c2SCharles.Forsyth uchar *wp; 208*74a4d8c2SCharles.Forsyth uchar *lim; 209*74a4d8c2SCharles.Forsyth uchar *data; 210*74a4d8c2SCharles.Forsyth Block* next; 211*74a4d8c2SCharles.Forsyth ulong magic; 212*74a4d8c2SCharles.Forsyth }; 213*74a4d8c2SCharles.Forsyth #define BLEN(b) ((b)->wp-(b)->rp) 214*74a4d8c2SCharles.Forsyth 215*74a4d8c2SCharles.Forsyth typedef struct QLock { 216*74a4d8c2SCharles.Forsyth int dummy; 217*74a4d8c2SCharles.Forsyth } QLock; 218