xref: /plan9/sys/src/9/pc/dat.h (revision 4e3613ab15c331a9ada113286cc0f2a35bc0373d)
14fafed5dSDavid du Colombier typedef struct BIOS32si	BIOS32si;
24fafed5dSDavid du Colombier typedef struct BIOS32ci	BIOS32ci;
33e12c5d1SDavid du Colombier typedef struct Conf	Conf;
44de34a7eSDavid du Colombier typedef struct Confmem	Confmem;
5401314a3SDavid du Colombier typedef union FPsave	FPsave;
691e577b2SDavid du Colombier typedef struct FPssestate FPssestate;
791e577b2SDavid du Colombier typedef struct FPstate	FPstate;
8219b2ee8SDavid du Colombier typedef struct ISAConf	ISAConf;
93e12c5d1SDavid du Colombier typedef struct Label	Label;
103e12c5d1SDavid du Colombier typedef struct Lock	Lock;
113e12c5d1SDavid du Colombier typedef struct MMU	MMU;
123e12c5d1SDavid du Colombier typedef struct Mach	Mach;
137dd7cddfSDavid du Colombier typedef struct Notsave	Notsave;
14bd389b36SDavid du Colombier typedef struct PCArch	PCArch;
157dd7cddfSDavid du Colombier typedef struct Pcidev	Pcidev;
16219b2ee8SDavid du Colombier typedef struct PCMmap	PCMmap;
1780ee5cbfSDavid du Colombier typedef struct PCMslot	PCMslot;
183e12c5d1SDavid du Colombier typedef struct Page	Page;
193e12c5d1SDavid du Colombier typedef struct PMMU	PMMU;
207dd7cddfSDavid du Colombier typedef struct Proc	Proc;
213e12c5d1SDavid du Colombier typedef struct Segdesc	Segdesc;
22*4e3613abSDavid du Colombier typedef struct SFPssestate SFPssestate;
23fdc61599SDavid du Colombier typedef vlong		Tval;
243e12c5d1SDavid du Colombier typedef struct Ureg	Ureg;
257dd7cddfSDavid du Colombier typedef struct Vctl	Vctl;
263e12c5d1SDavid du Colombier 
274fafed5dSDavid du Colombier #pragma incomplete BIOS32si
28d04cc87cSDavid du Colombier #pragma incomplete Pcidev
2912fd1c83SDavid du Colombier #pragma incomplete Ureg
3012fd1c83SDavid du Colombier 
319a747e4fSDavid du Colombier #define MAXSYSARG	5	/* for mount(fd, afd, mpt, flag, arg) */
329a747e4fSDavid du Colombier 
3385878a71SDavid du Colombier #define KMESGSIZE (256*1024)	/* lots, for acpi debugging */
34cc162d66SDavid du Colombier #define STAGESIZE 2048
3585878a71SDavid du Colombier 
363e12c5d1SDavid du Colombier /*
373e12c5d1SDavid du Colombier  *  parameters for sysproc.c
383e12c5d1SDavid du Colombier  */
397dd7cddfSDavid du Colombier #define AOUT_MAGIC	(I_MAGIC)
403e12c5d1SDavid du Colombier 
413e12c5d1SDavid du Colombier struct Lock
423e12c5d1SDavid du Colombier {
433e12c5d1SDavid du Colombier 	ulong	key;
44219b2ee8SDavid du Colombier 	ulong	sr;
457dd7cddfSDavid du Colombier 	ulong	pc;
467dd7cddfSDavid du Colombier 	Proc	*p;
474de34a7eSDavid du Colombier 	Mach	*m;
487dd7cddfSDavid du Colombier 	ushort	isilock;
49208510e1SDavid du Colombier 	long	lockcycles;
503e12c5d1SDavid du Colombier };
513e12c5d1SDavid du Colombier 
523e12c5d1SDavid du Colombier struct Label
533e12c5d1SDavid du Colombier {
543e12c5d1SDavid du Colombier 	ulong	sp;
553e12c5d1SDavid du Colombier 	ulong	pc;
563e12c5d1SDavid du Colombier };
573e12c5d1SDavid du Colombier 
583e12c5d1SDavid du Colombier 
593e12c5d1SDavid du Colombier /*
603e12c5d1SDavid du Colombier  * FPsave.status
613e12c5d1SDavid du Colombier  */
623e12c5d1SDavid du Colombier enum
633e12c5d1SDavid du Colombier {
643ff48bf5SDavid du Colombier 	/* this is a state */
653ff48bf5SDavid du Colombier 	FPinit=		0,
663ff48bf5SDavid du Colombier 	FPactive=	1,
673ff48bf5SDavid du Colombier 	FPinactive=	2,
683ff48bf5SDavid du Colombier 
693ff48bf5SDavid du Colombier 	/* the following is a bit that can be or'd into the state */
703ff48bf5SDavid du Colombier 	FPillegal=	0x100,
713e12c5d1SDavid du Colombier };
723e12c5d1SDavid du Colombier 
7391e577b2SDavid du Colombier struct	FPstate			/* x87 fpu state */
743e12c5d1SDavid du Colombier {
753e12c5d1SDavid du Colombier 	ushort	control;
763e12c5d1SDavid du Colombier 	ushort	r1;
773e12c5d1SDavid du Colombier 	ushort	status;
783e12c5d1SDavid du Colombier 	ushort	r2;
793e12c5d1SDavid du Colombier 	ushort	tag;
803e12c5d1SDavid du Colombier 	ushort	r3;
813e12c5d1SDavid du Colombier 	ulong	pc;
823e12c5d1SDavid du Colombier 	ushort	selector;
833e12c5d1SDavid du Colombier 	ushort	r4;
843e12c5d1SDavid du Colombier 	ulong	operand;
853e12c5d1SDavid du Colombier 	ushort	oselector;
863e12c5d1SDavid du Colombier 	ushort	r5;
873e12c5d1SDavid du Colombier 	uchar	regs[80];	/* floating point registers */
883e12c5d1SDavid du Colombier };
893e12c5d1SDavid du Colombier 
9091e577b2SDavid du Colombier struct	FPssestate		/* SSE fp state */
9191e577b2SDavid du Colombier {
9291e577b2SDavid du Colombier 	ushort	fcw;		/* control */
9391e577b2SDavid du Colombier 	ushort	fsw;		/* status */
9491e577b2SDavid du Colombier 	ushort	ftw;		/* tag */
9591e577b2SDavid du Colombier 	ushort	fop;		/* opcode */
9691e577b2SDavid du Colombier 	ulong	fpuip;		/* pc */
9791e577b2SDavid du Colombier 	ushort	cs;		/* pc segment */
9891e577b2SDavid du Colombier 	ushort	r1;		/* reserved */
9991e577b2SDavid du Colombier 	ulong	fpudp;		/* data pointer */
10091e577b2SDavid du Colombier 	ushort	ds;		/* data pointer segment */
10191e577b2SDavid du Colombier 	ushort	r2;
10291e577b2SDavid du Colombier 	ulong	mxcsr;		/* MXCSR register state */
10391e577b2SDavid du Colombier 	ulong	mxcsr_mask;	/* MXCSR mask register */
10491e577b2SDavid du Colombier 	uchar	xregs[480];	/* extended registers */
105*4e3613abSDavid du Colombier };
106*4e3613abSDavid du Colombier 
107*4e3613abSDavid du Colombier struct	SFPssestate		/* SSE fp state with alignment slop */
108*4e3613abSDavid du Colombier {
109*4e3613abSDavid du Colombier 	FPssestate;
110*4e3613abSDavid du Colombier 	uchar	alignpad[FPalign]; /* slop to allow copying to aligned addr */
111*4e3613abSDavid du Colombier 	ulong	magic;		/* debugging: check for overrun */
11291e577b2SDavid du Colombier };
11391e577b2SDavid du Colombier 
114401314a3SDavid du Colombier /*
115401314a3SDavid du Colombier  * the FP regs must be stored here, not somewhere pointed to from here.
116401314a3SDavid du Colombier  * port code assumes this.
117401314a3SDavid du Colombier  */
118401314a3SDavid du Colombier union FPsave {
11991e577b2SDavid du Colombier 	FPstate;
120*4e3613abSDavid du Colombier 	SFPssestate;
12191e577b2SDavid du Colombier };
12291e577b2SDavid du Colombier 
1234de34a7eSDavid du Colombier struct Confmem
1244de34a7eSDavid du Colombier {
1254de34a7eSDavid du Colombier 	ulong	base;
1264de34a7eSDavid du Colombier 	ulong	npage;
1274de34a7eSDavid du Colombier 	ulong	kbase;
1284de34a7eSDavid du Colombier 	ulong	klimit;
1294de34a7eSDavid du Colombier };
1304de34a7eSDavid du Colombier 
1313e12c5d1SDavid du Colombier struct Conf
1323e12c5d1SDavid du Colombier {
1333e12c5d1SDavid du Colombier 	ulong	nmach;		/* processors */
1343e12c5d1SDavid du Colombier 	ulong	nproc;		/* processes */
1353e12c5d1SDavid du Colombier 	ulong	monitor;	/* has monitor? */
1364de34a7eSDavid du Colombier 	Confmem	mem[4];		/* physical memory */
1373e12c5d1SDavid du Colombier 	ulong	npage;		/* total physical pages of memory */
1383e12c5d1SDavid du Colombier 	ulong	upages;		/* user page pool */
1393e12c5d1SDavid du Colombier 	ulong	nimage;		/* number of page cache image headers */
1403e12c5d1SDavid du Colombier 	ulong	nswap;		/* number of swap pages */
1417dd7cddfSDavid du Colombier 	int	nswppo;		/* max # of pageouts per segment pass */
1423e12c5d1SDavid du Colombier 	ulong	base0;		/* base of bank 0 */
1433e12c5d1SDavid du Colombier 	ulong	base1;		/* base of bank 1 */
1443e12c5d1SDavid du Colombier 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
1457dd7cddfSDavid du Colombier 	ulong	ialloc;		/* max interrupt time allocation in bytes */
1467dd7cddfSDavid du Colombier 	ulong	pipeqsize;	/* size in bytes of pipe queues */
1479a747e4fSDavid du Colombier 	int	nuart;		/* number of uart devices */
1483e12c5d1SDavid du Colombier };
1493e12c5d1SDavid du Colombier 
1503e12c5d1SDavid du Colombier /*
1513e12c5d1SDavid du Colombier  *  MMU stuff in proc
1523e12c5d1SDavid du Colombier  */
1537dd7cddfSDavid du Colombier #define NCOLOR 1
1543e12c5d1SDavid du Colombier struct PMMU
1553e12c5d1SDavid du Colombier {
1567dd7cddfSDavid du Colombier 	Page*	mmupdb;			/* page directory base */
1573e12c5d1SDavid du Colombier 	Page*	mmufree;		/* unused page table pages */
1583e12c5d1SDavid du Colombier 	Page*	mmuused;		/* used page table pages */
159ea15f0ccSDavid du Colombier 	Page*	kmaptable;		/* page table used by kmap */
1604de34a7eSDavid du Colombier 	uint	lastkmap;		/* last entry used by kmap */
161ea15f0ccSDavid du Colombier 	int	nkmap;			/* number of current kmaps */
1623e12c5d1SDavid du Colombier };
1633e12c5d1SDavid du Colombier 
1647dd7cddfSDavid du Colombier /*
1657dd7cddfSDavid du Colombier  *  things saved in the Proc structure during a notify
1667dd7cddfSDavid du Colombier  */
1677dd7cddfSDavid du Colombier struct Notsave
1687dd7cddfSDavid du Colombier {
1697dd7cddfSDavid du Colombier 	ulong	svflags;
1707dd7cddfSDavid du Colombier 	ulong	svcs;
1717dd7cddfSDavid du Colombier 	ulong	svss;
1727dd7cddfSDavid du Colombier };
1737dd7cddfSDavid du Colombier 
1743e12c5d1SDavid du Colombier #include "../port/portdat.h"
1753e12c5d1SDavid du Colombier 
1767dd7cddfSDavid du Colombier typedef struct {
1777dd7cddfSDavid du Colombier 	ulong	link;			/* link (old TSS selector) */
1787dd7cddfSDavid du Colombier 	ulong	esp0;			/* privilege level 0 stack pointer */
1797dd7cddfSDavid du Colombier 	ulong	ss0;			/* privilege level 0 stack selector */
1807dd7cddfSDavid du Colombier 	ulong	esp1;			/* privilege level 1 stack pointer */
1817dd7cddfSDavid du Colombier 	ulong	ss1;			/* privilege level 1 stack selector */
1827dd7cddfSDavid du Colombier 	ulong	esp2;			/* privilege level 2 stack pointer */
1837dd7cddfSDavid du Colombier 	ulong	ss2;			/* privilege level 2 stack selector */
184425afbabSDavid du Colombier 	ulong	xcr3;			/* page directory base register - not used because we don't use trap gates */
185219b2ee8SDavid du Colombier 	ulong	eip;			/* instruction pointer */
1867dd7cddfSDavid du Colombier 	ulong	eflags;			/* flags register */
1877dd7cddfSDavid du Colombier 	ulong	eax;			/* general registers */
188219b2ee8SDavid du Colombier 	ulong 	ecx;
189219b2ee8SDavid du Colombier 	ulong	edx;
190219b2ee8SDavid du Colombier 	ulong	ebx;
191219b2ee8SDavid du Colombier 	ulong	esp;
192219b2ee8SDavid du Colombier 	ulong	ebp;
193219b2ee8SDavid du Colombier 	ulong	esi;
194219b2ee8SDavid du Colombier 	ulong	edi;
195219b2ee8SDavid du Colombier 	ulong	es;			/* segment selectors */
196219b2ee8SDavid du Colombier 	ulong	cs;
197219b2ee8SDavid du Colombier 	ulong	ss;
198219b2ee8SDavid du Colombier 	ulong	ds;
199219b2ee8SDavid du Colombier 	ulong	fs;
200219b2ee8SDavid du Colombier 	ulong	gs;
2017dd7cddfSDavid du Colombier 	ulong	ldt;			/* selector for task's LDT */
2027dd7cddfSDavid du Colombier 	ulong	iomap;			/* I/O map base address + T-bit */
2037dd7cddfSDavid du Colombier } Tss;
204219b2ee8SDavid du Colombier 
205219b2ee8SDavid du Colombier struct Segdesc
206219b2ee8SDavid du Colombier {
207219b2ee8SDavid du Colombier 	ulong	d0;
208219b2ee8SDavid du Colombier 	ulong	d1;
209219b2ee8SDavid du Colombier };
210219b2ee8SDavid du Colombier 
2113e12c5d1SDavid du Colombier struct Mach
2123e12c5d1SDavid du Colombier {
2139a747e4fSDavid du Colombier 	int	machno;			/* physical id of processor (KNOWN TO ASSEMBLY) */
2143e12c5d1SDavid du Colombier 	ulong	splpc;			/* pc of last caller to splhi */
215219b2ee8SDavid du Colombier 
2167dd7cddfSDavid du Colombier 	ulong*	pdb;			/* page directory base for this processor (va) */
2177dd7cddfSDavid du Colombier 	Tss*	tss;			/* tss for this processor */
2189a747e4fSDavid du Colombier 	Segdesc	*gdt;			/* gdt for this processor */
2197dd7cddfSDavid du Colombier 
2203e12c5d1SDavid du Colombier 	Proc*	proc;			/* current process on this processor */
2217dd7cddfSDavid du Colombier 	Proc*	externup;		/* extern register Proc *up */
2227dd7cddfSDavid du Colombier 
2237dd7cddfSDavid du Colombier 	Page*	pdbpool;
2247dd7cddfSDavid du Colombier 	int	pdbcnt;
2257dd7cddfSDavid du Colombier 
2267dd7cddfSDavid du Colombier 	ulong	ticks;			/* of the clock since boot time */
2273e12c5d1SDavid du Colombier 	Label	sched;			/* scheduler wakeup */
2283e12c5d1SDavid du Colombier 	Lock	alarmlock;		/* access to alarm list */
2293e12c5d1SDavid du Colombier 	void*	alarm;			/* alarms bound to this clock */
23080ee5cbfSDavid du Colombier 	int	inclockintr;
2313e12c5d1SDavid du Colombier 
23259c21d95SDavid du Colombier 	Proc*	readied;		/* for runproc */
23359c21d95SDavid du Colombier 	ulong	schedticks;		/* next forced context switch */
2347dd7cddfSDavid du Colombier 
2353e12c5d1SDavid du Colombier 	int	tlbfault;
2363e12c5d1SDavid du Colombier 	int	tlbpurge;
2373e12c5d1SDavid du Colombier 	int	pfault;
2383e12c5d1SDavid du Colombier 	int	cs;
2393e12c5d1SDavid du Colombier 	int	syscall;
2403e12c5d1SDavid du Colombier 	int	load;
2413e12c5d1SDavid du Colombier 	int	intr;
2427dd7cddfSDavid du Colombier 	int	flushmmu;		/* make current proc flush it's mmu state */
2439a747e4fSDavid du Colombier 	int	ilockdepth;
2443ff48bf5SDavid du Colombier 	Perf	perf;			/* performance counters */
2453e12c5d1SDavid du Colombier 
2467dd7cddfSDavid du Colombier 	ulong	spuriousintr;
2477dd7cddfSDavid du Colombier 	int	lastintr;
2487dd7cddfSDavid du Colombier 
2497dd7cddfSDavid du Colombier 	int	loopconst;
2507dd7cddfSDavid du Colombier 
2519a747e4fSDavid du Colombier 	Lock	apictimerlock;
2527dd7cddfSDavid du Colombier 	int	cpumhz;
253e288d156SDavid du Colombier 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
2549a747e4fSDavid du Colombier 	uvlong	cpuhz;
2557dd7cddfSDavid du Colombier 	int	cpuidax;
2567dd7cddfSDavid du Colombier 	int	cpuiddx;
2577dd7cddfSDavid du Colombier 	char	cpuidid[16];
2587dd7cddfSDavid du Colombier 	char*	cpuidtype;
2599a747e4fSDavid du Colombier 	int	havetsc;
2609a747e4fSDavid du Colombier 	int	havepge;
2619a747e4fSDavid du Colombier 	uvlong	tscticks;
2621bd28109SDavid du Colombier 	int	pdballoc;
2631bd28109SDavid du Colombier 	int	pdbfree;
264d7e44d0dSDavid du Colombier 	FPsave	*fpsavalign;
2657dd7cddfSDavid du Colombier 
2667dd7cddfSDavid du Colombier 	vlong	mtrrcap;
2677dd7cddfSDavid du Colombier 	vlong	mtrrdef;
2687dd7cddfSDavid du Colombier 	vlong	mtrrfix[11];
2697dd7cddfSDavid du Colombier 	vlong	mtrrvar[32];		/* 256 max. */
270219b2ee8SDavid du Colombier 
2713e12c5d1SDavid du Colombier 	int	stack[1];
2723e12c5d1SDavid du Colombier };
2733e12c5d1SDavid du Colombier 
2743e12c5d1SDavid du Colombier /*
2754de34a7eSDavid du Colombier  * KMap the structure doesn't exist, but the functions do.
2763e12c5d1SDavid du Colombier  */
2774de34a7eSDavid du Colombier typedef struct KMap		KMap;
2784de34a7eSDavid du Colombier #define	VA(k)		((void*)(k))
2794de34a7eSDavid du Colombier KMap*	kmap(Page*);
2804de34a7eSDavid du Colombier void	kunmap(KMap*);
2813e12c5d1SDavid du Colombier 
2823e12c5d1SDavid du Colombier struct
2833e12c5d1SDavid du Colombier {
2843e12c5d1SDavid du Colombier 	Lock;
2857dd7cddfSDavid du Colombier 	int	machs;			/* bitmap of active CPUs */
2867dd7cddfSDavid du Colombier 	int	exiting;		/* shutdown */
2877dd7cddfSDavid du Colombier 	int	ispanic;		/* shutdown in response to a panic */
288da51d93aSDavid du Colombier 	int	thunderbirdsarego;	/* lets the added processors continue to schedinit */
289dadaab63SDavid du Colombier 	int	rebooting;		/* just idle cpus > 0 */
2903e12c5d1SDavid du Colombier }active;
2913e12c5d1SDavid du Colombier 
292bd389b36SDavid du Colombier /*
293bd389b36SDavid du Colombier  *  routines for things outside the PC model, like power management
294bd389b36SDavid du Colombier  */
295bd389b36SDavid du Colombier struct PCArch
296bd389b36SDavid du Colombier {
297bd389b36SDavid du Colombier 	char*	id;
2987dd7cddfSDavid du Colombier 	int	(*ident)(void);		/* this should be in the model */
299bd389b36SDavid du Colombier 	void	(*reset)(void);		/* this should be in the model */
300bd389b36SDavid du Colombier 	int	(*serialpower)(int);	/* 1 == on, 0 == off */
301bd389b36SDavid du Colombier 	int	(*modempower)(int);	/* 1 == on, 0 == off */
3027dd7cddfSDavid du Colombier 
3037dd7cddfSDavid du Colombier 	void	(*intrinit)(void);
3047dd7cddfSDavid du Colombier 	int	(*intrenable)(Vctl*);
3059a747e4fSDavid du Colombier 	int	(*intrvecno)(int);
3069a747e4fSDavid du Colombier 	int	(*intrdisable)(int);
3074de34a7eSDavid du Colombier 	void	(*introff)(void);
3084de34a7eSDavid du Colombier 	void	(*intron)(void);
3097dd7cddfSDavid du Colombier 
3107dd7cddfSDavid du Colombier 	void	(*clockenable)(void);
3117dd7cddfSDavid du Colombier 	uvlong	(*fastclock)(uvlong*);
3129a747e4fSDavid du Colombier 	void	(*timerset)(uvlong);
3131206f3fcSDavid du Colombier 
3141206f3fcSDavid du Colombier 	void	(*resetothers)(void);	/* put other cpus into reset */
315bd389b36SDavid du Colombier };
316bd389b36SDavid du Colombier 
317fdc61599SDavid du Colombier /* cpuid instruction result register bits */
318fdc61599SDavid du Colombier enum {
319fdc61599SDavid du Colombier 	/* dx */
320fdc61599SDavid du Colombier 	Fpuonchip = 1<<0,
32161fd6f66SDavid du Colombier 	Vmex	= 1<<1,		/* virtual-mode extensions */
32261fd6f66SDavid du Colombier 	Pse	= 1<<3,		/* page size extensions */
323fdc61599SDavid du Colombier 	Tsc	= 1<<4,		/* time-stamp counter */
324fdc61599SDavid du Colombier 	Cpumsr	= 1<<5,		/* model-specific registers, rdmsr/wrmsr */
325fdc61599SDavid du Colombier 	Pae	= 1<<6,		/* physical-addr extensions */
326fdc61599SDavid du Colombier 	Mce	= 1<<7,		/* machine-check exception */
327fdc61599SDavid du Colombier 	Cmpxchg8b = 1<<8,
328fdc61599SDavid du Colombier 	Cpuapic	= 1<<9,
329fdc61599SDavid du Colombier 	Mtrr	= 1<<12,	/* memory-type range regs.  */
330fdc61599SDavid du Colombier 	Pge	= 1<<13,	/* page global extension */
33161fd6f66SDavid du Colombier 	Pse2	= 1<<17,	/* more page size extensions */
332fdc61599SDavid du Colombier 	Clflush = 1<<19,
333fdc61599SDavid du Colombier 	Mmx	= 1<<23,
33491e577b2SDavid du Colombier 	Fxsr	= 1<<24,	/* have SSE FXSAVE/FXRSTOR */
335fdc61599SDavid du Colombier 	Sse	= 1<<25,	/* thus sfence instr. */
336fdc61599SDavid du Colombier 	Sse2	= 1<<26,	/* thus mfence & lfence instr.s */
337fdc61599SDavid du Colombier };
338fdc61599SDavid du Colombier 
3397dd7cddfSDavid du Colombier /*
3407dd7cddfSDavid du Colombier  *  a parsed plan9.ini line
3417dd7cddfSDavid du Colombier  */
3427dd7cddfSDavid du Colombier #define NISAOPT		8
343219b2ee8SDavid du Colombier 
344219b2ee8SDavid du Colombier struct ISAConf {
3459a747e4fSDavid du Colombier 	char	*type;
346219b2ee8SDavid du Colombier 	ulong	port;
347fb7f0c93SDavid du Colombier 	int	irq;
3487dd7cddfSDavid du Colombier 	ulong	dma;
349219b2ee8SDavid du Colombier 	ulong	mem;
350219b2ee8SDavid du Colombier 	ulong	size;
3517dd7cddfSDavid du Colombier 	ulong	freq;
3527dd7cddfSDavid du Colombier 
3537dd7cddfSDavid du Colombier 	int	nopt;
3549a747e4fSDavid du Colombier 	char	*opt[NISAOPT];
355219b2ee8SDavid du Colombier };
356219b2ee8SDavid du Colombier 
3577dd7cddfSDavid du Colombier extern PCArch	*arch;			/* PC architecture */
3587dd7cddfSDavid du Colombier 
359219b2ee8SDavid du Colombier /*
3607dd7cddfSDavid du Colombier  * Each processor sees its own Mach structure at address MACHADDR.
3617dd7cddfSDavid du Colombier  * However, the Mach structures must also be available via the per-processor
3627dd7cddfSDavid du Colombier  * MMU information array machp, mainly for disambiguation and access to
3637dd7cddfSDavid du Colombier  * the clock which is only maintained by the bootstrap processor (0).
364219b2ee8SDavid du Colombier  */
3657dd7cddfSDavid du Colombier Mach* machp[MAXMACH];
366219b2ee8SDavid du Colombier 
3677dd7cddfSDavid du Colombier #define	MACHP(n)	(machp[n])
368219b2ee8SDavid du Colombier 
3697dd7cddfSDavid du Colombier extern Mach	*m;
3707dd7cddfSDavid du Colombier #define up	(((Mach*)MACHADDR)->externup)
3719a747e4fSDavid du Colombier 
3729a747e4fSDavid du Colombier /*
3739a747e4fSDavid du Colombier  *  hardware info about a device
3749a747e4fSDavid du Colombier  */
3759a747e4fSDavid du Colombier typedef struct {
3769a747e4fSDavid du Colombier 	ulong	port;
3779a747e4fSDavid du Colombier 	int	size;
37859c21d95SDavid du Colombier } Devport;
3799a747e4fSDavid du Colombier 
3809a747e4fSDavid du Colombier struct DevConf
3819a747e4fSDavid du Colombier {
3823ff48bf5SDavid du Colombier 	ulong	intnum;			/* interrupt number */
3839a747e4fSDavid du Colombier 	char	*type;			/* card type, malloced */
3849a747e4fSDavid du Colombier 	int	nports;			/* Number of ports */
38559c21d95SDavid du Colombier 	Devport	*ports;			/* The ports themselves */
3869a747e4fSDavid du Colombier };
3874fafed5dSDavid du Colombier 
3884fafed5dSDavid du Colombier typedef struct BIOS32ci {		/* BIOS32 Calling Interface */
3894fafed5dSDavid du Colombier 	u32int	eax;
3904fafed5dSDavid du Colombier 	u32int	ebx;
3914fafed5dSDavid du Colombier 	u32int	ecx;
3924fafed5dSDavid du Colombier 	u32int	edx;
3934fafed5dSDavid du Colombier 	u32int	esi;
3944fafed5dSDavid du Colombier 	u32int	edi;
3954fafed5dSDavid du Colombier } BIOS32ci;
396