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,6 +2282,11 @@ void ide_ioport_write(CPUX86State *env, uint32_t addr, uint32_t val)
2282 n = s->req_nb_sectors; 2282 n = s->req_nb_sectors;
2283 ide_transfer_start(s, 512 * n, ide_sector_write); 2283 ide_transfer_start(s, 512 * n, ide_sector_write);
2284 break; 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 default: 2290 default:
2286 abort_cmd: 2291 abort_cmd:
2287 ide_abort_command(s); 2292 ide_abort_command(s);
@@ -2450,6 +2455,34 @@ void ide_init(void) @@ -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 /* cpu signal handler */ 2486 /* cpu signal handler */
2454 static void host_segv_handler(int host_signum, siginfo_t *info, 2487 static void host_segv_handler(int host_signum, siginfo_t *info,
2455 void *puc) 2488 void *puc)
@@ -2497,7 +2530,9 @@ void main_loop(void *opaque) @@ -2497,7 +2530,9 @@ void main_loop(void *opaque)
2497 for(;;) { 2530 for(;;) {
2498 2531
2499 ret = cpu_x86_exec(env); 2532 ret = cpu_x86_exec(env);
2500 - 2533 + if (reset_requested)
  2534 + break;
  2535 +
2501 /* if hlt instruction, we wait until the next IRQ */ 2536 /* if hlt instruction, we wait until the next IRQ */
2502 if (ret == EXCP_HLT) 2537 if (ret == EXCP_HLT)
2503 timeout = 10; 2538 timeout = 10;
@@ -2767,6 +2802,7 @@ int main(int argc, char **argv) @@ -2767,6 +2802,7 @@ int main(int argc, char **argv)
2767 serial_init(); 2802 serial_init();
2768 ne2000_init(); 2803 ne2000_init();
2769 ide_init(); 2804 ide_init();
  2805 + kbd_init();
2770 2806
2771 /* setup cpu signal handlers for MMU / self modifying code handling */ 2807 /* setup cpu signal handlers for MMU / self modifying code handling */
2772 sigfillset(&act.sa_mask); 2808 sigfillset(&act.sa_mask);