Commit d7d02e3c3a50782c0fa6b17d16f9957f1cc82a65
1 parent
bb0c6722
new reset API
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@938 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
44 additions
and
21 deletions
hw/dma.c
... | ... | @@ -355,6 +355,12 @@ void DMA_schedule(int nchan) |
355 | 355 | cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); |
356 | 356 | } |
357 | 357 | |
358 | +static void dma_reset(void *opaque) | |
359 | +{ | |
360 | + struct dma_cont *d = opaque; | |
361 | + write_cont (d, (0x0d << d->dshift), 0); | |
362 | +} | |
363 | + | |
358 | 364 | /* dshift = 0: 8 bit DMA, 1 = 16 bit DMA */ |
359 | 365 | static void dma_init2(struct dma_cont *d, int base, int dshift, int page_base) |
360 | 366 | { |
... | ... | @@ -378,7 +384,8 @@ static void dma_init2(struct dma_cont *d, int base, int dshift, int page_base) |
378 | 384 | register_ioport_read (base + ((i + 8) << dshift), 1, 1, |
379 | 385 | read_cont, d); |
380 | 386 | } |
381 | - write_cont (d, base + (0x0d << dshift), 0); | |
387 | + qemu_register_reset(dma_reset, d); | |
388 | + dma_reset(d); | |
382 | 389 | } |
383 | 390 | |
384 | 391 | void DMA_init (void) | ... | ... |
hw/i8254.c
... | ... | @@ -434,27 +434,37 @@ static int pit_load(QEMUFile *f, void *opaque, int version_id) |
434 | 434 | return 0; |
435 | 435 | } |
436 | 436 | |
437 | -PITState *pit_init(int base, int irq) | |
437 | +static void pit_reset(void *opaque) | |
438 | 438 | { |
439 | - PITState *pit = &pit_state; | |
439 | + PITState *pit = opaque; | |
440 | 440 | PITChannelState *s; |
441 | 441 | int i; |
442 | 442 | |
443 | 443 | for(i = 0;i < 3; i++) { |
444 | 444 | s = &pit->channels[i]; |
445 | - if (i == 0) { | |
446 | - /* the timer 0 is connected to an IRQ */ | |
447 | - s->irq_timer = qemu_new_timer(vm_clock, pit_irq_timer, s); | |
448 | - s->irq = irq; | |
449 | - } | |
450 | 445 | s->mode = 3; |
451 | 446 | s->gate = (i != 2); |
452 | 447 | pit_load_count(s, 0); |
453 | 448 | } |
449 | +} | |
450 | + | |
451 | +PITState *pit_init(int base, int irq) | |
452 | +{ | |
453 | + PITState *pit = &pit_state; | |
454 | + PITChannelState *s; | |
455 | + | |
456 | + s = &pit->channels[0]; | |
457 | + /* the timer 0 is connected to an IRQ */ | |
458 | + s->irq_timer = qemu_new_timer(vm_clock, pit_irq_timer, s); | |
459 | + s->irq = irq; | |
454 | 460 | |
455 | 461 | register_savevm("i8254", base, 1, pit_save, pit_load, pit); |
456 | 462 | |
463 | + qemu_register_reset(pit_reset, pit); | |
457 | 464 | register_ioport_write(base, 4, 1, pit_ioport_write, pit); |
458 | 465 | register_ioport_read(base, 3, 1, pit_ioport_read, pit); |
466 | + | |
467 | + pit_reset(pit); | |
468 | + | |
459 | 469 | return pit; |
460 | 470 | } | ... | ... |
hw/i8259.c
... | ... | @@ -231,10 +231,20 @@ int cpu_get_pic_interrupt(CPUState *env) |
231 | 231 | return intno; |
232 | 232 | } |
233 | 233 | |
234 | +static void pic_reset(void *opaque) | |
235 | +{ | |
236 | + PicState *s = opaque; | |
237 | + int tmp; | |
238 | + | |
239 | + tmp = s->elcr_mask; | |
240 | + memset(s, 0, sizeof(PicState)); | |
241 | + s->elcr_mask = tmp; | |
242 | +} | |
243 | + | |
234 | 244 | static void pic_ioport_write(void *opaque, uint32_t addr, uint32_t val) |
235 | 245 | { |
236 | 246 | PicState *s = opaque; |
237 | - int priority, cmd, irq, tmp; | |
247 | + int priority, cmd, irq; | |
238 | 248 | |
239 | 249 | #ifdef DEBUG_PIC |
240 | 250 | printf("pic_write: addr=0x%02x val=0x%02x\n", addr, val); |
... | ... | @@ -243,9 +253,7 @@ static void pic_ioport_write(void *opaque, uint32_t addr, uint32_t val) |
243 | 253 | if (addr == 0) { |
244 | 254 | if (val & 0x10) { |
245 | 255 | /* init */ |
246 | - tmp = s->elcr_mask; | |
247 | - memset(s, 0, sizeof(PicState)); | |
248 | - s->elcr_mask = tmp; | |
256 | + pic_reset(s); | |
249 | 257 | /* deassert a pending interrupt */ |
250 | 258 | cpu_reset_interrupt(cpu_single_env, CPU_INTERRUPT_HARD); |
251 | 259 | |
... | ... | @@ -458,6 +466,7 @@ static void pic_init1(int io_addr, int elcr_addr, PicState *s) |
458 | 466 | register_ioport_read(elcr_addr, 1, 1, elcr_ioport_read, s); |
459 | 467 | } |
460 | 468 | register_savevm("i8259", io_addr, 1, pic_save, pic_load, s); |
469 | + qemu_register_reset(pic_reset, s); | |
461 | 470 | } |
462 | 471 | |
463 | 472 | void pic_info(void) | ... | ... |
hw/m48t59.c
... | ... | @@ -162,9 +162,7 @@ static void watchdog_cb (void *opaque) |
162 | 162 | NVRAM->buffer[0x1FF7] = 0x00; |
163 | 163 | NVRAM->buffer[0x1FFC] &= ~0x40; |
164 | 164 | /* May it be a hw CPU Reset instead ? */ |
165 | - reset_requested = 1; | |
166 | - printf("Watchdog reset...\n"); | |
167 | - cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); | |
165 | + qemu_system_reset_request(); | |
168 | 166 | } else { |
169 | 167 | pic_set_irq(NVRAM->IRQ, 1); |
170 | 168 | pic_set_irq(NVRAM->IRQ, 0); | ... | ... |
hw/pckbd.c
... | ... | @@ -139,7 +139,6 @@ typedef struct KBDState { |
139 | 139 | } KBDState; |
140 | 140 | |
141 | 141 | KBDState kbd_state; |
142 | -int reset_requested; | |
143 | 142 | |
144 | 143 | /* update irq and KBD_STAT_[MOUSE_]OBF */ |
145 | 144 | /* XXX: not generating the irqs if KBD_MODE_DISABLE_KBD is set may be |
... | ... | @@ -274,8 +273,7 @@ static void kbd_write_command(void *opaque, uint32_t addr, uint32_t val) |
274 | 273 | break; |
275 | 274 | #endif |
276 | 275 | case KBD_CCMD_RESET: |
277 | - reset_requested = 1; | |
278 | - cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); | |
276 | + qemu_system_reset_request(); | |
279 | 277 | break; |
280 | 278 | case 0xff: |
281 | 279 | /* ignore that - I don't know what is its use */ |
... | ... | @@ -617,8 +615,7 @@ void kbd_write_data(void *opaque, uint32_t addr, uint32_t val) |
617 | 615 | cpu_x86_set_a20(cpu_single_env, (val >> 1) & 1); |
618 | 616 | #endif |
619 | 617 | if (!(val & 1)) { |
620 | - reset_requested = 1; | |
621 | - cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT); | |
618 | + qemu_system_reset_request(); | |
622 | 619 | } |
623 | 620 | break; |
624 | 621 | case KBD_CCMD_WRITE_MOUSE: |
... | ... | @@ -630,8 +627,9 @@ void kbd_write_data(void *opaque, uint32_t addr, uint32_t val) |
630 | 627 | s->write_cmd = 0; |
631 | 628 | } |
632 | 629 | |
633 | -void kbd_reset(KBDState *s) | |
630 | +static void kbd_reset(void *opaque) | |
634 | 631 | { |
632 | + KBDState *s = opaque; | |
635 | 633 | KBDQueue *q; |
636 | 634 | |
637 | 635 | s->kbd_write_cmd = -1; |
... | ... | @@ -656,4 +654,5 @@ void kbd_init(void) |
656 | 654 | |
657 | 655 | qemu_add_kbd_event_handler(pc_kbd_put_keycode, s); |
658 | 656 | qemu_add_mouse_event_handler(pc_kbd_mouse_event, s); |
657 | + qemu_register_reset(kbd_reset, s); | |
659 | 658 | } | ... | ... |