Commit cd4c3e888a385acbb27532745102b95796185777

Authored by bellard
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
... ... @@ -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);
... ...