xref: /plan9/sys/src/cmd/qi/power.h (revision 6891d8578618fb7ccda4a131c122d4d0e6580c4b)
1 /*
2  * power sim.h
3  *
4  * The integer instruction side of this emulator is portable if sizeof(long) >= 4
5  * Floating point emulation assumes:
6  *	sizeof(ulong) == sizeof(float)
7  *	sizeof(ulong)*2 == sizeof(double) <= sizeof(vlong)
8  *	unions of double & vlong have no padding
9  *	vlongs provide at least 64 bits precision
10  */
11 #include "/power/include/ureg.h"
12 #define	USERADDR	0xC0000000
13 #define	UREGADDR	(USERADDR+BY2PG-4-0xA0)
14 #define USER_REG(x)	(UREGADDR+(ulong)(x))
15 #define	REGOFF(x)	(USER_REG(&((struct Ureg *) 0)->x))
16 
17 typedef struct Registers Registers;
18 typedef struct Segment Segment;
19 typedef struct Memory Memory;
20 typedef struct Inset Inset;
21 typedef struct Inst Inst;
22 typedef struct Icache Icache;
23 typedef struct Breakpoint Breakpoint;
24 
25 enum
26 {
27 	Instruction	= 1,
28 	Read		= 2,
29 	Write		= 4,
30 	Access		= 2|4,
31 	Equal		= 4|8,
32 };
33 
34 struct Breakpoint
35 {
36 	int		type;		/* Instruction/Read/Access/Write/Equal */
37 	ulong		addr;		/* Place at address */
38 	int		count;		/* To execute count times or value */
39 	int		done;		/* How many times passed through */
40 	Breakpoint	*next;		/* Link to next one */
41 };
42 
43 enum
44 {
45 	Iload,
46 	Istore,
47 	Iarith,
48 	Ilog,
49 	Ibranch,
50 	Ireg,
51 	Isyscall,
52 	Ifloat,
53 	Inop,
54 	Icontrol,
55 };
56 
57 struct Icache
58 {
59 	int	on;			/* Turned on */
60 	int	linesize;		/* Line size in bytes */
61 	int	stall;			/* Cache stalls */
62 	int	*lines;			/* Tag array */
63 	int*	(*hash)(ulong);		/* Hash function */
64 	char	*hashtext;		/* What the function looks like */
65 };
66 
67 struct Inset
68 {
69 	Inst	*tab;		/* indexed by extended opcode */
70 	int	nel;
71 };
72 
73 struct Inst
74 {
75 	void 	(*func)(ulong);
76 	char	*name;
77 	int	type;
78 	int	count;
79 	int	taken;
80 };
81 
82 struct Registers
83 {
84 	ulong	pc;
85 	ulong	ir;
86 	Inst	*ip;
87 	long	r[32];
88 	ulong	ctr;
89 	ulong	cr;
90 	ulong	xer;
91 	ulong	lr;
92 	ulong	fpscr;
93 	ulong	dec;
94 	ulong	tbl;
95 	ulong	tbu;
96 	double	fd[32];
97 };
98 
99 enum
100 {
101 	MemRead,
102 	MemReadstring,
103 	MemWrite,
104 };
105 
106 enum
107 {
108 	Stack,
109 	Text,
110 	Data,
111 	Bss,
112 	Nseg,
113 };
114 
115 struct Segment
116 {
117 	short	type;
118 	ulong	base;
119 	ulong	end;
120 	ulong	fileoff;
121 	ulong	fileend;
122 	int	rss;
123 	int	refs;
124 	uchar	**table;
125 };
126 
127 struct Memory
128 {
129 	Segment	seg[Nseg];
130 };
131 
132 void		fatal(int, char*, ...);
133 void		fpreginit(void);
134 void		run(void);
135 void		undef(ulong);
136 void		unimp(ulong);
137 void		dumpreg(void);
138 void		dumpfreg(void);
139 void		dumpdreg(void);
140 void*		emalloc(ulong);
141 void*		erealloc(void*, ulong, ulong);
142 void*		vaddr(ulong);
143 void		itrace(char *, ...);
144 void		segsum(void);
145 void		sc(ulong);
146 char*		memio(char*, ulong, int, int);
147 ulong		getmem_w(ulong);
148 ulong		ifetch(ulong);
149 ushort		getmem_h(ulong);
150 void		putmem_w(ulong, ulong);
151 uchar		getmem_b(ulong);
152 void		putmem_b(ulong, uchar);
153 uvlong	getmem_v(ulong);
154 ulong		getmem_4(ulong);
155 ulong		getmem_2(ulong);
156 void	putmem_v(ulong, uvlong);
157 void		putmem_h(ulong, short);
158 void		isum(void);
159 void		initicache(void);
160 void		updateicache(ulong addr);
161 long		lnrand(long);
162 void		randseed(long, long);
163 void		cmd(void);
164 void		brkchk(ulong, int);
165 void		delbpt(char*);
166 void		breakpoint(char*, char*);
167 char*		nextc(char*);
168 ulong		expr(char*);
169 void		initstk(int, char**);
170 void		initmap(void);
171 void		inithdr(int);
172 void		reset(void);
173 void		dobplist(void);
174 void		procinit(int);
175 void		printsource(long);
176 void		printparams(Symbol *, ulong);
177 void		printlocals(Symbol *, ulong);
178 void		stktrace(int);
179 void		iprofile(void);
180 
181 /* Globals */
182 Extern 		Registers reg;
183 Extern 		Memory memory;
184 Extern		int text;
185 Extern		int trace;
186 Extern 		int sysdbg;
187 Extern 		int calltree;
188 Extern		Icache icache;
189 Extern		int count;
190 Extern		jmp_buf errjmp;
191 Extern		Breakpoint *bplist;
192 Extern		int atbpt;
193 Extern		int membpt;
194 Extern		int cmdcount;
195 Extern		int nopcount;
196 Extern		ulong dot;
197 extern		char *file;
198 Extern		Biobuf *bioout;
199 Extern		Biobuf *bin;
200 Extern		Inst *ci;
201 Extern		ulong *iprof;
202 Extern		ulong	iprofsize;
203 Extern		ulong loadlock;
204 extern		int datasize;
205 extern		int printcol;
206 Extern		Map *symmap;
207 extern		ulong bits[];
208 
209 extern		Inset ops0, ops19, ops31, ops59, ops63a, ops63b;
210 
211 /* Plan9 Kernel constants */
212 #define	BY2PG		4096
213 #define BY2WD		4
214 #define UTZERO		0x1000
215 #define TSTKSIZ		32
216 #define TSTACKTOP	0x20000000
217 #define STACKTOP	(TSTACKTOP-TSTKSIZ*BY2PG)
218 #define STACKSIZE	(4*1024*1024)
219 
220 #define PROFGRAN	4
221 #define NOP		0x80300000
222 #define SIGNBIT		0x80000000
223 
224 
225 enum {
226 	CRLT = 1<<31,
227 	CRGT = 1<<30,
228 	CREQ = 1<<29,
229 	CRSO = 1<<28,
230 	CRFU = CRSO,
231 
232 	CRFX = 1<<27,
233 	CRFEX = 1<<26,
234 	CRVX = 1<<25,
235 	CROX = 1<<24,
236 };
237 
238 #define getCR(x,w) (((w)>>(28-(x*4)))&0xF)
239 #define mkCR(x,v) (((v)&0xF)<<(28-(x*4)))
240 
241 #define simm(xx, ii)	xx = (short)(ii&0xFFFF);
242 #define uimm(xx, ii)	xx = ii&0xFFFF;
243 #define imms(xx, ii) xx = ii<<16;
244 #define getairr(i)	rd = (i>>21)&0x1f; ra = (i>>16)&0x1f; simm(imm,i)
245 #define getarrr(i)	rd = (i>>21)&0x1f; ra = (i>>16)&0x1f; rb = (i>>11)&0x1f;
246 #define getbobi(i)	bo = (i>>21)&0x1f; bi = (i>>16)&0x1f; xx = (i>>11)&0x1f;
247 #define getlirr(i)	rs = (i>>21)&0x1f; ra = (i>>16)&0x1f; uimm(imm,i)
248 #define getlrrr(i)	rs = (i>>21)&0x1f; ra = (i>>16)&0x1f; rb = (i>>11)&0x1f;
249 
250 #define OP(o,xo) ((o<<26)|(xo<<1))	/* build an operation */
251 #define xop(a,b) ((b<<6)|a)	/* compact form for use in a decoding switch on op/xo */
252 #define getop(i) ((i>>26)&0x3F)
253 #define getxo(i) ((i>>1)&0x3FF)
254 
255 #define	FPS_FX	(1<<31)	/* exception summary (sticky) */
256 #define	FPS_EX	(1<<30)	/* enabled exception summary */
257 #define	FPS_VX	(1<<29)	/* invalid operation exception summary */
258 #define	FPS_OX	(1<<28)	/* overflow exception OX (sticky) */
259 #define	FPS_UX	(1<<27)	/* underflow exception UX (sticky) */
260 #define	FPS_ZX	(1<<26)	/* zero divide exception ZX (sticky) */
261 #define	FPS_XX	(1<<25)	/* inexact exception XX (sticky) */
262 #define	FPS_VXSNAN (1<<24)	/* invalid operation exception for SNaN (sticky) */
263 #define	FPS_VXISI	(1<<23)	/* invalid operation exception for ∞-∞ (sticky) */
264 #define	FPS_VXIDI	(1<<22)	/* invalid operation exception for ∞/∞ (sticky) */
265 #define	FPS_VXZDZ (1<<21)	/* invalid operation exception for 0/0 (sticky) */
266 #define	FPS_VXIMZ	(1<<20)	/* invalid operation exception for ∞*0 (sticky) */
267 #define	FPS_VXVC	(1<<19)	/* invalid operation exception for invalid compare (sticky) */
268 #define	FPS_FR	(1<<18)	/* fraction rounded */
269 #define	FPS_FI	(1<<17)	/* fraction inexact */
270 #define	FPS_FPRF	(1<<16)	/* floating point result class */
271 #define	FPS_FPCC	(0xF<<12)	/* <, >, =, unordered */
272 #define	FPS_VXCVI	(1<<8)	/* enable exception for invalid integer convert (sticky) */
273 #define	FPS_VE	(1<<7)	/* invalid operation exception enable */
274 #define	FPS_OE	(1<<6)	/* enable overflow exceptions */
275 #define	FPS_UE	(1<<5)	/* enable underflow */
276 #define	FPS_ZE	(1<<4)	/* enable zero divide */
277 #define	FPS_XE	(1<<3)	/* enable inexact exceptions */
278 #define	FPS_RN	(3<<0)	/* rounding mode */
279 
280 #define	XER_SO	(1<<31)
281 #define	XER_OV	(1<<30)
282 #define	XER_CA	(1<<29)
283 
284 #define	Rc	1
285 #define	OE	0x400
286