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/ki/sparc.h |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/ki/sparc.h')
-rwxr-xr-x | sys/src/cmd/ki/sparc.h | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/sys/src/cmd/ki/sparc.h b/sys/src/cmd/ki/sparc.h new file mode 100755 index 000000000..1501f9e0f --- /dev/null +++ b/sys/src/cmd/ki/sparc.h @@ -0,0 +1,236 @@ +/* + * 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 |