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
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))
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;
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 */
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 */
69 Inst *tab; /* indexed by extended opcode */
132 void fatal(int, char*, ...);
133 void fpreginit(void);
140 void* emalloc(ulong);
141 void* erealloc(void*, ulong, ulong);
143 void itrace(char *, ...);
146 char* memio(char*, ulong, int, int);
147 ulong getmem_w(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);
159 void initicache(void);
160 void updateicache(ulong addr);
162 void randseed(long, long);
164 void brkchk(ulong, int);
166 void breakpoint(char*, char*);
169 void initstk(int, char**);
175 void printsource(long);
176 void printparams(Symbol *, ulong);
177 void printlocals(Symbol *, ulong);
182 Extern Registers reg;
183 Extern Memory memory;
188 Extern Icache icache;
190 Extern jmp_buf errjmp;
191 Extern Breakpoint *bplist;
198 Extern Biobuf *bioout;
202 Extern ulong iprofsize;
203 Extern ulong loadlock;
209 extern Inset ops0, ops19, ops31, ops59, ops63a, ops63b;
211 /* Plan9 Kernel constants */
214 #define UTZERO 0x1000
216 #define TSTACKTOP 0x20000000
217 #define STACKTOP (TSTACKTOP-TSTKSIZ*BY2PG)
218 #define STACKSIZE (4*1024*1024)
221 #define NOP 0x80300000
222 #define SIGNBIT 0x80000000
238 #define getCR(x,w) (((w)>>(28-(x*4)))&0xF)
239 #define mkCR(x,v) (((v)&0xF)<<(28-(x*4)))
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;
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)
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 */
280 #define XER_SO (1<<31)
281 #define XER_OV (1<<30)
282 #define XER_CA (1<<29)