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