Commit 6d0c293dc336807e4a2ab9c3a74483da747601ce
1 parent
fdce4963
Halt the CPU using a qemu_irq
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5601 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
15 additions
and
7 deletions
hw/slavio_misc.c
| @@ -50,7 +50,7 @@ typedef struct MiscState { | @@ -50,7 +50,7 @@ typedef struct MiscState { | ||
| 50 | uint8_t diag, mctrl; | 50 | uint8_t diag, mctrl; |
| 51 | uint32_t sysctrl; | 51 | uint32_t sysctrl; |
| 52 | uint16_t leds; | 52 | uint16_t leds; |
| 53 | - CPUState *env; | 53 | + qemu_irq cpu_halt; |
| 54 | qemu_irq fdc_tc; | 54 | qemu_irq fdc_tc; |
| 55 | } MiscState; | 55 | } MiscState; |
| 56 | 56 | ||
| @@ -256,7 +256,7 @@ static void apc_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | @@ -256,7 +256,7 @@ static void apc_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) | ||
| 256 | MiscState *s = opaque; | 256 | MiscState *s = opaque; |
| 257 | 257 | ||
| 258 | MISC_DPRINTF("Write power management %2.2x\n", val & 0xff); | 258 | MISC_DPRINTF("Write power management %2.2x\n", val & 0xff); |
| 259 | - cpu_interrupt(s->env, CPU_INTERRUPT_HALT); | 259 | + qemu_irq_raise(s->cpu_halt); |
| 260 | } | 260 | } |
| 261 | 261 | ||
| 262 | static uint32_t apc_mem_readb(void *opaque, target_phys_addr_t addr) | 262 | static uint32_t apc_mem_readb(void *opaque, target_phys_addr_t addr) |
| @@ -417,7 +417,7 @@ static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) | @@ -417,7 +417,7 @@ static int slavio_misc_load(QEMUFile *f, void *opaque, int version_id) | ||
| 417 | void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | 417 | void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
| 418 | target_phys_addr_t aux1_base, | 418 | target_phys_addr_t aux1_base, |
| 419 | target_phys_addr_t aux2_base, qemu_irq irq, | 419 | target_phys_addr_t aux2_base, qemu_irq irq, |
| 420 | - CPUState *env, qemu_irq **fdc_tc) | 420 | + qemu_irq cpu_halt, qemu_irq **fdc_tc) |
| 421 | { | 421 | { |
| 422 | int io; | 422 | int io; |
| 423 | MiscState *s; | 423 | MiscState *s; |
| @@ -471,7 +471,7 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | @@ -471,7 +471,7 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | ||
| 471 | } | 471 | } |
| 472 | 472 | ||
| 473 | s->irq = irq; | 473 | s->irq = irq; |
| 474 | - s->env = env; | 474 | + s->cpu_halt = cpu_halt; |
| 475 | *fdc_tc = &s->fdc_tc; | 475 | *fdc_tc = &s->fdc_tc; |
| 476 | 476 | ||
| 477 | register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load, | 477 | register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load, |
hw/sun4m.c
| @@ -360,6 +360,12 @@ static void secondary_cpu_reset(void *opaque) | @@ -360,6 +360,12 @@ static void secondary_cpu_reset(void *opaque) | ||
| 360 | env->halted = 1; | 360 | env->halted = 1; |
| 361 | } | 361 | } |
| 362 | 362 | ||
| 363 | +static void cpu_halt_signal(void *opaque, int irq, int level) | ||
| 364 | +{ | ||
| 365 | + if (level && cpu_single_env) | ||
| 366 | + cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HALT); | ||
| 367 | +} | ||
| 368 | + | ||
| 363 | static unsigned long sun4m_load_kernel(const char *kernel_filename, | 369 | static unsigned long sun4m_load_kernel(const char *kernel_filename, |
| 364 | const char *initrd_filename, | 370 | const char *initrd_filename, |
| 365 | ram_addr_t RAM_size) | 371 | ram_addr_t RAM_size) |
| @@ -426,6 +432,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | @@ -426,6 +432,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 426 | *espdma_irq, *ledma_irq; | 432 | *espdma_irq, *ledma_irq; |
| 427 | qemu_irq *esp_reset, *le_reset; | 433 | qemu_irq *esp_reset, *le_reset; |
| 428 | qemu_irq *fdc_tc; | 434 | qemu_irq *fdc_tc; |
| 435 | + qemu_irq *cpu_halt; | ||
| 429 | unsigned long prom_offset, kernel_size; | 436 | unsigned long prom_offset, kernel_size; |
| 430 | int ret; | 437 | int ret; |
| 431 | char buf[1024]; | 438 | char buf[1024]; |
| @@ -547,9 +554,10 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | @@ -547,9 +554,10 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 547 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], | 554 | slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], |
| 548 | serial_hds[1], serial_hds[0]); | 555 | serial_hds[1], serial_hds[0]); |
| 549 | 556 | ||
| 557 | + cpu_halt = qemu_allocate_irqs(cpu_halt_signal, NULL, 1); | ||
| 550 | slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base, | 558 | slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base, |
| 551 | hwdef->aux1_base, hwdef->aux2_base, | 559 | hwdef->aux1_base, hwdef->aux2_base, |
| 552 | - slavio_irq[hwdef->me_irq], envs[0], | 560 | + slavio_irq[hwdef->me_irq], cpu_halt[0], |
| 553 | &fdc_tc); | 561 | &fdc_tc); |
| 554 | 562 | ||
| 555 | if (hwdef->fd_base != (target_phys_addr_t)-1) { | 563 | if (hwdef->fd_base != (target_phys_addr_t)-1) { |
| @@ -1575,7 +1583,7 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | @@ -1575,7 +1583,7 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, | ||
| 1575 | serial_hds[1], serial_hds[0]); | 1583 | serial_hds[1], serial_hds[0]); |
| 1576 | 1584 | ||
| 1577 | slavio_misc = slavio_misc_init(0, -1, hwdef->aux1_base, -1, | 1585 | slavio_misc = slavio_misc_init(0, -1, hwdef->aux1_base, -1, |
| 1578 | - slavio_irq[hwdef->me_irq], env, &fdc_tc); | 1586 | + slavio_irq[hwdef->me_irq], NULL, &fdc_tc); |
| 1579 | 1587 | ||
| 1580 | if (hwdef->fd_base != (target_phys_addr_t)-1) { | 1588 | if (hwdef->fd_base != (target_phys_addr_t)-1) { |
| 1581 | /* there is zero or one floppy drive */ | 1589 | /* there is zero or one floppy drive */ |
hw/sun4m.h
| @@ -58,7 +58,7 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, | @@ -58,7 +58,7 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq, | ||
| 58 | void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, | 58 | void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
| 59 | target_phys_addr_t aux1_base, | 59 | target_phys_addr_t aux1_base, |
| 60 | target_phys_addr_t aux2_base, qemu_irq irq, | 60 | target_phys_addr_t aux2_base, qemu_irq irq, |
| 61 | - CPUState *env, qemu_irq **fdc_tc); | 61 | + qemu_irq cpu_halt, qemu_irq **fdc_tc); |
| 62 | void slavio_set_power_fail(void *opaque, int power_failing); | 62 | void slavio_set_power_fail(void *opaque, int power_failing); |
| 63 | 63 | ||
| 64 | /* cs4231.c */ | 64 | /* cs4231.c */ |