Subversion Repositories planix.SVN

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * sparc sim.h
 *
 * The integer instruction side of this emulator is portable if sizeof(long) >= 4
 * Floating point emulation however is not. Assumptions made are:
 * sizeof(ulong) == sizeof(float)
 * sizeof(ulong)*2 == sizeof(double)
 * bits of floating point in memory may be reversed lsw/msw
 * unions of double & 2*float & 2*long have no padding
 */
#include "/sparc/include/ureg.h"
#define USERADDR        0xC0000000
#define UREGADDR        (USERADDR+BY2PG-4-0xA0)
#define USER_REG(x)     (UREGADDR+(ulong)(x))
#define REGOFF(x)       (USER_REG(&((struct Ureg *) 0)->x))

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 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
{
        Iload,
        Istore,
        Iarith,
        Ibranch,
        Ireg,
        Isyscall,
        Ifloat,
        Inop,
};

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   pc;
        ulong   ir;
        Inst    *ip;
        long    r[32];
        ulong   Y;
        ulong   psr;
        ulong   fpsr;

        union {
                double  fd[16];
                float   fl[32];
                ulong   di[32];
        };
};

struct Mulu{
        ulong lo;
        ulong hi;
};

struct Mul{
        long lo;
        long hi;
};

enum
{
        MemRead,
        MemReadstring,
        MemWrite,
};

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            fatal(int, char*, ...);
void            run(void);
void            undef(ulong);
void            dumpreg(void);
void            dumpfreg(void);
void            dumpdreg(void);
void*           emalloc(ulong);
void*           erealloc(void*, ulong, ulong);
void*           vaddr(ulong);
void            itrace(char *, ...);
void            segsum(void);
void            ta(ulong);
char*           memio(char*, ulong, int, int);
ulong           getmem_w(ulong);
ulong           ifetch(ulong);
ushort          getmem_h(ulong);
void            putmem_w(ulong, ulong);
uchar           getmem_b(ulong);
void            putmem_b(ulong, uchar);
ulong           getmem_4(ulong);
ulong           getmem_2(ulong);
void            putmem_h(ulong, short);
Mul             mul(long, long);
Mulu            mulu(ulong, ulong);
void            isum(void);
void            initicache(void);
void            updateicache(ulong addr);
long            lnrand(long);
void            randseed(long, long);
void            cmd(void);
void            brkchk(ulong, int);
void            delbpt(char*);
void            breakpoint(char*, char*);
char*           nextc(char*);
ulong           expr(char*);
void            initstk(int, char**);
void            initmap(void);
void            inithdr(int);
void            reset(void);
void            dobplist(void);
void            procinit(int);
void            printsource(long);
void            printparams(Symbol *, ulong);
void            printlocals(Symbol *, ulong);
void            stktrace(int);
void            delay(ulong);
void            iprofile(void);

/* Globals */
Extern          Registers reg;
Extern          Memory memory;
Extern          int text;
Extern          int trace;
Extern          int sysdbg;
Extern          int calltree;
Extern          Icache icache;
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          Inst *ci;
Extern          ulong *iprof;
Extern          ulong loadlock;
Extern          ulong anulled;
extern          int datasize;           
extern          int printcol;
Extern          Map *symmap;

/* Plan9 Kernel constants */
#define BY2PG           4096
#define BY2WD           4
#define UTZERO          0x1000
#define TSTKSIZ         32
#define TSTACKTOP       0x10000000
#define STACKTOP        (TSTACKTOP-TSTKSIZ*BY2PG)
#define STACKSIZE       (4*1024*1024)

#define ANUL            (1<<29)
#define PROFGRAN        4
#define NOP             0x80300000
#define SIGNBIT         0x80000000
#define IMMBIT          (1<<13)
#define getrop23(i)     rd = (i>>25)&0x1f; rs1 = (i>>14)&0x1f; rs2 = i&0x1f;
#define ximm(xx, ii)    xx = ii&0x1FFF; if(xx&0x1000) xx |= ~0x1FFF

#define PSR_n           (1<<23)
#define PSR_z           (1<<22)
#define PSR_v           (1<<21)
#define PSR_c           (1<<20)

#define FP_U            3
#define FP_L            1
#define FP_G            2
#define FP_E            0