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