Print this page
12195 acpidump failed under EFI

*** 24,34 **** * Use is subject to license terms. * * Copyright (c) 2010, Intel Corporation. * All rights reserved. * ! * Copyright (c) 2019, Joyent, Inc. */ /* * This file contains the functionality that mimics the boot operations * on SPARC systems or the old boot.bin/multiboot programs on x86 systems. --- 24,34 ---- * Use is subject to license terms. * * Copyright (c) 2010, Intel Corporation. * All rights reserved. * ! * Copyright 2020 Joyent, Inc. */ /* * This file contains the functionality that mimics the boot operations * on SPARC systems or the old boot.bin/multiboot programs on x86 systems.
*** 2269,2334 **** /* * Scan memory range for an RSDP; * see ACPI 3.0 Spec, 5.2.5.1 */ static ACPI_TABLE_RSDP * ! scan_rsdp(paddr_t start, paddr_t end) { ! ssize_t len = end - start; caddr_t ptr; ! ptr = vmap_phys(len, start); while (len > 0) { if (strncmp(ptr, ACPI_SIG_RSDP, strlen(ACPI_SIG_RSDP)) == 0 && ! valid_rsdp((ACPI_TABLE_RSDP *)ptr)) return ((ACPI_TABLE_RSDP *)ptr); ptr += ACPI_RSDP_SCAN_STEP; len -= ACPI_RSDP_SCAN_STEP; } return (NULL); } /* ! * Refer to ACPI 3.0 Spec, section 5.2.5.1 to understand this function */ static ACPI_TABLE_RSDP * ! find_rsdp() { ! ACPI_TABLE_RSDP *rsdp; ! uint64_t rsdp_val = 0; ! uint16_t *ebda_seg; ! paddr_t ebda_addr; - /* check for "acpi-root-tab" property */ if (do_bsys_getproplen(NULL, "acpi-root-tab") == sizeof (uint64_t)) { ! (void) do_bsys_getprop(NULL, "acpi-root-tab", &rsdp_val); ! if (rsdp_val != 0) { ! rsdp = scan_rsdp(rsdp_val, rsdp_val + sizeof (*rsdp)); ! if (rsdp != NULL) { ! if (kbm_debug) { ! bop_printf(NULL, ! "Using RSDP from bootloader: " ! "0x%p\n", (void *)rsdp); } ! return (rsdp); } } } ! /* ! * Get the EBDA segment and scan the first 1K ! */ ! ebda_seg = (uint16_t *)vmap_phys(sizeof (uint16_t), ! ACPI_EBDA_PTR_LOCATION); ! ebda_addr = *ebda_seg << 4; ! rsdp = scan_rsdp(ebda_addr, ebda_addr + ACPI_EBDA_WINDOW_SIZE); ! if (rsdp == NULL) ! /* if EBDA doesn't contain RSDP, look in BIOS memory */ ! rsdp = scan_rsdp(ACPI_HI_RSDP_WINDOW_BASE, ! ACPI_HI_RSDP_WINDOW_BASE + ACPI_HI_RSDP_WINDOW_SIZE); return (rsdp); } static ACPI_TABLE_HEADER * map_fw_table(paddr_t table_addr) --- 2269,2362 ---- /* * Scan memory range for an RSDP; * see ACPI 3.0 Spec, 5.2.5.1 */ static ACPI_TABLE_RSDP * ! scan_rsdp(paddr_t *paddrp, size_t len) { ! paddr_t paddr = *paddrp; caddr_t ptr; ! ptr = vmap_phys(len, paddr); ! while (len > 0) { if (strncmp(ptr, ACPI_SIG_RSDP, strlen(ACPI_SIG_RSDP)) == 0 && ! valid_rsdp((ACPI_TABLE_RSDP *)ptr)) { ! *paddrp = paddr; return ((ACPI_TABLE_RSDP *)ptr); + } ptr += ACPI_RSDP_SCAN_STEP; + paddr += ACPI_RSDP_SCAN_STEP; len -= ACPI_RSDP_SCAN_STEP; } return (NULL); } /* ! * Locate the ACPI RSDP. We search in a particular order: ! * ! * - If the bootloader told us the location of the RSDP (via the EFI system ! * table), try that first. ! * - Otherwise, look in the EBDA and BIOS memory as per ACPI 5.2.5.1 (legacy ! * case). ! * - Finally, our bootloader may have a copy of the RSDP in its info: this might ! * get freed after boot, so we always prefer to find the original RSDP first. ! * ! * Once found, we set acpi-root-tab property (a physical address) for the ! * benefit of acpica, acpidump etc. */ + static ACPI_TABLE_RSDP * ! find_rsdp(struct xboot_info *xbp) { ! ACPI_TABLE_RSDP *rsdp = NULL; ! paddr_t paddr = 0; if (do_bsys_getproplen(NULL, "acpi-root-tab") == sizeof (uint64_t)) { ! (void) do_bsys_getprop(NULL, "acpi-root-tab", &paddr); ! rsdp = scan_rsdp(&paddr, sizeof (*rsdp)); } ! ! #ifndef __xpv ! if (rsdp == NULL && xbp->bi_acpi_rsdp != NULL) { ! paddr = (uintptr_t)xbp->bi_acpi_rsdp; ! rsdp = scan_rsdp(&paddr, sizeof (*rsdp)); } + #endif + + if (rsdp == NULL) { + uint16_t *ebda_seg = (uint16_t *)vmap_phys(sizeof (uint16_t), + ACPI_EBDA_PTR_LOCATION); + paddr = *ebda_seg << 4; + rsdp = scan_rsdp(&paddr, ACPI_EBDA_WINDOW_SIZE); } + + if (rsdp == NULL) { + paddr = ACPI_HI_RSDP_WINDOW_BASE; + rsdp = scan_rsdp(&paddr, ACPI_HI_RSDP_WINDOW_SIZE); } ! #ifndef __xpv ! if (rsdp == NULL && xbp->bi_acpi_rsdp_copy != NULL) { ! paddr = (uintptr_t)xbp->bi_acpi_rsdp_copy; ! rsdp = scan_rsdp(&paddr, sizeof (*rsdp)); ! } ! #endif ! ! if (rsdp == NULL) { ! bop_printf(NULL, "no RSDP found!\n"); ! return (NULL); ! } ! ! if (kbm_debug) ! bop_printf(NULL, "RSDP found at physical 0x%lx\n", paddr); ! ! if (do_bsys_getproplen(NULL, "acpi-root-tab") != sizeof (uint64_t)) ! bsetprop64("acpi-root-tab", paddr); ! return (rsdp); } static ACPI_TABLE_HEADER * map_fw_table(paddr_t table_addr)
*** 2344,2360 **** tp = (ACPI_TABLE_HEADER *)vmap_phys(tp->Length, table_addr); return (tp); } static ACPI_TABLE_HEADER * ! find_fw_table(char *signature) { static int revision = 0; static ACPI_TABLE_XSDT *xsdt; static int len; paddr_t xsdt_addr; - ACPI_TABLE_RSDP *rsdp; ACPI_TABLE_HEADER *tp; paddr_t table_addr; int n; if (strlen(signature) != ACPI_NAME_SIZE) --- 2372,2387 ---- tp = (ACPI_TABLE_HEADER *)vmap_phys(tp->Length, table_addr); return (tp); } static ACPI_TABLE_HEADER * ! find_fw_table(ACPI_TABLE_RSDP *rsdp, char *signature) { static int revision = 0; static ACPI_TABLE_XSDT *xsdt; static int len; paddr_t xsdt_addr; ACPI_TABLE_HEADER *tp; paddr_t table_addr; int n; if (strlen(signature) != ACPI_NAME_SIZE)
*** 2368,2378 **** * 0 or 1, use the RSDT and set internal revision to 1; if it is 2, * use the XSDT. If the XSDT address is 0, though, fall back to * revision 1 and use the RSDT. */ if (revision == 0) { ! if ((rsdp = find_rsdp()) != NULL) { revision = rsdp->Revision; /* * ACPI 6.0 states that current revision is 2 * from acpi_table_rsdp definition: * Must be (0) for ACPI 1.0 or (2) for ACPI 2.0+ --- 2395,2407 ---- * 0 or 1, use the RSDT and set internal revision to 1; if it is 2, * use the XSDT. If the XSDT address is 0, though, fall back to * revision 1 and use the RSDT. */ if (revision == 0) { ! if (rsdp == NULL) ! return (NULL); ! revision = rsdp->Revision; /* * ACPI 6.0 states that current revision is 2 * from acpi_table_rsdp definition: * Must be (0) for ACPI 1.0 or (2) for ACPI 2.0+
*** 2401,2411 **** default: /* unknown revision */ revision = 0; break; } ! } if (revision == 0) return (NULL); /* cache the XSDT info */ xsdt = (ACPI_TABLE_XSDT *)map_fw_table(xsdt_addr); --- 2430,2440 ---- default: /* unknown revision */ revision = 0; break; } ! if (revision == 0) return (NULL); /* cache the XSDT info */ xsdt = (ACPI_TABLE_XSDT *)map_fw_table(xsdt_addr);
*** 2838,2847 **** --- 2867,2877 ---- /*ARGSUSED*/ static void build_firmware_properties(struct xboot_info *xbp) { ACPI_TABLE_HEADER *tp = NULL; + ACPI_TABLE_RSDP *rsdp; #ifndef __xpv if (xbp->bi_uefi_arch == XBI_UEFI_ARCH_64) { bsetprops("efi-systype", "64"); bsetprop64("efi-systab",
*** 2854,2893 **** (uint64_t)(uintptr_t)xbp->bi_uefi_systab); if (kbm_debug) bop_printf(NULL, "32-bit UEFI detected.\n"); } - if (xbp->bi_acpi_rsdp != NULL) { - bsetprop64("acpi-root-tab", - (uint64_t)(uintptr_t)xbp->bi_acpi_rsdp); - } - if (xbp->bi_smbios != NULL) { bsetprop64("smbios-address", (uint64_t)(uintptr_t)xbp->bi_smbios); } ! if ((tp = find_fw_table(ACPI_SIG_MSCT)) != NULL) msct_ptr = process_msct((ACPI_TABLE_MSCT *)tp); else msct_ptr = NULL; ! if ((tp = find_fw_table(ACPI_SIG_MADT)) != NULL) process_madt((ACPI_TABLE_MADT *)tp); if ((srat_ptr = (ACPI_TABLE_SRAT *) ! find_fw_table(ACPI_SIG_SRAT)) != NULL) process_srat(srat_ptr); ! if (slit_ptr = (ACPI_TABLE_SLIT *)find_fw_table(ACPI_SIG_SLIT)) process_slit(slit_ptr); ! tp = find_fw_table(ACPI_SIG_MCFG); #else /* __xpv */ enumerate_xen_cpus(); if (DOMAIN_IS_INITDOMAIN(xen_info)) ! tp = find_fw_table(ACPI_SIG_MCFG); #endif /* __xpv */ if (tp != NULL) process_mcfg((ACPI_TABLE_MCFG *)tp); } --- 2884,2920 ---- (uint64_t)(uintptr_t)xbp->bi_uefi_systab); if (kbm_debug) bop_printf(NULL, "32-bit UEFI detected.\n"); } if (xbp->bi_smbios != NULL) { bsetprop64("smbios-address", (uint64_t)(uintptr_t)xbp->bi_smbios); } ! rsdp = find_rsdp(xbp); ! ! if ((tp = find_fw_table(rsdp, ACPI_SIG_MSCT)) != NULL) msct_ptr = process_msct((ACPI_TABLE_MSCT *)tp); else msct_ptr = NULL; ! if ((tp = find_fw_table(rsdp, ACPI_SIG_MADT)) != NULL) process_madt((ACPI_TABLE_MADT *)tp); if ((srat_ptr = (ACPI_TABLE_SRAT *) ! find_fw_table(rsdp, ACPI_SIG_SRAT)) != NULL) process_srat(srat_ptr); ! if (slit_ptr = (ACPI_TABLE_SLIT *)find_fw_table(rsdp, ACPI_SIG_SLIT)) process_slit(slit_ptr); ! tp = find_fw_table(rsdp, ACPI_SIG_MCFG); #else /* __xpv */ enumerate_xen_cpus(); if (DOMAIN_IS_INITDOMAIN(xen_info)) ! tp = find_fw_table(rsdp, ACPI_SIG_MCFG); #endif /* __xpv */ if (tp != NULL) process_mcfg((ACPI_TABLE_MCFG *)tp); }