for (p = s; *p != '\0'; p++)
outb (0x8900, *p);
+ /* For newer versions of qemu, you must run with -device
+ * isa-debug-exit, which exits on any write to an IO port (by
+ * default 0x501). Qemu's exit code is double the value plus one,
+ * so there is no way to exit cleanly. We use 0x31 which should
+ * result in a qemu exit code of 0x63. */
+ outb (0x501, 0x31);
+
/* This will power off a VMware VM if "gui.exitOnCLIHLT = TRUE"
is set in its configuration file. (The "pintos" script does
that automatically.) */
if $vga eq 'terminal';
print "warning: qemu doesn't support jitter\n"
if defined $jitter;
- my (@cmd) = ('qemu');
+ my (@cmd) = ('qemu-system-i386');
+ push (@cmd, '-device', 'isa-debug-exit');
+
push (@cmd, '-hda', $disks[0]) if defined $disks[0];
push (@cmd, '-hdb', $disks[1]) if defined $disks[1];
push (@cmd, '-hdc', $disks[2]) if defined $disks[2];
exit 0;
}
- return $?;
+ # Kind of a gross hack, because qemu's isa-debug-exit device
+ # only allows odd-numbered exit values, so we can't exit
+ # cleanly with 0. We use exit status 0x63 as an alternate
+ # "clean" exit status.
+ return ($? != 0x6300) && $?;
}
}