1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#ifndef CPU_CRIS_H
21#define CPU_CRIS_H
22
23#include "config.h"
24#include "qemu-common.h"
25
26#define TARGET_LONG_BITS 32
27
28#define CPUArchState struct CPUCRISState
29
30#include "cpu-defs.h"
31
32#define TARGET_HAS_ICE 1
33
34#define ELF_MACHINE EM_CRIS
35
36#define EXCP_NMI 1
37#define EXCP_GURU 2
38#define EXCP_BUSFAULT 3
39#define EXCP_IRQ 4
40#define EXCP_BREAK 5
41
42
43#define CPU_INTERRUPT_NMI CPU_INTERRUPT_TGT_EXT_3
44
45
46#define R_FP 8
47#define R_SP 14
48#define R_ACR 15
49
50
51#define PR_BZ 0
52#define PR_VR 1
53#define PR_PID 2
54#define PR_SRS 3
55#define PR_WZ 4
56#define PR_EXS 5
57#define PR_EDA 6
58#define PR_PREFIX 6
59#define PR_MOF 7
60#define PR_DZ 8
61#define PR_EBP 9
62#define PR_ERP 10
63#define PR_SRP 11
64#define PR_NRP 12
65#define PR_CCS 13
66#define PR_USP 14
67#define PRV10_BRP 14
68#define PR_SPC 15
69
70
71#define Q_FLAG 0x80000000
72#define M_FLAG_V32 0x40000000
73#define PFIX_FLAG 0x800
74#define F_FLAG_V10 0x400
75#define P_FLAG_V10 0x200
76#define S_FLAG 0x200
77#define R_FLAG 0x100
78#define P_FLAG 0x80
79#define M_FLAG_V10 0x80
80#define U_FLAG 0x40
81#define I_FLAG 0x20
82#define X_FLAG 0x10
83#define N_FLAG 0x08
84#define Z_FLAG 0x04
85#define V_FLAG 0x02
86#define C_FLAG 0x01
87#define ALU_FLAGS 0x1F
88
89
90#define CC_CC 0
91#define CC_CS 1
92#define CC_NE 2
93#define CC_EQ 3
94#define CC_VC 4
95#define CC_VS 5
96#define CC_PL 6
97#define CC_MI 7
98#define CC_LS 8
99#define CC_HI 9
100#define CC_GE 10
101#define CC_LT 11
102#define CC_GT 12
103#define CC_LE 13
104#define CC_A 14
105#define CC_P 15
106
107#define NB_MMU_MODES 2
108
109typedef struct CPUCRISState {
110 uint32_t regs[16];
111
112 uint32_t pregs[16];
113
114
115 uint32_t pc;
116
117
118 uint32_t ksp;
119
120
121 int dslot;
122 int btaken;
123 uint32_t btarget;
124
125
126 uint32_t cc_op;
127 uint32_t cc_mask;
128 uint32_t cc_dest;
129 uint32_t cc_src;
130 uint32_t cc_result;
131
132 int cc_size;
133
134 int cc_x;
135
136
137 int locked_irq;
138 int interrupt_vector;
139 int fault_vector;
140 int trap_vector;
141
142
143
144
145
146
147
148
149 uint32_t sregs[4][16];
150
151
152
153
154 uint32_t mmu_rand_lfsr;
155
156
157
158
159
160
161
162 struct
163 {
164 uint32_t hi;
165 uint32_t lo;
166 } tlbsets[2][4][16];
167
168 CPU_COMMON
169
170
171 void *load_info;
172} CPUCRISState;
173
174#include "cpu-qom.h"
175
176CRISCPU *cpu_cris_init(const char *cpu_model);
177int cpu_cris_exec(CPUCRISState *s);
178void cpu_cris_close(CPUCRISState *s);
179void do_interrupt(CPUCRISState *env);
180
181
182
183int cpu_cris_signal_handler(int host_signum, void *pinfo,
184 void *puc);
185
186enum {
187 CC_OP_DYNAMIC,
188 CC_OP_FLAGS,
189 CC_OP_CMP,
190 CC_OP_MOVE,
191 CC_OP_ADD,
192 CC_OP_ADDC,
193 CC_OP_MCP,
194 CC_OP_ADDU,
195 CC_OP_SUB,
196 CC_OP_SUBU,
197 CC_OP_NEG,
198 CC_OP_BTST,
199 CC_OP_MULS,
200 CC_OP_MULU,
201 CC_OP_DSTEP,
202 CC_OP_MSTEP,
203 CC_OP_BOUND,
204
205 CC_OP_OR,
206 CC_OP_AND,
207 CC_OP_XOR,
208 CC_OP_LSL,
209 CC_OP_LSR,
210 CC_OP_ASR,
211 CC_OP_LZ
212};
213
214
215#define TARGET_PAGE_BITS 13
216#define MMAP_SHIFT TARGET_PAGE_BITS
217
218#define TARGET_PHYS_ADDR_SPACE_BITS 32
219#define TARGET_VIRT_ADDR_SPACE_BITS 32
220
221static inline CPUCRISState *cpu_init(const char *cpu_model)
222{
223 CRISCPU *cpu = cpu_cris_init(cpu_model);
224 if (cpu == NULL) {
225 return NULL;
226 }
227 return &cpu->env;
228}
229
230#define cpu_exec cpu_cris_exec
231#define cpu_gen_code cpu_cris_gen_code
232#define cpu_signal_handler cpu_cris_signal_handler
233
234#define CPU_SAVE_VERSION 1
235
236
237#define MMU_MODE0_SUFFIX _kernel
238#define MMU_MODE1_SUFFIX _user
239#define MMU_USER_IDX 1
240static inline int cpu_mmu_index (CPUCRISState *env)
241{
242 return !!(env->pregs[PR_CCS] & U_FLAG);
243}
244
245int cpu_cris_handle_mmu_fault(CPUCRISState *env, target_ulong address, int rw,
246 int mmu_idx);
247#define cpu_handle_mmu_fault cpu_cris_handle_mmu_fault
248
249#if defined(CONFIG_USER_ONLY)
250static inline void cpu_clone_regs(CPUCRISState *env, target_ulong newsp)
251{
252 if (newsp)
253 env->regs[14] = newsp;
254 env->regs[10] = 0;
255}
256#endif
257
258static inline void cpu_set_tls(CPUCRISState *env, target_ulong newtls)
259{
260 env->pregs[PR_PID] = (env->pregs[PR_PID] & 0xff) | newtls;
261}
262
263
264#define SFR_RW_GC_CFG 0][0
265#define SFR_RW_MM_CFG env->pregs[PR_SRS]][0
266#define SFR_RW_MM_KBASE_LO env->pregs[PR_SRS]][1
267#define SFR_RW_MM_KBASE_HI env->pregs[PR_SRS]][2
268#define SFR_R_MM_CAUSE env->pregs[PR_SRS]][3
269#define SFR_RW_MM_TLB_SEL env->pregs[PR_SRS]][4
270#define SFR_RW_MM_TLB_LO env->pregs[PR_SRS]][5
271#define SFR_RW_MM_TLB_HI env->pregs[PR_SRS]][6
272
273#include "cpu-all.h"
274
275static inline void cpu_get_tb_cpu_state(CPUCRISState *env, target_ulong *pc,
276 target_ulong *cs_base, int *flags)
277{
278 *pc = env->pc;
279 *cs_base = 0;
280 *flags = env->dslot |
281 (env->pregs[PR_CCS] & (S_FLAG | P_FLAG | U_FLAG
282 | X_FLAG | PFIX_FLAG));
283}
284
285#define cpu_list cris_cpu_list
286void cris_cpu_list(FILE *f, fprintf_function cpu_fprintf);
287
288static inline bool cpu_has_work(CPUState *cpu)
289{
290 CPUCRISState *env = &CRIS_CPU(cpu)->env;
291
292 return env->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
293}
294
295#include "exec-all.h"
296
297static inline void cpu_pc_from_tb(CPUCRISState *env, TranslationBlock *tb)
298{
299 env->pc = tb->pc;
300}
301#endif
302