sparc.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /*
  2. * sparc sim.h
  3. *
  4. * The integer instruction side of this emulator is portable if sizeof(long) >= 4
  5. * Floating point emulation however is not. Assumptions made are:
  6. * sizeof(ulong) == sizeof(float)
  7. * sizeof(ulong)*2 == sizeof(double)
  8. * bits of floating point in memory may be reversed lsw/msw
  9. * unions of double & 2*float & 2*long have no padding
  10. */
  11. #include "/sparc/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 Inst Inst;
  22. typedef struct Icache Icache;
  23. typedef struct Breakpoint Breakpoint;
  24. enum
  25. {
  26. Instruction = 1,
  27. Read = 2,
  28. Write = 4,
  29. Access = 2|4,
  30. Equal = 4|8,
  31. };
  32. struct Breakpoint
  33. {
  34. int type; /* Instruction/Read/Access/Write/Equal */
  35. ulong addr; /* Place at address */
  36. int count; /* To execute count times or value */
  37. int done; /* How many times passed through */
  38. Breakpoint *next; /* Link to next one */
  39. };
  40. enum
  41. {
  42. Iload,
  43. Istore,
  44. Iarith,
  45. Ibranch,
  46. Ireg,
  47. Isyscall,
  48. Ifloat,
  49. Inop,
  50. };
  51. struct Icache
  52. {
  53. int on; /* Turned on */
  54. int linesize; /* Line size in bytes */
  55. int stall; /* Cache stalls */
  56. int *lines; /* Tag array */
  57. int* (*hash)(ulong); /* Hash function */
  58. char *hashtext; /* What the function looks like */
  59. };
  60. struct Inst
  61. {
  62. void (*func)(ulong);
  63. char *name;
  64. int type;
  65. int count;
  66. int taken;
  67. int useddelay;
  68. };
  69. struct Registers
  70. {
  71. ulong pc;
  72. ulong ir;
  73. Inst *ip;
  74. long r[32];
  75. ulong Y;
  76. ulong psr;
  77. ulong fpsr;
  78. union {
  79. double fd[16];
  80. float fl[32];
  81. ulong di[32];
  82. };
  83. };
  84. struct Mulu{
  85. ulong lo;
  86. ulong hi;
  87. };
  88. struct Mul{
  89. long lo;
  90. long hi;
  91. };
  92. enum
  93. {
  94. MemRead,
  95. MemReadstring,
  96. MemWrite,
  97. };
  98. enum
  99. {
  100. Stack,
  101. Text,
  102. Data,
  103. Bss,
  104. Nseg,
  105. };
  106. struct Segment
  107. {
  108. short type;
  109. ulong base;
  110. ulong end;
  111. ulong fileoff;
  112. ulong fileend;
  113. int rss;
  114. int refs;
  115. uchar **table;
  116. };
  117. struct Memory
  118. {
  119. Segment seg[Nseg];
  120. };
  121. void fatal(int, char*, ...);
  122. void run(void);
  123. void undef(ulong);
  124. void dumpreg(void);
  125. void dumpfreg(void);
  126. void dumpdreg(void);
  127. void* emalloc(ulong);
  128. void* erealloc(void*, ulong, ulong);
  129. void* vaddr(ulong);
  130. void itrace(char *, ...);
  131. void segsum(void);
  132. void ta(ulong);
  133. char* memio(char*, ulong, int, int);
  134. ulong getmem_w(ulong);
  135. ulong ifetch(ulong);
  136. ushort getmem_h(ulong);
  137. void putmem_w(ulong, ulong);
  138. uchar getmem_b(ulong);
  139. void putmem_b(ulong, uchar);
  140. ulong getmem_4(ulong);
  141. ulong getmem_2(ulong);
  142. void putmem_h(ulong, short);
  143. Mul mul(long, long);
  144. Mulu mulu(ulong, ulong);
  145. void isum(void);
  146. void initicache(void);
  147. void updateicache(ulong addr);
  148. long lnrand(long);
  149. void randseed(long, long);
  150. void cmd(void);
  151. void brkchk(ulong, int);
  152. void delbpt(char*);
  153. void breakpoint(char*, char*);
  154. char* nextc(char*);
  155. ulong expr(char*);
  156. void initstk(int, char**);
  157. void initmap(void);
  158. void inithdr(int);
  159. void reset(void);
  160. void dobplist(void);
  161. void procinit(int);
  162. void printsource(long);
  163. void printparams(Symbol *, ulong);
  164. void printlocals(Symbol *, ulong);
  165. void stktrace(int);
  166. void delay(ulong);
  167. void iprofile(void);
  168. /* Globals */
  169. Extern Registers reg;
  170. Extern Memory memory;
  171. Extern int text;
  172. Extern int trace;
  173. Extern int sysdbg;
  174. Extern int calltree;
  175. Extern Icache icache;
  176. Extern int count;
  177. Extern jmp_buf errjmp;
  178. Extern Breakpoint *bplist;
  179. Extern int atbpt;
  180. Extern int membpt;
  181. Extern int cmdcount;
  182. Extern int nopcount;
  183. Extern ulong dot;
  184. extern char *file;
  185. Extern Biobuf *bioout;
  186. Extern Biobuf *bin;
  187. Extern Inst *ci;
  188. Extern ulong *iprof;
  189. Extern ulong loadlock;
  190. Extern ulong anulled;
  191. extern int datasize;
  192. extern int printcol;
  193. Extern Map *symmap;
  194. /* Plan9 Kernel constants */
  195. #define BY2PG 4096
  196. #define BY2WD 4
  197. #define UTZERO 0x1000
  198. #define TSTKSIZ 32
  199. #define TSTACKTOP 0x10000000
  200. #define STACKTOP (TSTACKTOP-TSTKSIZ*BY2PG)
  201. #define STACKSIZE (4*1024*1024)
  202. #define ANUL (1<<29)
  203. #define PROFGRAN 4
  204. #define NOP 0x80300000
  205. #define SIGNBIT 0x80000000
  206. #define IMMBIT (1<<13)
  207. #define getrop23(i) rd = (i>>25)&0x1f; rs1 = (i>>14)&0x1f; rs2 = i&0x1f;
  208. #define ximm(xx, ii) xx = ii&0x1FFF; if(xx&0x1000) xx |= ~0x1FFF
  209. #define PSR_n (1<<23)
  210. #define PSR_z (1<<22)
  211. #define PSR_v (1<<21)
  212. #define PSR_c (1<<20)
  213. #define FP_U 3
  214. #define FP_L 1
  215. #define FP_G 2
  216. #define FP_E 0