/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ /* * 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,};
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
/*
* 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,
};