xref: /plan9-contrib/sys/src/9k/k10/dat.h (revision 094d68186d4cdde21fdab9786d6c843a03693e4e)
19ef1f84bSDavid du Colombier typedef struct Asm Asm;
29ef1f84bSDavid du Colombier typedef struct Fxsave Fxsave;
39ef1f84bSDavid du Colombier typedef struct ISAConf ISAConf;
49ef1f84bSDavid du Colombier typedef struct Label Label;
59ef1f84bSDavid du Colombier typedef struct Lock Lock;
69ef1f84bSDavid du Colombier typedef struct MCPU MCPU;
79ef1f84bSDavid du Colombier typedef struct MFPU MFPU;
89ef1f84bSDavid du Colombier typedef struct MMMU MMMU;
99ef1f84bSDavid du Colombier typedef struct Mach Mach;
109ef1f84bSDavid du Colombier typedef u64int Mpl;
119ef1f84bSDavid du Colombier typedef Mpl Mreg;				/* GAK */
129ef1f84bSDavid du Colombier typedef struct Page Page;
139ef1f84bSDavid du Colombier typedef struct Pcidev Pcidev;
149ef1f84bSDavid du Colombier typedef struct PFPU PFPU;
159ef1f84bSDavid du Colombier typedef struct PMMU PMMU;
169ef1f84bSDavid du Colombier typedef struct PNOTIFY PNOTIFY;
179ef1f84bSDavid du Colombier typedef u64int PTE;
189ef1f84bSDavid du Colombier typedef struct Proc Proc;
199ef1f84bSDavid du Colombier typedef struct Sys Sys;
209ef1f84bSDavid du Colombier typedef u64int uintmem;				/* horrible name */
21406c76faSDavid du Colombier typedef vlong Tval;
229ef1f84bSDavid du Colombier typedef struct Ureg Ureg;
239ef1f84bSDavid du Colombier typedef struct Vctl Vctl;
249ef1f84bSDavid du Colombier 
259ef1f84bSDavid du Colombier #pragma incomplete Ureg
269ef1f84bSDavid du Colombier 
279ef1f84bSDavid du Colombier #define MAXSYSARG	5	/* for mount(fd, afd, mpt, flag, arg) */
289ef1f84bSDavid du Colombier 
299ef1f84bSDavid du Colombier /*
309ef1f84bSDavid du Colombier  *  parameters for sysproc.c
319ef1f84bSDavid du Colombier  */
329ef1f84bSDavid du Colombier #define AOUT_MAGIC	(S_MAGIC)
339ef1f84bSDavid du Colombier 
349ef1f84bSDavid du Colombier /*
359ef1f84bSDavid du Colombier  *  machine dependent definitions used by ../port/portdat.h
369ef1f84bSDavid du Colombier  */
379ef1f84bSDavid du Colombier struct Lock
389ef1f84bSDavid du Colombier {
399ef1f84bSDavid du Colombier 	u32int	key;
409ef1f84bSDavid du Colombier 	int	isilock;
419ef1f84bSDavid du Colombier 	union {					/* GAK */
429ef1f84bSDavid du Colombier 		Mpl	pl;
439ef1f84bSDavid du Colombier 		Mreg	sr;
449ef1f84bSDavid du Colombier 	};
459ef1f84bSDavid du Colombier 	uintptr	pc;
469ef1f84bSDavid du Colombier 	Proc*	p;
479ef1f84bSDavid du Colombier 	Mach*	m;
489ef1f84bSDavid du Colombier };
499ef1f84bSDavid du Colombier 
509ef1f84bSDavid du Colombier struct Label
519ef1f84bSDavid du Colombier {
529ef1f84bSDavid du Colombier 	uintptr	sp;
539ef1f84bSDavid du Colombier 	uintptr	pc;
549ef1f84bSDavid du Colombier };
559ef1f84bSDavid du Colombier 
569ef1f84bSDavid du Colombier struct Fxsave {
579ef1f84bSDavid du Colombier 	u16int	fcw;			/* x87 control word */
589ef1f84bSDavid du Colombier 	u16int	fsw;			/* x87 status word */
599ef1f84bSDavid du Colombier 	u8int	ftw;			/* x87 tag word */
609ef1f84bSDavid du Colombier 	u8int	zero;			/* 0 */
619ef1f84bSDavid du Colombier 	u16int	fop;			/* last x87 opcode */
629ef1f84bSDavid du Colombier 	u64int	rip;			/* last x87 instruction pointer */
639ef1f84bSDavid du Colombier 	u64int	rdp;			/* last x87 data pointer */
649ef1f84bSDavid du Colombier 	u32int	mxcsr;			/* MMX control and status */
659ef1f84bSDavid du Colombier 	u32int	mxcsrmask;		/* supported MMX feature bits */
669ef1f84bSDavid du Colombier 	uchar	st[128];		/* shared 64-bit media and x87 regs */
679ef1f84bSDavid du Colombier 	uchar	xmm[256];		/* 128-bit media regs */
689ef1f84bSDavid du Colombier 	uchar	ign[96];		/* reserved, ignored */
699ef1f84bSDavid du Colombier };
709ef1f84bSDavid du Colombier 
719ef1f84bSDavid du Colombier /*
729ef1f84bSDavid du Colombier  *  FPU stuff in Proc
739ef1f84bSDavid du Colombier  */
749ef1f84bSDavid du Colombier struct PFPU {
759ef1f84bSDavid du Colombier 	int	fpustate;
769ef1f84bSDavid du Colombier 	uchar	fxsave[sizeof(Fxsave)+15];
779ef1f84bSDavid du Colombier 	void*	fpusave;
789ef1f84bSDavid du Colombier };
799ef1f84bSDavid du Colombier 
809ef1f84bSDavid du Colombier /*
819ef1f84bSDavid du Colombier  *  MMU stuff in Proc
829ef1f84bSDavid du Colombier  */
839ef1f84bSDavid du Colombier #define NCOLOR 8
849ef1f84bSDavid du Colombier struct PMMU
859ef1f84bSDavid du Colombier {
869ef1f84bSDavid du Colombier 	Page*	mmuptp[4];		/* page table pages for each level */
879ef1f84bSDavid du Colombier };
889ef1f84bSDavid du Colombier 
899ef1f84bSDavid du Colombier /*
909ef1f84bSDavid du Colombier  *  things saved in the Proc structure during a notify
919ef1f84bSDavid du Colombier  */
929ef1f84bSDavid du Colombier struct PNOTIFY
939ef1f84bSDavid du Colombier {
949ef1f84bSDavid du Colombier 	void	emptiness;
959ef1f84bSDavid du Colombier };
969ef1f84bSDavid du Colombier 
979ef1f84bSDavid du Colombier /*
989ef1f84bSDavid du Colombier  * Address Space Map.
999ef1f84bSDavid du Colombier  * Low duty cycle.
1009ef1f84bSDavid du Colombier  */
1019ef1f84bSDavid du Colombier struct Asm
1029ef1f84bSDavid du Colombier {
1039ef1f84bSDavid du Colombier 	uintmem	addr;
1049ef1f84bSDavid du Colombier 	uintmem	size;
1059ef1f84bSDavid du Colombier 	int	type;
1069ef1f84bSDavid du Colombier 	int	location;
1079ef1f84bSDavid du Colombier 	Asm*	next;
1089ef1f84bSDavid du Colombier 	uintmem base;	/* used by port; ROUNDUP(addr, PGSZ) */
1099ef1f84bSDavid du Colombier 	uintmem	limit;	/* used by port; ROUNDDN(addr+size, PGSZ) */
1109ef1f84bSDavid du Colombier 	uintptr	kbase;	/* used by port; kernel for base, used by devproc */
1119ef1f84bSDavid du Colombier };
1129ef1f84bSDavid du Colombier extern Asm* asmlist;
1139ef1f84bSDavid du Colombier 
1149ef1f84bSDavid du Colombier #include "../port/portdat.h"
1159ef1f84bSDavid du Colombier 
1169ef1f84bSDavid du Colombier /*
1179ef1f84bSDavid du Colombier  *  CPU stuff in Mach.
1189ef1f84bSDavid du Colombier  */
1199ef1f84bSDavid du Colombier struct MCPU {
1209ef1f84bSDavid du Colombier 	u32int	cpuinfo[2][4];		/* CPUID instruction output E[ABCD]X */
1219ef1f84bSDavid du Colombier 	int	ncpuinfos;		/* number of standard entries */
1229ef1f84bSDavid du Colombier 	int	ncpuinfoe;		/* number of extended entries */
1239ef1f84bSDavid du Colombier 	int	isintelcpu;		/*  */
1249ef1f84bSDavid du Colombier };
1259ef1f84bSDavid du Colombier 
1269ef1f84bSDavid du Colombier /*
1279ef1f84bSDavid du Colombier  *  FPU stuff in Mach.
1289ef1f84bSDavid du Colombier  */
1299ef1f84bSDavid du Colombier struct MFPU {
1309ef1f84bSDavid du Colombier 	u16int	fcw;			/* x87 control word */
1319ef1f84bSDavid du Colombier 	u32int	mxcsr;			/* MMX control and status */
1329ef1f84bSDavid du Colombier 	u32int	mxcsrmask;		/* supported MMX feature bits */
1339ef1f84bSDavid du Colombier };
1349ef1f84bSDavid du Colombier 
1359ef1f84bSDavid du Colombier /*
1369ef1f84bSDavid du Colombier  *  MMU stuff in Mach.
1379ef1f84bSDavid du Colombier  */
1389ef1f84bSDavid du Colombier enum
1399ef1f84bSDavid du Colombier {
1409ef1f84bSDavid du Colombier 	NPGSZ = 4
1419ef1f84bSDavid du Colombier };
1429ef1f84bSDavid du Colombier 
1439ef1f84bSDavid du Colombier struct MMMU
1449ef1f84bSDavid du Colombier {
1459ef1f84bSDavid du Colombier 	Page*	pml4;			/* pml4 for this processor */
1469ef1f84bSDavid du Colombier 	PTE*	pmap;			/* unused as of yet */
1479ef1f84bSDavid du Colombier 
1489ef1f84bSDavid du Colombier 	uint	pgszlg2[NPGSZ];		/* per Mach or per Sys? */
1499ef1f84bSDavid du Colombier 	uintmem	pgszmask[NPGSZ];
1509ef1f84bSDavid du Colombier 	uint	pgsz[NPGSZ];
1519ef1f84bSDavid du Colombier 	int	npgsz;
1529ef1f84bSDavid du Colombier 
1539ef1f84bSDavid du Colombier 	Page	pml4kludge;		/* GAK: we need a page */
1549ef1f84bSDavid du Colombier };
1559ef1f84bSDavid du Colombier 
1569ef1f84bSDavid du Colombier /*
1579ef1f84bSDavid du Colombier  * Per processor information.
1589ef1f84bSDavid du Colombier  *
1599ef1f84bSDavid du Colombier  * The offsets of the first few elements may be known
1609ef1f84bSDavid du Colombier  * to low-level assembly code, so do not re-order:
1619ef1f84bSDavid du Colombier  *	machno	- no dependency, convention
1629ef1f84bSDavid du Colombier  *	splpc	- splhi, spllo, splx
1639ef1f84bSDavid du Colombier  *	proc	- syscallentry
1649ef1f84bSDavid du Colombier  */
1659ef1f84bSDavid du Colombier struct Mach
1669ef1f84bSDavid du Colombier {
1679ef1f84bSDavid du Colombier 	int	machno;			/* physical id of processor */
1689ef1f84bSDavid du Colombier 	uintptr	splpc;			/* pc of last caller to splhi */
1699ef1f84bSDavid du Colombier 
1709ef1f84bSDavid du Colombier 	Proc*	proc;			/* current process on this processor */
1719ef1f84bSDavid du Colombier 
1729ef1f84bSDavid du Colombier 	int	apicno;
1739ef1f84bSDavid du Colombier 	int	online;
1749ef1f84bSDavid du Colombier 	int	mode;			/* fold into online? GAK */
1759ef1f84bSDavid du Colombier 
1769ef1f84bSDavid du Colombier 	MMMU;
1779ef1f84bSDavid du Colombier 
1789ef1f84bSDavid du Colombier 	uintptr	stack;
1799ef1f84bSDavid du Colombier 	uchar*	vsvm;
1809ef1f84bSDavid du Colombier 	void*	gdt;
1819ef1f84bSDavid du Colombier 	void*	tss;
1829ef1f84bSDavid du Colombier 
1839ef1f84bSDavid du Colombier 	ulong	ticks;			/* of the clock since boot time */
1849ef1f84bSDavid du Colombier 	Label	sched;			/* scheduler wakeup */
1859ef1f84bSDavid du Colombier 	Lock	alarmlock;		/* access to alarm list */
1869ef1f84bSDavid du Colombier 	void*	alarm;			/* alarms bound to this clock */
1879ef1f84bSDavid du Colombier 	int	inclockintr;
1889ef1f84bSDavid du Colombier 
1899ef1f84bSDavid du Colombier 	Proc*	readied;		/* for runproc */
1909ef1f84bSDavid du Colombier 	ulong	schedticks;		/* next forced context switch */
1919ef1f84bSDavid du Colombier 
1929ef1f84bSDavid du Colombier 	int	color;
1939ef1f84bSDavid du Colombier 
1949ef1f84bSDavid du Colombier 	int	tlbfault;
1959ef1f84bSDavid du Colombier 	int	tlbpurge;
1969ef1f84bSDavid du Colombier 	int	pfault;
1979ef1f84bSDavid du Colombier 	int	cs;
1989ef1f84bSDavid du Colombier 	int	syscall;
1999ef1f84bSDavid du Colombier 	int	load;
2009ef1f84bSDavid du Colombier 	int	intr;
2019ef1f84bSDavid du Colombier 	int	mmuflush;		/* make current proc flush it's mmu state */
2029ef1f84bSDavid du Colombier 	int	ilockdepth;
2039ef1f84bSDavid du Colombier 	uintptr	ilockpc;
2049ef1f84bSDavid du Colombier 	Perf	perf;			/* performance counters */
2059ef1f84bSDavid du Colombier 
2069ef1f84bSDavid du Colombier 	int	lastintr;
2079ef1f84bSDavid du Colombier 
2089ef1f84bSDavid du Colombier 	Lock	apictimerlock;
2099ef1f84bSDavid du Colombier 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
2109ef1f84bSDavid du Colombier 	vlong	cpuhz;
2119ef1f84bSDavid du Colombier 	int	cpumhz;
2129ef1f84bSDavid du Colombier 	u64int	rdtsc;
2139ef1f84bSDavid du Colombier 
2149ef1f84bSDavid du Colombier 	MFPU;
2159ef1f84bSDavid du Colombier 	MCPU;
2169ef1f84bSDavid du Colombier };
2179ef1f84bSDavid du Colombier 
2189ef1f84bSDavid du Colombier /*
2199ef1f84bSDavid du Colombier  * This is the low memory map, between 0x100000 and 0x110000.
2209ef1f84bSDavid du Colombier  * It is located there to allow fundamental datastructures to be
2219ef1f84bSDavid du Colombier  * created and used before knowing where free memory begins
2229ef1f84bSDavid du Colombier  * (e.g. there may be modules located after the kernel BSS end).
2239ef1f84bSDavid du Colombier  * The layout is known in the bootstrap code in l32p.s.
2249ef1f84bSDavid du Colombier  * It is logically two parts: the per processor data structures
2259ef1f84bSDavid du Colombier  * for the bootstrap processor (stack, Mach, vsvm, and page tables),
2269ef1f84bSDavid du Colombier  * and the global information about the system (syspage, ptrpage).
2279ef1f84bSDavid du Colombier  * Some of the elements must be aligned on page boundaries, hence
2289ef1f84bSDavid du Colombier  * the unions.
2299ef1f84bSDavid du Colombier  */
2309ef1f84bSDavid du Colombier struct Sys {
2319ef1f84bSDavid du Colombier 	uchar	machstk[MACHSTKSZ];
2329ef1f84bSDavid du Colombier 
2339ef1f84bSDavid du Colombier 	PTE	pml4[PTSZ/sizeof(PTE)];	/*  */
2349ef1f84bSDavid du Colombier 	PTE	pdp[PTSZ/sizeof(PTE)];
2359ef1f84bSDavid du Colombier 	PTE	pd[PTSZ/sizeof(PTE)];
2369ef1f84bSDavid du Colombier 	PTE	pt[PTSZ/sizeof(PTE)];
2379ef1f84bSDavid du Colombier 
2389ef1f84bSDavid du Colombier 	uchar	vsvmpage[4*KiB];
2399ef1f84bSDavid du Colombier 
2409ef1f84bSDavid du Colombier 	union {
2419ef1f84bSDavid du Colombier 		Mach	mach;
2429ef1f84bSDavid du Colombier 		uchar	machpage[MACHSZ];
2439ef1f84bSDavid du Colombier 	};
2449ef1f84bSDavid du Colombier 
2459ef1f84bSDavid du Colombier 	union {
2469ef1f84bSDavid du Colombier 		struct {
2479ef1f84bSDavid du Colombier 			u64int	pmstart;	/* physical memory */
2489ef1f84bSDavid du Colombier 			u64int	pmoccupied;	/* how much is occupied */
2499ef1f84bSDavid du Colombier 			u64int	pmend;		/* total span */
250*094d6818SDavid du Colombier 			u64int	pmpaged;	/* how much assigned to page pool */
2519ef1f84bSDavid du Colombier 
2529ef1f84bSDavid du Colombier 			uintptr	vmstart;	/* base address for malloc */
2539ef1f84bSDavid du Colombier 			uintptr	vmunused;	/* 1st unused va */
2549ef1f84bSDavid du Colombier 			uintptr	vmunmapped;	/* 1st unmapped va */
2559ef1f84bSDavid du Colombier 			uintptr	vmend;		/* 1st unusable va */
2569ef1f84bSDavid du Colombier 
2579ef1f84bSDavid du Colombier 			u64int	epoch;		/* crude time synchronisation */
2589ef1f84bSDavid du Colombier 			int	nmach;		/* how many machs */
2599ef1f84bSDavid du Colombier 			int	nonline;	/* how many machs are online */
2609ef1f84bSDavid du Colombier 			uint	ticks;		/* since boot (type?) */
2619ef1f84bSDavid du Colombier 			uint	copymode;	/* 0 is COW, 1 is copy on ref */
2629ef1f84bSDavid du Colombier 		};
2639ef1f84bSDavid du Colombier 		uchar	syspage[4*KiB];
2649ef1f84bSDavid du Colombier 	};
2659ef1f84bSDavid du Colombier 
2669ef1f84bSDavid du Colombier 	union {
2679ef1f84bSDavid du Colombier 		Mach*	machptr[MACHMAX];
2689ef1f84bSDavid du Colombier 		uchar	ptrpage[4*KiB];
2699ef1f84bSDavid du Colombier 	};
2709ef1f84bSDavid du Colombier 
2719ef1f84bSDavid du Colombier 	uchar	_57344_[2][4*KiB];		/* unused */
2729ef1f84bSDavid du Colombier };
2739ef1f84bSDavid du Colombier 
2749ef1f84bSDavid du Colombier extern Sys* sys;
2759ef1f84bSDavid du Colombier 
2769ef1f84bSDavid du Colombier /*
2779ef1f84bSDavid du Colombier  * KMap
2789ef1f84bSDavid du Colombier  */
2799ef1f84bSDavid du Colombier typedef void KMap;
2809ef1f84bSDavid du Colombier extern KMap* kmap(Page*);
2819ef1f84bSDavid du Colombier 
2829ef1f84bSDavid du Colombier #define kunmap(k)
2839ef1f84bSDavid du Colombier #define VA(k)		PTR2UINT(k)
2849ef1f84bSDavid du Colombier 
2859ef1f84bSDavid du Colombier struct
2869ef1f84bSDavid du Colombier {
2879ef1f84bSDavid du Colombier 	Lock;
2889ef1f84bSDavid du Colombier 	uint	machs;			/* bitmap of active CPUs */
2899ef1f84bSDavid du Colombier 	int	exiting;		/* shutdown */
2909ef1f84bSDavid du Colombier 	int	ispanic;		/* shutdown in response to a panic */
2919ef1f84bSDavid du Colombier 	int	thunderbirdsarego;	/* F.A.B. */
2929ef1f84bSDavid du Colombier }active;
2939ef1f84bSDavid du Colombier 
2949ef1f84bSDavid du Colombier /*
2959ef1f84bSDavid du Colombier  *  a parsed plan9.ini line
2969ef1f84bSDavid du Colombier  */
2979ef1f84bSDavid du Colombier #define NISAOPT		8
2989ef1f84bSDavid du Colombier 
2999ef1f84bSDavid du Colombier struct ISAConf {
3009ef1f84bSDavid du Colombier 	char	*type;
3019ef1f84bSDavid du Colombier 	uintptr	port;
3029ef1f84bSDavid du Colombier 	int	irq;
3039ef1f84bSDavid du Colombier 	ulong	dma;
3049ef1f84bSDavid du Colombier 	uintptr	mem;
3059ef1f84bSDavid du Colombier 	usize	size;
3069ef1f84bSDavid du Colombier 	ulong	freq;
3079ef1f84bSDavid du Colombier 
3089ef1f84bSDavid du Colombier 	int	nopt;
3099ef1f84bSDavid du Colombier 	char	*opt[NISAOPT];
3109ef1f84bSDavid du Colombier };
3119ef1f84bSDavid du Colombier 
3129ef1f84bSDavid du Colombier /*
3139ef1f84bSDavid du Colombier  * The Mach structures must be available via the per-processor
3149ef1f84bSDavid du Colombier  * MMU information array machptr, mainly for disambiguation and access to
3159ef1f84bSDavid du Colombier  * the clock which is only maintained by the bootstrap processor (0).
3169ef1f84bSDavid du Colombier  */
3179ef1f84bSDavid du Colombier extern register Mach* m;			/* R15 */
3189ef1f84bSDavid du Colombier extern register Proc* up;			/* R14 */
3199ef1f84bSDavid du Colombier 
3209ef1f84bSDavid du Colombier extern uintptr kseg0;
3219ef1f84bSDavid du Colombier 
3229ef1f84bSDavid du Colombier /*
3239ef1f84bSDavid du Colombier  * Horrid.
3249ef1f84bSDavid du Colombier  */
3259ef1f84bSDavid du Colombier #ifdef _DBGC_
3269ef1f84bSDavid du Colombier #define DBGFLG		(dbgflg[_DBGC_])
3279ef1f84bSDavid du Colombier #else
3289ef1f84bSDavid du Colombier #define DBGFLG		(0)
3299ef1f84bSDavid du Colombier #endif /* _DBGC_ */
3309ef1f84bSDavid du Colombier 
3319ef1f84bSDavid du Colombier #define DBG(...)	if(!DBGFLG){}else dbgprint(__VA_ARGS__)
3329ef1f84bSDavid du Colombier 
3339ef1f84bSDavid du Colombier extern char dbgflg[256];
3349ef1f84bSDavid du Colombier 
3359ef1f84bSDavid du Colombier #define dbgprint	print		/* for now */
3369ef1f84bSDavid du Colombier 
3379ef1f84bSDavid du Colombier #pragma	varargck	type	"P"	uintmem	/* GAK */
338