1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#ifndef CPU_M68K_H
21#define CPU_M68K_H
22
23#define TARGET_LONG_BITS 32
24
25#define CPUArchState struct CPUM68KState
26
27#include "qemu-common.h"
28#include "exec/cpu-defs.h"
29
30#include "fpu/softfloat.h"
31
32#define MAX_QREGS 32
33
34#define EXCP_ACCESS 2
35#define EXCP_ADDRESS 3
36#define EXCP_ILLEGAL 4
37#define EXCP_DIV0 5
38#define EXCP_PRIVILEGE 8
39#define EXCP_TRACE 9
40#define EXCP_LINEA 10
41#define EXCP_LINEF 11
42#define EXCP_DEBUGNBP 12
43#define EXCP_DEBEGBP 13
44#define EXCP_FORMAT 14
45#define EXCP_UNINITIALIZED 15
46#define EXCP_TRAP0 32
47#define EXCP_TRAP15 47
48#define EXCP_UNSUPPORTED 61
49#define EXCP_ICE 13
50
51#define EXCP_RTE 0x100
52#define EXCP_HALT_INSN 0x101
53
54#define NB_MMU_MODES 2
55
56typedef struct CPUM68KState {
57 uint32_t dregs[8];
58 uint32_t aregs[8];
59 uint32_t pc;
60 uint32_t sr;
61
62
63 int current_sp;
64 uint32_t sp[2];
65
66
67 uint32_t cc_op;
68 uint32_t cc_dest;
69 uint32_t cc_src;
70 uint32_t cc_x;
71
72 float64 fregs[8];
73 float64 fp_result;
74 uint32_t fpcr;
75 uint32_t fpsr;
76 float_status fp_status;
77
78 uint64_t mactmp;
79
80
81
82 uint64_t macc[4];
83 uint32_t macsr;
84 uint32_t mac_mask;
85
86
87 uint32_t div1;
88 uint32_t div2;
89
90
91 struct {
92 uint32_t ar;
93 } mmu;
94
95
96 uint32_t vbr;
97 uint32_t mbar;
98 uint32_t rambar0;
99 uint32_t cacr;
100
101 int pending_vector;
102 int pending_level;
103
104 uint32_t qregs[MAX_QREGS];
105
106 CPU_COMMON
107
108
109 uint32_t features;
110} CPUM68KState;
111
112#include "cpu-qom.h"
113
114void m68k_tcg_init(void);
115void m68k_cpu_init_gdb(M68kCPU *cpu);
116M68kCPU *cpu_m68k_init(const char *cpu_model);
117int cpu_m68k_exec(CPUState *cpu);
118
119
120
121int cpu_m68k_signal_handler(int host_signum, void *pinfo,
122 void *puc);
123void cpu_m68k_flush_flags(CPUM68KState *, int);
124
125enum {
126 CC_OP_DYNAMIC,
127 CC_OP_FLAGS,
128 CC_OP_LOGIC,
129 CC_OP_ADD,
130 CC_OP_SUB,
131 CC_OP_CMPB,
132 CC_OP_CMPW,
133 CC_OP_ADDX,
134 CC_OP_SUBX,
135 CC_OP_SHIFT,
136};
137
138#define CCF_C 0x01
139#define CCF_V 0x02
140#define CCF_Z 0x04
141#define CCF_N 0x08
142#define CCF_X 0x10
143
144#define SR_I_SHIFT 8
145#define SR_I 0x0700
146#define SR_M 0x1000
147#define SR_S 0x2000
148#define SR_T 0x8000
149
150#define M68K_SSP 0
151#define M68K_USP 1
152
153
154#define M68K_CACR_EUSP 0x10
155
156#define MACSR_PAV0 0x100
157#define MACSR_OMC 0x080
158#define MACSR_SU 0x040
159#define MACSR_FI 0x020
160#define MACSR_RT 0x010
161#define MACSR_N 0x008
162#define MACSR_Z 0x004
163#define MACSR_V 0x002
164#define MACSR_EV 0x001
165
166void m68k_set_irq_level(M68kCPU *cpu, int level, uint8_t vector);
167void m68k_set_macsr(CPUM68KState *env, uint32_t val);
168void m68k_switch_sp(CPUM68KState *env);
169
170#define M68K_FPCR_PREC (1 << 6)
171
172void do_m68k_semihosting(CPUM68KState *env, int nr);
173
174
175
176
177
178enum m68k_features {
179 M68K_FEATURE_CF_ISA_A,
180 M68K_FEATURE_CF_ISA_B,
181 M68K_FEATURE_CF_ISA_APLUSC,
182 M68K_FEATURE_BRAL,
183 M68K_FEATURE_CF_FPU,
184 M68K_FEATURE_CF_MAC,
185 M68K_FEATURE_CF_EMAC,
186 M68K_FEATURE_CF_EMAC_B,
187 M68K_FEATURE_USP,
188 M68K_FEATURE_EXT_FULL,
189 M68K_FEATURE_WORD_INDEX
190};
191
192static inline int m68k_feature(CPUM68KState *env, int feature)
193{
194 return (env->features & (1u << feature)) != 0;
195}
196
197void m68k_cpu_list(FILE *f, fprintf_function cpu_fprintf);
198
199void register_m68k_insns (CPUM68KState *env);
200
201#ifdef CONFIG_USER_ONLY
202
203#define TARGET_PAGE_BITS 13
204#else
205
206#define TARGET_PAGE_BITS 10
207#endif
208
209#define TARGET_PHYS_ADDR_SPACE_BITS 32
210#define TARGET_VIRT_ADDR_SPACE_BITS 32
211
212#define cpu_init(cpu_model) CPU(cpu_m68k_init(cpu_model))
213
214#define cpu_exec cpu_m68k_exec
215#define cpu_signal_handler cpu_m68k_signal_handler
216#define cpu_list m68k_cpu_list
217
218
219#define MMU_MODE0_SUFFIX _kernel
220#define MMU_MODE1_SUFFIX _user
221#define MMU_USER_IDX 1
222static inline int cpu_mmu_index (CPUM68KState *env, bool ifetch)
223{
224 return (env->sr & SR_S) == 0 ? 1 : 0;
225}
226
227int m68k_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw,
228 int mmu_idx);
229
230#include "exec/cpu-all.h"
231
232static inline void cpu_get_tb_cpu_state(CPUM68KState *env, target_ulong *pc,
233 target_ulong *cs_base, int *flags)
234{
235 *pc = env->pc;
236 *cs_base = 0;
237 *flags = (env->fpcr & M68K_FPCR_PREC)
238 | (env->sr & SR_S)
239 | ((env->macsr >> 4) & 0xf);
240}
241
242#include "exec/exec-all.h"
243
244#endif
245