diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/qi/power.h |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/qi/power.h')
-rwxr-xr-x | sys/src/cmd/qi/power.h | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/sys/src/cmd/qi/power.h b/sys/src/cmd/qi/power.h new file mode 100755 index 000000000..e24ca8a34 --- /dev/null +++ b/sys/src/cmd/qi/power.h @@ -0,0 +1,285 @@ +/* + * 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 |