summaryrefslogtreecommitdiff
path: root/sys/src/cmd/5i/arm.h
blob: 322bcb2be6f6029e04dc27fca8e0e2290051f873 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
/*
 * arm.h
 */
#ifndef	EXTERN
#define	EXTERN	extern
#endif

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	Tlb		Tlb;
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
{
	Imem,
	Iarith,
	Ibranch,
	Isyscall,
};

enum
{
	Nmaxtlb = 64,
	REGARG	= 0,
	REGRET	= 0,
	REGPC	= 15,
	REGLINK	= 14,
	REGSP	= 13,
};

struct Tlb
{
	int	on;			/* Being updated */
	int	tlbsize;		/* Number of entries */
	ulong	tlbent[Nmaxtlb];	/* Virtual address tags */
	int	hit;			/* Number of successful tag matches */
	int	miss;			/* Number of failed tag matches */
};		

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	ar;
	ulong	ir;
	Inst*	ip;
	long	r[16];
	long	cc1;
	long	cc2;
	int	class;
	int	cond;
	int	compare_op;
	int	cbit;
	int	cout;
};

enum
{
	FPd	= 0,
	FPs,
	FPmemory,
};

enum
{
	MemRead,
	MemReadstring,
	MemWrite,
};

enum
{
	CCcmp, 
	CCtst,
	CCteq,
};

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		Ssyscall(ulong);
int		armclass(long);
void		breakpoint(char*, char*);
void		brkchk(ulong, int);
void		cmd(void);
void		delbpt(char*);
void		dobplist(void);
void		dumpdreg(void);
void		dumpfreg(void);
void		dumpreg(void);
void*		emalloc(ulong);
void*		erealloc(void*, ulong, ulong);
ulong		expr(char*);
void		fatal(int, char*, ...);
ulong		getmem_2(ulong);
ulong		getmem_4(ulong);
uchar		getmem_b(ulong);
ushort		getmem_h(ulong);
uvlong		getmem_v(ulong);
ulong		getmem_w(ulong);
ulong		ifetch(ulong);
void		inithdr(int);
void		initicache(void);
void		initmap(void);
void		initstk(int, char**);
void		iprofile(void);
void		isum(void);
void		itrace(char*, ...);
long		lnrand(long);
char*		memio(char*, ulong, int, int);
int		_mipscoinst(Map*, ulong, char*, int);
Mul		mul(long, long);
Mulu		mulu(ulong, ulong);
char*		nextc(char*);
void		printlocals(Symbol*, ulong);
void		printparams(Symbol*, ulong);
void		printsource(long);
void		procinit(int);
void		putmem_b(ulong, uchar);
void		putmem_h(ulong, ushort);
void		putmem_v(ulong, uvlong);
void		putmem_w(ulong, ulong);
void		reset(void);
void		run(void);
void		segsum(void);
void		stktrace(int);
void		tlbsum(void);
void		undef(ulong);
void		updateicache(ulong addr);
void*		vaddr(ulong);

/* Globals */
EXTERN	Registers	reg;
EXTERN	Memory		memory;
EXTERN	int		text;
EXTERN	int		trace;
EXTERN	int		sysdbg;
EXTERN	int		calltree;
EXTERN	Inst		itab[];
EXTERN	Inst		ispec[];
EXTERN	Icache		icache;
EXTERN	Tlb		tlb;
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	ulong*		iprof;
EXTERN	int		datasize;
EXTERN	Map*		symmap;	

/* Plan9 Kernel constants */
enum
{
	BY2PG		= 4096,
	BY2WD		= 4,
	UTZERO		= 0x1000,
	STACKTOP	= 0x80000000,
	STACKSIZE	= 0x10000,

	PROFGRAN	= 4,
	Sbit		= 1<<20,
	SIGNBIT		= 0x80000000,

	FP_U		= 3,
	FP_L		= 1,
	FP_G		= 2,
	FP_E		= 0,
	FP_CBIT		= 1<<23,
};