power.h 6.7 KB

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