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
41#define MAX_QREGS 32
42
43#define EXCP_ACCESS 2
44#define EXCP_ADDRESS 3
45#define EXCP_ILLEGAL 4
46#define EXCP_DIV0 5
47#define EXCP_PRIVILEGE 8
48#define EXCP_TRACE 9
49#define EXCP_LINEA 10
50#define EXCP_LINEF 11
51#define EXCP_DEBUGNBP 12
52#define EXCP_DEBEGBP 13
53#define EXCP_FORMAT 14
54#define EXCP_UNINITIALIZED 15
55#define EXCP_TRAP0 32
56#define EXCP_TRAP15 47
57#define EXCP_UNSUPPORTED 61
58#define EXCP_ICE 13
59
60#define EXCP_RTE 0x100
61#define EXCP_HALT_INSN 0x101
62
63#define NB_MMU_MODES 2
64#define TARGET_INSN_START_EXTRA_WORDS 1
65
66typedef struct CPUM68KState {
67 uint32_t dregs[8];
68 uint32_t aregs[8];
69 uint32_t pc;
70 uint32_t sr;
71
72
73 int current_sp;
74 uint32_t sp[2];
75
76
77 uint32_t cc_op;
78 uint32_t cc_x;
79 uint32_t cc_n;
80 uint32_t cc_v;
81 uint32_t cc_c;
82 uint32_t cc_z;
83
84 float64 fregs[8];
85 float64 fp_result;
86 uint32_t fpcr;
87 uint32_t fpsr;
88 float_status fp_status;
89
90 uint64_t mactmp;
91
92
93
94 uint64_t macc[4];
95 uint32_t macsr;
96 uint32_t mac_mask;
97
98
99 uint32_t div1;
100 uint32_t div2;
101
102
103 struct {
104 uint32_t ar;
105 } mmu;
106
107
108 uint32_t vbr;
109 uint32_t mbar;
110 uint32_t rambar0;
111 uint32_t cacr;
112
113 int pending_vector;
114 int pending_level;
115
116 uint32_t qregs[MAX_QREGS];
117
118 CPU_COMMON
119
120
121 uint32_t features;
122} CPUM68KState;
123
124
125
126
127
128
129
130struct M68kCPU {
131
132 CPUState parent_obj;
133
134
135 CPUM68KState env;
136};
137
138static inline M68kCPU *m68k_env_get_cpu(CPUM68KState *env)
139{
140 return container_of(env, M68kCPU, env);
141}
142
143#define ENV_GET_CPU(e) CPU(m68k_env_get_cpu(e))
144
145#define ENV_OFFSET offsetof(M68kCPU, env)
146
147void m68k_cpu_do_interrupt(CPUState *cpu);
148bool m68k_cpu_exec_interrupt(CPUState *cpu, int int_req);
149void m68k_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
150 int flags);
151hwaddr m68k_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
152int m68k_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
153int m68k_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
154
155void m68k_tcg_init(void);
156void m68k_cpu_init_gdb(M68kCPU *cpu);
157M68kCPU *cpu_m68k_init(const char *cpu_model);
158
159
160
161int cpu_m68k_signal_handler(int host_signum, void *pinfo,
162 void *puc);
163uint32_t cpu_m68k_get_ccr(CPUM68KState *env);
164void cpu_m68k_set_ccr(CPUM68KState *env, uint32_t);
165
166
167
168
169
170
171
172
173
174typedef enum {
175
176 CC_OP_DYNAMIC = -1,
177
178
179 CC_OP_FLAGS,
180
181
182 CC_OP_ADDB, CC_OP_ADDW, CC_OP_ADDL,
183 CC_OP_SUBB, CC_OP_SUBW, CC_OP_SUBL,
184
185
186 CC_OP_CMPB, CC_OP_CMPW, CC_OP_CMPL,
187
188
189 CC_OP_LOGIC,
190
191 CC_OP_NB
192} CCOp;
193
194#define CCF_C 0x01
195#define CCF_V 0x02
196#define CCF_Z 0x04
197#define CCF_N 0x08
198#define CCF_X 0x10
199
200#define SR_I_SHIFT 8
201#define SR_I 0x0700
202#define SR_M 0x1000
203#define SR_S 0x2000
204#define SR_T 0x8000
205
206#define M68K_SSP 0
207#define M68K_USP 1
208
209
210#define M68K_CACR_EUSP 0x10
211
212#define MACSR_PAV0 0x100
213#define MACSR_OMC 0x080
214#define MACSR_SU 0x040
215#define MACSR_FI 0x020
216#define MACSR_RT 0x010
217#define MACSR_N 0x008
218#define MACSR_Z 0x004
219#define MACSR_V 0x002
220#define MACSR_EV 0x001
221
222void m68k_set_irq_level(M68kCPU *cpu, int level, uint8_t vector);
223void m68k_switch_sp(CPUM68KState *env);
224
225#define M68K_FPCR_PREC (1 << 6)
226
227void do_m68k_semihosting(CPUM68KState *env, int nr);
228
229
230
231
232
233enum m68k_features {
234 M68K_FEATURE_M68000,
235 M68K_FEATURE_CF_ISA_A,
236 M68K_FEATURE_CF_ISA_B,
237 M68K_FEATURE_CF_ISA_APLUSC,
238 M68K_FEATURE_BRAL,
239 M68K_FEATURE_CF_FPU,
240 M68K_FEATURE_CF_MAC,
241 M68K_FEATURE_CF_EMAC,
242 M68K_FEATURE_CF_EMAC_B,
243 M68K_FEATURE_USP,
244 M68K_FEATURE_EXT_FULL,
245 M68K_FEATURE_WORD_INDEX,
246 M68K_FEATURE_SCALED_INDEX,
247 M68K_FEATURE_LONG_MULDIV,
248 M68K_FEATURE_QUAD_MULDIV,
249 M68K_FEATURE_BCCL,
250 M68K_FEATURE_BITFIELD,
251 M68K_FEATURE_FPU,
252 M68K_FEATURE_CAS,
253 M68K_FEATURE_BKPT,
254};
255
256static inline int m68k_feature(CPUM68KState *env, int feature)
257{
258 return (env->features & (1u << feature)) != 0;
259}
260
261void m68k_cpu_list(FILE *f, fprintf_function cpu_fprintf);
262
263void register_m68k_insns (CPUM68KState *env);
264
265#ifdef CONFIG_USER_ONLY
266
267
268
269
270#define TARGET_PAGE_BITS 12
271#else
272
273#define TARGET_PAGE_BITS 10
274#endif
275
276#define TARGET_PHYS_ADDR_SPACE_BITS 32
277#define TARGET_VIRT_ADDR_SPACE_BITS 32
278
279#define cpu_init(cpu_model) CPU(cpu_m68k_init(cpu_model))
280
281#define cpu_signal_handler cpu_m68k_signal_handler
282#define cpu_list m68k_cpu_list
283
284
285#define MMU_MODE0_SUFFIX _kernel
286#define MMU_MODE1_SUFFIX _user
287#define MMU_USER_IDX 1
288static inline int cpu_mmu_index (CPUM68KState *env, bool ifetch)
289{
290 return (env->sr & SR_S) == 0 ? 1 : 0;
291}
292
293int m68k_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw,
294 int mmu_idx);
295
296#include "exec/cpu-all.h"
297
298static inline void cpu_get_tb_cpu_state(CPUM68KState *env, target_ulong *pc,
299 target_ulong *cs_base, uint32_t *flags)
300{
301 *pc = env->pc;
302 *cs_base = 0;
303 *flags = (env->fpcr & M68K_FPCR_PREC)
304 | (env->sr & SR_S)
305 | ((env->macsr >> 4) & 0xf);
306}
307
308#endif
309