summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ki/sparc.h
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /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-xsys/src/cmd/ki/sparc.h236
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