plan9fox/sys/src/cmd/ki/sparc.h
2011-03-30 19:35:09 +03:00

237 lines
4.3 KiB
C

/*
* 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