From: Vladimir 'phcoder' Serbinenko Date: Mon, 13 Sep 2010 18:29:15 +0000 (+0200) Subject: Enable acpi shutdown on all ACPI platforms. X-Git-Tag: 1.99~524 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2419f17a09037635044ef7f2eea7ae2089c81be5;p=thirdparty%2Fgrub.git Enable acpi shutdown on all ACPI platforms. * grub-core/Makefile.core.def (halt): Inlude commands/acpihalt.c on coreboo, multiboot and EFI. * grub-core/commands/acpihalt.c (get_sleep_type): Add missing casts. (grub_acpi_halt): Likewise. * grub-core/commands/i386/pc/halt.c (grub_halt): Call grub_acpi_halt. (grub_cmd_halt): Don't call grub_acpi_halt directly. * grub-core/lib/efi/halt.c (grub_halt): Call grub_acpi_halt. * grub-core/lib/i386/halt.c (grub_halt) [GRUB_MACHINE_COREBOOT || GRUB_MACHINE_MULTIBOOT]: Likewise. --- diff --git a/ChangeLog b/ChangeLog index 8b959c0f4..555ed7711 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2010-09-13 Vladimir Serbinenko + + Enable acpi shutdown on all ACPI platforms. + + * grub-core/Makefile.core.def (halt): Inlude commands/acpihalt.c + on coreboo, multiboot and EFI. + * grub-core/commands/acpihalt.c (get_sleep_type): Add missing casts. + (grub_acpi_halt): Likewise. + * grub-core/commands/i386/pc/halt.c (grub_halt): Call grub_acpi_halt. + (grub_cmd_halt): Don't call grub_acpi_halt directly. + * grub-core/lib/efi/halt.c (grub_halt): Call grub_acpi_halt. + * grub-core/lib/i386/halt.c (grub_halt) + [GRUB_MACHINE_COREBOOT || GRUB_MACHINE_MULTIBOOT]: Likewise. + 2010-09-13 Vladimir Serbinenko * grub-core/commands/iorw.c (grub_cmd_read): Declare buf in smallest diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index 902ab48a8..05890d248 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -521,6 +521,9 @@ module = { nopc = commands/halt.c; i386_pc = commands/i386/pc/halt.c; i386_pc = commands/acpihalt.c; + i386_coreboot = commands/acpihalt.c; + i386_multiboot = commands/acpihalt.c; + x86_efi = commands/acpihalt.c; i386_multiboot = lib/i386/halt.c; i386_coreboot = lib/i386/halt.c; i386_qemu = lib/i386/halt.c; diff --git a/grub-core/commands/acpihalt.c b/grub-core/commands/acpihalt.c index 2ba15468b..0cd32f389 100644 --- a/grub-core/commands/acpihalt.c +++ b/grub-core/commands/acpihalt.c @@ -144,8 +144,8 @@ get_sleep_type (grub_uint8_t *table, grub_uint8_t *end) { int add; prev = ptr; - grub_dprintf ("acpi", "Opcode %x\n", *ptr); - grub_dprintf ("acpi", "Tell %x\n", ptr - table); + grub_dprintf ("acpi", "Opcode 0x%x\n", *ptr); + grub_dprintf ("acpi", "Tell %x\n", (unsigned) (ptr - table)); switch (*ptr) { case GRUB_ACPI_OPCODE_EXTOP: @@ -225,19 +225,19 @@ grub_acpi_halt (void) if (!rsdp1) return; - rsdt = (struct grub_acpi_table_header *) rsdp1->rsdt_addr; + rsdt = (struct grub_acpi_table_header *) (grub_addr_t) rsdp1->rsdt_addr; for (entry_ptr = (grub_uint32_t *) (rsdt + 1); entry_ptr < (grub_uint32_t *) (((grub_uint8_t *) rsdt) + rsdt->length); entry_ptr++) { - if (grub_memcmp ((void *)*entry_ptr, "FACP", 4) == 0) + if (grub_memcmp ((void *) (grub_addr_t) *entry_ptr, "FACP", 4) == 0) { grub_uint32_t port; struct grub_acpi_fadt *fadt - = ((struct grub_acpi_fadt *) *entry_ptr); + = ((struct grub_acpi_fadt *) (grub_addr_t) *entry_ptr); struct grub_acpi_table_header *dsdt - = (struct grub_acpi_table_header *) fadt->dsdt_addr; + = (struct grub_acpi_table_header *) (grub_addr_t) fadt->dsdt_addr; int sleep_type = -1; port = fadt->pm1a; diff --git a/grub-core/commands/i386/pc/halt.c b/grub-core/commands/i386/pc/halt.c index 8afae8eb7..44a88bb05 100644 --- a/grub-core/commands/i386/pc/halt.c +++ b/grub-core/commands/i386/pc/halt.c @@ -47,6 +47,8 @@ grub_halt (int no_apm) { struct grub_bios_int_registers regs; + grub_acpi_halt (); + if (no_apm) stop (); @@ -102,8 +104,6 @@ grub_cmd_halt (grub_extcmd_context_t ctxt, struct grub_arg_list *state = ctxt->state; int no_apm = 0; - grub_acpi_halt (); - if (state[0].set) no_apm = 1; grub_halt (no_apm); diff --git a/grub-core/lib/efi/halt.c b/grub-core/lib/efi/halt.c index ed3e1e1c0..c19536897 100644 --- a/grub-core/lib/efi/halt.c +++ b/grub-core/lib/efi/halt.c @@ -22,11 +22,13 @@ #include #include #include +#include void grub_halt (void) { grub_machine_fini (); + grub_acpi_halt (); efi_call_4 (grub_efi_system_table->runtime_services->reset_system, GRUB_EFI_RESET_SHUTDOWN, GRUB_EFI_SUCCESS, 0, NULL); diff --git a/grub-core/lib/i386/halt.c b/grub-core/lib/i386/halt.c index 74e0c7301..15c4ba0d6 100644 --- a/grub-core/lib/i386/halt.c +++ b/grub-core/lib/i386/halt.c @@ -18,6 +18,7 @@ #include #include +#include const char bochs_shutdown[] = "Shutdown"; @@ -40,6 +41,10 @@ grub_halt (void) { unsigned int i; +#if defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_MULTIBOOT) + grub_acpi_halt (); +#endif + /* Disable interrupts. */ __asm__ __volatile__ ("cli");