void grub_acpi_halt (void) { struct grub_acpi_rsdp_v20 *rsdp2; struct grub_acpi_rsdp_v10 *rsdp1; struct grub_acpi_table_header *rsdt; grub_uint32_t *entry_ptr; rsdp2 = grub_acpi_get_rsdpv2 (); if (rsdp2) rsdp1 = &(rsdp2->rsdpv1); else rsdp1 = grub_acpi_get_rsdpv1 (); grub_dprintf ("acpi", "rsdp1=%p\n", rsdp1); if (!rsdp1) return; 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 *) (grub_addr_t) *entry_ptr, "FACP", 4) == 0) { grub_uint32_t port; struct grub_acpi_fadt *fadt = ((struct grub_acpi_fadt *) (grub_addr_t) *entry_ptr); struct grub_acpi_table_header *dsdt = (struct grub_acpi_table_header *) (grub_addr_t) fadt->dsdt_addr; int sleep_type = -1; port = fadt->pm1a; grub_dprintf ("acpi", "PM1a port=%x\n", port); if (grub_memcmp (dsdt->signature, "DSDT", sizeof (dsdt->signature)) != 0) break; sleep_type = get_sleep_type ((grub_uint8_t *) dsdt, (grub_uint8_t *) dsdt + dsdt->length); if (sleep_type < 0 || sleep_type >= 8) break; grub_dprintf ("acpi", "SLP_TYP = %d, port = 0x%x\n", sleep_type, port); grub_outw (GRUB_ACPI_SLP_EN | (sleep_type << GRUB_ACPI_SLP_TYP_OFFSET), port & 0xffff); } } grub_millisleep (1500); /* TRANSLATORS: It's computer shutdown using ACPI, not disabling ACPI. */ grub_puts_ (N_("ACPI shutdown failed")); }
void approximateDelay (int milliseconds) { if (milliseconds > 0) { #if defined(__MINGW32__) Sleep(milliseconds); #elif defined(__MSDOS__) tsr_usleep(milliseconds * USECS_PER_MSEC); #elif defined (GRUB_RUNTIME) grub_millisleep(milliseconds); #elif defined(HAVE_NANOSLEEP) const struct timespec timeout = { .tv_sec = milliseconds / MSECS_PER_SEC, .tv_nsec = (milliseconds % MSECS_PER_SEC) * NSECS_PER_MSEC }; if (nanosleep(&timeout, NULL) == -1) { if (errno != EINTR) logSystemError("nanosleep"); } #elif defined(HAVE_SYS_POLL_H) if (poll(NULL, 0, milliseconds) == -1) { if (errno != EINTR) logSystemError("poll"); } #elif defined(HAVE_SELECT) struct timeval timeout = { .tv_sec = milliseconds / MSECS_PER_SEC, .tv_usec = (milliseconds % MSECS_PER_SEC) * USECS_PER_MSEC }; if (select(0, NULL, NULL, NULL, &timeout) == -1) { if (errno != EINTR) logSystemError("select"); } #endif /* delay */ }
static grub_err_t grub_cmd_sleep (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; int n; if (argc != 1) return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing operand"); n = grub_strtoul (args[0], 0, 10); if (n == 0) { /* Either `0' or broken input. */ return 0; } pos = grub_term_save_pos (); for (; n; n--) { if (state[0].set) do_print (n); if (state[1].set) { if (grub_interruptible_millisleep (1000)) return 1; } else grub_millisleep (1000); } if (state[0].set) do_print (0); return 0; }
void grub_acpi_halt (void) { struct grub_acpi_rsdp_v20 *rsdp2; struct grub_acpi_rsdp_v10 *rsdp1; struct grub_acpi_table_header *rsdt; grub_uint32_t *entry_ptr; grub_uint32_t port = 0; int sleep_type = -1; rsdp2 = grub_acpi_get_rsdpv2 (); if (rsdp2) rsdp1 = &(rsdp2->rsdpv1); else rsdp1 = grub_acpi_get_rsdpv1 (); grub_dprintf ("acpi", "rsdp1=%p\n", rsdp1); if (!rsdp1) return; rsdt = (struct grub_acpi_table_header *) io_map_cached (rsdp1->rsdt_addr, sizeof *rsdt); rsdt = (struct grub_acpi_table_header *) io_map_cached (rsdp1->rsdt_addr, rsdt->length); 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 *) io_map_cached (*entry_ptr, 4), "FACP", 4) == 0) { struct grub_acpi_fadt *fadt = (struct grub_acpi_fadt *) io_map_cached (*entry_ptr, sizeof *fadt); struct grub_acpi_table_header *dsdt = (struct grub_acpi_table_header *) io_map_cached (fadt->dsdt_addr, sizeof *dsdt); grub_uint8_t *buf = (grub_uint8_t *) io_map_cached (fadt->dsdt_addr, dsdt->length); port = fadt->pm1a; grub_dprintf ("acpi", "PM1a port=%x\n", port); if (grub_memcmp (dsdt->signature, "DSDT", sizeof (dsdt->signature)) == 0 && sleep_type < 0) sleep_type = get_sleep_type (buf, NULL, buf + dsdt->length, NULL, 0); } else if (grub_memcmp ((void *) io_map_cached (*entry_ptr, 4), "SSDT", 4) == 0 && sleep_type < 0) { struct grub_acpi_table_header *ssdt = (struct grub_acpi_table_header *) (grub_addr_t) io_map_cached (*entry_ptr, sizeof *ssdt); grub_uint8_t *buf = (grub_uint8_t *) io_map_cached (*entry_ptr, ssdt->length); grub_dprintf ("acpi", "SSDT = %p\n", ssdt); sleep_type = get_sleep_type (buf, NULL, buf + ssdt->length, NULL, 0); } } grub_dprintf ("acpi", "SLP_TYP = %d, port = 0x%x\n", sleep_type, port); if (port && sleep_type >= 0 && sleep_type < 8) grub_outw (GRUB_ACPI_SLP_EN | (sleep_type << GRUB_ACPI_SLP_TYP_OFFSET), port & 0xffff); grub_millisleep (1500); /* TRANSLATORS: It's computer shutdown using ACPI, not disabling ACPI. */ grub_puts_ (N_("ACPI shutdown failed")); }