vmstate_register(0, &vmstate_ide_pci, d);
qemu_register_reset(cmd646_reset, d);
- cmd646_reset(d);
return 0;
}
base = isa->iobase;
isa_init_irq(dev, &s->irq, isa->isairq);
- parallel_reset(s);
qemu_register_reset(parallel_reset, s);
if (qemu_chr_ioctl(s->chr, CHR_IOCTL_PP_READ_STATUS, &dummy) == 0) {
s->irq = irq;
s->chr = chr;
s->it_shift = it_shift;
- parallel_reset(s);
qemu_register_reset(parallel_reset, s);
io_sw = cpu_register_io_memory(parallel_mm_read_sw, parallel_mm_write_sw, s);
s->irq_mouse = mouse_irq;
s->mask = mask;
- kbd_reset(s);
vmstate_register(0, &vmstate_kbd, s);
s_io_memory = cpu_register_io_memory(kbd_mm_read, kbd_mm_write, s);
cpu_register_physical_memory(base, size, s_io_memory);
isa_init_irq(dev, &s->irq_kbd, 1);
isa_init_irq(dev, &s->irq_mouse, 12);
- kbd_reset(s);
vmstate_register(0, &vmstate_kbd, s);
register_ioport_read(0x60, 1, 1, kbd_read_data, s);
register_ioport_write(0x60, 1, 1, kbd_write_data, s);
s->common.update_irq = update_irq;
s->common.update_arg = update_arg;
s->scancode_set = 2;
- ps2_kbd_reset(s);
vmstate_register(0, &vmstate_ps2_keyboard, s);
qemu_add_kbd_event_handler(ps2_put_keycode, s);
qemu_register_reset(ps2_kbd_reset, s);
s->common.update_irq = update_irq;
s->common.update_arg = update_arg;
- ps2_mouse_reset(s);
vmstate_register(0, &vmstate_ps2_mouse, s);
qemu_add_mouse_event_handler(ps2_mouse_event, s, 0, "QEMU PS/2 Mouse");
qemu_register_reset(ps2_mouse_reset, s);
typedef struct ResetData {
CPUState *env;
- uint64_t reset_addr;
+ uint64_t prom_addr;
} ResetData;
static void main_cpu_reset(void *opaque)
{
ResetData *s = (ResetData *)opaque;
CPUState *env = s->env;
+ static unsigned int nr_resets;
cpu_reset(env);
env->tick_cmpr = TICK_INT_DIS | 0;
env->gregs[1] = 0; // Memory start
env->gregs[2] = ram_size; // Memory size
env->gregs[3] = 0; // Machine description XXX
- env->pc = s->reset_addr;
+ if (nr_resets++ == 0) {
+ /* Power on reset */
+ env->pc = s->prom_addr + 0x20ULL;
+ } else {
+ env->pc = s->prom_addr + 0x40ULL;
+ }
env->npc = env->pc + 4;
}
reset_info = qemu_mallocz(sizeof(ResetData));
reset_info->env = env;
- reset_info->reset_addr = hwdef->prom_addr + 0x40ULL;
+ reset_info->prom_addr = hwdef->prom_addr;
qemu_register_reset(main_cpu_reset, reset_info);
- main_cpu_reset(reset_info);
- // Override warm reset address with cold start address
- env->pc = hwdef->prom_addr + 0x20ULL;
- env->npc = env->pc + 4;
return env;
}