1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#ifndef M68K_CPU_H
22#define M68K_CPU_H
23
24#define TARGET_LONG_BITS 32
25
26#define CPUArchState struct CPUM68KState
27
28#include "qemu-common.h"
29#include "exec/cpu-defs.h"
30#include "cpu-qom.h"
31#include "fpu/softfloat.h"
32
33#define OS_BYTE 0
34#define OS_WORD 1
35#define OS_LONG 2
36#define OS_SINGLE 3
37#define OS_DOUBLE 4
38#define OS_EXTENDED 5
39#define OS_PACKED 6
40#define OS_UNSIZED 7
41
42#define MAX_QREGS 32
43
44#define EXCP_ACCESS 2
45#define EXCP_ADDRESS 3
46#define EXCP_ILLEGAL 4
47#define EXCP_DIV0 5
48#define EXCP_PRIVILEGE 8
49#define EXCP_TRACE 9
50#define EXCP_LINEA 10
51#define EXCP_LINEF 11
52#define EXCP_DEBUGNBP 12
53#define EXCP_DEBEGBP 13
54#define EXCP_FORMAT 14
55#define EXCP_UNINITIALIZED 15
56#define EXCP_TRAP0 32
57#define EXCP_TRAP15 47
58#define EXCP_FP_BSUN 48
59#define EXCP_FP_INEX 49
60#define EXCP_FP_DZ 50
61#define EXCP_FP_UNFL 51
62#define EXCP_FP_OPERR 52
63#define EXCP_FP_OVFL 53
64#define EXCP_FP_SNAN 54
65#define EXCP_FP_UNIMP 55
66#define EXCP_UNSUPPORTED 61
67
68#define EXCP_RTE 0x100
69#define EXCP_HALT_INSN 0x101
70
71#define NB_MMU_MODES 2
72#define TARGET_INSN_START_EXTRA_WORDS 1
73
74typedef CPU_LDoubleU FPReg;
75
76typedef struct CPUM68KState {
77 uint32_t dregs[8];
78 uint32_t aregs[8];
79 uint32_t pc;
80 uint32_t sr;
81
82
83 int current_sp;
84 uint32_t sp[2];
85
86
87 uint32_t cc_op;
88 uint32_t cc_x;
89 uint32_t cc_n;
90 uint32_t cc_v;
91 uint32_t cc_c;
92 uint32_t cc_z;
93
94 FPReg fregs[8];
95 FPReg fp_result;
96 uint32_t fpcr;
97 uint32_t fpsr;
98 float_status fp_status;
99
100 uint64_t mactmp;
101
102
103
104 uint64_t macc[4];
105 uint32_t macsr;
106 uint32_t mac_mask;
107
108
109 struct {
110 uint32_t ar;
111 } mmu;
112
113
114 uint32_t vbr;
115 uint32_t mbar;
116 uint32_t rambar0;
117 uint32_t cacr;
118
119 int pending_vector;
120 int pending_level;
121
122 uint32_t qregs[MAX_QREGS];
123
124
125 struct {} end_reset_fields;
126
127 CPU_COMMON
128
129
130 uint32_t features;
131} CPUM68KState;
132
133
134
135
136
137
138
139struct M68kCPU {
140
141 CPUState parent_obj;
142
143
144 CPUM68KState env;
145};
146
147static inline M68kCPU *m68k_env_get_cpu(CPUM68KState *env)
148{
149 return container_of(env, M68kCPU, env);
150}
151
152#define ENV_GET_CPU(e) CPU(m68k_env_get_cpu(e))
153
154#define ENV_OFFSET offsetof(M68kCPU, env)
155
156void m68k_cpu_do_interrupt(CPUState *cpu);
157bool m68k_cpu_exec_interrupt(CPUState *cpu, int int_req);
158void m68k_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
159 int flags);
160hwaddr m68k_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
161int m68k_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
162int m68k_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
163
164void m68k_tcg_init(void);
165void m68k_cpu_init_gdb(M68kCPU *cpu);
166M68kCPU *cpu_m68k_init(const char *cpu_model);
167
168
169
170int cpu_m68k_signal_handler(int host_signum, void *pinfo,
171 void *puc);
172uint32_t cpu_m68k_get_ccr(CPUM68KState *env);
173void cpu_m68k_set_ccr(CPUM68KState *env, uint32_t);
174void cpu_m68k_set_fpcr(CPUM68KState *env, uint32_t val);
175
176
177
178
179
180
181
182
183
184typedef enum {
185
186 CC_OP_DYNAMIC = -1,
187
188
189 CC_OP_FLAGS,
190
191
192 CC_OP_ADDB, CC_OP_ADDW, CC_OP_ADDL,
193 CC_OP_SUBB, CC_OP_SUBW, CC_OP_SUBL,
194
195
196 CC_OP_CMPB, CC_OP_CMPW, CC_OP_CMPL,
197
198
199 CC_OP_LOGIC,
200
201 CC_OP_NB
202} CCOp;
203
204#define CCF_C 0x01
205#define CCF_V 0x02
206#define CCF_Z 0x04
207#define CCF_N 0x08
208#define CCF_X 0x10
209
210#define SR_I_SHIFT 8
211#define SR_I 0x0700
212#define SR_M 0x1000
213#define SR_S 0x2000
214#define SR_T 0x8000
215
216#define M68K_SSP 0
217#define M68K_USP 1
218
219#define M68K_FPIAR_SHIFT 0
220#define M68K_FPIAR (1 << M68K_FPIAR_SHIFT)
221#define M68K_FPSR_SHIFT 1
222#define M68K_FPSR (1 << M68K_FPSR_SHIFT)
223#define M68K_FPCR_SHIFT 2
224#define M68K_FPCR (1 << M68K_FPCR_SHIFT)
225
226
227
228
229#define FPSR_CC_MASK 0x0f000000
230#define FPSR_CC_A 0x01000000
231#define FPSR_CC_I 0x02000000
232#define FPSR_CC_Z 0x04000000
233#define FPSR_CC_N 0x08000000
234
235
236
237#define FPSR_QT_MASK 0x00ff0000
238
239
240
241#define FPCR_RND_MASK 0x0030
242#define FPCR_RND_N 0x0000
243#define FPCR_RND_Z 0x0010
244#define FPCR_RND_M 0x0020
245#define FPCR_RND_P 0x0030
246
247
248#define FPCR_PREC_MASK 0x00c0
249#define FPCR_PREC_X 0x0000
250#define FPCR_PREC_S 0x0040
251#define FPCR_PREC_D 0x0080
252#define FPCR_PREC_U 0x00c0
253
254#define FPCR_EXCP_MASK 0xff00
255
256
257#define M68K_CACR_EUSP 0x10
258
259#define MACSR_PAV0 0x100
260#define MACSR_OMC 0x080
261#define MACSR_SU 0x040
262#define MACSR_FI 0x020
263#define MACSR_RT 0x010
264#define MACSR_N 0x008
265#define MACSR_Z 0x004
266#define MACSR_V 0x002
267#define MACSR_EV 0x001
268
269void m68k_set_irq_level(M68kCPU *cpu, int level, uint8_t vector);
270void m68k_switch_sp(CPUM68KState *env);
271
272void do_m68k_semihosting(CPUM68KState *env, int nr);
273
274
275
276
277
278enum m68k_features {
279 M68K_FEATURE_M68000,
280 M68K_FEATURE_CF_ISA_A,
281 M68K_FEATURE_CF_ISA_B,
282 M68K_FEATURE_CF_ISA_APLUSC,
283 M68K_FEATURE_BRAL,
284 M68K_FEATURE_CF_FPU,
285 M68K_FEATURE_CF_MAC,
286 M68K_FEATURE_CF_EMAC,
287 M68K_FEATURE_CF_EMAC_B,
288 M68K_FEATURE_USP,
289 M68K_FEATURE_EXT_FULL,
290 M68K_FEATURE_WORD_INDEX,
291 M68K_FEATURE_SCALED_INDEX,
292 M68K_FEATURE_LONG_MULDIV,
293 M68K_FEATURE_QUAD_MULDIV,
294 M68K_FEATURE_BCCL,
295 M68K_FEATURE_BITFIELD,
296 M68K_FEATURE_FPU,
297 M68K_FEATURE_CAS,
298 M68K_FEATURE_BKPT,
299 M68K_FEATURE_RTD,
300};
301
302static inline int m68k_feature(CPUM68KState *env, int feature)
303{
304 return (env->features & (1u << feature)) != 0;
305}
306
307void m68k_cpu_list(FILE *f, fprintf_function cpu_fprintf);
308
309void register_m68k_insns (CPUM68KState *env);
310
311#ifdef CONFIG_USER_ONLY
312
313
314
315
316#define TARGET_PAGE_BITS 12
317#else
318
319#define TARGET_PAGE_BITS 10
320#endif
321
322#define TARGET_PHYS_ADDR_SPACE_BITS 32
323#define TARGET_VIRT_ADDR_SPACE_BITS 32
324
325#define cpu_init(cpu_model) CPU(cpu_m68k_init(cpu_model))
326
327#define cpu_signal_handler cpu_m68k_signal_handler
328#define cpu_list m68k_cpu_list
329
330
331#define MMU_MODE0_SUFFIX _kernel
332#define MMU_MODE1_SUFFIX _user
333#define MMU_USER_IDX 1
334static inline int cpu_mmu_index (CPUM68KState *env, bool ifetch)
335{
336 return (env->sr & SR_S) == 0 ? 1 : 0;
337}
338
339int m68k_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw,
340 int mmu_idx);
341
342#include "exec/cpu-all.h"
343
344static inline void cpu_get_tb_cpu_state(CPUM68KState *env, target_ulong *pc,
345 target_ulong *cs_base, uint32_t *flags)
346{
347 *pc = env->pc;
348 *cs_base = 0;
349 *flags = (env->sr & SR_S)
350 | ((env->macsr >> 4) & 0xf);
351}
352
353#endif
354