/*
* power sim.h
*
* The integer instruction side of this emulator is portable if sizeof(long) >= 4
* Floating point emulation assumes:
* sizeof(ulong) == sizeof(float)
* sizeof(ulong)*2 == sizeof(double) <= sizeof(vlong)
* unions of double & vlong have no padding
* vlongs provide at least 64 bits precision
*/
#include "/power/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 Inset Inset;
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,
Ilog,
Ibranch,
Ireg,
Isyscall,
Ifloat,
Inop,
Icontrol,
};
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 Inset
{
Inst *tab; /* indexed by extended opcode */
int nel;
};
struct Inst
{
void (*func)(ulong);
char *name;
int type;
int count;
int taken;
};
struct Registers
{
ulong pc;
ulong ir;
Inst *ip;
long r[32];
ulong ctr;
ulong cr;
ulong xer;
ulong lr;
ulong fpscr;
ulong dec;
ulong tbl;
ulong tbu;
double fd[32];
};
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 fpreginit(void);
void run(void);
void undef(ulong);
void unimp(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 sc(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);
uvlong getmem_v(ulong);
ulong getmem_4(ulong);
ulong getmem_2(ulong);
void putmem_v(ulong, uvlong);
void putmem_h(ulong, short);
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 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 iprofsize;
Extern ulong loadlock;
extern int datasize;
extern int printcol;
Extern Map *symmap;
extern ulong bits[];
extern Inset ops0, ops19, ops31, ops59, ops63a, ops63b;
/* Plan9 Kernel constants */
#define BY2PG 4096
#define BY2WD 4
#define UTZERO 0x1000
#define TSTKSIZ 32
#define TSTACKTOP 0x20000000
#define STACKTOP (TSTACKTOP-TSTKSIZ*BY2PG)
#define STACKSIZE (4*1024*1024)
#define PROFGRAN 4
#define NOP 0x80300000
#define SIGNBIT 0x80000000
enum {
CRLT = 1<<31,
CRGT = 1<<30,
CREQ = 1<<29,
CRSO = 1<<28,
CRFU = CRSO,
CRFX = 1<<27,
CRFEX = 1<<26,
CRVX = 1<<25,
CROX = 1<<24,
};
#define getCR(x,w) (((w)>>(28-(x*4)))&0xF)
#define mkCR(x,v) (((v)&0xF)<<(28-(x*4)))
#define simm(xx, ii) xx = (short)(ii&0xFFFF);
#define uimm(xx, ii) xx = ii&0xFFFF;
#define imms(xx, ii) xx = ii<<16;
#define getairr(i) rd = (i>>21)&0x1f; ra = (i>>16)&0x1f; simm(imm,i)
#define getarrr(i) rd = (i>>21)&0x1f; ra = (i>>16)&0x1f; rb = (i>>11)&0x1f;
#define getbobi(i) bo = (i>>21)&0x1f; bi = (i>>16)&0x1f; xx = (i>>11)&0x1f;
#define getlirr(i) rs = (i>>21)&0x1f; ra = (i>>16)&0x1f; uimm(imm,i)
#define getlrrr(i) rs = (i>>21)&0x1f; ra = (i>>16)&0x1f; rb = (i>>11)&0x1f;
#define OP(o,xo) ((o<<26)|(xo<<1)) /* build an operation */
#define xop(a,b) ((b<<6)|a) /* compact form for use in a decoding switch on op/xo */
#define getop(i) ((i>>26)&0x3F)
#define getxo(i) ((i>>1)&0x3FF)
#define FPS_FX (1<<31) /* exception summary (sticky) */
#define FPS_EX (1<<30) /* enabled exception summary */
#define FPS_VX (1<<29) /* invalid operation exception summary */
#define FPS_OX (1<<28) /* overflow exception OX (sticky) */
#define FPS_UX (1<<27) /* underflow exception UX (sticky) */
#define FPS_ZX (1<<26) /* zero divide exception ZX (sticky) */
#define FPS_XX (1<<25) /* inexact exception XX (sticky) */
#define FPS_VXSNAN (1<<24) /* invalid operation exception for SNaN (sticky) */
#define FPS_VXISI (1<<23) /* invalid operation exception for ∞-∞ (sticky) */
#define FPS_VXIDI (1<<22) /* invalid operation exception for ∞/∞ (sticky) */
#define FPS_VXZDZ (1<<21) /* invalid operation exception for 0/0 (sticky) */
#define FPS_VXIMZ (1<<20) /* invalid operation exception for ∞*0 (sticky) */
#define FPS_VXVC (1<<19) /* invalid operation exception for invalid compare (sticky) */
#define FPS_FR (1<<18) /* fraction rounded */
#define FPS_FI (1<<17) /* fraction inexact */
#define FPS_FPRF (1<<16) /* floating point result class */
#define FPS_FPCC (0xF<<12) /* <, >, =, unordered */
#define FPS_VXCVI (1<<8) /* enable exception for invalid integer convert (sticky) */
#define FPS_VE (1<<7) /* invalid operation exception enable */
#define FPS_OE (1<<6) /* enable overflow exceptions */
#define FPS_UE (1<<5) /* enable underflow */
#define FPS_ZE (1<<4) /* enable zero divide */
#define FPS_XE (1<<3) /* enable inexact exceptions */
#define FPS_RN (3<<0) /* rounding mode */
#define XER_SO (1<<31)
#define XER_OV (1<<30)
#define XER_CA (1<<29)
#define Rc 1
#define OE 0x400
|