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
241
242
243
244
245
|
/* cpu.h --- declarations for the RX core.
Copyright (C) 2005, 2007-2012 Free Software Foundation, Inc.
Contributed by Red Hat, Inc.
This file is part of the GNU simulators.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <stdint.h>
#include <setjmp.h>
extern int verbose;
extern int trace;
extern int enable_counting;
typedef uint8_t QI;
typedef uint16_t HI;
typedef uint32_t SI;
typedef uint64_t DI;
extern int rx_in_gdb;
extern int rx_big_endian;
typedef struct
{
SI r[16];
SI r_psw;
SI r_pc;
SI r_usp;
SI r_fpsw;
SI r__reserved_cr_4;
SI r__reserved_cr_5;
SI r__reserved_cr_6;
SI r__reserved_cr_7;
SI r_bpsw;
SI r_bpc;
SI r_isp;
SI r_fintv;
SI r_intb;
SI r__reserved_cr_13;
SI r__reserved_cr_14;
SI r__reserved_cr_15;
SI r__reserved_cr_16;
SI r__reserved_cr_17;
SI r__reserved_cr_18;
SI r__reserved_cr_19;
SI r__reserved_cr_20;
SI r__reserved_cr_21;
SI r__reserved_cr_22;
SI r__reserved_cr_23;
SI r__reserved_cr_24;
SI r__reserved_cr_25;
SI r__reserved_cr_26;
SI r__reserved_cr_27;
SI r__reserved_cr_28;
SI r__reserved_cr_29;
SI r__reserved_cr_30;
SI r__reserved_cr_31;
SI r_temp;
DI r_acc;
#ifdef CYCLE_ACCURATE
/* If set, RTS/RTSD take 2 fewer cycles. */
char fast_return;
SI link_register;
unsigned long long cycle_count;
/* Bits saying what kind of memory operands the previous insn had. */
int m2m;
/* Target register for load. */
int rt;
#endif
} regs_type;
#define M2M_SRC 0x01
#define M2M_DST 0x02
#define M2M_BOTH 0x03
#define sp 0
#define psw 16
#define pc 17
#define usp 18
#define fpsw 19
#define bpsw 24
#define bpc 25
#define isp 26
#define fintv 27
#define intb 28
#define r_temp_idx 48
#define acc64 49
#define acchi 50
#define accmi 51
#define acclo 52
extern regs_type regs;
#define FLAGBIT_C 0x00000001
#define FLAGBIT_Z 0x00000002
#define FLAGBIT_S 0x00000004
#define FLAGBIT_O 0x00000008
#define FLAGBIT_I 0x00010000
#define FLAGBIT_U 0x00020000
#define FLAGBIT_PM 0x00100000
#define FLAGBITS_IPL 0x0f000000
#define FLAGSHIFT_IPL 24
#define FPSWBITS_RM 0x00000003
#define FPSWBITS_CV 0x00000004 /* invalid operation */
#define FPSWBITS_CO 0x00000008 /* overflow */
#define FPSWBITS_CZ 0x00000010 /* divide-by-zero */
#define FPSWBITS_CU 0x00000020 /* underflow */
#define FPSWBITS_CX 0x00000040 /* inexact */
#define FPSWBITS_CE 0x00000080 /* unimplemented processing */
#define FPSWBITS_CMASK 0x000000fc /* all the above */
#define FPSWBITS_DN 0x00000100
#define FPSW_CESH 8
#define FPSWBITS_EV 0x00000400
#define FPSWBITS_EO 0x00000800
#define FPSWBITS_EZ 0x00001000
#define FPSWBITS_EU 0x00002000
#define FPSWBITS_EX 0x00004000
#define FPSW_EFSH 16
#define FPSW_CFSH 24
#define FPSWBITS_FV 0x04000000
#define FPSWBITS_FO 0x08000000
#define FPSWBITS_FZ 0x10000000
#define FPSWBITS_FU 0x20000000
#define FPSWBITS_FX 0x40000000
#define FPSWBITS_FSUM 0x80000000
#define FPSWBITS_FMASK 0x7c000000
#define FPSWBITS_CLEAR 0xffffff03 /* masked at start of any FP opcode */
#define FPRM_NEAREST 0
#define FPRM_ZERO 1
#define FPRM_PINF 2
#define FPRM_NINF 3
extern char *reg_names[];
extern int rx_flagmask;
extern int rx_flagand;
extern int rx_flagor;
extern unsigned int b2mask[];
extern unsigned int b2signbit[];
extern int b2maxsigned[];
extern int b2minsigned[];
void init_regs (void);
void stack_heap_stats (void);
void set_pointer_width (int bytes);
unsigned int get_reg (int id);
unsigned long long get_reg64 (int id);
void put_reg (int id, unsigned int value);
void put_reg64 (int id, unsigned long long value);
void set_flags (int mask, int newbits);
void set_oszc (long long value, int bytes, int c);
void set_szc (long long value, int bytes, int c);
void set_osz (long long value, int bytes);
void set_sz (long long value, int bytes);
void set_zc (int z, int c);
void set_c (int c);
const char *bits (int v, int b);
int condition_true (int cond_id);
#define FLAG(f) ((regs.r_psw & f) ? 1 : 0)
#define FLAG_C FLAG(FLAGBIT_C)
#define FLAG_D FLAG(FLAGBIT_D)
#define FLAG_Z FLAG(FLAGBIT_Z)
#define FLAG_S FLAG(FLAGBIT_S)
#define FLAG_B FLAG(FLAGBIT_B)
#define FLAG_O FLAG(FLAGBIT_O)
#define FLAG_I FLAG(FLAGBIT_I)
#define FLAG_U FLAG(FLAGBIT_U)
#define FLAG_PM FLAG(FLAGBIT_PM)
/* Instruction step return codes.
Suppose one of the decode_* functions below returns a value R:
- If RX_STEPPED (R), then the single-step completed normally.
- If RX_HIT_BREAK (R), then the program hit a breakpoint.
- If RX_EXITED (R), then the program has done an 'exit' system
call, and the exit code is RX_EXIT_STATUS (R).
- If RX_STOPPED (R), then a signal (number RX_STOP_SIG (R)) was
generated.
For building step return codes:
- RX_MAKE_STEPPED is the return code for finishing a normal step.
- RX_MAKE_HIT_BREAK is the return code for hitting a breakpoint.
- RX_MAKE_EXITED (C) is the return code for exiting with status C.
- RX_MAKE_STOPPED (S) is the return code for stopping on signal S. */
#define RX_MAKE_STEPPED() (1)
#define RX_MAKE_HIT_BREAK() (2)
#define RX_MAKE_EXITED(c) (((int) (c) << 8) + 3)
#define RX_MAKE_STOPPED(s) (((int) (s) << 8) + 4)
#define RX_STEPPED(r) ((r) == RX_MAKE_STEPPED ())
#define RX_HIT_BREAK(r) ((r) == RX_MAKE_HIT_BREAK ())
#define RX_EXITED(r) (((r) & 0xff) == 3)
#define RX_EXIT_STATUS(r) ((r) >> 8)
#define RX_STOPPED(r) (((r) & 0xff) == 4)
#define RX_STOP_SIG(r) ((r) >> 8)
/* The step result for the current step. Global to allow
communication between the stepping function and the system
calls. */
extern int step_result;
extern unsigned int rx_cycles;
/* Used to detect heap/stack collisions. */
extern unsigned int heaptop;
extern unsigned int heapbottom;
extern int decode_opcode (void);
extern void reset_decoder (void);
extern void reset_pipeline_stats (void);
extern void halt_pipeline_stats (void);
extern void pipeline_stats (void);
extern void trace_register_changes ();
extern void generate_access_exception (void);
extern jmp_buf decode_jmp_buf;
|