cpu.h revision 1.1.1.3 1 1.1 christos /* cpu.h --- declarations for the RX core.
2 1.1 christos
3 1.1.1.3 christos Copyright (C) 2005-2014 Free Software Foundation, Inc.
4 1.1 christos Contributed by Red Hat, Inc.
5 1.1 christos
6 1.1 christos This file is part of the GNU simulators.
7 1.1 christos
8 1.1 christos This program is free software; you can redistribute it and/or modify
9 1.1 christos it under the terms of the GNU General Public License as published by
10 1.1 christos the Free Software Foundation; either version 3 of the License, or
11 1.1 christos (at your option) any later version.
12 1.1 christos
13 1.1 christos This program is distributed in the hope that it will be useful,
14 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 christos GNU General Public License for more details.
17 1.1 christos
18 1.1 christos You should have received a copy of the GNU General Public License
19 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 1.1 christos
21 1.1 christos #include <stdint.h>
22 1.1 christos #include <setjmp.h>
23 1.1 christos
24 1.1 christos extern int verbose;
25 1.1 christos extern int trace;
26 1.1 christos extern int enable_counting;
27 1.1 christos
28 1.1 christos typedef uint8_t QI;
29 1.1 christos typedef uint16_t HI;
30 1.1 christos typedef uint32_t SI;
31 1.1 christos typedef uint64_t DI;
32 1.1 christos
33 1.1 christos extern int rx_in_gdb;
34 1.1 christos extern int rx_big_endian;
35 1.1 christos
36 1.1 christos typedef struct
37 1.1 christos {
38 1.1 christos SI r[16];
39 1.1 christos
40 1.1 christos SI r_psw;
41 1.1 christos SI r_pc;
42 1.1 christos SI r_usp;
43 1.1 christos SI r_fpsw;
44 1.1 christos SI r__reserved_cr_4;
45 1.1 christos SI r__reserved_cr_5;
46 1.1 christos SI r__reserved_cr_6;
47 1.1 christos SI r__reserved_cr_7;
48 1.1 christos
49 1.1 christos SI r_bpsw;
50 1.1 christos SI r_bpc;
51 1.1 christos SI r_isp;
52 1.1 christos SI r_fintv;
53 1.1 christos SI r_intb;
54 1.1 christos SI r__reserved_cr_13;
55 1.1 christos SI r__reserved_cr_14;
56 1.1 christos SI r__reserved_cr_15;
57 1.1 christos
58 1.1 christos SI r__reserved_cr_16;
59 1.1 christos SI r__reserved_cr_17;
60 1.1 christos SI r__reserved_cr_18;
61 1.1 christos SI r__reserved_cr_19;
62 1.1 christos SI r__reserved_cr_20;
63 1.1 christos SI r__reserved_cr_21;
64 1.1 christos SI r__reserved_cr_22;
65 1.1 christos SI r__reserved_cr_23;
66 1.1 christos
67 1.1 christos SI r__reserved_cr_24;
68 1.1 christos SI r__reserved_cr_25;
69 1.1 christos SI r__reserved_cr_26;
70 1.1 christos SI r__reserved_cr_27;
71 1.1 christos SI r__reserved_cr_28;
72 1.1 christos SI r__reserved_cr_29;
73 1.1 christos SI r__reserved_cr_30;
74 1.1 christos SI r__reserved_cr_31;
75 1.1 christos
76 1.1 christos SI r_temp;
77 1.1 christos
78 1.1 christos DI r_acc;
79 1.1 christos
80 1.1 christos #ifdef CYCLE_ACCURATE
81 1.1 christos /* If set, RTS/RTSD take 2 fewer cycles. */
82 1.1 christos char fast_return;
83 1.1 christos SI link_register;
84 1.1 christos
85 1.1 christos unsigned long long cycle_count;
86 1.1 christos /* Bits saying what kind of memory operands the previous insn had. */
87 1.1 christos int m2m;
88 1.1 christos /* Target register for load. */
89 1.1 christos int rt;
90 1.1 christos #endif
91 1.1 christos } regs_type;
92 1.1 christos
93 1.1 christos #define M2M_SRC 0x01
94 1.1 christos #define M2M_DST 0x02
95 1.1 christos #define M2M_BOTH 0x03
96 1.1 christos
97 1.1 christos #define sp 0
98 1.1 christos #define psw 16
99 1.1 christos #define pc 17
100 1.1 christos #define usp 18
101 1.1 christos #define fpsw 19
102 1.1 christos
103 1.1 christos #define bpsw 24
104 1.1 christos #define bpc 25
105 1.1 christos #define isp 26
106 1.1 christos #define fintv 27
107 1.1 christos #define intb 28
108 1.1 christos
109 1.1 christos #define r_temp_idx 48
110 1.1 christos #define acc64 49
111 1.1 christos #define acchi 50
112 1.1 christos #define accmi 51
113 1.1 christos #define acclo 52
114 1.1 christos
115 1.1 christos extern regs_type regs;
116 1.1 christos
117 1.1 christos #define FLAGBIT_C 0x00000001
118 1.1 christos #define FLAGBIT_Z 0x00000002
119 1.1 christos #define FLAGBIT_S 0x00000004
120 1.1 christos #define FLAGBIT_O 0x00000008
121 1.1 christos #define FLAGBIT_I 0x00010000
122 1.1 christos #define FLAGBIT_U 0x00020000
123 1.1 christos #define FLAGBIT_PM 0x00100000
124 1.1 christos #define FLAGBITS_IPL 0x0f000000
125 1.1 christos #define FLAGSHIFT_IPL 24
126 1.1 christos
127 1.1 christos #define FPSWBITS_RM 0x00000003
128 1.1 christos #define FPSWBITS_CV 0x00000004 /* invalid operation */
129 1.1 christos #define FPSWBITS_CO 0x00000008 /* overflow */
130 1.1 christos #define FPSWBITS_CZ 0x00000010 /* divide-by-zero */
131 1.1 christos #define FPSWBITS_CU 0x00000020 /* underflow */
132 1.1 christos #define FPSWBITS_CX 0x00000040 /* inexact */
133 1.1 christos #define FPSWBITS_CE 0x00000080 /* unimplemented processing */
134 1.1 christos #define FPSWBITS_CMASK 0x000000fc /* all the above */
135 1.1 christos #define FPSWBITS_DN 0x00000100
136 1.1 christos #define FPSW_CESH 8
137 1.1 christos #define FPSWBITS_EV 0x00000400
138 1.1 christos #define FPSWBITS_EO 0x00000800
139 1.1 christos #define FPSWBITS_EZ 0x00001000
140 1.1 christos #define FPSWBITS_EU 0x00002000
141 1.1 christos #define FPSWBITS_EX 0x00004000
142 1.1 christos #define FPSW_EFSH 16
143 1.1 christos #define FPSW_CFSH 24
144 1.1 christos #define FPSWBITS_FV 0x04000000
145 1.1 christos #define FPSWBITS_FO 0x08000000
146 1.1 christos #define FPSWBITS_FZ 0x10000000
147 1.1 christos #define FPSWBITS_FU 0x20000000
148 1.1 christos #define FPSWBITS_FX 0x40000000
149 1.1 christos #define FPSWBITS_FSUM 0x80000000
150 1.1 christos #define FPSWBITS_FMASK 0x7c000000
151 1.1 christos #define FPSWBITS_CLEAR 0xffffff03 /* masked at start of any FP opcode */
152 1.1 christos
153 1.1 christos #define FPRM_NEAREST 0
154 1.1 christos #define FPRM_ZERO 1
155 1.1 christos #define FPRM_PINF 2
156 1.1 christos #define FPRM_NINF 3
157 1.1 christos
158 1.1 christos extern char *reg_names[];
159 1.1 christos
160 1.1 christos extern int rx_flagmask;
161 1.1 christos extern int rx_flagand;
162 1.1 christos extern int rx_flagor;
163 1.1 christos
164 1.1 christos extern unsigned int b2mask[];
165 1.1 christos extern unsigned int b2signbit[];
166 1.1 christos extern int b2maxsigned[];
167 1.1 christos extern int b2minsigned[];
168 1.1 christos
169 1.1 christos void init_regs (void);
170 1.1 christos void stack_heap_stats (void);
171 1.1 christos void set_pointer_width (int bytes);
172 1.1 christos unsigned int get_reg (int id);
173 1.1 christos unsigned long long get_reg64 (int id);
174 1.1 christos void put_reg (int id, unsigned int value);
175 1.1 christos void put_reg64 (int id, unsigned long long value);
176 1.1 christos
177 1.1 christos void set_flags (int mask, int newbits);
178 1.1 christos void set_oszc (long long value, int bytes, int c);
179 1.1 christos void set_szc (long long value, int bytes, int c);
180 1.1 christos void set_osz (long long value, int bytes);
181 1.1 christos void set_sz (long long value, int bytes);
182 1.1 christos void set_zc (int z, int c);
183 1.1 christos void set_c (int c);
184 1.1 christos
185 1.1 christos const char *bits (int v, int b);
186 1.1 christos
187 1.1 christos int condition_true (int cond_id);
188 1.1 christos
189 1.1 christos #define FLAG(f) ((regs.r_psw & f) ? 1 : 0)
190 1.1 christos #define FLAG_C FLAG(FLAGBIT_C)
191 1.1 christos #define FLAG_D FLAG(FLAGBIT_D)
192 1.1 christos #define FLAG_Z FLAG(FLAGBIT_Z)
193 1.1 christos #define FLAG_S FLAG(FLAGBIT_S)
194 1.1 christos #define FLAG_B FLAG(FLAGBIT_B)
195 1.1 christos #define FLAG_O FLAG(FLAGBIT_O)
196 1.1 christos #define FLAG_I FLAG(FLAGBIT_I)
197 1.1 christos #define FLAG_U FLAG(FLAGBIT_U)
198 1.1 christos #define FLAG_PM FLAG(FLAGBIT_PM)
199 1.1 christos
200 1.1 christos /* Instruction step return codes.
201 1.1 christos Suppose one of the decode_* functions below returns a value R:
202 1.1 christos - If RX_STEPPED (R), then the single-step completed normally.
203 1.1 christos - If RX_HIT_BREAK (R), then the program hit a breakpoint.
204 1.1 christos - If RX_EXITED (R), then the program has done an 'exit' system
205 1.1 christos call, and the exit code is RX_EXIT_STATUS (R).
206 1.1 christos - If RX_STOPPED (R), then a signal (number RX_STOP_SIG (R)) was
207 1.1 christos generated.
208 1.1 christos
209 1.1 christos For building step return codes:
210 1.1 christos - RX_MAKE_STEPPED is the return code for finishing a normal step.
211 1.1 christos - RX_MAKE_HIT_BREAK is the return code for hitting a breakpoint.
212 1.1 christos - RX_MAKE_EXITED (C) is the return code for exiting with status C.
213 1.1 christos - RX_MAKE_STOPPED (S) is the return code for stopping on signal S. */
214 1.1 christos #define RX_MAKE_STEPPED() (1)
215 1.1 christos #define RX_MAKE_HIT_BREAK() (2)
216 1.1 christos #define RX_MAKE_EXITED(c) (((int) (c) << 8) + 3)
217 1.1 christos #define RX_MAKE_STOPPED(s) (((int) (s) << 8) + 4)
218 1.1 christos
219 1.1 christos #define RX_STEPPED(r) ((r) == RX_MAKE_STEPPED ())
220 1.1 christos #define RX_HIT_BREAK(r) ((r) == RX_MAKE_HIT_BREAK ())
221 1.1 christos #define RX_EXITED(r) (((r) & 0xff) == 3)
222 1.1 christos #define RX_EXIT_STATUS(r) ((r) >> 8)
223 1.1 christos #define RX_STOPPED(r) (((r) & 0xff) == 4)
224 1.1 christos #define RX_STOP_SIG(r) ((r) >> 8)
225 1.1 christos
226 1.1 christos /* The step result for the current step. Global to allow
227 1.1 christos communication between the stepping function and the system
228 1.1 christos calls. */
229 1.1 christos extern int step_result;
230 1.1 christos
231 1.1 christos extern unsigned int rx_cycles;
232 1.1 christos
233 1.1 christos /* Used to detect heap/stack collisions. */
234 1.1 christos extern unsigned int heaptop;
235 1.1 christos extern unsigned int heapbottom;
236 1.1 christos
237 1.1 christos extern int decode_opcode (void);
238 1.1 christos extern void reset_decoder (void);
239 1.1 christos extern void reset_pipeline_stats (void);
240 1.1 christos extern void halt_pipeline_stats (void);
241 1.1 christos extern void pipeline_stats (void);
242 1.1 christos
243 1.1 christos extern void trace_register_changes ();
244 1.1 christos extern void generate_access_exception (void);
245 1.1 christos extern jmp_buf decode_jmp_buf;
246