typedef struct List { void *next;} List; typedef struct Alarm Alarm;typedef struct Alarm { List; int busy; long dt; void (*f)(Alarm*); void *arg;} Alarm; typedef struct Apminfo { int haveinfo; int ax; int cx; int dx; int di; int ebx; int esi;} Apminfo; typedef struct Block Block;struct Block { Block* next; uchar* rp; /* first unconsumed byte */ uchar* wp; /* first empty byte */ uchar* lim; /* 1 past the end of the buffer */ uchar* base; /* start of the buffer */ ulong flag;};#define BLEN(s) ((s)->wp - (s)->rp) typedef struct IOQ IOQ;typedef struct IOQ { uchar buf[4096]; uchar *in; uchar *out; int state; int (*getc)(IOQ*); int (*putc)(IOQ*, int); void *ptr;}; enum { Eaddrlen = 6, /* next two exclude 4-byte ether CRC */ ETHERMINTU = 60, /* minimum transmit size */ ETHERMAXTU = 1514, /* maximum transmit size */ ETHERHDRSIZE = 14, /* size of an ethernet header */ MaxEther = 6,}; typedef struct { uchar d[Eaddrlen]; uchar s[Eaddrlen]; uchar type[2]; uchar data[1500]; uchar crc[4];} Etherpkt; extern uchar broadcast[Eaddrlen]; typedef struct Ureg Ureg;#pragma incomplete Ureg typedef struct Segdesc { ulong d0; ulong d1;} Segdesc; typedef struct Mach { ulong ticks; /* of the clock since boot time */ void *alarm; /* alarms bound to this clock */} Mach; extern Mach *m; #define I_MAGIC ((((4*11)+0)*11)+7) /* intel 386 */#define S_MAGIC (0x8000|((((4*26)+0)*26)+7)) /* amd64 */ typedef struct Exec Exec;struct Exec{ uchar magic[4]; /* magic number */ uchar text[4]; /* size of text segment */ uchar data[4]; /* size of initialized data */ uchar bss[4]; /* size of uninitialized data */ uchar syms[4]; /* size of symbol table */ uchar entry[4]; /* entry point */ uchar spsz[4]; /* size of sp/pc offset table */ uchar pcsz[4]; /* size of pc/line number table */}; typedef struct { Exec; uvlong uvl[1];} Hdr; /* * a parsed .ini line */#define ISAOPTLEN 32#define NISAOPT 8 typedef struct ISAConf { char type[NAMELEN]; ulong port; ulong irq; ulong mem; ulong size; uchar ea[6]; int nopt; char opt[NISAOPT][ISAOPTLEN];} ISAConf; typedef struct Pcidev Pcidev;typedef struct PCMmap PCMmap;typedef struct PCMslot PCMslot; #define BOOTLINE ((char*)CONFADDR) enum { MB = (1024*1024),};#define ROUND(s, sz) (((s)+((sz)-1))&~((sz)-1)) typedef struct Type Type;typedef struct Medium Medium;typedef struct Boot Boot; enum { /* type */ Tnil = 0x00, Tfloppy = 0x01, Tsd = 0x02, Tether = 0x03, Tcd = 0x04, Tnoether = 5, Tany = 6,}; enum { /* name and flag */ Fnone = 0x00, Nfs = 0x00, Ffs = (1<<Nfs), Nboot = 0x01, Fboot = (1<<Nboot), Nbootp = 0x02, Fbootp = (1<<Nbootp), NName = 3, Fany = Fbootp|Fboot|Ffs, Fini = 0x10, Fprobe = 0x80,}; typedef struct Type { int type; char *devstr; int flag; int (*init)(void); void (*initdev)(int, char*); void* (*getfspart)(int, char*, int); /* actually returns Dos* */ void (*addconf)(int); int (*boot)(int, char*, Boot*); void (*printdevs)(int); char** parts; char** inis; int mask; Medium* media;} Type; extern void (*etherdetach)(void);extern void (*floppydetach)(void);extern void (*sddetach)(void); typedef struct Lock { /* for ilock, iunlock */ int locked; int spl;} Lock; enum { /* returned by bootpass */ MORE, ENOUGH, FAIL};enum { INITKERNEL, READEXEC, READ9TEXT, READ9DATA, READGZIP, READEHDR, READPHDR, READEPAD, READEDATA, TRYBOOT, TRYEBOOT, INIT9LOAD, READ9LOAD, FAILED}; struct Boot { int state; Hdr hdr; char *bp; /* base ptr */ char *wp; /* write ptr */ char *ep; /* end ptr */}; enum { /* flags */ Fmem = 0x00000001, /* mem* valid */ Fbootdevice = 0x00000002, /* bootdevice valid */ Fcmdline = 0x00000004, /* cmdline valid */ Fmods = 0x00000008, /* mod* valid */ Fsyms = 0x00000010, /* syms[] has a.out info */ Felf = 0x00000020, /* syms[] has ELF info */ Fmmap = 0x00000040, /* mmap* valid */ Fdrives = 0x00000080, /* drives* valid */ Fconfigtable = 0x00000100, /* configtable* valid */ Fbootloadername = 0x00000200, /* bootloadername* valid */ Fapmtable = 0x00000400, /* apmtable* valid */ Fvbe = 0x00000800, /* vbe[] valid */}; /* * Multiboot grot. */typedef struct Mbi Mbi;struct Mbi { u32int flags; u32int memlower; u32int memupper; u32int bootdevice; u32int cmdline; u32int modscount; u32int modsaddr; u32int syms[4]; u32int mmaplength; u32int mmapaddr; u32int driveslength; u32int drivesaddr; u32int configtable; u32int bootloadername; u32int apmtable; u32int vbe[6];}; typedef struct MMap MMap;struct MMap { u32int size; u32int base[2]; u32int length[2]; u32int type;}; extern int debug;extern Apminfo apm;extern char *defaultpartition;extern int iniread;extern int pxe;extern int vga;extern int nmmap;extern MMap mmap[];
typedef struct List {
void *next;
} List;
typedef struct Alarm Alarm;
typedef struct Alarm {
List;
int busy;
long dt;
void (*f)(Alarm*);
void *arg;
} Alarm;
typedef struct Apminfo {
int haveinfo;
int ax;
int cx;
int dx;
int di;
int ebx;
int esi;
} Apminfo;
typedef struct Block Block;
struct Block {
Block* next;
uchar* rp; /* first unconsumed byte */
uchar* wp; /* first empty byte */
uchar* lim; /* 1 past the end of the buffer */
uchar* base; /* start of the buffer */
ulong flag;
};
#define BLEN(s) ((s)->wp - (s)->rp)
typedef struct IOQ IOQ;
typedef struct IOQ {
uchar buf[4096];
uchar *in;
uchar *out;
int state;
int (*getc)(IOQ*);
int (*putc)(IOQ*, int);
void *ptr;
};
enum {
Eaddrlen = 6,
/* next two exclude 4-byte ether CRC */
ETHERMINTU = 60, /* minimum transmit size */
ETHERMAXTU = 1514, /* maximum transmit size */
ETHERHDRSIZE = 14, /* size of an ethernet header */
MaxEther = 6,
};
typedef struct {
uchar d[Eaddrlen];
uchar s[Eaddrlen];
uchar type[2];
uchar data[1500];
uchar crc[4];
} Etherpkt;
extern uchar broadcast[Eaddrlen];
typedef struct Ureg Ureg;
#pragma incomplete Ureg
typedef struct Segdesc {
ulong d0;
ulong d1;
} Segdesc;
typedef struct Mach {
ulong ticks; /* of the clock since boot time */
void *alarm; /* alarms bound to this clock */
} Mach;
extern Mach *m;
#define I_MAGIC ((((4*11)+0)*11)+7) /* intel 386 */
#define S_MAGIC (0x8000|((((4*26)+0)*26)+7)) /* amd64 */
typedef struct Exec Exec;
struct Exec
{
uchar magic[4]; /* magic number */
uchar text[4]; /* size of text segment */
uchar data[4]; /* size of initialized data */
uchar bss[4]; /* size of uninitialized data */
uchar syms[4]; /* size of symbol table */
uchar entry[4]; /* entry point */
uchar spsz[4]; /* size of sp/pc offset table */
uchar pcsz[4]; /* size of pc/line number table */
};
typedef struct {
Exec;
uvlong uvl[1];
} Hdr;
/*
* a parsed .ini line
*/
#define ISAOPTLEN 32
#define NISAOPT 8
typedef struct ISAConf {
char type[NAMELEN];
ulong port;
ulong irq;
ulong mem;
ulong size;
uchar ea[6];
int nopt;
char opt[NISAOPT][ISAOPTLEN];
} ISAConf;
typedef struct Pcidev Pcidev;
typedef struct PCMmap PCMmap;
typedef struct PCMslot PCMslot;
#define BOOTLINE ((char*)CONFADDR)
enum {
MB = (1024*1024),
};
#define ROUND(s, sz) (((s)+((sz)-1))&~((sz)-1))
typedef struct Type Type;
typedef struct Medium Medium;
typedef struct Boot Boot;
enum { /* type */
Tnil = 0x00,
Tfloppy = 0x01,
Tsd = 0x02,
Tether = 0x03,
Tcd = 0x04,
Tnoether = 5,
Tany = 6,
};
enum { /* name and flag */
Fnone = 0x00,
Nfs = 0x00,
Ffs = (1<<Nfs),
Nboot = 0x01,
Fboot = (1<<Nboot),
Nbootp = 0x02,
Fbootp = (1<<Nbootp),
NName = 3,
Fany = Fbootp|Fboot|Ffs,
Fini = 0x10,
Fprobe = 0x80,
};
typedef struct Type {
int type;
char *devstr;
int flag;
int (*init)(void);
void (*initdev)(int, char*);
void* (*getfspart)(int, char*, int); /* actually returns Dos* */
void (*addconf)(int);
int (*boot)(int, char*, Boot*);
void (*printdevs)(int);
char** parts;
char** inis;
int mask;
Medium* media;
} Type;
extern void (*etherdetach)(void);
extern void (*floppydetach)(void);
extern void (*sddetach)(void);
typedef struct Lock { /* for ilock, iunlock */
int locked;
int spl;
} Lock;
enum { /* returned by bootpass */
MORE, ENOUGH, FAIL
};
enum {
INITKERNEL,
READEXEC,
READ9TEXT,
READ9DATA,
READGZIP,
READEHDR,
READPHDR,
READEPAD,
READEDATA,
TRYBOOT,
TRYEBOOT,
INIT9LOAD,
READ9LOAD,
FAILED
};
struct Boot {
int state;
Hdr hdr;
char *bp; /* base ptr */
char *wp; /* write ptr */
char *ep; /* end ptr */
};
enum { /* flags */
Fmem = 0x00000001, /* mem* valid */
Fbootdevice = 0x00000002, /* bootdevice valid */
Fcmdline = 0x00000004, /* cmdline valid */
Fmods = 0x00000008, /* mod* valid */
Fsyms = 0x00000010, /* syms[] has a.out info */
Felf = 0x00000020, /* syms[] has ELF info */
Fmmap = 0x00000040, /* mmap* valid */
Fdrives = 0x00000080, /* drives* valid */
Fconfigtable = 0x00000100, /* configtable* valid */
Fbootloadername = 0x00000200, /* bootloadername* valid */
Fapmtable = 0x00000400, /* apmtable* valid */
Fvbe = 0x00000800, /* vbe[] valid */
};
/*
* Multiboot grot.
*/
typedef struct Mbi Mbi;
struct Mbi {
u32int flags;
u32int memlower;
u32int memupper;
u32int bootdevice;
u32int cmdline;
u32int modscount;
u32int modsaddr;
u32int syms[4];
u32int mmaplength;
u32int mmapaddr;
u32int driveslength;
u32int drivesaddr;
u32int configtable;
u32int bootloadername;
u32int apmtable;
u32int vbe[6];
};
typedef struct MMap MMap;
struct MMap {
u32int size;
u32int base[2];
u32int length[2];
u32int type;
};
extern int debug;
extern Apminfo apm;
extern char *defaultpartition;
extern int iniread;
extern int pxe;
extern int vga;
extern int nmmap;
extern MMap mmap[];