FreeBSD Bugzilla – Attachment 217349 Details for
Bug 248746
panic during boot in ACPI Platform Error Interfaces
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
possible fix
diff (text/plain), 4.69 KB, created by
Mark Johnston
on 2020-08-19 18:43:41 UTC
(
hide
)
Description:
possible fix
Filename:
MIME Type:
Creator:
Mark Johnston
Created:
2020-08-19 18:43:41 UTC
Size:
4.69 KB
patch
obsolete
>commit f4cf9ded7b3b689924f44f90becd4fcd8f15d98b >Author: Mark Johnston <markjdb@gmail.com> >Date: Wed Aug 19 14:35:22 2020 -0400 > > Fix > >diff --git a/sys/amd64/acpica/acpi_machdep.c b/sys/amd64/acpica/acpi_machdep.c >index b0208360b6ab..6ca9eb6a2993 100644 >--- a/sys/amd64/acpica/acpi_machdep.c >+++ b/sys/amd64/acpica/acpi_machdep.c >@@ -91,70 +91,8 @@ acpi_machdep_quirks(int *quirks) > } > > /* >- * 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 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) >-{ >- 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. >+ * Map a table. First map the header to determine the table length and then map >+ * the entire table. > */ > static void * > map_table(vm_paddr_t pa, int offset, const char *sig) >@@ -163,19 +101,19 @@ map_table(vm_paddr_t pa, int offset, const char *sig) > 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 > } >@@ -190,24 +128,15 @@ 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); > } > > /* >@@ -228,7 +157,7 @@ acpi_unmap_table(void *table) > ACPI_TABLE_HEADER *header; > > header = (ACPI_TABLE_HEADER *)table; >- table_unmap(table, header->Length); >+ pmap_unmapbios((vm_offset_t)table, header->Length); > } > > /* >@@ -265,9 +194,7 @@ acpi_find_table(const char *sig) > > /* > * 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) {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 248746
:
217331
|
217332
|
217333
|
217334
|
217343
|
217346
|
217347
|
217348
| 217349 |
217353
|
217358
|
217405