/* * arm.h */ #ifndef EXTERN #define EXTERN extern #endif typedef struct Registers Registers; typedef struct Segment Segment; typedef struct Memory Memory; typedef struct Mul Mul; typedef struct Mulu Mulu; typedef struct Inst Inst; typedef struct Icache Icache; typedef struct Tlb Tlb; typedef struct Breakpoint Breakpoint; enum { Instruction = 1, Read = 2, Write = 4, Access = 2|4, Equal = 4|8, }; struct Breakpoint { int type; /* Instruction/Read/Access/Write/Equal */ ulong addr; /* Place at address */ int count; /* To execute count times or value */ int done; /* How many times passed through */ Breakpoint* next; /* Link to next one */ }; enum { Imem, Iarith, Ibranch, Isyscall, }; enum { Nmaxtlb = 64, REGARG = 0, REGRET = 0, REGPC = 15, REGLINK = 14, REGSP = 13, }; struct Tlb { int on; /* Being updated */ int tlbsize; /* Number of entries */ ulong tlbent[Nmaxtlb]; /* Virtual address tags */ int hit; /* Number of successful tag matches */ int miss; /* Number of failed tag matches */ }; struct Icache { int on; /* Turned on */ int linesize; /* Line size in bytes */ int stall; /* Cache stalls */ int* lines; /* Tag array */ int* (*hash)(ulong); /* Hash function */ char* hashtext; /* What the function looks like */ }; struct Inst { void (*func)(ulong); char* name; int type; int count; int taken; int useddelay; }; struct Registers { ulong ar; ulong ir; Inst* ip; long r[16]; long cc1; long cc2; int class; int cond; int compare_op; int cbit; int cout; }; enum { FPd = 0, FPs, FPmemory, }; enum { MemRead, MemReadstring, MemWrite, }; enum { CCcmp, CCtst, CCteq, }; enum { Stack, Text, Data, Bss, Nseg, }; struct Segment { short type; ulong base; ulong end; ulong fileoff; ulong fileend; int rss; int refs; uchar** table; }; struct Memory { Segment seg[Nseg]; }; void Ssyscall(ulong); int armclass(long); void breakpoint(char*, char*); void brkchk(ulong, int); void cmd(void); void delbpt(char*); void dobplist(void); void dumpdreg(void); void dumpfreg(void); void dumpreg(void); void* emalloc(ulong); void* erealloc(void*, ulong, ulong); ulong expr(char*); void fatal(int, char*, ...); ulong getmem_2(ulong); ulong getmem_4(ulong); uchar getmem_b(ulong); ushort getmem_h(ulong); uvlong getmem_v(ulong); ulong getmem_w(ulong); ulong ifetch(ulong); void inithdr(int); void initicache(void); void initmap(void); void initstk(int, char**); void iprofile(void); void isum(void); void itrace(char*, ...); long lnrand(long); char* memio(char*, ulong, int, int); int _mipscoinst(Map*, ulong, char*, int); Mul mul(long, long); Mulu mulu(ulong, ulong); char* nextc(char*); void printlocals(Symbol*, ulong); void printparams(Symbol*, ulong); void printsource(long); void procinit(int); void putmem_b(ulong, uchar); void putmem_h(ulong, ushort); void putmem_v(ulong, uvlong); void putmem_w(ulong, ulong); void reset(void); void run(void); void segsum(void); void stktrace(int); void tlbsum(void); void undef(ulong); void updateicache(ulong addr); void* vaddr(ulong); /* Globals */ EXTERN Registers reg; EXTERN Memory memory; EXTERN int text; EXTERN int trace; EXTERN int sysdbg; EXTERN int calltree; EXTERN Inst itab[]; EXTERN Inst ispec[]; EXTERN Icache icache; EXTERN Tlb tlb; EXTERN int count; EXTERN jmp_buf errjmp; EXTERN Breakpoint* bplist; EXTERN int atbpt; EXTERN int membpt; EXTERN int cmdcount; EXTERN int nopcount; EXTERN ulong dot; EXTERN char* file; EXTERN Biobuf* bioout; EXTERN Biobuf* bin; EXTERN ulong* iprof; EXTERN int datasize; EXTERN Map* symmap; /* Plan9 Kernel constants */ enum { BY2PG = 4096, BY2WD = 4, UTZERO = 0x1000, STACKTOP = 0x80000000, STACKSIZE = 0x10000, PROFGRAN = 4, Sbit = 1<<20, SIGNBIT = 0x80000000, FP_U = 3, FP_L = 1, FP_G = 2, FP_E = 0, FP_CBIT = 1<<23, };