Revision e16ad5b0 hw/mips_r4k.c
b/hw/mips_r4k.c | ||
---|---|---|
70 | 70 |
|
71 | 71 |
static int mips_qemu_iomemtype = 0; |
72 | 72 |
|
73 |
static void load_kernel (CPUState *env) |
|
73 |
typedef struct ResetData { |
|
74 |
CPUState *env; |
|
75 |
uint64_t vector; |
|
76 |
} ResetData; |
|
77 |
|
|
78 |
static int64_t load_kernel(void) |
|
74 | 79 |
{ |
75 | 80 |
int64_t entry, kernel_low, kernel_high; |
76 | 81 |
long kernel_size, initrd_size; |
... | ... | |
89 | 94 |
if (kernel_size >= 0) { |
90 | 95 |
if ((entry & ~0x7fffffffULL) == 0x80000000) |
91 | 96 |
entry = (int32_t)entry; |
92 |
env->active_tc.PC = entry; |
|
93 | 97 |
} else { |
94 | 98 |
fprintf(stderr, "qemu: could not load kernel '%s'\n", |
95 | 99 |
loaderparams.kernel_filename); |
... | ... | |
135 | 139 |
|
136 | 140 |
stl_phys((16 << 20) - 260, 0x12345678); |
137 | 141 |
stl_phys((16 << 20) - 264, ram_size); |
142 |
return entry; |
|
138 | 143 |
} |
139 | 144 |
|
140 | 145 |
static void main_cpu_reset(void *opaque) |
141 | 146 |
{ |
142 |
CPUState *env = opaque;
|
|
143 |
cpu_reset(env);
|
|
147 |
ResetData *s = (ResetData *)opaque;
|
|
148 |
CPUState *env = s->env;
|
|
144 | 149 |
|
145 |
if (loaderparams.kernel_filename)
|
|
146 |
load_kernel (env);
|
|
150 |
cpu_reset(env);
|
|
151 |
env->active_tc.PC = s->vector;
|
|
147 | 152 |
} |
148 | 153 |
|
149 | 154 |
static const int sector_len = 32 * 1024; |
... | ... | |
158 | 163 |
ram_addr_t bios_offset; |
159 | 164 |
int bios_size; |
160 | 165 |
CPUState *env; |
166 |
ResetData *reset_info; |
|
161 | 167 |
RTCState *rtc_state; |
162 | 168 |
int i; |
163 | 169 |
qemu_irq *i8259; |
... | ... | |
177 | 183 |
fprintf(stderr, "Unable to find CPU definition\n"); |
178 | 184 |
exit(1); |
179 | 185 |
} |
180 |
qemu_register_reset(main_cpu_reset, env); |
|
186 |
reset_info = qemu_mallocz(sizeof(ResetData)); |
|
187 |
reset_info->env = env; |
|
188 |
reset_info->vector = env->active_tc.PC; |
|
189 |
qemu_register_reset(main_cpu_reset, reset_info); |
|
181 | 190 |
|
182 | 191 |
/* allocate RAM */ |
183 | 192 |
if (ram_size > (256 << 20)) { |
... | ... | |
237 | 246 |
loaderparams.kernel_filename = kernel_filename; |
238 | 247 |
loaderparams.kernel_cmdline = kernel_cmdline; |
239 | 248 |
loaderparams.initrd_filename = initrd_filename; |
240 |
load_kernel (env);
|
|
249 |
reset_info->vector = load_kernel();
|
|
241 | 250 |
} |
242 | 251 |
|
243 | 252 |
/* Init CPU internal devices */ |
Also available in: Unified diff