📄 power.h
字号:
/* * 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 Mul Mul;typedef struct Mulu Mulu;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; union { double fd[32]; uvlong dv[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 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);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 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 0x80000000enum { 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -