Qemu commit 9ee59f3 removed the bochs bios apm interface emulation at port 0x8900. That broke poweroff via APM. Fix it by powering off the machine using the acpi pm control register.
Old code is left in, so seabios wil try both poweroff methods. Cleaning that eventually up is left for another patch, after checking it isn't needed. Qemu never implemented "Standby" and "Suspend", only "Shutdown", so it looks like there might be non-qemu use cases (bochs probably).
Easiest way to test this is the syslinux poweroff module; modern linux distros usually have CONFIG_APM turned off.
Reported-by: Sebastian Herbszt herbszt@gmx.de Signed-off-by: Gerd Hoffmann kraxel@redhat.com --- src/apm.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/src/apm.c b/src/apm.c index b2eac6d..15f37dd 100644 --- a/src/apm.c +++ b/src/apm.c @@ -109,6 +109,7 @@ void apm_shutdown(void) { irq_disable(); + outw(0x2000, PORT_ACPI_PM_BASE + 0x04); out_str("Shutdown"); for (;;) hlt();
On Thu, Jul 25, 2013 at 10:05:21AM +0200, Gerd Hoffmann wrote:
Qemu commit 9ee59f3 removed the bochs bios apm interface emulation at port 0x8900. That broke poweroff via APM. Fix it by powering off the machine using the acpi pm control register.
Old code is left in, so seabios wil try both poweroff methods. Cleaning that eventually up is left for another patch, after checking it isn't needed. Qemu never implemented "Standby" and "Suspend", only "Shutdown", so it looks like there might be non-qemu use cases (bochs probably).
Easiest way to test this is the syslinux poweroff module; modern linux distros usually have CONFIG_APM turned off.
I agree that implementing APM using ACPI makes sense. However, this code is used by coreboot and CSM as well, so we can't hardcode the ACPI address. Ideally the code would scan the ACPI tables for poweroff capability and store that so APM could use it later.
If QEMU never implemented standby/suspend, then I'm fine with dropping that code. (I agree putting that in a separate patch makes sense.)
-Kevin