1 /* 2 * arm.h 3 */ 4 #ifndef EXTERN 5 #define EXTERN extern 6 #endif 7 8 typedef struct Registers Registers; 9 typedef struct Segment Segment; 10 typedef struct Memory Memory; 11 typedef struct Mul Mul; 12 typedef struct Mulu Mulu; 13 typedef struct Inst Inst; 14 typedef struct Icache Icache; 15 typedef struct Tlb Tlb; 16 typedef struct Breakpoint Breakpoint; 17 18 enum 19 { 20 Instruction = 1, 21 Read = 2, 22 Write = 4, 23 Access = 2|4, 24 Equal = 4|8, 25 }; 26 27 struct Breakpoint 28 { 29 int type; /* Instruction/Read/Access/Write/Equal */ 30 ulong addr; /* Place at address */ 31 int count; /* To execute count times or value */ 32 int done; /* How many times passed through */ 33 Breakpoint* next; /* Link to next one */ 34 }; 35 36 enum 37 { 38 Imem, 39 Iarith, 40 Ibranch, 41 Isyscall, 42 }; 43 44 enum 45 { 46 Nmaxtlb = 64, 47 REGARG = 0, 48 REGRET = 0, 49 REGPC = 15, 50 REGLINK = 14, 51 REGSP = 13, 52 }; 53 54 struct Tlb 55 { 56 int on; /* Being updated */ 57 int tlbsize; /* Number of entries */ 58 ulong tlbent[Nmaxtlb]; /* Virtual address tags */ 59 int hit; /* Number of successful tag matches */ 60 int miss; /* Number of failed tag matches */ 61 }; 62 63 struct Icache 64 { 65 int on; /* Turned on */ 66 int linesize; /* Line size in bytes */ 67 int stall; /* Cache stalls */ 68 int* lines; /* Tag array */ 69 int* (*hash)(ulong); /* Hash function */ 70 char* hashtext; /* What the function looks like */ 71 }; 72 73 struct Inst 74 { 75 void (*func)(ulong); 76 char* name; 77 int type; 78 int count; 79 int taken; 80 int useddelay; 81 }; 82 83 struct Registers 84 { 85 ulong ar; 86 ulong ir; 87 Inst* ip; 88 long r[16]; 89 long cc1; 90 long cc2; 91 int class; 92 int cond; 93 int compare_op; 94 int cbit; 95 int cout; 96 }; 97 98 enum 99 { 100 FPd = 0, 101 FPs, 102 FPmemory, 103 }; 104 105 enum 106 { 107 MemRead, 108 MemReadstring, 109 MemWrite, 110 }; 111 112 enum 113 { 114 CCcmp, 115 CCtst, 116 CCteq, 117 }; 118 119 enum 120 { 121 Stack, 122 Text, 123 Data, 124 Bss, 125 Nseg, 126 }; 127 128 struct Segment 129 { 130 short type; 131 ulong base; 132 ulong end; 133 ulong fileoff; 134 ulong fileend; 135 int rss; 136 int refs; 137 uchar** table; 138 }; 139 140 struct Memory 141 { 142 Segment seg[Nseg]; 143 }; 144 145 void Ssyscall(ulong); 146 int armclass(long); 147 void breakpoint(char*, char*); 148 void brkchk(ulong, int); 149 void cmd(void); 150 void delbpt(char*); 151 void dobplist(void); 152 void dumpdreg(void); 153 void dumpfreg(void); 154 void dumpreg(void); 155 void* emalloc(ulong); 156 void* erealloc(void*, ulong, ulong); 157 ulong expr(char*); 158 void fatal(int, char*, ...); 159 ulong getmem_2(ulong); 160 ulong getmem_4(ulong); 161 uchar getmem_b(ulong); 162 ushort getmem_h(ulong); 163 uvlong getmem_v(ulong); 164 ulong getmem_w(ulong); 165 ulong ifetch(ulong); 166 void inithdr(int); 167 void initicache(void); 168 void initmap(void); 169 void initstk(int, char**); 170 void iprofile(void); 171 void isum(void); 172 void itrace(char*, ...); 173 long lnrand(long); 174 char* memio(char*, ulong, int, int); 175 int _mipscoinst(Map*, ulong, char*, int); 176 Mul mul(long, long); 177 Mulu mulu(ulong, ulong); 178 char* nextc(char*); 179 void printlocals(Symbol*, ulong); 180 void printparams(Symbol*, ulong); 181 void printsource(long); 182 void procinit(int); 183 void putmem_b(ulong, uchar); 184 void putmem_h(ulong, ushort); 185 void putmem_v(ulong, uvlong); 186 void putmem_w(ulong, ulong); 187 void reset(void); 188 void run(void); 189 void segsum(void); 190 void stktrace(int); 191 void tlbsum(void); 192 void undef(ulong); 193 void updateicache(ulong addr); 194 void* vaddr(ulong); 195 196 /* Globals */ 197 EXTERN Registers reg; 198 EXTERN Memory memory; 199 EXTERN int text; 200 EXTERN int trace; 201 EXTERN int sysdbg; 202 EXTERN int calltree; 203 EXTERN Inst itab[]; 204 EXTERN Inst ispec[]; 205 EXTERN Icache icache; 206 EXTERN Tlb tlb; 207 EXTERN int count; 208 EXTERN jmp_buf errjmp; 209 EXTERN Breakpoint* bplist; 210 EXTERN int atbpt; 211 EXTERN int membpt; 212 EXTERN int cmdcount; 213 EXTERN int nopcount; 214 EXTERN ulong dot; 215 EXTERN char* file; 216 EXTERN Biobuf* bioout; 217 EXTERN Biobuf* bin; 218 EXTERN ulong* iprof; 219 EXTERN int datasize; 220 EXTERN Map* symmap; 221 222 /* Plan9 Kernel constants */ 223 enum 224 { 225 BY2PG = 4096, 226 BY2WD = 4, 227 UTZERO = 0x1000, 228 STACKTOP = 0x80000000, 229 STACKSIZE = 0x10000, 230 231 PROFGRAN = 4, 232 Sbit = 1<<20, 233 SIGNBIT = 0x80000000, 234 235 FP_U = 3, 236 FP_L = 1, 237 FP_G = 2, 238 FP_E = 0, 239 FP_CBIT = 1<<23, 240 }; 241