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); | ... | ... |