xref: /plan9-contrib/sys/src/9/pcboot/dat.h (revision 77dd0a987f922b1125641a8757e16b54f2cf323f)
125210b06SDavid du Colombier typedef struct BIOS32si	BIOS32si;
225210b06SDavid du Colombier typedef struct BIOS32ci	BIOS32ci;
325210b06SDavid du Colombier typedef struct Conf	Conf;
425210b06SDavid du Colombier typedef struct Confmem	Confmem;
525210b06SDavid du Colombier typedef struct FPsave	FPsave;
625210b06SDavid du Colombier typedef struct ISAConf	ISAConf;
725210b06SDavid du Colombier typedef struct Label	Label;
825210b06SDavid du Colombier typedef struct Lock	Lock;
925210b06SDavid du Colombier typedef struct MMU	MMU;
1025210b06SDavid du Colombier typedef struct Mach	Mach;
1125210b06SDavid du Colombier typedef struct PCArch	PCArch;
1225210b06SDavid du Colombier typedef struct Pcidev	Pcidev;
1325210b06SDavid du Colombier typedef struct PCMmap	PCMmap;
1425210b06SDavid du Colombier typedef struct PCMslot	PCMslot;
1525210b06SDavid du Colombier typedef struct Page	Page;
1625210b06SDavid du Colombier typedef struct PMMU	PMMU;
1725210b06SDavid du Colombier typedef struct Proc	Proc;
1825210b06SDavid du Colombier typedef struct Segdesc	Segdesc;
1925210b06SDavid du Colombier typedef vlong		Tval;
2025210b06SDavid du Colombier typedef struct Ureg	Ureg;
2125210b06SDavid du Colombier typedef struct Vctl	Vctl;
2225210b06SDavid du Colombier 
2325210b06SDavid du Colombier #pragma incomplete BIOS32si
2425210b06SDavid du Colombier #pragma incomplete Pcidev
2525210b06SDavid du Colombier #pragma incomplete Ureg
2625210b06SDavid du Colombier 
2725210b06SDavid du Colombier #define MAXSYSARG	5	/* for mount(fd, afd, mpt, flag, arg) */
2825210b06SDavid du Colombier 
2925210b06SDavid du Colombier /*
3025210b06SDavid du Colombier  * Where configuration info is left for the loaded programme.
3125210b06SDavid du Colombier  * There are 3584 bytes available at CONFADDR.
3225210b06SDavid du Colombier  */
3325210b06SDavid du Colombier #define BOOTLINE	((char*)CONFADDR)
3425210b06SDavid du Colombier #define BOOTLINELEN	64
3525210b06SDavid du Colombier #define BOOTARGS	((char*)(CONFADDR+BOOTLINELEN))
3625210b06SDavid du Colombier #define	BOOTARGSLEN	(3584-0x200-BOOTLINELEN)
3725210b06SDavid du Colombier #define	MAXCONF		100
3825210b06SDavid du Colombier 
39e4575fb1SDavid du Colombier enum {
40e4575fb1SDavid du Colombier 	Promptsecs	= 60,
41e4575fb1SDavid du Colombier };
42e4575fb1SDavid du Colombier 
4325210b06SDavid du Colombier char *confname[MAXCONF];
4425210b06SDavid du Colombier char *confval[MAXCONF];
4525210b06SDavid du Colombier int nconf;
4625210b06SDavid du Colombier 
4725210b06SDavid du Colombier #define KMESGSIZE 64
4825210b06SDavid du Colombier #define PCICONSSIZE 64
4925210b06SDavid du Colombier #define STAGESIZE 64
5025210b06SDavid du Colombier 
5125210b06SDavid du Colombier #define NAMELEN 28
5225210b06SDavid du Colombier 
5325210b06SDavid du Colombier #define	GSHORT(p)	(((p)[1]<<8)|(p)[0])
5425210b06SDavid du Colombier #define	GLSHORT(p)	(((p)[0]<<8)|(p)[1])
5562579e34SDavid du Colombier 
5662579e34SDavid du Colombier #define	GLONG(p)	((GSHORT(p+2)<<16)|GSHORT(p))
5725210b06SDavid du Colombier #define	GLLONG(p)	(((ulong)GLSHORT(p)<<16)|GLSHORT(p+2))
5825210b06SDavid du Colombier #define	PLLONG(p,v)	(p)[3]=(v);(p)[2]=(v)>>8;(p)[1]=(v)>>16;(p)[0]=(v)>>24
5925210b06SDavid du Colombier 
6062579e34SDavid du Colombier #define	PLVLONG(p,v)	(p)[7]=(v);(p)[6]=(v)>>8;(p)[5]=(v)>>16;(p)[4]=(v)>>24;\
6162579e34SDavid du Colombier 			(p)[3]=(v)>>32; (p)[2]=(v)>>40;\
6262579e34SDavid du Colombier 			(p)[1]=(v)>>48; (p)[0]=(v)>>56;
6362579e34SDavid du Colombier 
6425210b06SDavid du Colombier enum {
6525210b06SDavid du Colombier 	Stkpat =	0,
6625210b06SDavid du Colombier };
6725210b06SDavid du Colombier 
6825210b06SDavid du Colombier /*
6925210b06SDavid du Colombier  *  parameters for sysproc.c
7025210b06SDavid du Colombier  */
7125210b06SDavid du Colombier #define AOUT_MAGIC	(I_MAGIC)
7225210b06SDavid du Colombier 
7325210b06SDavid du Colombier struct Lock
7425210b06SDavid du Colombier {
7525210b06SDavid du Colombier 	ulong	magic;
7625210b06SDavid du Colombier 	ulong	key;
7725210b06SDavid du Colombier 	ulong	sr;
7825210b06SDavid du Colombier 	ulong	pc;
7925210b06SDavid du Colombier 	Proc	*p;
8025210b06SDavid du Colombier 	Mach	*m;
8125210b06SDavid du Colombier 	ushort	isilock;
8225210b06SDavid du Colombier 	long	lockcycles;
8325210b06SDavid du Colombier };
8425210b06SDavid du Colombier 
8525210b06SDavid du Colombier struct Label
8625210b06SDavid du Colombier {
8725210b06SDavid du Colombier 	ulong	sp;
8825210b06SDavid du Colombier 	ulong	pc;
8925210b06SDavid du Colombier };
9025210b06SDavid du Colombier 
9125210b06SDavid du Colombier 
9225210b06SDavid du Colombier /*
9325210b06SDavid du Colombier  * FPsave.status
9425210b06SDavid du Colombier  */
9525210b06SDavid du Colombier enum
9625210b06SDavid du Colombier {
9725210b06SDavid du Colombier 	/* this is a state */
9825210b06SDavid du Colombier 	FPinit=		0,
9925210b06SDavid du Colombier 	FPactive=	1,
10025210b06SDavid du Colombier 	FPinactive=	2,
10125210b06SDavid du Colombier 
10225210b06SDavid du Colombier 	/* the following is a bit that can be or'd into the state */
10325210b06SDavid du Colombier 	FPillegal=	0x100,
10425210b06SDavid du Colombier };
10525210b06SDavid du Colombier 
10625210b06SDavid du Colombier struct	FPsave
10725210b06SDavid du Colombier {
10825210b06SDavid du Colombier 	ushort	control;
10925210b06SDavid du Colombier 	ushort	r1;
11025210b06SDavid du Colombier 	ushort	status;
11125210b06SDavid du Colombier 	ushort	r2;
11225210b06SDavid du Colombier 	ushort	tag;
11325210b06SDavid du Colombier 	ushort	r3;
11425210b06SDavid du Colombier 	ulong	pc;
11525210b06SDavid du Colombier 	ushort	selector;
11625210b06SDavid du Colombier 	ushort	r4;
11725210b06SDavid du Colombier 	ulong	operand;
11825210b06SDavid du Colombier 	ushort	oselector;
11925210b06SDavid du Colombier 	ushort	r5;
12025210b06SDavid du Colombier 	uchar	regs[80];	/* floating point registers */
12125210b06SDavid du Colombier };
12225210b06SDavid du Colombier 
12325210b06SDavid du Colombier struct Confmem
12425210b06SDavid du Colombier {
12525210b06SDavid du Colombier 	ulong	base;
12625210b06SDavid du Colombier 	ulong	npage;
12725210b06SDavid du Colombier 	ulong	kbase;
12825210b06SDavid du Colombier 	ulong	klimit;
12925210b06SDavid du Colombier };
13025210b06SDavid du Colombier 
13125210b06SDavid du Colombier struct Conf
13225210b06SDavid du Colombier {
13325210b06SDavid du Colombier 	ulong	nmach;		/* processors */
13425210b06SDavid du Colombier 	ulong	nproc;		/* processes */
13525210b06SDavid du Colombier 	ulong	monitor;	/* has monitor? */
13625210b06SDavid du Colombier 	Confmem	mem[4];		/* physical memory */
13725210b06SDavid du Colombier 	ulong	npage;		/* total physical pages of memory */
13825210b06SDavid du Colombier 	ulong	upages;		/* user page pool */
13925210b06SDavid du Colombier 	ulong	nimage;		/* number of page cache image headers */
14025210b06SDavid du Colombier 	ulong	nswap;		/* number of swap pages */
14125210b06SDavid du Colombier 	int	nswppo;		/* max # of pageouts per segment pass */
14225210b06SDavid du Colombier 	ulong	base0;		/* base of bank 0 */
14325210b06SDavid du Colombier 	ulong	base1;		/* base of bank 1 */
14425210b06SDavid du Colombier 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
14525210b06SDavid du Colombier 	ulong	ialloc;		/* max interrupt time allocation in bytes */
14625210b06SDavid du Colombier 	ulong	pipeqsize;	/* size in bytes of pipe queues */
14725210b06SDavid du Colombier 	int	nuart;		/* number of uart devices */
14825210b06SDavid du Colombier };
14925210b06SDavid du Colombier 
15025210b06SDavid du Colombier /*
15125210b06SDavid du Colombier  *  MMU stuff in proc
15225210b06SDavid du Colombier  */
15325210b06SDavid du Colombier #define NCOLOR 1
15425210b06SDavid du Colombier struct PMMU
15525210b06SDavid du Colombier {
15625210b06SDavid du Colombier 	Page*	mmupdb;			/* page directory base */
15725210b06SDavid du Colombier 	Page*	mmufree;		/* unused page table pages */
15825210b06SDavid du Colombier 	Page*	mmuused;		/* used page table pages */
15925210b06SDavid du Colombier 	Page*	kmaptable;		/* page table used by kmap */
16025210b06SDavid du Colombier 	uint	lastkmap;		/* last entry used by kmap */
16125210b06SDavid du Colombier 	int	nkmap;			/* number of current kmaps */
16225210b06SDavid du Colombier };
16325210b06SDavid du Colombier 
16425210b06SDavid du Colombier #include "../port/portdat.h"
16525210b06SDavid du Colombier 
16625210b06SDavid du Colombier typedef struct {
16725210b06SDavid du Colombier 	ulong	link;			/* link (old TSS selector) */
16825210b06SDavid du Colombier 	ulong	esp0;			/* privilege level 0 stack pointer */
16925210b06SDavid du Colombier 	ulong	ss0;			/* privilege level 0 stack selector */
17025210b06SDavid du Colombier 	ulong	esp1;			/* privilege level 1 stack pointer */
17125210b06SDavid du Colombier 	ulong	ss1;			/* privilege level 1 stack selector */
17225210b06SDavid du Colombier 	ulong	esp2;			/* privilege level 2 stack pointer */
17325210b06SDavid du Colombier 	ulong	ss2;			/* privilege level 2 stack selector */
17425210b06SDavid du Colombier 	ulong	xcr3;			/* page directory base register - not used because we don't use trap gates */
17525210b06SDavid du Colombier 	ulong	eip;			/* instruction pointer */
17625210b06SDavid du Colombier 	ulong	eflags;			/* flags register */
17725210b06SDavid du Colombier 	ulong	eax;			/* general registers */
17825210b06SDavid du Colombier 	ulong 	ecx;
17925210b06SDavid du Colombier 	ulong	edx;
18025210b06SDavid du Colombier 	ulong	ebx;
18125210b06SDavid du Colombier 	ulong	esp;
18225210b06SDavid du Colombier 	ulong	ebp;
18325210b06SDavid du Colombier 	ulong	esi;
18425210b06SDavid du Colombier 	ulong	edi;
18525210b06SDavid du Colombier 	ulong	es;			/* segment selectors */
18625210b06SDavid du Colombier 	ulong	cs;
18725210b06SDavid du Colombier 	ulong	ss;
18825210b06SDavid du Colombier 	ulong	ds;
18925210b06SDavid du Colombier 	ulong	fs;
19025210b06SDavid du Colombier 	ulong	gs;
19125210b06SDavid du Colombier 	ulong	ldt;			/* selector for task's LDT */
19225210b06SDavid du Colombier 	ulong	iomap;			/* I/O map base address + T-bit */
19325210b06SDavid du Colombier } Tss;
19425210b06SDavid du Colombier 
19525210b06SDavid du Colombier struct Segdesc
19625210b06SDavid du Colombier {
19725210b06SDavid du Colombier 	ulong	d0;
19825210b06SDavid du Colombier 	ulong	d1;
19925210b06SDavid du Colombier };
20025210b06SDavid du Colombier 
20125210b06SDavid du Colombier struct Mach
20225210b06SDavid du Colombier {
20325210b06SDavid du Colombier 	int	machno;			/* physical id of processor (KNOWN TO ASSEMBLY) */
20425210b06SDavid du Colombier 	ulong	splpc;			/* pc of last caller to splhi */
20525210b06SDavid du Colombier 
20625210b06SDavid du Colombier 	ulong*	pdb;			/* page directory base for this processor (va) */
20725210b06SDavid du Colombier 	Tss*	tss;			/* tss for this processor */
20825210b06SDavid du Colombier 	Segdesc	*gdt;			/* gdt for this processor */
20925210b06SDavid du Colombier 
21025210b06SDavid du Colombier 	Proc*	proc;			/* current process on this processor */
21125210b06SDavid du Colombier 	Proc*	externup;		/* extern register Proc *up */
21225210b06SDavid du Colombier 
21325210b06SDavid du Colombier 	Page*	pdbpool;
21425210b06SDavid du Colombier 	int	pdbcnt;
21525210b06SDavid du Colombier 
21625210b06SDavid du Colombier 	ulong	ticks;			/* of the clock since boot time */
21725210b06SDavid du Colombier 	Label	sched;			/* scheduler wakeup */
21825210b06SDavid du Colombier 	Lock	alarmlock;		/* access to alarm list */
21925210b06SDavid du Colombier 	void*	alarm;			/* alarms bound to this clock */
22025210b06SDavid du Colombier 	int	inclockintr;
22125210b06SDavid du Colombier 
22225210b06SDavid du Colombier 	Proc*	readied;		/* for runproc */
22325210b06SDavid du Colombier 	ulong	schedticks;		/* next forced context switch */
22425210b06SDavid du Colombier 
22525210b06SDavid du Colombier 	int	tlbfault;
22625210b06SDavid du Colombier 	int	tlbpurge;
22725210b06SDavid du Colombier 	int	pfault;
22825210b06SDavid du Colombier 	int	cs;
22925210b06SDavid du Colombier 	int	syscall;
23025210b06SDavid du Colombier 	int	load;
23125210b06SDavid du Colombier 	int	intr;
23225210b06SDavid du Colombier 	int	flushmmu;		/* make current proc flush it's mmu state */
23325210b06SDavid du Colombier 	int	ilockdepth;
23425210b06SDavid du Colombier 	Perf	perf;			/* performance counters */
23525210b06SDavid du Colombier 
23625210b06SDavid du Colombier 	ulong	spuriousintr;
23725210b06SDavid du Colombier 	int	lastintr;
23825210b06SDavid du Colombier 
23925210b06SDavid du Colombier 	int	loopconst;
24025210b06SDavid du Colombier 
24125210b06SDavid du Colombier 	Lock	apictimerlock;
24225210b06SDavid du Colombier 	int	cpumhz;
24325210b06SDavid du Colombier 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
24425210b06SDavid du Colombier 	uvlong	cpuhz;
24525210b06SDavid du Colombier 	int	cpuidax;
24625210b06SDavid du Colombier 	int	cpuiddx;
24725210b06SDavid du Colombier 	char	cpuidid[16];
24825210b06SDavid du Colombier 	char*	cpuidtype;
24925210b06SDavid du Colombier 	int	havetsc;
25025210b06SDavid du Colombier 	int	havepge;
25125210b06SDavid du Colombier 	uvlong	tscticks;
25225210b06SDavid du Colombier 	int	pdballoc;
25325210b06SDavid du Colombier 	int	pdbfree;
25425210b06SDavid du Colombier 
25525210b06SDavid du Colombier 	vlong	mtrrcap;
25625210b06SDavid du Colombier 	vlong	mtrrdef;
25725210b06SDavid du Colombier 	vlong	mtrrfix[11];
25825210b06SDavid du Colombier 	vlong	mtrrvar[32];		/* 256 max. */
25925210b06SDavid du Colombier 
26025210b06SDavid du Colombier 	int	stack[1];
26125210b06SDavid du Colombier };
26225210b06SDavid du Colombier 
26325210b06SDavid du Colombier /*
26425210b06SDavid du Colombier  * KMap the structure doesn't exist, but the functions do.
26525210b06SDavid du Colombier  */
26625210b06SDavid du Colombier typedef struct KMap		KMap;
26725210b06SDavid du Colombier #define	VA(k)		((void*)(k))
26825210b06SDavid du Colombier KMap*	kmap(Page*);
26925210b06SDavid du Colombier void	kunmap(KMap*);
27025210b06SDavid du Colombier 
27125210b06SDavid du Colombier struct
27225210b06SDavid du Colombier {
27325210b06SDavid du Colombier 	Lock;
27425210b06SDavid du Colombier 	int	machs;			/* bitmap of active CPUs */
27525210b06SDavid du Colombier 	int	exiting;		/* shutdown */
27625210b06SDavid du Colombier 	int	ispanic;		/* shutdown in response to a panic */
27725210b06SDavid du Colombier 	int	thunderbirdsarego;	/* lets the added processors continue to schedinit */
27825210b06SDavid du Colombier 	int	rebooting;		/* just idle cpus > 0 */
27925210b06SDavid du Colombier }active;
28025210b06SDavid du Colombier 
28125210b06SDavid du Colombier /*
28225210b06SDavid du Colombier  *  routines for things outside the PC model, like power management
28325210b06SDavid du Colombier  */
28425210b06SDavid du Colombier struct PCArch
28525210b06SDavid du Colombier {
28625210b06SDavid du Colombier 	char*	id;
28725210b06SDavid du Colombier 	int	(*ident)(void);		/* this should be in the model */
28825210b06SDavid du Colombier 	void	(*reset)(void);		/* this should be in the model */
28925210b06SDavid du Colombier 	int	(*serialpower)(int);	/* 1 == on, 0 == off */
29025210b06SDavid du Colombier 	int	(*modempower)(int);	/* 1 == on, 0 == off */
29125210b06SDavid du Colombier 
29225210b06SDavid du Colombier 	void	(*intrinit)(void);
29325210b06SDavid du Colombier 	int	(*intrenable)(Vctl*);
29425210b06SDavid du Colombier 	int	(*intrvecno)(int);
29525210b06SDavid du Colombier 	int	(*intrdisable)(int);
29625210b06SDavid du Colombier 	void	(*introff)(void);
29725210b06SDavid du Colombier 	void	(*intron)(void);
29825210b06SDavid du Colombier 
29925210b06SDavid du Colombier 	void	(*clockenable)(void);
30025210b06SDavid du Colombier 	uvlong	(*fastclock)(uvlong*);
30125210b06SDavid du Colombier 	void	(*timerset)(uvlong);
30225210b06SDavid du Colombier 
30325210b06SDavid du Colombier 	void	(*resetothers)(void);	/* put other cpus into reset */
30425210b06SDavid du Colombier };
30525210b06SDavid du Colombier 
30625210b06SDavid du Colombier /* cpuid instruction result register bits */
30725210b06SDavid du Colombier enum {
30825210b06SDavid du Colombier 	/* dx */
30925210b06SDavid du Colombier 	Fpuonchip = 1<<0,
310c9834a71SDavid du Colombier 	Pse	= 1<<3,		/* page size extensions */
31125210b06SDavid du Colombier 	Tsc	= 1<<4,		/* time-stamp counter */
31225210b06SDavid du Colombier 	Cpumsr	= 1<<5,		/* model-specific registers, rdmsr/wrmsr */
31325210b06SDavid du Colombier 	Pae	= 1<<6,		/* physical-addr extensions */
31425210b06SDavid du Colombier 	Mce	= 1<<7,		/* machine-check exception */
31525210b06SDavid du Colombier 	Cmpxchg8b = 1<<8,
31625210b06SDavid du Colombier 	Cpuapic	= 1<<9,
31725210b06SDavid du Colombier 	Mtrr	= 1<<12,	/* memory-type range regs.  */
31825210b06SDavid du Colombier 	Pge	= 1<<13,	/* page global extension */
319c9834a71SDavid du Colombier 	Pse2	= 1<<17,	/* more page size extensions */
32025210b06SDavid du Colombier 	Clflush = 1<<19,
321*48489f93SDavid du Colombier 	Acpif	= 1<<22,
32225210b06SDavid du Colombier 	Mmx	= 1<<23,
32325210b06SDavid du Colombier 	Fxsr	= 1<<24,	/* have SSE FXSAVE/FXRSTOR */
32425210b06SDavid du Colombier 	Sse	= 1<<25,	/* thus sfence instr. */
32525210b06SDavid du Colombier 	Sse2	= 1<<26,	/* thus mfence & lfence instr.s */
32625210b06SDavid du Colombier };
32725210b06SDavid du Colombier 
32825210b06SDavid du Colombier /*
32925210b06SDavid du Colombier  *  a parsed plan9.ini line
33025210b06SDavid du Colombier  */
33125210b06SDavid du Colombier #define NISAOPT		8
33225210b06SDavid du Colombier 
33325210b06SDavid du Colombier struct ISAConf {
33425210b06SDavid du Colombier 	char	*type;
33525210b06SDavid du Colombier 	ulong	port;
33625210b06SDavid du Colombier 	int	irq;
33725210b06SDavid du Colombier 	ulong	dma;
33825210b06SDavid du Colombier 	ulong	mem;
33925210b06SDavid du Colombier 	ulong	size;
34025210b06SDavid du Colombier 	ulong	freq;
34125210b06SDavid du Colombier 
34225210b06SDavid du Colombier 	int	nopt;
34325210b06SDavid du Colombier 	char	*opt[NISAOPT];
34425210b06SDavid du Colombier };
34525210b06SDavid du Colombier 
34625210b06SDavid du Colombier extern PCArch	*arch;			/* PC architecture */
34725210b06SDavid du Colombier 
34825210b06SDavid du Colombier /*
34925210b06SDavid du Colombier  * Each processor sees its own Mach structure at address MACHADDR.
35025210b06SDavid du Colombier  * However, the Mach structures must also be available via the per-processor
35125210b06SDavid du Colombier  * MMU information array machp, mainly for disambiguation and access to
35225210b06SDavid du Colombier  * the clock which is only maintained by the bootstrap processor (0).
35325210b06SDavid du Colombier  */
35425210b06SDavid du Colombier Mach* machp[MAXMACH];
35525210b06SDavid du Colombier 
35625210b06SDavid du Colombier #define	MACHP(n)	(machp[n])
35725210b06SDavid du Colombier 
35825210b06SDavid du Colombier extern Mach	*m;
35925210b06SDavid du Colombier #define up	(((Mach*)MACHADDR)->externup)
36025210b06SDavid du Colombier 
36125210b06SDavid du Colombier /*
36225210b06SDavid du Colombier  *  hardware info about a device
36325210b06SDavid du Colombier  */
36425210b06SDavid du Colombier typedef struct {
36525210b06SDavid du Colombier 	ulong	port;
36625210b06SDavid du Colombier 	int	size;
36725210b06SDavid du Colombier } Devport;
36825210b06SDavid du Colombier 
36925210b06SDavid du Colombier struct DevConf
37025210b06SDavid du Colombier {
37125210b06SDavid du Colombier 	ulong	intnum;			/* interrupt number */
37225210b06SDavid du Colombier 	char	*type;			/* card type, malloced */
37325210b06SDavid du Colombier 	int	nports;			/* Number of ports */
37425210b06SDavid du Colombier 	Devport	*ports;			/* The ports themselves */
37525210b06SDavid du Colombier };
37625210b06SDavid du Colombier 
37725210b06SDavid du Colombier typedef struct BIOS32ci {		/* BIOS32 Calling Interface */
37825210b06SDavid du Colombier 	u32int	eax;
37925210b06SDavid du Colombier 	u32int	ebx;
38025210b06SDavid du Colombier 	u32int	ecx;
38125210b06SDavid du Colombier 	u32int	edx;
38225210b06SDavid du Colombier 	u32int	esi;
38325210b06SDavid du Colombier 	u32int	edi;
38425210b06SDavid du Colombier } BIOS32ci;
38525210b06SDavid du Colombier 
38625210b06SDavid du Colombier /* misc. */
38725210b06SDavid du Colombier extern int	v_flag;
38825210b06SDavid du Colombier 
38925210b06SDavid du Colombier /* APM goo */
39025210b06SDavid du Colombier typedef struct Apminfo {
39125210b06SDavid du Colombier 	int haveinfo;
39225210b06SDavid du Colombier 	int ax;
39325210b06SDavid du Colombier 	int cx;
39425210b06SDavid du Colombier 	int dx;
39525210b06SDavid du Colombier 	int di;
39625210b06SDavid du Colombier 	int ebx;
39725210b06SDavid du Colombier 	int esi;
39825210b06SDavid du Colombier } Apminfo;
39925210b06SDavid du Colombier extern Apminfo	apm;
40025210b06SDavid du Colombier 
40125210b06SDavid du Colombier /*
40225210b06SDavid du Colombier  * Multiboot grot.
40325210b06SDavid du Colombier  */
40425210b06SDavid du Colombier typedef struct Mbi Mbi;
40525210b06SDavid du Colombier struct Mbi {
40625210b06SDavid du Colombier 	u32int	flags;
40725210b06SDavid du Colombier 	u32int	memlower;
40825210b06SDavid du Colombier 	u32int	memupper;
40925210b06SDavid du Colombier 	u32int	bootdevice;
41025210b06SDavid du Colombier 	u32int	cmdline;
41125210b06SDavid du Colombier 	u32int	modscount;
41225210b06SDavid du Colombier 	u32int	modsaddr;
41325210b06SDavid du Colombier 	u32int	syms[4];
41425210b06SDavid du Colombier 	u32int	mmaplength;
41525210b06SDavid du Colombier 	u32int	mmapaddr;
41625210b06SDavid du Colombier 	u32int	driveslength;
41725210b06SDavid du Colombier 	u32int	drivesaddr;
41825210b06SDavid du Colombier 	u32int	configtable;
41925210b06SDavid du Colombier 	u32int	bootloadername;
42025210b06SDavid du Colombier 	u32int	apmtable;
42125210b06SDavid du Colombier 	u32int	vbe[6];
42225210b06SDavid du Colombier };
42325210b06SDavid du Colombier 
42425210b06SDavid du Colombier enum {						/* flags */
42525210b06SDavid du Colombier 	Fmem		= 0x00000001,		/* mem* valid */
42625210b06SDavid du Colombier 	Fbootdevice	= 0x00000002,		/* bootdevice valid */
42725210b06SDavid du Colombier 	Fcmdline	= 0x00000004,		/* cmdline valid */
42825210b06SDavid du Colombier 	Fmods		= 0x00000008,		/* mod* valid */
42925210b06SDavid du Colombier 	Fsyms		= 0x00000010,		/* syms[] has a.out info */
43025210b06SDavid du Colombier 	Felf		= 0x00000020,		/* syms[] has ELF info */
43125210b06SDavid du Colombier 	Fmmap		= 0x00000040,		/* mmap* valid */
43225210b06SDavid du Colombier 	Fdrives		= 0x00000080,		/* drives* valid */
43325210b06SDavid du Colombier 	Fconfigtable	= 0x00000100,		/* configtable* valid */
43425210b06SDavid du Colombier 	Fbootloadername	= 0x00000200,		/* bootloadername* valid */
43525210b06SDavid du Colombier 	Fapmtable	= 0x00000400,		/* apmtable* valid */
43625210b06SDavid du Colombier 	Fvbe		= 0x00000800,		/* vbe[] valid */
43725210b06SDavid du Colombier };
43825210b06SDavid du Colombier 
43925210b06SDavid du Colombier typedef struct Mod Mod;
44025210b06SDavid du Colombier struct Mod {
44125210b06SDavid du Colombier 	u32int	modstart;
44225210b06SDavid du Colombier 	u32int	modend;
44325210b06SDavid du Colombier 	u32int	string;
44425210b06SDavid du Colombier 	u32int	reserved;
44525210b06SDavid du Colombier };
44625210b06SDavid du Colombier 
44725210b06SDavid du Colombier typedef struct MMap MMap;
44825210b06SDavid du Colombier struct MMap {
44925210b06SDavid du Colombier 	u32int	size;
45025210b06SDavid du Colombier 	u32int	base[2];
45125210b06SDavid du Colombier 	u32int	length[2];
45225210b06SDavid du Colombier 	u32int	type;
45325210b06SDavid du Colombier };
45425210b06SDavid du Colombier 
45525210b06SDavid du Colombier MMap mmap[32+1];
45625210b06SDavid du Colombier int nmmap;
45725210b06SDavid du Colombier 
45825210b06SDavid du Colombier Mbi *multibootheader;
45925210b06SDavid du Colombier 
46025210b06SDavid du Colombier enum {
46125210b06SDavid du Colombier 	Maxfile = 4096,
46225210b06SDavid du Colombier };
46325210b06SDavid du Colombier 
46425210b06SDavid du Colombier /* from 9load */
46525210b06SDavid du Colombier 
46625210b06SDavid du Colombier enum {	/* returned by bootpass */
46725210b06SDavid du Colombier 	MORE, ENOUGH, FAIL
46825210b06SDavid du Colombier };
46925210b06SDavid du Colombier enum {
47025210b06SDavid du Colombier 	INITKERNEL,
47125210b06SDavid du Colombier 	READEXEC,
47225210b06SDavid du Colombier 	READ9TEXT,
47325210b06SDavid du Colombier 	READ9DATA,
47425210b06SDavid du Colombier 	READGZIP,
47562579e34SDavid du Colombier 	READEHDR,		/* elf states ... */
47625210b06SDavid du Colombier 	READPHDR,
47725210b06SDavid du Colombier 	READEPAD,
47862579e34SDavid du Colombier 	READEDATA,		/* through here */
47962579e34SDavid du Colombier 	READE64HDR,		/* elf64 states ... */
48062579e34SDavid du Colombier 	READ64PHDR,
48162579e34SDavid du Colombier 	READE64PAD,
48262579e34SDavid du Colombier 	READE64DATA,		/* through here */
48325210b06SDavid du Colombier 	TRYBOOT,
48462579e34SDavid du Colombier 	TRYEBOOT,		/* another elf state */
48562579e34SDavid du Colombier 	TRYE64BOOT,		/* another elf state */
48625210b06SDavid du Colombier 	INIT9LOAD,
48725210b06SDavid du Colombier 	READ9LOAD,
48825210b06SDavid du Colombier 	FAILED
48925210b06SDavid du Colombier };
49025210b06SDavid du Colombier 
49125210b06SDavid du Colombier typedef struct Execbytes Execbytes;
49225210b06SDavid du Colombier struct	Execbytes
49325210b06SDavid du Colombier {
49425210b06SDavid du Colombier 	uchar	magic[4];		/* magic number */
49525210b06SDavid du Colombier 	uchar	text[4];	 	/* size of text segment */
49625210b06SDavid du Colombier 	uchar	data[4];	 	/* size of initialized data */
49725210b06SDavid du Colombier 	uchar	bss[4];	  		/* size of uninitialized data */
49825210b06SDavid du Colombier 	uchar	syms[4];	 	/* size of symbol table */
49925210b06SDavid du Colombier 	uchar	entry[4];	 	/* entry point */
50025210b06SDavid du Colombier 	uchar	spsz[4];		/* size of sp/pc offset table */
50125210b06SDavid du Colombier 	uchar	pcsz[4];		/* size of pc/line number table */
50225210b06SDavid du Colombier };
50325210b06SDavid du Colombier 
50425210b06SDavid du Colombier typedef struct {
50525210b06SDavid du Colombier 	Execbytes;
50625210b06SDavid du Colombier 	uvlong uvl[1];
50725210b06SDavid du Colombier } Exechdr;
50825210b06SDavid du Colombier 
50925210b06SDavid du Colombier typedef struct Boot Boot;
51025210b06SDavid du Colombier struct Boot {
51125210b06SDavid du Colombier 	int state;
51225210b06SDavid du Colombier 
51325210b06SDavid du Colombier 	Exechdr hdr;
51462579e34SDavid du Colombier 	uvlong	entry;
51525210b06SDavid du Colombier 
51625210b06SDavid du Colombier 	char *bp;	/* base ptr */
51725210b06SDavid du Colombier 	char *wp;	/* write ptr */
51825210b06SDavid du Colombier 	char *ep;	/* end ptr */
51925210b06SDavid du Colombier };
52025210b06SDavid du Colombier 
52125210b06SDavid du Colombier extern int	debugload;
52225210b06SDavid du Colombier extern Apminfo	apm;
523c1e5ebd3SDavid du Colombier extern Chan	*conschan;
52425210b06SDavid du Colombier extern char	*defaultpartition;
52525210b06SDavid du Colombier extern int	iniread;
52625210b06SDavid du Colombier extern u32int	memstart;
52725210b06SDavid du Colombier extern u32int	memend;
52825210b06SDavid du Colombier extern int	noclock;
52925210b06SDavid du Colombier extern int	pxe;
53025210b06SDavid du Colombier extern int	vga;
53125210b06SDavid du Colombier 
53225210b06SDavid du Colombier extern int	biosinited;
53325210b06SDavid du Colombier 
53425210b06SDavid du Colombier extern void _KTZERO(void);
53525210b06SDavid du Colombier #define KTZERO ((uintptr)_KTZERO)
536