Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

/*
 * 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,
};