Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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