xref: /inferno-os/os/boot/pc/dat.h (revision 8a8c2d742b51525f66c2210e3c8a251de10022ff)
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