Commit 6e6b73631301d41e8b18de4d35937bc78b0117f3
1 parent
b4e237aa
Register reset handlers
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6136 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
9 changed files
with
159 additions
and
19 deletions
hw/adb.c
| ... | ... | @@ -122,6 +122,8 @@ ADBDevice *adb_register_device(ADBBusState *s, int devaddr, |
| 122 | 122 | d->devreq = devreq; |
| 123 | 123 | d->devreset = devreset; |
| 124 | 124 | d->opaque = opaque; |
| 125 | + qemu_register_reset(devreset, d); | |
| 126 | + d->devreset(d); | |
| 125 | 127 | return d; |
| 126 | 128 | } |
| 127 | 129 | |
| ... | ... | @@ -278,7 +280,6 @@ void adb_kbd_init(ADBBusState *bus) |
| 278 | 280 | s = qemu_mallocz(sizeof(KBDState)); |
| 279 | 281 | d = adb_register_device(bus, ADB_KEYBOARD, adb_kbd_request, |
| 280 | 282 | adb_kbd_reset, s); |
| 281 | - adb_kbd_reset(d); | |
| 282 | 283 | qemu_add_kbd_event_handler(adb_kbd_put_keycode, d); |
| 283 | 284 | } |
| 284 | 285 | |
| ... | ... | @@ -420,6 +421,5 @@ void adb_mouse_init(ADBBusState *bus) |
| 420 | 421 | s = qemu_mallocz(sizeof(MouseState)); |
| 421 | 422 | d = adb_register_device(bus, ADB_MOUSE, adb_mouse_request, |
| 422 | 423 | adb_mouse_reset, s); |
| 423 | - adb_mouse_reset(d); | |
| 424 | 424 | qemu_add_mouse_event_handler(adb_mouse_event, d, 0, "QEMU ADB Mouse"); |
| 425 | 425 | } | ... | ... |
hw/cuda.c
| ... | ... | @@ -633,6 +633,33 @@ static CPUReadMemoryFunc *cuda_read[] = { |
| 633 | 633 | &cuda_readl, |
| 634 | 634 | }; |
| 635 | 635 | |
| 636 | +static void cuda_reset(void *opaque) | |
| 637 | +{ | |
| 638 | + CUDAState *s = opaque; | |
| 639 | + | |
| 640 | + s->b = 0; | |
| 641 | + s->a = 0; | |
| 642 | + s->dirb = 0; | |
| 643 | + s->dira = 0; | |
| 644 | + s->sr = 0; | |
| 645 | + s->acr = 0; | |
| 646 | + s->pcr = 0; | |
| 647 | + s->ifr = 0; | |
| 648 | + s->ier = 0; | |
| 649 | + // s->ier = T1_INT | SR_INT; | |
| 650 | + s->anh = 0; | |
| 651 | + s->data_in_size = 0; | |
| 652 | + s->data_in_index = 0; | |
| 653 | + s->data_out_index = 0; | |
| 654 | + s->autopoll = 0; | |
| 655 | + | |
| 656 | + s->timers[0].latch = 0xffff; | |
| 657 | + set_counter(s, &s->timers[0], 0xffff); | |
| 658 | + | |
| 659 | + s->timers[1].latch = 0; | |
| 660 | + set_counter(s, &s->timers[1], 0xffff); | |
| 661 | +} | |
| 662 | + | |
| 636 | 663 | void cuda_init (int *cuda_mem_index, qemu_irq irq) |
| 637 | 664 | { |
| 638 | 665 | CUDAState *s = &cuda_state; |
| ... | ... | @@ -641,15 +668,11 @@ void cuda_init (int *cuda_mem_index, qemu_irq irq) |
| 641 | 668 | |
| 642 | 669 | s->timers[0].index = 0; |
| 643 | 670 | s->timers[0].timer = qemu_new_timer(vm_clock, cuda_timer1, s); |
| 644 | - s->timers[0].latch = 0xffff; | |
| 645 | - set_counter(s, &s->timers[0], 0xffff); | |
| 646 | 671 | |
| 647 | 672 | s->timers[1].index = 1; |
| 648 | - s->timers[1].latch = 0; | |
| 649 | - // s->ier = T1_INT | SR_INT; | |
| 650 | - s->ier = 0; | |
| 651 | - set_counter(s, &s->timers[1], 0xffff); | |
| 652 | 673 | |
| 653 | 674 | s->adb_poll_timer = qemu_new_timer(vm_clock, cuda_adb_poll, s); |
| 654 | 675 | *cuda_mem_index = cpu_register_io_memory(0, cuda_read, cuda_write, s); |
| 676 | + qemu_register_reset(cuda_reset, s); | |
| 677 | + cuda_reset(s); | |
| 655 | 678 | } | ... | ... |
hw/grackle_pci.c
| ... | ... | @@ -105,6 +105,10 @@ static void pci_grackle_set_irq(qemu_irq *pic, int irq_num, int level) |
| 105 | 105 | qemu_set_irq(pic[irq_num + 0x15], level); |
| 106 | 106 | } |
| 107 | 107 | |
| 108 | +static void pci_grackle_reset(void *opaque) | |
| 109 | +{ | |
| 110 | +} | |
| 111 | + | |
| 108 | 112 | PCIBus *pci_grackle_init(uint32_t base, qemu_irq *pic) |
| 109 | 113 | { |
| 110 | 114 | GrackleState *s; |
| ... | ... | @@ -160,5 +164,8 @@ PCIBus *pci_grackle_init(uint32_t base, qemu_irq *pic) |
| 160 | 164 | d->config[0x26] = 0x00; // prefetchable_memory_limit |
| 161 | 165 | d->config[0x27] = 0x85; |
| 162 | 166 | #endif |
| 167 | + qemu_register_reset(pci_grackle_reset, d); | |
| 168 | + pci_grackle_reset(d); | |
| 169 | + | |
| 163 | 170 | return s->bus; |
| 164 | 171 | } | ... | ... |
hw/heathrow_pic.c
| ... | ... | @@ -165,17 +165,33 @@ static void heathrow_pic_set_irq(void *opaque, int num, int level) |
| 165 | 165 | heathrow_pic_update(s); |
| 166 | 166 | } |
| 167 | 167 | |
| 168 | +static void heathrow_pic_reset_one(HeathrowPIC *s) | |
| 169 | +{ | |
| 170 | + memset(s, '\0', sizeof(HeathrowPIC)); | |
| 171 | +} | |
| 172 | + | |
| 173 | +static void heathrow_pic_reset(void *opaque) | |
| 174 | +{ | |
| 175 | + HeathrowPICS *s = opaque; | |
| 176 | + | |
| 177 | + heathrow_pic_reset_one(&s->pics[0]); | |
| 178 | + heathrow_pic_reset_one(&s->pics[1]); | |
| 179 | + | |
| 180 | + s->pics[0].level_triggered = 0; | |
| 181 | + s->pics[1].level_triggered = 0x1ff00000; | |
| 182 | +} | |
| 183 | + | |
| 168 | 184 | qemu_irq *heathrow_pic_init(int *pmem_index, |
| 169 | 185 | int nb_cpus, qemu_irq **irqs) |
| 170 | 186 | { |
| 171 | 187 | HeathrowPICS *s; |
| 172 | 188 | |
| 173 | 189 | s = qemu_mallocz(sizeof(HeathrowPICS)); |
| 174 | - s->pics[0].level_triggered = 0; | |
| 175 | - s->pics[1].level_triggered = 0x1ff00000; | |
| 176 | 190 | /* only 1 CPU */ |
| 177 | 191 | s->irqs = irqs[0]; |
| 178 | 192 | *pmem_index = cpu_register_io_memory(0, pic_read, pic_write, s); |
| 179 | 193 | |
| 194 | + qemu_register_reset(heathrow_pic_reset, s); | |
| 195 | + heathrow_pic_reset(s); | |
| 180 | 196 | return qemu_allocate_irqs(heathrow_pic_set_irq, s, 64); |
| 181 | 197 | } | ... | ... |
hw/ide.c
| ... | ... | @@ -3084,6 +3084,15 @@ static void cmd646_set_irq(void *opaque, int channel, int level) |
| 3084 | 3084 | cmd646_update_irq(d); |
| 3085 | 3085 | } |
| 3086 | 3086 | |
| 3087 | +static void cmd646_reset(void *opaque) | |
| 3088 | +{ | |
| 3089 | + PCIIDEState *d = opaque; | |
| 3090 | + unsigned int i; | |
| 3091 | + | |
| 3092 | + for (i = 0; i < 2; i++) | |
| 3093 | + ide_dma_cancel(&d->bmdma[i]); | |
| 3094 | +} | |
| 3095 | + | |
| 3087 | 3096 | /* CMD646 PCI IDE controller */ |
| 3088 | 3097 | void pci_cmd646_ide_init(PCIBus *bus, BlockDriverState **hd_table, |
| 3089 | 3098 | int secondary_ide_enabled) |
| ... | ... | @@ -3135,6 +3144,9 @@ void pci_cmd646_ide_init(PCIBus *bus, BlockDriverState **hd_table, |
| 3135 | 3144 | irq = qemu_allocate_irqs(cmd646_set_irq, d, 2); |
| 3136 | 3145 | ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], irq[0]); |
| 3137 | 3146 | ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], irq[1]); |
| 3147 | + | |
| 3148 | + qemu_register_reset(cmd646_reset, d); | |
| 3149 | + cmd646_reset(d); | |
| 3138 | 3150 | } |
| 3139 | 3151 | |
| 3140 | 3152 | static void pci_ide_save(QEMUFile* f, void *opaque) |
| ... | ... | @@ -3405,6 +3417,14 @@ static CPUReadMemoryFunc *pmac_ide_read[] = { |
| 3405 | 3417 | pmac_ide_readl, |
| 3406 | 3418 | }; |
| 3407 | 3419 | |
| 3420 | +static void pmac_ide_reset(void *opaque) | |
| 3421 | +{ | |
| 3422 | + IDEState *s = (IDEState *)opaque; | |
| 3423 | + | |
| 3424 | + ide_reset(&s[0]); | |
| 3425 | + ide_reset(&s[1]); | |
| 3426 | +} | |
| 3427 | + | |
| 3408 | 3428 | /* hd_table must contain 4 block drivers */ |
| 3409 | 3429 | /* PowerMac uses memory mapped registers, not I/O. Return the memory |
| 3410 | 3430 | I/O index to access the ide. */ |
| ... | ... | @@ -3418,6 +3438,8 @@ int pmac_ide_init (BlockDriverState **hd_table, qemu_irq irq) |
| 3418 | 3438 | |
| 3419 | 3439 | pmac_ide_memory = cpu_register_io_memory(0, pmac_ide_read, |
| 3420 | 3440 | pmac_ide_write, &ide_if[0]); |
| 3441 | + qemu_register_reset(pmac_ide_reset, &ide_if[0]); | |
| 3442 | + pmac_ide_reset(&ide_if[0]); | |
| 3421 | 3443 | return pmac_ide_memory; |
| 3422 | 3444 | } |
| 3423 | 3445 | ... | ... |
hw/m48t59.c
| ... | ... | @@ -604,6 +604,8 @@ static void m48t59_reset(void *opaque) |
| 604 | 604 | { |
| 605 | 605 | m48t59_t *NVRAM = opaque; |
| 606 | 606 | |
| 607 | + NVRAM->addr = 0; | |
| 608 | + NVRAM->lock = 0; | |
| 607 | 609 | if (NVRAM->alrm_timer != NULL) |
| 608 | 610 | qemu_del_timer(NVRAM->alrm_timer); |
| 609 | 611 | |
| ... | ... | @@ -630,7 +632,6 @@ m48t59_t *m48t59_init (qemu_irq IRQ, target_phys_addr_t mem_base, |
| 630 | 632 | s->IRQ = IRQ; |
| 631 | 633 | s->size = size; |
| 632 | 634 | s->io_base = io_base; |
| 633 | - s->addr = 0; | |
| 634 | 635 | s->type = type; |
| 635 | 636 | if (io_base != 0) { |
| 636 | 637 | register_ioport_read(io_base, 0x04, 1, NVRAM_readb, s); |
| ... | ... | @@ -644,7 +645,6 @@ m48t59_t *m48t59_init (qemu_irq IRQ, target_phys_addr_t mem_base, |
| 644 | 645 | s->alrm_timer = qemu_new_timer(vm_clock, &alarm_cb, s); |
| 645 | 646 | s->wd_timer = qemu_new_timer(vm_clock, &watchdog_cb, s); |
| 646 | 647 | } |
| 647 | - s->lock = 0; | |
| 648 | 648 | qemu_get_timedate(&s->alarm, 0); |
| 649 | 649 | |
| 650 | 650 | qemu_register_reset(m48t59_reset, s); | ... | ... |
hw/mac_dbdma.c
| ... | ... | @@ -88,7 +88,13 @@ static CPUReadMemoryFunc *dbdma_read[] = { |
| 88 | 88 | &dbdma_readl, |
| 89 | 89 | }; |
| 90 | 90 | |
| 91 | +static void dbdma_reset(void *opaque) | |
| 92 | +{ | |
| 93 | +} | |
| 94 | + | |
| 91 | 95 | void dbdma_init (int *dbdma_mem_index) |
| 92 | 96 | { |
| 93 | 97 | *dbdma_mem_index = cpu_register_io_memory(0, dbdma_read, dbdma_write, NULL); |
| 98 | + qemu_register_reset(dbdma_reset, NULL); | |
| 99 | + dbdma_reset(NULL); | |
| 94 | 100 | } | ... | ... |
hw/mac_nvram.c
| ... | ... | @@ -104,6 +104,10 @@ static CPUReadMemoryFunc *nvram_read[] = { |
| 104 | 104 | &macio_nvram_readb, |
| 105 | 105 | }; |
| 106 | 106 | |
| 107 | +static void macio_nvram_reset(void *opaque) | |
| 108 | +{ | |
| 109 | +} | |
| 110 | + | |
| 107 | 111 | MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size) |
| 108 | 112 | { |
| 109 | 113 | MacIONVRAMState *s; |
| ... | ... | @@ -120,6 +124,8 @@ MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size) |
| 120 | 124 | |
| 121 | 125 | s->mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s); |
| 122 | 126 | *mem_index = s->mem_index; |
| 127 | + qemu_register_reset(macio_nvram_reset, s); | |
| 128 | + macio_nvram_reset(s); | |
| 123 | 129 | |
| 124 | 130 | return s; |
| 125 | 131 | } | ... | ... |
hw/vga.c
| ... | ... | @@ -1826,10 +1826,73 @@ static void vga_invalidate_display(void *opaque) |
| 1826 | 1826 | s->last_height = -1; |
| 1827 | 1827 | } |
| 1828 | 1828 | |
| 1829 | -static void vga_reset(VGAState *s) | |
| 1829 | +static void vga_reset(void *opaque) | |
| 1830 | 1830 | { |
| 1831 | - memset(s, 0, sizeof(VGAState)); | |
| 1831 | + VGAState *s = (VGAState *) opaque; | |
| 1832 | + | |
| 1833 | + s->lfb_addr = 0; | |
| 1834 | + s->lfb_end = 0; | |
| 1835 | + s->map_addr = 0; | |
| 1836 | + s->map_end = 0; | |
| 1837 | + s->lfb_vram_mapped = 0; | |
| 1838 | + s->bios_offset = 0; | |
| 1839 | + s->bios_size = 0; | |
| 1840 | + s->sr_index = 0; | |
| 1841 | + memset(s->sr, '\0', sizeof(s->sr)); | |
| 1842 | + s->gr_index = 0; | |
| 1843 | + memset(s->gr, '\0', sizeof(s->gr)); | |
| 1844 | + s->ar_index = 0; | |
| 1845 | + memset(s->ar, '\0', sizeof(s->ar)); | |
| 1846 | + s->ar_flip_flop = 0; | |
| 1847 | + s->cr_index = 0; | |
| 1848 | + memset(s->cr, '\0', sizeof(s->cr)); | |
| 1849 | + s->msr = 0; | |
| 1850 | + s->fcr = 0; | |
| 1851 | + s->st00 = 0; | |
| 1852 | + s->st01 = 0; | |
| 1853 | + s->dac_state = 0; | |
| 1854 | + s->dac_sub_index = 0; | |
| 1855 | + s->dac_read_index = 0; | |
| 1856 | + s->dac_write_index = 0; | |
| 1857 | + memset(s->dac_cache, '\0', sizeof(s->dac_cache)); | |
| 1858 | + s->dac_8bit = 0; | |
| 1859 | + memset(s->palette, '\0', sizeof(s->palette)); | |
| 1860 | + s->bank_offset = 0; | |
| 1861 | +#ifdef CONFIG_BOCHS_VBE | |
| 1862 | + s->vbe_index = 0; | |
| 1863 | + memset(s->vbe_regs, '\0', sizeof(s->vbe_regs)); | |
| 1864 | + s->vbe_regs[VBE_DISPI_INDEX_ID] = VBE_DISPI_ID0; | |
| 1865 | + s->vbe_start_addr = 0; | |
| 1866 | + s->vbe_line_offset = 0; | |
| 1867 | + s->vbe_bank_mask = (s->vram_size >> 16) - 1; | |
| 1868 | +#endif | |
| 1869 | + memset(s->font_offsets, '\0', sizeof(s->font_offsets)); | |
| 1832 | 1870 | s->graphic_mode = -1; /* force full update */ |
| 1871 | + s->shift_control = 0; | |
| 1872 | + s->double_scan = 0; | |
| 1873 | + s->line_offset = 0; | |
| 1874 | + s->line_compare = 0; | |
| 1875 | + s->start_addr = 0; | |
| 1876 | + s->plane_updated = 0; | |
| 1877 | + s->last_cw = 0; | |
| 1878 | + s->last_ch = 0; | |
| 1879 | + s->last_width = 0; | |
| 1880 | + s->last_height = 0; | |
| 1881 | + s->last_scr_width = 0; | |
| 1882 | + s->last_scr_height = 0; | |
| 1883 | + s->cursor_start = 0; | |
| 1884 | + s->cursor_end = 0; | |
| 1885 | + s->cursor_offset = 0; | |
| 1886 | + memset(s->invalidated_y_table, '\0', sizeof(s->invalidated_y_table)); | |
| 1887 | + memset(s->last_palette, '\0', sizeof(s->last_palette)); | |
| 1888 | + memset(s->last_ch_attr, '\0', sizeof(s->last_ch_attr)); | |
| 1889 | + switch (vga_retrace_method) { | |
| 1890 | + case VGA_RETRACE_DUMB: | |
| 1891 | + break; | |
| 1892 | + case VGA_RETRACE_PRECISE: | |
| 1893 | + memset(&s->retrace_info, 0, sizeof (s->retrace_info)); | |
| 1894 | + break; | |
| 1895 | + } | |
| 1833 | 1896 | } |
| 1834 | 1897 | |
| 1835 | 1898 | #define TEXTMODE_X(x) ((x) % width) |
| ... | ... | @@ -2179,8 +2242,6 @@ void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, |
| 2179 | 2242 | expand4to8[i] = v; |
| 2180 | 2243 | } |
| 2181 | 2244 | |
| 2182 | - vga_reset(s); | |
| 2183 | - | |
| 2184 | 2245 | s->vram_ptr = vga_ram_base; |
| 2185 | 2246 | s->vram_offset = vga_ram_offset; |
| 2186 | 2247 | s->vram_size = vga_ram_size; |
| ... | ... | @@ -2201,9 +2262,10 @@ void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, |
| 2201 | 2262 | case VGA_RETRACE_PRECISE: |
| 2202 | 2263 | s->retrace = vga_precise_retrace; |
| 2203 | 2264 | s->update_retrace_info = vga_precise_update_retrace_info; |
| 2204 | - memset(&s->retrace_info, 0, sizeof (s->retrace_info)); | |
| 2205 | 2265 | break; |
| 2206 | 2266 | } |
| 2267 | + qemu_register_reset(vga_reset, s); | |
| 2268 | + vga_reset(s); | |
| 2207 | 2269 | } |
| 2208 | 2270 | |
| 2209 | 2271 | /* used by both ISA and PCI */ |
| ... | ... | @@ -2229,8 +2291,6 @@ void vga_init(VGAState *s) |
| 2229 | 2291 | s->bank_offset = 0; |
| 2230 | 2292 | |
| 2231 | 2293 | #ifdef CONFIG_BOCHS_VBE |
| 2232 | - s->vbe_regs[VBE_DISPI_INDEX_ID] = VBE_DISPI_ID0; | |
| 2233 | - s->vbe_bank_mask = ((s->vram_size >> 16) - 1); | |
| 2234 | 2294 | #if defined (TARGET_I386) |
| 2235 | 2295 | register_ioport_read(0x1ce, 1, 2, vbe_ioport_read_index, s); |
| 2236 | 2296 | register_ioport_read(0x1cf, 1, 2, vbe_ioport_read_data, s); | ... | ... |