Revision 44a99354 hw/sun4u.c
b/hw/sun4u.c | ||
---|---|---|
268 | 268 |
|
269 | 269 |
typedef struct ResetData { |
270 | 270 |
CPUState *env; |
271 |
uint64_t reset_addr;
|
|
271 |
uint64_t prom_addr;
|
|
272 | 272 |
} ResetData; |
273 | 273 |
|
274 | 274 |
static void main_cpu_reset(void *opaque) |
275 | 275 |
{ |
276 | 276 |
ResetData *s = (ResetData *)opaque; |
277 | 277 |
CPUState *env = s->env; |
278 |
static unsigned int nr_resets; |
|
278 | 279 |
|
279 | 280 |
cpu_reset(env); |
280 | 281 |
env->tick_cmpr = TICK_INT_DIS | 0; |
... | ... | |
289 | 290 |
env->gregs[1] = 0; // Memory start |
290 | 291 |
env->gregs[2] = ram_size; // Memory size |
291 | 292 |
env->gregs[3] = 0; // Machine description XXX |
292 |
env->pc = s->reset_addr; |
|
293 |
if (nr_resets++ == 0) { |
|
294 |
/* Power on reset */ |
|
295 |
env->pc = s->prom_addr + 0x20ULL; |
|
296 |
} else { |
|
297 |
env->pc = s->prom_addr + 0x40ULL; |
|
298 |
} |
|
293 | 299 |
env->npc = env->pc + 4; |
294 | 300 |
} |
295 | 301 |
|
... | ... | |
544 | 550 |
|
545 | 551 |
reset_info = qemu_mallocz(sizeof(ResetData)); |
546 | 552 |
reset_info->env = env; |
547 |
reset_info->reset_addr = hwdef->prom_addr + 0x40ULL;
|
|
553 |
reset_info->prom_addr = hwdef->prom_addr;
|
|
548 | 554 |
qemu_register_reset(main_cpu_reset, reset_info); |
549 |
main_cpu_reset(reset_info); |
|
550 |
// Override warm reset address with cold start address |
|
551 |
env->pc = hwdef->prom_addr + 0x20ULL; |
|
552 |
env->npc = env->pc + 4; |
|
553 | 555 |
|
554 | 556 |
return env; |
555 | 557 |
} |
Also available in: Unified diff