Commit cd4c3e888a385acbb27532745102b95796185777
1 parent
7916e224
added IDE WIN_READ_NATIVE_MAX command (2.5.xx fix) - added support for proper system shutdown
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@308 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
37 additions
and
1 deletions
vl.c
... | ... | @@ -2282,6 +2282,11 @@ void ide_ioport_write(CPUX86State *env, uint32_t addr, uint32_t val) |
2282 | 2282 | n = s->req_nb_sectors; |
2283 | 2283 | ide_transfer_start(s, 512 * n, ide_sector_write); |
2284 | 2284 | break; |
2285 | + case WIN_READ_NATIVE_MAX: | |
2286 | + ide_set_sector(s, s->nb_sectors - 1); | |
2287 | + s->status = READY_STAT; | |
2288 | + ide_set_irq(s); | |
2289 | + break; | |
2285 | 2290 | default: |
2286 | 2291 | abort_cmd: |
2287 | 2292 | ide_abort_command(s); |
... | ... | @@ -2450,6 +2455,34 @@ void ide_init(void) |
2450 | 2455 | } |
2451 | 2456 | |
2452 | 2457 | /***********************************************************/ |
2458 | +/* simulate reset (stop qemu) */ | |
2459 | + | |
2460 | +int reset_requested; | |
2461 | + | |
2462 | +uint32_t kbd_read_status(CPUX86State *env, uint32_t addr) | |
2463 | +{ | |
2464 | + return 0; | |
2465 | +} | |
2466 | + | |
2467 | +void kbd_write_command(CPUX86State *env, uint32_t addr, uint32_t val) | |
2468 | +{ | |
2469 | + switch(val) { | |
2470 | + case 0xfe: | |
2471 | + reset_requested = 1; | |
2472 | + cpu_x86_interrupt(global_env, CPU_INTERRUPT_EXIT); | |
2473 | + break; | |
2474 | + default: | |
2475 | + break; | |
2476 | + } | |
2477 | +} | |
2478 | + | |
2479 | +void kbd_init(void) | |
2480 | +{ | |
2481 | + register_ioport_read(0x64, 1, kbd_read_status, 1); | |
2482 | + register_ioport_write(0x64, 1, kbd_write_command, 1); | |
2483 | +} | |
2484 | + | |
2485 | +/***********************************************************/ | |
2453 | 2486 | /* cpu signal handler */ |
2454 | 2487 | static void host_segv_handler(int host_signum, siginfo_t *info, |
2455 | 2488 | void *puc) |
... | ... | @@ -2497,7 +2530,9 @@ void main_loop(void *opaque) |
2497 | 2530 | for(;;) { |
2498 | 2531 | |
2499 | 2532 | ret = cpu_x86_exec(env); |
2500 | - | |
2533 | + if (reset_requested) | |
2534 | + break; | |
2535 | + | |
2501 | 2536 | /* if hlt instruction, we wait until the next IRQ */ |
2502 | 2537 | if (ret == EXCP_HLT) |
2503 | 2538 | timeout = 10; |
... | ... | @@ -2767,6 +2802,7 @@ int main(int argc, char **argv) |
2767 | 2802 | serial_init(); |
2768 | 2803 | ne2000_init(); |
2769 | 2804 | ide_init(); |
2805 | + kbd_init(); | |
2770 | 2806 | |
2771 | 2807 | /* setup cpu signal handlers for MMU / self modifying code handling */ |
2772 | 2808 | sigfillset(&act.sa_mask); | ... | ... |