174a4d8c2SCharles.Forsyth typedef struct List { 274a4d8c2SCharles.Forsyth void *next; 374a4d8c2SCharles.Forsyth } List; 474a4d8c2SCharles.Forsyth 574a4d8c2SCharles.Forsyth typedef struct Alarm Alarm; 674a4d8c2SCharles.Forsyth typedef struct Alarm { 774a4d8c2SCharles.Forsyth List; 874a4d8c2SCharles.Forsyth int busy; 974a4d8c2SCharles.Forsyth long dt; 1074a4d8c2SCharles.Forsyth void (*f)(Alarm*); 1174a4d8c2SCharles.Forsyth void *arg; 1274a4d8c2SCharles.Forsyth } Alarm; 1374a4d8c2SCharles.Forsyth 1474a4d8c2SCharles.Forsyth typedef struct Apminfo { 1574a4d8c2SCharles.Forsyth int haveinfo; 1674a4d8c2SCharles.Forsyth int ax; 1774a4d8c2SCharles.Forsyth int cx; 1874a4d8c2SCharles.Forsyth int dx; 1974a4d8c2SCharles.Forsyth int di; 2074a4d8c2SCharles.Forsyth int ebx; 2174a4d8c2SCharles.Forsyth int esi; 2274a4d8c2SCharles.Forsyth } Apminfo; 2374a4d8c2SCharles.Forsyth 2474a4d8c2SCharles.Forsyth typedef struct Block Block; 2574a4d8c2SCharles.Forsyth struct Block { 2674a4d8c2SCharles.Forsyth Block* next; 2774a4d8c2SCharles.Forsyth uchar* rp; /* first unconsumed byte */ 2874a4d8c2SCharles.Forsyth uchar* wp; /* first empty byte */ 2974a4d8c2SCharles.Forsyth uchar* lim; /* 1 past the end of the buffer */ 3074a4d8c2SCharles.Forsyth uchar* base; /* start of the buffer */ 3174a4d8c2SCharles.Forsyth ulong flag; 3274a4d8c2SCharles.Forsyth }; 3374a4d8c2SCharles.Forsyth #define BLEN(s) ((s)->wp - (s)->rp) 3474a4d8c2SCharles.Forsyth 3574a4d8c2SCharles.Forsyth typedef struct IOQ IOQ; 3674a4d8c2SCharles.Forsyth typedef struct IOQ { 3774a4d8c2SCharles.Forsyth uchar buf[4096]; 3874a4d8c2SCharles.Forsyth uchar *in; 3974a4d8c2SCharles.Forsyth uchar *out; 4074a4d8c2SCharles.Forsyth int state; 4174a4d8c2SCharles.Forsyth int (*getc)(IOQ*); 4274a4d8c2SCharles.Forsyth int (*putc)(IOQ*, int); 4374a4d8c2SCharles.Forsyth void *ptr; 4474a4d8c2SCharles.Forsyth }; 4574a4d8c2SCharles.Forsyth 4674a4d8c2SCharles.Forsyth enum { 4774a4d8c2SCharles.Forsyth Eaddrlen = 6, 4874a4d8c2SCharles.Forsyth /* next two exclude 4-byte ether CRC */ 4974a4d8c2SCharles.Forsyth ETHERMINTU = 60, /* minimum transmit size */ 5074a4d8c2SCharles.Forsyth ETHERMAXTU = 1514, /* maximum transmit size */ 5174a4d8c2SCharles.Forsyth ETHERHDRSIZE = 14, /* size of an ethernet header */ 5274a4d8c2SCharles.Forsyth 5374a4d8c2SCharles.Forsyth MaxEther = 6, 5474a4d8c2SCharles.Forsyth }; 5574a4d8c2SCharles.Forsyth 5674a4d8c2SCharles.Forsyth typedef struct { 5774a4d8c2SCharles.Forsyth uchar d[Eaddrlen]; 5874a4d8c2SCharles.Forsyth uchar s[Eaddrlen]; 5974a4d8c2SCharles.Forsyth uchar type[2]; 6074a4d8c2SCharles.Forsyth uchar data[1500]; 6174a4d8c2SCharles.Forsyth uchar crc[4]; 6274a4d8c2SCharles.Forsyth } Etherpkt; 6374a4d8c2SCharles.Forsyth 6474a4d8c2SCharles.Forsyth extern uchar broadcast[Eaddrlen]; 6574a4d8c2SCharles.Forsyth 6674a4d8c2SCharles.Forsyth typedef struct Ureg Ureg; 67*8a8c2d74SCharles.Forsyth #pragma incomplete Ureg 6874a4d8c2SCharles.Forsyth 6974a4d8c2SCharles.Forsyth typedef struct Segdesc { 7074a4d8c2SCharles.Forsyth ulong d0; 7174a4d8c2SCharles.Forsyth ulong d1; 7274a4d8c2SCharles.Forsyth } Segdesc; 7374a4d8c2SCharles.Forsyth 7474a4d8c2SCharles.Forsyth typedef struct Mach { 7574a4d8c2SCharles.Forsyth ulong ticks; /* of the clock since boot time */ 7674a4d8c2SCharles.Forsyth void *alarm; /* alarms bound to this clock */ 7774a4d8c2SCharles.Forsyth } Mach; 7874a4d8c2SCharles.Forsyth 7974a4d8c2SCharles.Forsyth extern Mach *m; 8074a4d8c2SCharles.Forsyth 8174a4d8c2SCharles.Forsyth #define I_MAGIC ((((4*11)+0)*11)+7) 8274a4d8c2SCharles.Forsyth 8374a4d8c2SCharles.Forsyth typedef struct Exec Exec; 8474a4d8c2SCharles.Forsyth struct Exec 8574a4d8c2SCharles.Forsyth { 8674a4d8c2SCharles.Forsyth uchar magic[4]; /* magic number */ 8774a4d8c2SCharles.Forsyth uchar text[4]; /* size of text segment */ 8874a4d8c2SCharles.Forsyth uchar data[4]; /* size of initialized data */ 8974a4d8c2SCharles.Forsyth uchar bss[4]; /* size of uninitialized data */ 9074a4d8c2SCharles.Forsyth uchar syms[4]; /* size of symbol table */ 9174a4d8c2SCharles.Forsyth uchar entry[4]; /* entry point */ 9274a4d8c2SCharles.Forsyth uchar spsz[4]; /* size of sp/pc offset table */ 9374a4d8c2SCharles.Forsyth uchar pcsz[4]; /* size of pc/line number table */ 9474a4d8c2SCharles.Forsyth }; 9574a4d8c2SCharles.Forsyth 9674a4d8c2SCharles.Forsyth /* 9774a4d8c2SCharles.Forsyth * a parsed .ini line 9874a4d8c2SCharles.Forsyth */ 9974a4d8c2SCharles.Forsyth #define ISAOPTLEN 32 10074a4d8c2SCharles.Forsyth #define NISAOPT 8 10174a4d8c2SCharles.Forsyth 10274a4d8c2SCharles.Forsyth typedef struct ISAConf { 10374a4d8c2SCharles.Forsyth char type[NAMELEN]; 10474a4d8c2SCharles.Forsyth ulong port; 10574a4d8c2SCharles.Forsyth ulong irq; 10674a4d8c2SCharles.Forsyth ulong mem; 10774a4d8c2SCharles.Forsyth ulong size; 10874a4d8c2SCharles.Forsyth uchar ea[6]; 10974a4d8c2SCharles.Forsyth 11074a4d8c2SCharles.Forsyth int nopt; 11174a4d8c2SCharles.Forsyth char opt[NISAOPT][ISAOPTLEN]; 11274a4d8c2SCharles.Forsyth } ISAConf; 11374a4d8c2SCharles.Forsyth 11474a4d8c2SCharles.Forsyth typedef struct Pcidev Pcidev; 11574a4d8c2SCharles.Forsyth typedef struct PCMmap PCMmap; 116*8a8c2d74SCharles.Forsyth typedef struct PCMslot PCMslot; 11774a4d8c2SCharles.Forsyth 11874a4d8c2SCharles.Forsyth #define BOOTLINE ((char*)CONFADDR) 11974a4d8c2SCharles.Forsyth 12074a4d8c2SCharles.Forsyth enum { 12174a4d8c2SCharles.Forsyth MB = (1024*1024), 12274a4d8c2SCharles.Forsyth }; 12374a4d8c2SCharles.Forsyth #define ROUND(s, sz) (((s)+((sz)-1))&~((sz)-1)) 12474a4d8c2SCharles.Forsyth 12574a4d8c2SCharles.Forsyth 12674a4d8c2SCharles.Forsyth typedef struct Type Type; 12774a4d8c2SCharles.Forsyth typedef struct Medium Medium; 12874a4d8c2SCharles.Forsyth typedef struct Boot Boot; 12974a4d8c2SCharles.Forsyth 13074a4d8c2SCharles.Forsyth enum { /* type */ 13174a4d8c2SCharles.Forsyth Tnil = 0x00, 13274a4d8c2SCharles.Forsyth 13374a4d8c2SCharles.Forsyth Tfloppy = 0x01, 13474a4d8c2SCharles.Forsyth Tsd = 0x02, 13574a4d8c2SCharles.Forsyth Tether = 0x03, 13674a4d8c2SCharles.Forsyth Tcd = 0x04, 137*8a8c2d74SCharles.Forsyth Tbios = 0x05, 13874a4d8c2SCharles.Forsyth 13974a4d8c2SCharles.Forsyth Tany = -1, 14074a4d8c2SCharles.Forsyth }; 14174a4d8c2SCharles.Forsyth 14274a4d8c2SCharles.Forsyth enum { /* name and flag */ 14374a4d8c2SCharles.Forsyth Fnone = 0x00, 14474a4d8c2SCharles.Forsyth 14574a4d8c2SCharles.Forsyth Nfs = 0x00, 14674a4d8c2SCharles.Forsyth Ffs = (1<<Nfs), 14774a4d8c2SCharles.Forsyth Nboot = 0x01, 14874a4d8c2SCharles.Forsyth Fboot = (1<<Nboot), 14974a4d8c2SCharles.Forsyth Nbootp = 0x02, 15074a4d8c2SCharles.Forsyth Fbootp = (1<<Nbootp), 15174a4d8c2SCharles.Forsyth NName = 3, 15274a4d8c2SCharles.Forsyth 15374a4d8c2SCharles.Forsyth Fany = Fbootp|Fboot|Ffs, 15474a4d8c2SCharles.Forsyth 15574a4d8c2SCharles.Forsyth Fini = 0x10, 15674a4d8c2SCharles.Forsyth Fprobe = 0x80, 15774a4d8c2SCharles.Forsyth }; 15874a4d8c2SCharles.Forsyth 15974a4d8c2SCharles.Forsyth typedef struct Type { 16074a4d8c2SCharles.Forsyth int type; 16174a4d8c2SCharles.Forsyth int flag; 16274a4d8c2SCharles.Forsyth int (*init)(void); 16374a4d8c2SCharles.Forsyth void (*initdev)(int, char*); 16474a4d8c2SCharles.Forsyth void* (*getfspart)(int, char*, int); /* actually returns Dos* */ 16574a4d8c2SCharles.Forsyth void (*addconf)(int); 16674a4d8c2SCharles.Forsyth int (*boot)(int, char*, Boot*); 16774a4d8c2SCharles.Forsyth void (*printdevs)(int); 16874a4d8c2SCharles.Forsyth char** parts; 16974a4d8c2SCharles.Forsyth char** inis; 17074a4d8c2SCharles.Forsyth int mask; 17174a4d8c2SCharles.Forsyth Medium* media; 17274a4d8c2SCharles.Forsyth } Type; 17374a4d8c2SCharles.Forsyth 17474a4d8c2SCharles.Forsyth extern void (*etherdetach)(void); 17574a4d8c2SCharles.Forsyth extern void (*floppydetach)(void); 17674a4d8c2SCharles.Forsyth extern void (*sddetach)(void); 17774a4d8c2SCharles.Forsyth 17874a4d8c2SCharles.Forsyth typedef struct Lock { /* for ilock, iunlock */ 17974a4d8c2SCharles.Forsyth int locked; 18074a4d8c2SCharles.Forsyth int spl; 18174a4d8c2SCharles.Forsyth } Lock; 18274a4d8c2SCharles.Forsyth 18374a4d8c2SCharles.Forsyth enum { /* returned by bootpass */ 18474a4d8c2SCharles.Forsyth MORE, ENOUGH, FAIL 18574a4d8c2SCharles.Forsyth }; 18674a4d8c2SCharles.Forsyth enum { 18774a4d8c2SCharles.Forsyth INITKERNEL, 18874a4d8c2SCharles.Forsyth READEXEC, 18974a4d8c2SCharles.Forsyth READ9TEXT, 19074a4d8c2SCharles.Forsyth READ9DATA, 19174a4d8c2SCharles.Forsyth READGZIP, 19274a4d8c2SCharles.Forsyth READEHDR, 19374a4d8c2SCharles.Forsyth READPHDR, 19474a4d8c2SCharles.Forsyth READEPAD, 19574a4d8c2SCharles.Forsyth READEDATA, 19674a4d8c2SCharles.Forsyth TRYBOOT, 19774a4d8c2SCharles.Forsyth INIT9LOAD, 19874a4d8c2SCharles.Forsyth READ9LOAD, 19974a4d8c2SCharles.Forsyth FAILED 20074a4d8c2SCharles.Forsyth }; 20174a4d8c2SCharles.Forsyth 20274a4d8c2SCharles.Forsyth struct Boot { 20374a4d8c2SCharles.Forsyth int state; 20474a4d8c2SCharles.Forsyth 20574a4d8c2SCharles.Forsyth Exec exec; 20674a4d8c2SCharles.Forsyth char *bp; /* base ptr */ 20774a4d8c2SCharles.Forsyth char *wp; /* write ptr */ 20874a4d8c2SCharles.Forsyth char *ep; /* end ptr */ 20974a4d8c2SCharles.Forsyth }; 21074a4d8c2SCharles.Forsyth 21174a4d8c2SCharles.Forsyth extern int debug; 21274a4d8c2SCharles.Forsyth extern Apminfo apm; 21374a4d8c2SCharles.Forsyth extern char *defaultpartition; 21474a4d8c2SCharles.Forsyth extern int iniread; 21574a4d8c2SCharles.Forsyth extern int pxe; 216