Revision aaed909a target-m68k/helper.c
b/target-m68k/helper.c | ||
---|---|---|
33 | 33 |
M68K_CPUID_ANY, |
34 | 34 |
}; |
35 | 35 |
|
36 |
typedef struct m68k_def_t m68k_def_t; |
|
37 |
|
|
36 | 38 |
struct m68k_def_t { |
37 | 39 |
const char * name; |
38 | 40 |
enum m68k_cpuid id; |
... | ... | |
51 | 53 |
env->features |= (1u << feature); |
52 | 54 |
} |
53 | 55 |
|
54 |
int cpu_m68k_set_model(CPUM68KState *env, const char * name)
|
|
56 |
static int cpu_m68k_set_model(CPUM68KState *env, const char *name)
|
|
55 | 57 |
{ |
56 | 58 |
m68k_def_t *def; |
57 | 59 |
|
... | ... | |
60 | 62 |
break; |
61 | 63 |
} |
62 | 64 |
if (!def->name) |
63 |
return 1; |
|
65 |
return -1;
|
|
64 | 66 |
|
65 | 67 |
switch (def->id) { |
66 | 68 |
case M68K_CPUID_M5206: |
... | ... | |
98 | 100 |
} |
99 | 101 |
|
100 | 102 |
register_m68k_insns(env); |
103 |
} |
|
104 |
|
|
105 |
void cpu_reset(CPUM68KState *env) |
|
106 |
{ |
|
107 |
memset(env, 0, offsetof(CPUM68KState, breakpoints)); |
|
108 |
#if !defined (CONFIG_USER_ONLY) |
|
109 |
env->sr = 0x2700; |
|
110 |
#endif |
|
111 |
m68k_switch_sp(env); |
|
112 |
/* ??? FP regs should be initialized to NaN. */ |
|
113 |
env->cc_op = CC_OP_FLAGS; |
|
114 |
/* TODO: We should set PC from the interrupt vector. */ |
|
115 |
env->pc = 0; |
|
116 |
tlb_flush(env, 1); |
|
117 |
} |
|
101 | 118 |
|
102 |
return 0; |
|
119 |
CPUM68KState *cpu_m68k_init(const char *cpu_model) |
|
120 |
{ |
|
121 |
CPUM68KState *env; |
|
122 |
|
|
123 |
env = malloc(sizeof(CPUM68KState)); |
|
124 |
if (!env) |
|
125 |
return NULL; |
|
126 |
cpu_exec_init(env); |
|
127 |
|
|
128 |
if (cpu_m68k_set_model(env, cpu_model) < 0) { |
|
129 |
cpu_m68k_close(env); |
|
130 |
return NULL; |
|
131 |
} |
|
132 |
|
|
133 |
cpu_reset(env); |
|
134 |
return env; |
|
135 |
} |
|
136 |
|
|
137 |
void cpu_m68k_close(CPUM68KState *env) |
|
138 |
{ |
|
139 |
qemu_free(env); |
|
103 | 140 |
} |
104 | 141 |
|
105 | 142 |
void cpu_m68k_flush_flags(CPUM68KState *env, int cc_op) |
Also available in: Unified diff