xref: /plan9/sys/src/cmd/vi/mips.h (revision 426f2a32150b219ea919a1d76cbd0c50d6d55686)
1 /*
2  * mipsim.h
3  */
4 #include "/mips/include/ureg.h"
5 #define	USERADDR	0xC0000000
6 #define	UREGADDR	(USERADDR+BY2PG-4-0xA0)
7 #define USER_REG(x)	(UREGADDR+(ulong)(x))
8 #define	REGOFF(x)	(USER_REG(&((struct Ureg *) 0)->x))
9 
10 typedef struct Registers Registers;
11 typedef struct Segment Segment;
12 typedef struct Memory Memory;
13 typedef struct Mul Mul;
14 typedef struct Mulu Mulu;
15 typedef struct Inst Inst;
16 typedef struct Icache Icache;
17 typedef struct Tlb Tlb;
18 typedef struct Breakpoint Breakpoint;
19 
20 enum
21 {
22 	Instruction	= 1,
23 	Read		= 2,
24 	Write		= 4,
25 	Access		= 2|4,
26 	Equal		= 4|8,
27 };
28 
29 struct Breakpoint
30 {
31 	int		type;		/* Instruction/Read/Access/Write/Equal */
32 	ulong		addr;		/* Place at address */
33 	int		count;		/* To execute count times or value */
34 	int		done;		/* How many times passed through */
35 	Breakpoint	*next;		/* Link to next one */
36 };
37 
38 enum
39 {
40 	Iload,
41 	Istore,
42 	Iarith,
43 	Ibranch,
44 	Ireg,
45 	Isyscall,
46 	Ifloat,
47 };
48 
49 enum
50 {
51 	Nmaxtlb = 64,
52 };
53 
54 struct Tlb
55 {
56 	int	on;			/* Being updated */
57 	int	tlbsize;		/* Number of entries */
58 	ulong	tlbent[Nmaxtlb];	/* Virtual address tags */
59 	int	hit;			/* Number of successful tag matches */
60 	int	miss;			/* Number of failed tag matches */
61 };
62 
63 struct Icache
64 {
65 	int	on;			/* Turned on */
66 	int	linesize;		/* Line size in bytes */
67 	int	stall;			/* Cache stalls */
68 	int	*lines;			/* Tag array */
69 	int*	(*hash)(ulong);		/* Hash function */
70 	char	*hashtext;		/* What the function looks like */
71 };
72 
73 struct Inst
74 {
75 	void 	(*func)(ulong);
76 	char	*name;
77 	int	type;
78 	int	count;
79 	int	taken;
80 	int	useddelay;
81 };
82 
83 struct Registers
84 {
85 	ulong	pc;
86 	ulong	ir;
87 	Inst	*ip;
88 	long	r[32];
89 	ulong	mhi;
90 	ulong	mlo;
91 
92 	ulong	fpsr;
93 	union {
94 		double	fd[16];
95 		float	fl[32];
96 		ulong	di[32];
97 	};
98 	char	ft[32];
99 };
100 
101 enum
102 {
103 	FPd	= 0,
104 	FPs,
105 	FPmemory,
106 };
107 #define dreg(r)	((r)>>1)
108 
109 struct Mulu
110 {
111 	ulong lo;
112 	ulong hi;
113 };
114 
115 struct Mul
116 {
117 	long lo;
118 	long hi;
119 };
120 
121 enum
122 {
123 	MemRead,
124 	MemReadstring,
125 	MemWrite,
126 };
127 
128 enum
129 {
130 	Stack,
131 	Text,
132 	Data,
133 	Bss,
134 	Nseg,
135 };
136 
137 struct Segment
138 {
139 	short	type;
140 	ulong	base;
141 	ulong	end;
142 	ulong	fileoff;
143 	ulong	fileend;
144 	int	rss;
145 	int	refs;
146 	uchar	**table;
147 };
148 
149 struct Memory
150 {
151 	Segment	seg[Nseg];
152 };
153 
154 void		fatal(int, char*, ...);
155 void		run(void);
156 void		undef(ulong);
157 void		dumpreg(void);
158 void		dumpfreg(void);
159 void		dumpdreg(void);
160 void*		emalloc(ulong);
161 void*		erealloc(void*, ulong, ulong);
162 void*		vaddr(ulong);
163 int		badvaddr(ulong, int);
164 void		itrace(char *, ...);
165 void		segsum(void);
166 void		Ssyscall(ulong);
167 char*		memio(char*, ulong, int, int);
168 ulong		ifetch(ulong);
169 ulong		getmem_w(ulong);
170 ushort		getmem_h(ulong);
171 void		putmem_w(ulong, ulong);
172 uchar		getmem_b(ulong);
173 void		putmem_b(ulong, uchar);
174 ulong		getmem_4(ulong);
175 ulong		getmem_2(ulong);
176 void		putmem_h(ulong, short);
177 Mul		mul(long, long);
178 Mulu		mulu(ulong, ulong);
179 void		isum(void);
180 void		initicache(void);
181 void		updateicache(ulong addr);
182 void		tlbsum(void);
183 long		lnrand(long);
184 void		randseed(long, long);
185 void		cmd(void);
186 void		brkchk(ulong, int);
187 void		delbpt(char*);
188 void		breakpoint(char*, char*);
189 char*		nextc(char*);
190 ulong		expr(char*);
191 void		initmap(void);
192 void		inithdr(int);
193 void		initstk(int, char**);
194 void		reset(void);
195 void		dobplist(void);
196 int		_mipscoinst(Map*, uvlong, char*, int);
197 void		procinit(int);
198 void		printsource(long);
199 void		printparams(Symbol *, ulong);
200 void		printlocals(Symbol *, ulong);
201 void		stktrace(int);
202 void		iprofile(void);
203 
204 /* Globals */
205 Extern 		Registers reg;
206 Extern 		Memory memory;
207 Extern		int text;
208 Extern		int trace;
209 Extern 		int sysdbg;
210 Extern 		int calltree;
211 Extern		Inst itab[];
212 Extern		Inst ispec[];
213 Extern		Icache icache;
214 Extern		Tlb tlb;
215 Extern		int count;
216 Extern		jmp_buf errjmp;
217 Extern		Breakpoint *bplist;
218 Extern		int atbpt;
219 Extern		int membpt;
220 Extern		int cmdcount;
221 Extern		int nopcount;
222 Extern		ulong dot;
223 extern		char *file;
224 Extern		Biobuf *bioout;
225 Extern		Biobuf *bin;
226 Extern		ulong *iprof;
227 extern		int datasize;
228 Extern		Map *symmap;
229 Extern		int rtrace;
230 
231 /* Plan9 Kernel constants */
232 #define	BY2PG		(16*1024)
233 #define BY2WD		4
234 #define UTZERO		0x1000
235 #define STACKTOP	0x80000000
236 #define STACKSIZE	0x10000
237 
238 #define PROFGRAN	4
239 /* Opcode decoders */
240 #define Getrsrt(s,t,i)		s = (i>>21)&0x1f; t = (i>>16)&0x1f;
241 #define Getrbrt(b,t,i)		b = (i>>21)&0x1f; t = (i>>16)&0x1f;
242 #define Get3(s, t, d, i)	s = (i>>21)&0x1f; t = (i>>16)&0x1f; d = (i>>11)&0x1f;
243 #define Getf3(s, t, d, i)	s = (i>>11)&0x1f; t = (i>>16)&0x1f; d = (i>>6)&0x1f;
244 #define Getf2(s, d, i)		s = (i>>11)&0x1f; d = (i>>6)&0x1f;
245 #define SpecialGetrtrd(t, d, i)	t = (i>>16)&0x1f; d = (i>>11)&0x1f;
246 
247 #define INOPINST	"nor"
248 #define INOP		0x00000027	/* Instruction used as nop */
249 #define SIGNBIT		0x80000000
250 #define Iexec(ir)	{Inst *i; i = &itab[(ir)>>26]; reg.ip = i; i->count++; (*i->func)(ir); }
251 #define Statbra()	reg.ip->taken++; if(reg.ir != INOP) reg.ip->useddelay++;
252 
253 #define FP_U		3
254 #define FP_L		1
255 #define FP_G		2
256 #define FP_E		0
257 #define FP_CBIT		(1<<23)
258