xref: /plan9-contrib/sys/src/9/pc/dat.h (revision 77dd0a987f922b1125641a8757e16b54f2cf323f)
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;
13bd389b36SDavid du Colombier typedef struct PCArch	PCArch;
147dd7cddfSDavid du Colombier typedef struct Pcidev	Pcidev;
15219b2ee8SDavid du Colombier typedef struct PCMmap	PCMmap;
1680ee5cbfSDavid du Colombier typedef struct PCMslot	PCMslot;
173e12c5d1SDavid du Colombier typedef struct Page	Page;
183e12c5d1SDavid du Colombier typedef struct PMMU	PMMU;
197dd7cddfSDavid du Colombier typedef struct Proc	Proc;
203e12c5d1SDavid du Colombier typedef struct Segdesc	Segdesc;
214e3613abSDavid du Colombier typedef struct SFPssestate SFPssestate;
22fdc61599SDavid du Colombier typedef vlong		Tval;
233e12c5d1SDavid du Colombier typedef struct Ureg	Ureg;
247dd7cddfSDavid du Colombier typedef struct Vctl	Vctl;
253e12c5d1SDavid du Colombier 
264fafed5dSDavid du Colombier #pragma incomplete BIOS32si
27d04cc87cSDavid du Colombier #pragma incomplete Pcidev
2812fd1c83SDavid du Colombier #pragma incomplete Ureg
2912fd1c83SDavid du Colombier 
309a747e4fSDavid du Colombier #define MAXSYSARG	5	/* for mount(fd, afd, mpt, flag, arg) */
319a747e4fSDavid du Colombier 
3285878a71SDavid du Colombier #define KMESGSIZE (256*1024)	/* lots, for acpi debugging */
33cc162d66SDavid du Colombier #define STAGESIZE 2048
3485878a71SDavid du Colombier 
353e12c5d1SDavid du Colombier /*
363e12c5d1SDavid du Colombier  *  parameters for sysproc.c
373e12c5d1SDavid du Colombier  */
387dd7cddfSDavid du Colombier #define AOUT_MAGIC	(I_MAGIC)
393e12c5d1SDavid du Colombier 
403e12c5d1SDavid du Colombier struct Lock
413e12c5d1SDavid du Colombier {
423e12c5d1SDavid du Colombier 	ulong	key;
43219b2ee8SDavid du Colombier 	ulong	sr;
447dd7cddfSDavid du Colombier 	ulong	pc;
457dd7cddfSDavid du Colombier 	Proc	*p;
464de34a7eSDavid du Colombier 	Mach	*m;
477dd7cddfSDavid du Colombier 	ushort	isilock;
48208510e1SDavid du Colombier 	long	lockcycles;
493e12c5d1SDavid du Colombier };
503e12c5d1SDavid du Colombier 
513e12c5d1SDavid du Colombier struct Label
523e12c5d1SDavid du Colombier {
533e12c5d1SDavid du Colombier 	ulong	sp;
543e12c5d1SDavid du Colombier 	ulong	pc;
553e12c5d1SDavid du Colombier };
563e12c5d1SDavid du Colombier 
573e12c5d1SDavid du Colombier 
583e12c5d1SDavid du Colombier /*
593e12c5d1SDavid du Colombier  * FPsave.status
603e12c5d1SDavid du Colombier  */
613e12c5d1SDavid du Colombier enum
623e12c5d1SDavid du Colombier {
633ff48bf5SDavid du Colombier 	/* this is a state */
643ff48bf5SDavid du Colombier 	FPinit=		0,
653ff48bf5SDavid du Colombier 	FPactive=	1,
663ff48bf5SDavid du Colombier 	FPinactive=	2,
673ff48bf5SDavid du Colombier 
683ff48bf5SDavid du Colombier 	/* the following is a bit that can be or'd into the state */
693ff48bf5SDavid du Colombier 	FPillegal=	0x100,
703e12c5d1SDavid du Colombier };
713e12c5d1SDavid du Colombier 
7291e577b2SDavid du Colombier struct	FPstate			/* x87 fpu state */
733e12c5d1SDavid du Colombier {
743e12c5d1SDavid du Colombier 	ushort	control;
753e12c5d1SDavid du Colombier 	ushort	r1;
763e12c5d1SDavid du Colombier 	ushort	status;
773e12c5d1SDavid du Colombier 	ushort	r2;
783e12c5d1SDavid du Colombier 	ushort	tag;
793e12c5d1SDavid du Colombier 	ushort	r3;
803e12c5d1SDavid du Colombier 	ulong	pc;
813e12c5d1SDavid du Colombier 	ushort	selector;
823e12c5d1SDavid du Colombier 	ushort	r4;
833e12c5d1SDavid du Colombier 	ulong	operand;
843e12c5d1SDavid du Colombier 	ushort	oselector;
853e12c5d1SDavid du Colombier 	ushort	r5;
863e12c5d1SDavid du Colombier 	uchar	regs[80];	/* floating point registers */
873e12c5d1SDavid du Colombier };
883e12c5d1SDavid du Colombier 
8991e577b2SDavid du Colombier struct	FPssestate		/* SSE fp state */
9091e577b2SDavid du Colombier {
9191e577b2SDavid du Colombier 	ushort	fcw;		/* control */
9291e577b2SDavid du Colombier 	ushort	fsw;		/* status */
9391e577b2SDavid du Colombier 	ushort	ftw;		/* tag */
9491e577b2SDavid du Colombier 	ushort	fop;		/* opcode */
9591e577b2SDavid du Colombier 	ulong	fpuip;		/* pc */
9691e577b2SDavid du Colombier 	ushort	cs;		/* pc segment */
9791e577b2SDavid du Colombier 	ushort	r1;		/* reserved */
9891e577b2SDavid du Colombier 	ulong	fpudp;		/* data pointer */
9991e577b2SDavid du Colombier 	ushort	ds;		/* data pointer segment */
10091e577b2SDavid du Colombier 	ushort	r2;
10191e577b2SDavid du Colombier 	ulong	mxcsr;		/* MXCSR register state */
10291e577b2SDavid du Colombier 	ulong	mxcsr_mask;	/* MXCSR mask register */
10391e577b2SDavid du Colombier 	uchar	xregs[480];	/* extended registers */
1044e3613abSDavid du Colombier };
1054e3613abSDavid du Colombier 
1064e3613abSDavid du Colombier struct	SFPssestate		/* SSE fp state with alignment slop */
1074e3613abSDavid du Colombier {
1084e3613abSDavid du Colombier 	FPssestate;
1094e3613abSDavid du Colombier 	uchar	alignpad[FPalign]; /* slop to allow copying to aligned addr */
1104e3613abSDavid du Colombier 	ulong	magic;		/* debugging: check for overrun */
11191e577b2SDavid du Colombier };
11291e577b2SDavid du Colombier 
113401314a3SDavid du Colombier /*
114401314a3SDavid du Colombier  * the FP regs must be stored here, not somewhere pointed to from here.
115401314a3SDavid du Colombier  * port code assumes this.
116401314a3SDavid du Colombier  */
117401314a3SDavid du Colombier union FPsave {
11891e577b2SDavid du Colombier 	FPstate;
1194e3613abSDavid du Colombier 	SFPssestate;
12091e577b2SDavid du Colombier };
12191e577b2SDavid du Colombier 
1224de34a7eSDavid du Colombier struct Confmem
1234de34a7eSDavid du Colombier {
1244de34a7eSDavid du Colombier 	ulong	base;
1254de34a7eSDavid du Colombier 	ulong	npage;
1264de34a7eSDavid du Colombier 	ulong	kbase;
1274de34a7eSDavid du Colombier 	ulong	klimit;
1284de34a7eSDavid du Colombier };
1294de34a7eSDavid du Colombier 
1303e12c5d1SDavid du Colombier struct Conf
1313e12c5d1SDavid du Colombier {
1323e12c5d1SDavid du Colombier 	ulong	nmach;		/* processors */
1333e12c5d1SDavid du Colombier 	ulong	nproc;		/* processes */
1343e12c5d1SDavid du Colombier 	ulong	monitor;	/* has monitor? */
1354de34a7eSDavid du Colombier 	Confmem	mem[4];		/* physical memory */
1363e12c5d1SDavid du Colombier 	ulong	npage;		/* total physical pages of memory */
1373e12c5d1SDavid du Colombier 	ulong	upages;		/* user page pool */
1383e12c5d1SDavid du Colombier 	ulong	nimage;		/* number of page cache image headers */
1393e12c5d1SDavid du Colombier 	ulong	nswap;		/* number of swap pages */
1407dd7cddfSDavid du Colombier 	int	nswppo;		/* max # of pageouts per segment pass */
1413e12c5d1SDavid du Colombier 	ulong	base0;		/* base of bank 0 */
1423e12c5d1SDavid du Colombier 	ulong	base1;		/* base of bank 1 */
1433e12c5d1SDavid du Colombier 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
1447dd7cddfSDavid du Colombier 	ulong	ialloc;		/* max interrupt time allocation in bytes */
1457dd7cddfSDavid du Colombier 	ulong	pipeqsize;	/* size in bytes of pipe queues */
1469a747e4fSDavid du Colombier 	int	nuart;		/* number of uart devices */
1473e12c5d1SDavid du Colombier };
1483e12c5d1SDavid du Colombier 
1493e12c5d1SDavid du Colombier /*
1503e12c5d1SDavid du Colombier  *  MMU stuff in proc
1513e12c5d1SDavid du Colombier  */
1527dd7cddfSDavid du Colombier #define NCOLOR 1
1533e12c5d1SDavid du Colombier struct PMMU
1543e12c5d1SDavid du Colombier {
1557dd7cddfSDavid du Colombier 	Page*	mmupdb;			/* page directory base */
1563e12c5d1SDavid du Colombier 	Page*	mmufree;		/* unused page table pages */
1573e12c5d1SDavid du Colombier 	Page*	mmuused;		/* used page table pages */
158ea15f0ccSDavid du Colombier 	Page*	kmaptable;		/* page table used by kmap */
1594de34a7eSDavid du Colombier 	uint	lastkmap;		/* last entry used by kmap */
160ea15f0ccSDavid du Colombier 	int	nkmap;			/* number of current kmaps */
1613e12c5d1SDavid du Colombier };
1623e12c5d1SDavid du Colombier 
1633e12c5d1SDavid du Colombier #include "../port/portdat.h"
1643e12c5d1SDavid du Colombier 
1657dd7cddfSDavid du Colombier typedef struct {
1667dd7cddfSDavid du Colombier 	ulong	link;			/* link (old TSS selector) */
1677dd7cddfSDavid du Colombier 	ulong	esp0;			/* privilege level 0 stack pointer */
1687dd7cddfSDavid du Colombier 	ulong	ss0;			/* privilege level 0 stack selector */
1697dd7cddfSDavid du Colombier 	ulong	esp1;			/* privilege level 1 stack pointer */
1707dd7cddfSDavid du Colombier 	ulong	ss1;			/* privilege level 1 stack selector */
1717dd7cddfSDavid du Colombier 	ulong	esp2;			/* privilege level 2 stack pointer */
1727dd7cddfSDavid du Colombier 	ulong	ss2;			/* privilege level 2 stack selector */
173425afbabSDavid du Colombier 	ulong	xcr3;			/* page directory base register - not used because we don't use trap gates */
174219b2ee8SDavid du Colombier 	ulong	eip;			/* instruction pointer */
1757dd7cddfSDavid du Colombier 	ulong	eflags;			/* flags register */
1767dd7cddfSDavid du Colombier 	ulong	eax;			/* general registers */
177219b2ee8SDavid du Colombier 	ulong 	ecx;
178219b2ee8SDavid du Colombier 	ulong	edx;
179219b2ee8SDavid du Colombier 	ulong	ebx;
180219b2ee8SDavid du Colombier 	ulong	esp;
181219b2ee8SDavid du Colombier 	ulong	ebp;
182219b2ee8SDavid du Colombier 	ulong	esi;
183219b2ee8SDavid du Colombier 	ulong	edi;
184219b2ee8SDavid du Colombier 	ulong	es;			/* segment selectors */
185219b2ee8SDavid du Colombier 	ulong	cs;
186219b2ee8SDavid du Colombier 	ulong	ss;
187219b2ee8SDavid du Colombier 	ulong	ds;
188219b2ee8SDavid du Colombier 	ulong	fs;
189219b2ee8SDavid du Colombier 	ulong	gs;
1907dd7cddfSDavid du Colombier 	ulong	ldt;			/* selector for task's LDT */
1917dd7cddfSDavid du Colombier 	ulong	iomap;			/* I/O map base address + T-bit */
1927dd7cddfSDavid du Colombier } Tss;
193219b2ee8SDavid du Colombier 
194219b2ee8SDavid du Colombier struct Segdesc
195219b2ee8SDavid du Colombier {
196219b2ee8SDavid du Colombier 	ulong	d0;
197219b2ee8SDavid du Colombier 	ulong	d1;
198219b2ee8SDavid du Colombier };
199219b2ee8SDavid du Colombier 
2003e12c5d1SDavid du Colombier struct Mach
2013e12c5d1SDavid du Colombier {
2029a747e4fSDavid du Colombier 	int	machno;			/* physical id of processor (KNOWN TO ASSEMBLY) */
2033e12c5d1SDavid du Colombier 	ulong	splpc;			/* pc of last caller to splhi */
204219b2ee8SDavid du Colombier 
2057dd7cddfSDavid du Colombier 	ulong*	pdb;			/* page directory base for this processor (va) */
2067dd7cddfSDavid du Colombier 	Tss*	tss;			/* tss for this processor */
2079a747e4fSDavid du Colombier 	Segdesc	*gdt;			/* gdt for this processor */
2087dd7cddfSDavid du Colombier 
2093e12c5d1SDavid du Colombier 	Proc*	proc;			/* current process on this processor */
2107dd7cddfSDavid du Colombier 	Proc*	externup;		/* extern register Proc *up */
2117dd7cddfSDavid du Colombier 
2127dd7cddfSDavid du Colombier 	Page*	pdbpool;
2137dd7cddfSDavid du Colombier 	int	pdbcnt;
2147dd7cddfSDavid du Colombier 
2157dd7cddfSDavid du Colombier 	ulong	ticks;			/* of the clock since boot time */
2163e12c5d1SDavid du Colombier 	Label	sched;			/* scheduler wakeup */
2173e12c5d1SDavid du Colombier 	Lock	alarmlock;		/* access to alarm list */
2183e12c5d1SDavid du Colombier 	void*	alarm;			/* alarms bound to this clock */
21980ee5cbfSDavid du Colombier 	int	inclockintr;
2203e12c5d1SDavid du Colombier 
22159c21d95SDavid du Colombier 	Proc*	readied;		/* for runproc */
22259c21d95SDavid du Colombier 	ulong	schedticks;		/* next forced context switch */
2237dd7cddfSDavid du Colombier 
2243e12c5d1SDavid du Colombier 	int	tlbfault;
2253e12c5d1SDavid du Colombier 	int	tlbpurge;
2263e12c5d1SDavid du Colombier 	int	pfault;
2273e12c5d1SDavid du Colombier 	int	cs;
2283e12c5d1SDavid du Colombier 	int	syscall;
2293e12c5d1SDavid du Colombier 	int	load;
2303e12c5d1SDavid du Colombier 	int	intr;
2317dd7cddfSDavid du Colombier 	int	flushmmu;		/* make current proc flush it's mmu state */
2329a747e4fSDavid du Colombier 	int	ilockdepth;
2333ff48bf5SDavid du Colombier 	Perf	perf;			/* performance counters */
2343e12c5d1SDavid du Colombier 
2357dd7cddfSDavid du Colombier 	ulong	spuriousintr;
2367dd7cddfSDavid du Colombier 	int	lastintr;
2377dd7cddfSDavid du Colombier 
2387dd7cddfSDavid du Colombier 	int	loopconst;
2397dd7cddfSDavid du Colombier 
2409a747e4fSDavid du Colombier 	Lock	apictimerlock;
2417dd7cddfSDavid du Colombier 	int	cpumhz;
242e288d156SDavid du Colombier 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
2439a747e4fSDavid du Colombier 	uvlong	cpuhz;
2447dd7cddfSDavid du Colombier 	int	cpuidax;
2457dd7cddfSDavid du Colombier 	int	cpuiddx;
2467dd7cddfSDavid du Colombier 	char	cpuidid[16];
2477dd7cddfSDavid du Colombier 	char*	cpuidtype;
2489a747e4fSDavid du Colombier 	int	havetsc;
2499a747e4fSDavid du Colombier 	int	havepge;
2509a747e4fSDavid du Colombier 	uvlong	tscticks;
2511bd28109SDavid du Colombier 	int	pdballoc;
2521bd28109SDavid du Colombier 	int	pdbfree;
253d7e44d0dSDavid du Colombier 	FPsave	*fpsavalign;
2547dd7cddfSDavid du Colombier 
2557dd7cddfSDavid du Colombier 	vlong	mtrrcap;
2567dd7cddfSDavid du Colombier 	vlong	mtrrdef;
2577dd7cddfSDavid du Colombier 	vlong	mtrrfix[11];
2587dd7cddfSDavid du Colombier 	vlong	mtrrvar[32];		/* 256 max. */
259219b2ee8SDavid du Colombier 
2603e12c5d1SDavid du Colombier 	int	stack[1];
2613e12c5d1SDavid du Colombier };
2623e12c5d1SDavid du Colombier 
2633e12c5d1SDavid du Colombier /*
2644de34a7eSDavid du Colombier  * KMap the structure doesn't exist, but the functions do.
2653e12c5d1SDavid du Colombier  */
2664de34a7eSDavid du Colombier typedef struct KMap		KMap;
2674de34a7eSDavid du Colombier #define	VA(k)		((void*)(k))
2684de34a7eSDavid du Colombier KMap*	kmap(Page*);
2694de34a7eSDavid du Colombier void	kunmap(KMap*);
2703e12c5d1SDavid du Colombier 
2713e12c5d1SDavid du Colombier struct
2723e12c5d1SDavid du Colombier {
2733e12c5d1SDavid du Colombier 	Lock;
274*405829f1SDavid du Colombier 	union {
275*405829f1SDavid du Colombier 		uvlong	machs;		/* bitmap of active CPUs */
276*405829f1SDavid du Colombier 		ulong	machsmap[(MAXMACH+BI2WD-1)/BI2WD];
277*405829f1SDavid du Colombier 	};
278*405829f1SDavid du Colombier 	int	nmachs;			/* number of bits set in machs(map) */
2797dd7cddfSDavid du Colombier 	int	exiting;		/* shutdown */
2807dd7cddfSDavid du Colombier 	int	ispanic;		/* shutdown in response to a panic */
281da51d93aSDavid du Colombier 	int	thunderbirdsarego;	/* lets the added processors continue to schedinit */
282dadaab63SDavid du Colombier 	int	rebooting;		/* just idle cpus > 0 */
2833e12c5d1SDavid du Colombier }active;
2843e12c5d1SDavid du Colombier 
285bd389b36SDavid du Colombier /*
286bd389b36SDavid du Colombier  *  routines for things outside the PC model, like power management
287bd389b36SDavid du Colombier  */
288bd389b36SDavid du Colombier struct PCArch
289bd389b36SDavid du Colombier {
290bd389b36SDavid du Colombier 	char*	id;
2917dd7cddfSDavid du Colombier 	int	(*ident)(void);		/* this should be in the model */
292bd389b36SDavid du Colombier 	void	(*reset)(void);		/* this should be in the model */
293bd389b36SDavid du Colombier 	int	(*serialpower)(int);	/* 1 == on, 0 == off */
294bd389b36SDavid du Colombier 	int	(*modempower)(int);	/* 1 == on, 0 == off */
2957dd7cddfSDavid du Colombier 
2967dd7cddfSDavid du Colombier 	void	(*intrinit)(void);
2977dd7cddfSDavid du Colombier 	int	(*intrenable)(Vctl*);
2989a747e4fSDavid du Colombier 	int	(*intrvecno)(int);
2999a747e4fSDavid du Colombier 	int	(*intrdisable)(int);
3004de34a7eSDavid du Colombier 	void	(*introff)(void);
3014de34a7eSDavid du Colombier 	void	(*intron)(void);
3027dd7cddfSDavid du Colombier 
3037dd7cddfSDavid du Colombier 	void	(*clockenable)(void);
3047dd7cddfSDavid du Colombier 	uvlong	(*fastclock)(uvlong*);
3059a747e4fSDavid du Colombier 	void	(*timerset)(uvlong);
3061206f3fcSDavid du Colombier 
3071206f3fcSDavid du Colombier 	void	(*resetothers)(void);	/* put other cpus into reset */
308bd389b36SDavid du Colombier };
309bd389b36SDavid du Colombier 
310fdc61599SDavid du Colombier /* cpuid instruction result register bits */
311fdc61599SDavid du Colombier enum {
312fdc61599SDavid du Colombier 	/* dx */
313fdc61599SDavid du Colombier 	Fpuonchip = 1<<0,
31461fd6f66SDavid du Colombier 	Vmex	= 1<<1,		/* virtual-mode extensions */
31561fd6f66SDavid du Colombier 	Pse	= 1<<3,		/* page size extensions */
316fdc61599SDavid du Colombier 	Tsc	= 1<<4,		/* time-stamp counter */
317fdc61599SDavid du Colombier 	Cpumsr	= 1<<5,		/* model-specific registers, rdmsr/wrmsr */
318fdc61599SDavid du Colombier 	Pae	= 1<<6,		/* physical-addr extensions */
319fdc61599SDavid du Colombier 	Mce	= 1<<7,		/* machine-check exception */
320fdc61599SDavid du Colombier 	Cmpxchg8b = 1<<8,
321fdc61599SDavid du Colombier 	Cpuapic	= 1<<9,
322fdc61599SDavid du Colombier 	Mtrr	= 1<<12,	/* memory-type range regs.  */
323fdc61599SDavid du Colombier 	Pge	= 1<<13,	/* page global extension */
32461fd6f66SDavid du Colombier 	Pse2	= 1<<17,	/* more page size extensions */
325fdc61599SDavid du Colombier 	Clflush = 1<<19,
32648489f93SDavid du Colombier 	Acpif	= 1<<22,
327fdc61599SDavid du Colombier 	Mmx	= 1<<23,
32891e577b2SDavid du Colombier 	Fxsr	= 1<<24,	/* have SSE FXSAVE/FXRSTOR */
329fdc61599SDavid du Colombier 	Sse	= 1<<25,	/* thus sfence instr. */
330fdc61599SDavid du Colombier 	Sse2	= 1<<26,	/* thus mfence & lfence instr.s */
331fdc61599SDavid du Colombier };
332fdc61599SDavid du Colombier 
3337dd7cddfSDavid du Colombier /*
3347dd7cddfSDavid du Colombier  *  a parsed plan9.ini line
3357dd7cddfSDavid du Colombier  */
3367dd7cddfSDavid du Colombier #define NISAOPT		8
337219b2ee8SDavid du Colombier 
338219b2ee8SDavid du Colombier struct ISAConf {
3399a747e4fSDavid du Colombier 	char	*type;
340219b2ee8SDavid du Colombier 	ulong	port;
341fb7f0c93SDavid du Colombier 	int	irq;
3427dd7cddfSDavid du Colombier 	ulong	dma;
343219b2ee8SDavid du Colombier 	ulong	mem;
344219b2ee8SDavid du Colombier 	ulong	size;
3457dd7cddfSDavid du Colombier 	ulong	freq;
3467dd7cddfSDavid du Colombier 
3477dd7cddfSDavid du Colombier 	int	nopt;
3489a747e4fSDavid du Colombier 	char	*opt[NISAOPT];
349219b2ee8SDavid du Colombier };
350219b2ee8SDavid du Colombier 
3517dd7cddfSDavid du Colombier extern PCArch	*arch;			/* PC architecture */
3527dd7cddfSDavid du Colombier 
353219b2ee8SDavid du Colombier /*
3547dd7cddfSDavid du Colombier  * Each processor sees its own Mach structure at address MACHADDR.
3557dd7cddfSDavid du Colombier  * However, the Mach structures must also be available via the per-processor
3567dd7cddfSDavid du Colombier  * MMU information array machp, mainly for disambiguation and access to
3577dd7cddfSDavid du Colombier  * the clock which is only maintained by the bootstrap processor (0).
358219b2ee8SDavid du Colombier  */
3597dd7cddfSDavid du Colombier Mach* machp[MAXMACH];
360219b2ee8SDavid du Colombier 
3617dd7cddfSDavid du Colombier #define	MACHP(n)	(machp[n])
362219b2ee8SDavid du Colombier 
3637dd7cddfSDavid du Colombier extern Mach	*m;
3647dd7cddfSDavid du Colombier #define up	(((Mach*)MACHADDR)->externup)
3659a747e4fSDavid du Colombier 
3669a747e4fSDavid du Colombier /*
3679a747e4fSDavid du Colombier  *  hardware info about a device
3689a747e4fSDavid du Colombier  */
3699a747e4fSDavid du Colombier typedef struct {
3709a747e4fSDavid du Colombier 	ulong	port;
3719a747e4fSDavid du Colombier 	int	size;
37259c21d95SDavid du Colombier } Devport;
3739a747e4fSDavid du Colombier 
3749a747e4fSDavid du Colombier struct DevConf
3759a747e4fSDavid du Colombier {
3763ff48bf5SDavid du Colombier 	ulong	intnum;			/* interrupt number */
3779a747e4fSDavid du Colombier 	char	*type;			/* card type, malloced */
3789a747e4fSDavid du Colombier 	int	nports;			/* Number of ports */
37959c21d95SDavid du Colombier 	Devport	*ports;			/* The ports themselves */
3809a747e4fSDavid du Colombier };
3814fafed5dSDavid du Colombier 
3824fafed5dSDavid du Colombier typedef struct BIOS32ci {		/* BIOS32 Calling Interface */
3834fafed5dSDavid du Colombier 	u32int	eax;
3844fafed5dSDavid du Colombier 	u32int	ebx;
3854fafed5dSDavid du Colombier 	u32int	ecx;
3864fafed5dSDavid du Colombier 	u32int	edx;
3874fafed5dSDavid du Colombier 	u32int	esi;
3884fafed5dSDavid du Colombier 	u32int	edi;
3894fafed5dSDavid du Colombier } BIOS32ci;
390