Index: sys/amd64/acpica/acpi_machdep.c =================================================================== --- sys/amd64/acpica/acpi_machdep.c (revision 364411) +++ sys/amd64/acpica/acpi_machdep.c (working copy) @@ -91,91 +91,29 @@ } /* - * Support for mapping ACPI tables during early boot. Currently this - * uses the crashdump map to map each table. However, the crashdump - * map is created in pmap_bootstrap() right after the direct map, so - * we should be able to just use pmap_mapbios() here instead. - * - * This makes the following assumptions about how we use this KVA: - * pages 0 and 1 are used to map in the header of each table found via - * the RSDT or XSDT and pages 2 to n are used to map in the RSDT or - * XSDT. This has to use 2 pages for the table headers in case a - * header spans a page boundary. - * - * XXX: We don't ensure the table fits in the available address space - * in the crashdump map. + * Map a table. First map the header to determine the table length and then map + * the entire table. */ - -/* - * Map some memory using the crashdump map. 'offset' is an offset in - * pages into the crashdump map to use for the start of the mapping. - */ static void * -table_map(vm_paddr_t pa, int offset, vm_offset_t length) +map_table(vm_paddr_t pa, const char *sig) { - vm_offset_t va, off; - void *data; - - off = pa & PAGE_MASK; - length = round_page(length + off); - pa = pa & PG_FRAME; - va = (vm_offset_t)pmap_kenter_temporary(pa, offset) + - (offset * PAGE_SIZE); - data = (void *)(va + off); - length -= PAGE_SIZE; - while (length > 0) { - va += PAGE_SIZE; - pa += PAGE_SIZE; - length -= PAGE_SIZE; - pmap_kenter(va, pa); - invlpg(va); - } - return (data); -} - -/* Unmap memory previously mapped with table_map(). */ -static void -table_unmap(void *data, vm_offset_t length) -{ - vm_offset_t va, off; - - va = (vm_offset_t)data; - off = va & PAGE_MASK; - length = round_page(length + off); - va &= ~PAGE_MASK; - while (length > 0) { - pmap_kremove(va); - invlpg(va); - va += PAGE_SIZE; - length -= PAGE_SIZE; - } -} - -/* - * Map a table at a given offset into the crashdump map. It first - * maps the header to determine the table length and then maps the - * entire table. - */ -static void * -map_table(vm_paddr_t pa, int offset, const char *sig) -{ ACPI_TABLE_HEADER *header; vm_offset_t length; void *table; - header = table_map(pa, offset, sizeof(ACPI_TABLE_HEADER)); + header = pmap_mapbios(pa, sizeof(ACPI_TABLE_HEADER)); if (strncmp(header->Signature, sig, ACPI_NAMESEG_SIZE) != 0) { - table_unmap(header, sizeof(ACPI_TABLE_HEADER)); + pmap_unmapbios((vm_offset_t)header, sizeof(ACPI_TABLE_HEADER)); return (NULL); } length = header->Length; - table_unmap(header, sizeof(ACPI_TABLE_HEADER)); - table = table_map(pa, offset, length); + pmap_unmapbios((vm_offset_t)header, sizeof(ACPI_TABLE_HEADER)); + table = pmap_mapbios(pa, length); if (ACPI_FAILURE(AcpiTbChecksum(table, length))) { if (bootverbose) printf("ACPI: Failed checksum for table %s\n", sig); #if (ACPI_CHECKSUM_ABORT) - table_unmap(table, length); + pmap_unmapbios((vm_offset_t)table, length); return (NULL); #endif } @@ -183,31 +121,19 @@ } /* - * See if a given ACPI table is the requested table. Returns the - * length of the able if it matches or zero on failure. + * See if a given ACPI table is the requested table. Returns + * one on success or zero on failure. */ static int probe_table(vm_paddr_t address, const char *sig) { ACPI_TABLE_HEADER *table; + int ret; - table = table_map(address, 0, sizeof(ACPI_TABLE_HEADER)); - if (table == NULL) { - if (bootverbose) - printf("ACPI: Failed to map table at 0x%jx\n", - (uintmax_t)address); - return (0); - } - if (bootverbose) - printf("Table '%.4s' at 0x%jx\n", table->Signature, - (uintmax_t)address); - - if (strncmp(table->Signature, sig, ACPI_NAMESEG_SIZE) != 0) { - table_unmap(table, sizeof(ACPI_TABLE_HEADER)); - return (0); - } - table_unmap(table, sizeof(ACPI_TABLE_HEADER)); - return (1); + table = pmap_mapbios(address, sizeof(ACPI_TABLE_HEADER)); + ret = strncmp(table->Signature, sig, ACPI_NAMESEG_SIZE) == 0; + pmap_unmapbios((vm_offset_t)table, sizeof(ACPI_TABLE_HEADER)); + return (ret); } /* @@ -218,7 +144,7 @@ acpi_map_table(vm_paddr_t pa, const char *sig) { - return (map_table(pa, 0, sig)); + return (map_table(pa, sig)); } /* Unmap a table previously mapped via acpi_map_table(). */ @@ -228,7 +154,7 @@ ACPI_TABLE_HEADER *header; header = (ACPI_TABLE_HEADER *)table; - table_unmap(table, header->Length); + pmap_unmapbios((vm_offset_t)table, header->Length); } /* @@ -265,9 +191,7 @@ /* * For ACPI >= 2.0, use the XSDT if it is available. - * Otherwise, use the RSDT. We map the XSDT or RSDT at page 2 - * in the crashdump area. Pages 0 and 1 are used to map in the - * headers of candidate ACPI tables. + * Otherwise, use the RSDT. */ addr = 0; if (rsdp->Revision >= 2 && rsdp->XsdtPhysicalAddress != 0) { @@ -281,7 +205,7 @@ printf("ACPI: RSDP failed extended checksum\n"); return (0); } - xsdt = map_table(rsdp->XsdtPhysicalAddress, 2, ACPI_SIG_XSDT); + xsdt = map_table(rsdp->XsdtPhysicalAddress, ACPI_SIG_XSDT); if (xsdt == NULL) { if (bootverbose) printf("ACPI: Failed to map XSDT\n"); @@ -296,7 +220,7 @@ } acpi_unmap_table(xsdt); } else { - rsdt = map_table(rsdp->RsdtPhysicalAddress, 2, ACPI_SIG_RSDT); + rsdt = map_table(rsdp->RsdtPhysicalAddress, ACPI_SIG_RSDT); if (rsdt == NULL) { if (bootverbose) printf("ACPI: Failed to map RSDT\n"); @@ -324,7 +248,7 @@ * Verify that we can map the full table and that its checksum is * correct, etc. */ - table = map_table(addr, 0, sig); + table = map_table(addr, sig); if (table == NULL) return (0); acpi_unmap_table(table); Index: sys/dev/acpica/acpi_apei.c =================================================================== --- sys/dev/acpica/acpi_apei.c (revision 364411) +++ sys/dev/acpica/acpi_apei.c (working copy) @@ -550,14 +550,22 @@ { device_t child; int found; + ACPI_TABLE_HEADER *hest; + ACPI_STATUS status; if (acpi_disabled("apei")) return; - if (acpi_find_table(ACPI_SIG_HEST) == 0) + + /* Without HEST table we have nothing to do. */ + status = AcpiGetTable(ACPI_SIG_HEST, 0, &hest); + if (ACPI_FAILURE(status)) return; + AcpiPutTable(hest); + /* Only one APEI device can exist. */ if (devclass_get_device(apei_devclass, 0)) return; + /* Search for ACPI error device to be used. */ found = 0; AcpiWalkNamespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, @@ -564,6 +572,7 @@ 100, apei_find, NULL, NULL, (void *)&found); if (found) return; + /* If not found - create a fake one. */ child = BUS_ADD_CHILD(parent, 2, "apei", 0); if (child == NULL) @@ -573,18 +582,27 @@ static int apei_probe(device_t dev) { + ACPI_TABLE_HEADER *hest; + ACPI_STATUS status; int rv; if (acpi_disabled("apei")) return (ENXIO); - if (acpi_find_table(ACPI_SIG_HEST) == 0) - return (ENXIO); - if (acpi_get_handle(dev) != NULL) + + if (acpi_get_handle(dev) != NULL) { rv = (ACPI_ID_PROBE(device_get_parent(dev), dev, apei_ids) == NULL); - else + if (rv > 0) + return (rv); + } else rv = 0; - if (rv <= 0) - device_set_desc(dev, "Platform Error Interface"); + + /* Without HEST table we have nothing to do. */ + status = AcpiGetTable(ACPI_SIG_HEST, 0, &hest); + if (ACPI_FAILURE(status)) + return (ENXIO); + AcpiPutTable(hest); + + device_set_desc(dev, "ACPI Platform Error Interface"); return (rv); } Index: sys/i386/acpica/acpi_machdep.c =================================================================== --- sys/i386/acpica/acpi_machdep.c (revision 364411) +++ sys/i386/acpica/acpi_machdep.c (working copy) @@ -109,89 +109,29 @@ } /* - * Support for mapping ACPI tables during early boot. This abuses the - * crashdump map because the kernel cannot allocate KVA in - * pmap_mapbios() when this is used. This makes the following - * assumptions about how we use this KVA: pages 0 and 1 are used to - * map in the header of each table found via the RSDT or XSDT and - * pages 2 to n are used to map in the RSDT or XSDT. This has to use - * 2 pages for the table headers in case a header spans a page - * boundary. - * - * XXX: We don't ensure the table fits in the available address space - * in the crashdump map. + * Map a table. First map the header to determine the table length and then map + * the entire table. */ - -/* - * Map some memory using the crashdump map. 'offset' is an offset in - * pages into the crashdump map to use for the start of the mapping. - */ static void * -table_map(vm_paddr_t pa, int offset, vm_offset_t length) +map_table(vm_paddr_t pa, const char *sig) { - vm_offset_t va, off; - void *data; - - off = pa & PAGE_MASK; - length = round_page(length + off); - pa = pa & PG_FRAME; - va = (vm_offset_t)pmap_kenter_temporary(pa, offset) + - (offset * PAGE_SIZE); - data = (void *)(va + off); - length -= PAGE_SIZE; - while (length > 0) { - va += PAGE_SIZE; - pa += PAGE_SIZE; - length -= PAGE_SIZE; - pmap_kenter(va, pa); - invlpg(va); - } - return (data); -} - -/* Unmap memory previously mapped with table_map(). */ -static void -table_unmap(void *data, vm_offset_t length) -{ - vm_offset_t va, off; - - va = (vm_offset_t)data; - off = va & PAGE_MASK; - length = round_page(length + off); - va &= ~PAGE_MASK; - while (length > 0) { - pmap_kremove(va); - invlpg(va); - va += PAGE_SIZE; - length -= PAGE_SIZE; - } -} - -/* - * Map a table at a given offset into the crashdump map. It first - * maps the header to determine the table length and then maps the - * entire table. - */ -static void * -map_table(vm_paddr_t pa, int offset, const char *sig) -{ ACPI_TABLE_HEADER *header; vm_offset_t length; void *table; - header = table_map(pa, offset, sizeof(ACPI_TABLE_HEADER)); + header = pmap_mapbios(pa, sizeof(ACPI_TABLE_HEADER)); if (strncmp(header->Signature, sig, ACPI_NAMESEG_SIZE) != 0) { - table_unmap(header, sizeof(ACPI_TABLE_HEADER)); + pmap_unmapbios((vm_offset_t)header, sizeof(ACPI_TABLE_HEADER)); return (NULL); } length = header->Length; - table_unmap(header, sizeof(ACPI_TABLE_HEADER)); - table = table_map(pa, offset, length); + pmap_unmapbios((vm_offset_t)header, sizeof(ACPI_TABLE_HEADER)); + table = pmap_mapbios(pa, length); if (ACPI_FAILURE(AcpiTbChecksum(table, length))) { if (bootverbose) printf("ACPI: Failed checksum for table %s\n", sig); #if (ACPI_CHECKSUM_ABORT) - table_unmap(table, length); + pmap_unmapbios((vm_offset_t)table, length); return (NULL); #endif } @@ -199,31 +139,22 @@ } /* - * See if a given ACPI table is the requested table. Returns the - * length of the able if it matches or zero on failure. + * See if a given ACPI table is the requested table. Returns + * one on success or zero on failure. */ static int probe_table(vm_paddr_t address, const char *sig) { ACPI_TABLE_HEADER *table; + int ret; - table = table_map(address, 0, sizeof(ACPI_TABLE_HEADER)); - if (table == NULL) { - if (bootverbose) - printf("ACPI: Failed to map table at 0x%jx\n", - (uintmax_t)address); - return (0); - } + table = pmap_mapbios(address, sizeof(ACPI_TABLE_HEADER)); if (bootverbose) printf("Table '%.4s' at 0x%jx\n", table->Signature, (uintmax_t)address); - - if (strncmp(table->Signature, sig, ACPI_NAMESEG_SIZE) != 0) { - table_unmap(table, sizeof(ACPI_TABLE_HEADER)); - return (0); - } - table_unmap(table, sizeof(ACPI_TABLE_HEADER)); - return (1); + ret = strncmp(table->Signature, sig, ACPI_NAMESEG_SIZE) == 0; + pmap_unmapbios((vm_offset_t)table, sizeof(ACPI_TABLE_HEADER)); + return (ret); } /* @@ -234,7 +165,7 @@ acpi_map_table(vm_paddr_t pa, const char *sig) { - return (map_table(pa, 0, sig)); + return (map_table(pa, sig)); } /* Unmap a table previously mapped via acpi_map_table(). */ @@ -244,7 +175,7 @@ ACPI_TABLE_HEADER *header; header = (ACPI_TABLE_HEADER *)table; - table_unmap(table, header->Length); + pmap_unmapbios((vm_offset_t)table, header->Length); } /* @@ -281,9 +212,7 @@ /* * For ACPI >= 2.0, use the XSDT if it is available. - * Otherwise, use the RSDT. We map the XSDT or RSDT at page 2 - * in the crashdump area. Pages 0 and 1 are used to map in the - * headers of candidate ACPI tables. + * Otherwise, use the RSDT. */ addr = 0; if (rsdp->Revision >= 2 && rsdp->XsdtPhysicalAddress != 0) { @@ -297,7 +226,7 @@ printf("ACPI: RSDP failed extended checksum\n"); return (0); } - xsdt = map_table(rsdp->XsdtPhysicalAddress, 2, ACPI_SIG_XSDT); + xsdt = map_table(rsdp->XsdtPhysicalAddress, ACPI_SIG_XSDT); if (xsdt == NULL) { if (bootverbose) printf("ACPI: Failed to map XSDT\n"); @@ -312,7 +241,7 @@ } acpi_unmap_table(xsdt); } else { - rsdt = map_table(rsdp->RsdtPhysicalAddress, 2, ACPI_SIG_RSDT); + rsdt = map_table(rsdp->RsdtPhysicalAddress, ACPI_SIG_RSDT); if (rsdt == NULL) { if (bootverbose) printf("ACPI: Failed to map RSDT\n"); @@ -340,7 +269,7 @@ * Verify that we can map the full table and that its checksum is * correct, etc. */ - table = map_table(addr, 0, sig); + table = map_table(addr, sig); if (table == NULL) return (0); acpi_unmap_table(table);