xref: /plan9/sys/src/cmd/ki/sparc.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 /*
2  * sparc sim.h
3  *
4  * The integer instruction side of this emulator is portable if sizeof(long) >= 4
5  * Floating point emulation however is not. Assumptions made are:
6  * sizeof(ulong) == sizeof(float)
7  * sizeof(ulong)*2 == sizeof(double)
8  * bits of floating point in memory may be reversed lsw/msw
9  * unions of double & 2*float & 2*long have no padding
10  */
11 #include "/sparc/include/ureg.h"
12 #define	USERADDR	0xC0000000
13 #define	UREGADDR	(USERADDR+BY2PG-4-0xA0)
14 #define USER_REG(x)	(UREGADDR+(ulong)(x))
15 #define	REGOFF(x)	(USER_REG(&((struct Ureg *) 0)->x))
16 
17 typedef struct Registers Registers;
18 typedef struct Segment Segment;
19 typedef struct Memory Memory;
20 typedef struct Mul Mul;
21 typedef struct Mulu Mulu;
22 typedef struct Inst Inst;
23 typedef struct Icache Icache;
24 typedef struct Breakpoint Breakpoint;
25 
26 enum
27 {
28 	Instruction	= 1,
29 	Read		= 2,
30 	Write		= 4,
31 	Access		= 2|4,
32 	Equal		= 4|8,
33 };
34 
35 struct Breakpoint
36 {
37 	int		type;		/* Instruction/Read/Access/Write/Equal */
38 	ulong		addr;		/* Place at address */
39 	int		count;		/* To execute count times or value */
40 	int		done;		/* How many times passed through */
41 	Breakpoint	*next;		/* Link to next one */
42 };
43 
44 enum
45 {
46 	Iload,
47 	Istore,
48 	Iarith,
49 	Ibranch,
50 	Ireg,
51 	Isyscall,
52 	Ifloat,
53 	Inop,
54 };
55 
56 struct Icache
57 {
58 	int	on;			/* Turned on */
59 	int	linesize;		/* Line size in bytes */
60 	int	stall;			/* Cache stalls */
61 	int	*lines;			/* Tag array */
62 	int*	(*hash)(ulong);		/* Hash function */
63 	char	*hashtext;		/* What the function looks like */
64 };
65 
66 struct Inst
67 {
68 	void 	(*func)(ulong);
69 	char	*name;
70 	int	type;
71 	int	count;
72 	int	taken;
73 	int	useddelay;
74 };
75 
76 struct Registers
77 {
78 	ulong	pc;
79 	ulong	ir;
80 	Inst	*ip;
81 	long	r[32];
82 	ulong	Y;
83 	ulong	psr;
84 	ulong	fpsr;
85 
86 	union {
87 		double	fd[16];
88 		float	fl[32];
89 		ulong	di[32];
90 	};
91 };
92 
93 struct Mulu{
94 	ulong lo;
95 	ulong hi;
96 };
97 
98 struct Mul{
99 	long lo;
100 	long hi;
101 };
102 
103 enum
104 {
105 	MemRead,
106 	MemReadstring,
107 	MemWrite,
108 };
109 
110 enum
111 {
112 	Stack,
113 	Text,
114 	Data,
115 	Bss,
116 	Nseg,
117 };
118 
119 struct Segment
120 {
121 	short	type;
122 	ulong	base;
123 	ulong	end;
124 	ulong	fileoff;
125 	ulong	fileend;
126 	int	rss;
127 	int	refs;
128 	uchar	**table;
129 };
130 
131 struct Memory
132 {
133 	Segment	seg[Nseg];
134 };
135 
136 void		fatal(int, char*, ...);
137 void		run(void);
138 void		undef(ulong);
139 void		dumpreg(void);
140 void		dumpfreg(void);
141 void		dumpdreg(void);
142 void*		emalloc(ulong);
143 void*		erealloc(void*, ulong, ulong);
144 void*		vaddr(ulong);
145 void		itrace(char *, ...);
146 void		segsum(void);
147 void		ta(ulong);
148 char*		memio(char*, ulong, int, int);
149 ulong		getmem_w(ulong);
150 ulong		ifetch(ulong);
151 ushort		getmem_h(ulong);
152 void		putmem_w(ulong, ulong);
153 uchar		getmem_b(ulong);
154 void		putmem_b(ulong, uchar);
155 ulong		getmem_4(ulong);
156 ulong		getmem_2(ulong);
157 void		putmem_h(ulong, short);
158 Mul		mul(long, long);
159 Mulu		mulu(ulong, ulong);
160 void		isum(void);
161 void		initicache(void);
162 void		updateicache(ulong addr);
163 long		lnrand(long);
164 void		randseed(long, long);
165 void		cmd(void);
166 void		brkchk(ulong, int);
167 void		delbpt(char*);
168 void		breakpoint(char*, char*);
169 char*		nextc(char*);
170 ulong		expr(char*);
171 void		initstk(int, char**);
172 void		initmap(void);
173 void		inithdr(int);
174 void		reset(void);
175 void		dobplist(void);
176 void		procinit(int);
177 void		printsource(long);
178 void		printparams(Symbol *, ulong);
179 void		printlocals(Symbol *, ulong);
180 void		stktrace(int);
181 void		delay(ulong);
182 void		iprofile(void);
183 
184 /* Globals */
185 Extern 		Registers reg;
186 Extern 		Memory memory;
187 Extern		int text;
188 Extern		int trace;
189 Extern 		int sysdbg;
190 Extern 		int calltree;
191 Extern		Icache icache;
192 Extern		int count;
193 Extern		jmp_buf errjmp;
194 Extern		Breakpoint *bplist;
195 Extern		int atbpt;
196 Extern		int membpt;
197 Extern		int cmdcount;
198 Extern		int nopcount;
199 Extern		ulong dot;
200 extern		char *file;
201 Extern		Biobuf *bioout;
202 Extern		Biobuf *bin;
203 Extern		Inst *ci;
204 Extern		ulong *iprof;
205 Extern		ulong loadlock;
206 Extern		ulong anulled;
207 extern		int datasize;
208 extern		int printcol;
209 Extern		Map *symmap;
210 
211 /* Plan9 Kernel constants */
212 #define	BY2PG		4096
213 #define BY2WD		4
214 #define UTZERO		0x1000
215 #define TSTKSIZ		32
216 #define TSTACKTOP	0x10000000
217 #define STACKTOP	(TSTACKTOP-TSTKSIZ*BY2PG)
218 #define STACKSIZE	(4*1024*1024)
219 
220 #define ANUL		(1<<29)
221 #define PROFGRAN	4
222 #define NOP		0x80300000
223 #define SIGNBIT		0x80000000
224 #define IMMBIT		(1<<13)
225 #define getrop23(i)	rd = (i>>25)&0x1f; rs1 = (i>>14)&0x1f; rs2 = i&0x1f;
226 #define ximm(xx, ii)	xx = ii&0x1FFF; if(xx&0x1000) xx |= ~0x1FFF
227 
228 #define PSR_n		(1<<23)
229 #define PSR_z		(1<<22)
230 #define PSR_v		(1<<21)
231 #define PSR_c		(1<<20)
232 
233 #define FP_U		3
234 #define FP_L		1
235 #define FP_G		2
236 #define FP_E		0
237