00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef CPU_M68K_H
00022 #define CPU_M68K_H
00023
00024 #define TARGET_LONG_BITS 32
00025
00026 #include "cpu-defs.h"
00027
00028 #include "softfloat.h"
00029
00030 #define MAX_QREGS 32
00031
00032 #define TARGET_HAS_ICE 1
00033
00034 #define ELF_MACHINE EM_68K
00035
00036 #define EXCP_ACCESS 2
00037 #define EXCP_ADDRESS 3
00038 #define EXCP_ILLEGAL 4
00039 #define EXCP_DIV0 5
00040 #define EXCP_PRIVILEGE 8
00041 #define EXCP_TRACE 9
00042 #define EXCP_LINEA 10
00043 #define EXCP_LINEF 11
00044 #define EXCP_DEBUGNBP 12
00045 #define EXCP_DEBEGBP 13
00046 #define EXCP_FORMAT 14
00047 #define EXCP_UNINITIALIZED 15
00048 #define EXCP_TRAP0 32
00049 #define EXCP_TRAP15 47
00050 #define EXCP_UNSUPPORTED 61
00051 #define EXCP_ICE 13
00052
00053 #define EXCP_RTE 0x100
00054 #define EXCP_HALT_INSN 0x101
00055
00056 #define NB_MMU_MODES 2
00057
00058 typedef struct CPUM68KState {
00059 uint32_t dregs[8];
00060 uint32_t aregs[8];
00061 uint32_t pc;
00062 uint32_t sr;
00063
00064
00065 int current_sp;
00066 uint32_t sp[2];
00067
00068
00069 uint32_t cc_op;
00070 uint32_t cc_dest;
00071 uint32_t cc_src;
00072 uint32_t cc_x;
00073
00074 float64 fregs[8];
00075 float64 fp_result;
00076 uint32_t fpcr;
00077 uint32_t fpsr;
00078 float_status fp_status;
00079
00080 uint64_t mactmp;
00081
00082
00083
00084 uint64_t macc[4];
00085 uint32_t macsr;
00086 uint32_t mac_mask;
00087
00088
00089 uint32_t div1;
00090 uint32_t div2;
00091
00092
00093 struct {
00094 uint32_t ar;
00095 } mmu;
00096
00097
00098 uint32_t vbr;
00099 uint32_t mbar;
00100 uint32_t rambar0;
00101 uint32_t cacr;
00102
00103
00104 uint32_t t1;
00105
00106 int pending_vector;
00107 int pending_level;
00108
00109 uint32_t qregs[MAX_QREGS];
00110
00111 CPU_COMMON
00112
00113 uint32_t features;
00114 } CPUM68KState;
00115
00116 void m68k_tcg_init(void);
00117 CPUM68KState *cpu_m68k_init(const char *cpu_model);
00118 int cpu_m68k_exec(CPUM68KState *s);
00119 void cpu_m68k_close(CPUM68KState *s);
00120 void do_interrupt(int is_hw);
00121
00122
00123
00124 int cpu_m68k_signal_handler(int host_signum, void *pinfo,
00125 void *puc);
00126 void cpu_m68k_flush_flags(CPUM68KState *, int);
00127
00128 enum {
00129 CC_OP_DYNAMIC,
00130 CC_OP_FLAGS,
00131 CC_OP_LOGIC,
00132 CC_OP_ADD,
00133 CC_OP_SUB,
00134 CC_OP_CMPB,
00135 CC_OP_CMPW,
00136 CC_OP_ADDX,
00137 CC_OP_SUBX,
00138 CC_OP_SHIFT,
00139 };
00140
00141 #define CCF_C 0x01
00142 #define CCF_V 0x02
00143 #define CCF_Z 0x04
00144 #define CCF_N 0x08
00145 #define CCF_X 0x10
00146
00147 #define SR_I_SHIFT 8
00148 #define SR_I 0x0700
00149 #define SR_M 0x1000
00150 #define SR_S 0x2000
00151 #define SR_T 0x8000
00152
00153 #define M68K_SSP 0
00154 #define M68K_USP 1
00155
00156
00157 #define M68K_CACR_EUSP 0x10
00158
00159 #define MACSR_PAV0 0x100
00160 #define MACSR_OMC 0x080
00161 #define MACSR_SU 0x040
00162 #define MACSR_FI 0x020
00163 #define MACSR_RT 0x010
00164 #define MACSR_N 0x008
00165 #define MACSR_Z 0x004
00166 #define MACSR_V 0x002
00167 #define MACSR_EV 0x001
00168
00169 void m68k_set_irq_level(CPUM68KState *env, int level, uint8_t vector);
00170 void m68k_set_macsr(CPUM68KState *env, uint32_t val);
00171 void m68k_switch_sp(CPUM68KState *env);
00172
00173 #define M68K_FPCR_PREC (1 << 6)
00174
00175 void do_m68k_semihosting(CPUM68KState *env, int nr);
00176
00177
00178
00179
00180
00181 enum m68k_features {
00182 M68K_FEATURE_CF_ISA_A,
00183 M68K_FEATURE_CF_ISA_B,
00184 M68K_FEATURE_CF_ISA_APLUSC,
00185 M68K_FEATURE_BRAL,
00186 M68K_FEATURE_CF_FPU,
00187 M68K_FEATURE_CF_MAC,
00188 M68K_FEATURE_CF_EMAC,
00189 M68K_FEATURE_CF_EMAC_B,
00190 M68K_FEATURE_USP,
00191 M68K_FEATURE_EXT_FULL,
00192 M68K_FEATURE_WORD_INDEX
00193 };
00194
00195 static inline int m68k_feature(CPUM68KState *env, int feature)
00196 {
00197 return (env->features & (1u << feature)) != 0;
00198 }
00199
00200 void register_m68k_insns (CPUM68KState *env);
00201
00202 #ifdef CONFIG_USER_ONLY
00203
00204 #define TARGET_PAGE_BITS 13
00205 #else
00206
00207 #define TARGET_PAGE_BITS 10
00208 #endif
00209
00210 #define CPUState CPUM68KState
00211 #define cpu_init cpu_m68k_init
00212 #define cpu_exec cpu_m68k_exec
00213 #define cpu_gen_code cpu_m68k_gen_code
00214 #define cpu_signal_handler cpu_m68k_signal_handler
00215
00216
00217 #define MMU_MODE0_SUFFIX _kernel
00218 #define MMU_MODE1_SUFFIX _user
00219 #define MMU_USER_IDX 1
00220 static inline int cpu_mmu_index (CPUState *env)
00221 {
00222 return (env->sr & SR_S) == 0 ? 1 : 0;
00223 }
00224
00225 #if defined(CONFIG_USER_ONLY)
00226 static inline void cpu_clone_regs(CPUState *env, target_ulong newsp)
00227 {
00228 if (newsp)
00229 env->aregs[7] = newsp;
00230 env->dregs[0] = 0;
00231 }
00232 #endif
00233
00234 #include "cpu-all.h"
00235 #include "exec-all.h"
00236
00237 static inline void cpu_pc_from_tb(CPUState *env, TranslationBlock *tb)
00238 {
00239 env->pc = tb->pc;
00240 }
00241
00242 static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
00243 target_ulong *cs_base, int *flags)
00244 {
00245 *pc = env->pc;
00246 *cs_base = 0;
00247 *flags = (env->fpcr & M68K_FPCR_PREC)
00248 | (env->sr & SR_S)
00249 | ((env->macsr >> 4) & 0xf);
00250 }
00251
00252 #endif