static void sdt_probe(void) { const struct acpi_rsdp *rsdp; vm_size_t mapsz; uint8_t *ptr; if (ebda_addr != 0) { mapsz = ACPI_RSDP_EBDA_MAPSZ; ptr = pmap_mapdev(ebda_addr, mapsz); rsdp = sdt_rsdp_search(ptr, mapsz); if (rsdp == NULL) { SDT_VPRINTF("RSDP not in EBDA\n"); pmap_unmapdev((vm_offset_t)ptr, mapsz); ptr = NULL; mapsz = 0; } else { SDT_VPRINTF("RSDP in EBDA\n"); goto found_rsdp; } } mapsz = ACPI_RSDP_BIOS_MAPSZ; ptr = pmap_mapdev(ACPI_RSDP_BIOS_MAPADDR, mapsz); rsdp = sdt_rsdp_search(ptr, mapsz); if (rsdp == NULL) { kprintf("sdt_probe: no RSDP\n"); pmap_unmapdev((vm_offset_t)ptr, mapsz); return; } else { SDT_VPRINTF("RSDP in BIOS mem\n"); } found_rsdp: if (rsdp->rsdp_rev != 2) { sdt_search_func = sdt_search_rsdt; sdt_search_paddr = rsdp->rsdp_rsdt; } else { sdt_search_func = sdt_search_xsdt; sdt_search_paddr = rsdp->rsdp_xsdt; } pmap_unmapdev((vm_offset_t)ptr, mapsz); }
static void sdt_probe(void) { const ACPI_TABLE_RSDP *rsdp; vm_size_t mapsz; uint8_t *ptr; if (ebda_addr != 0) { mapsz = ACPI_EBDA_WINDOW_SIZE; ptr = pmap_mapdev(ebda_addr, mapsz); rsdp = sdt_rsdp_search(ptr, mapsz); if (rsdp == NULL) { SDT_VPRINTF("RSDP not in EBDA\n"); pmap_unmapdev((vm_offset_t)ptr, mapsz); ptr = NULL; mapsz = 0; } else { SDT_VPRINTF("RSDP in EBDA\n"); goto found_rsdp; } } mapsz = ACPI_HI_RSDP_WINDOW_SIZE; ptr = pmap_mapdev(ACPI_HI_RSDP_WINDOW_BASE, mapsz); rsdp = sdt_rsdp_search(ptr, mapsz); if (rsdp == NULL) { kprintf("sdt_probe: no RSDP\n"); pmap_unmapdev((vm_offset_t)ptr, mapsz); return; } else { SDT_VPRINTF("RSDP in BIOS mem\n"); } found_rsdp: if (rsdp->Revision != 2 /* || AcpiGbl_DoNotUseXsdt */) { sdt_search_func = sdt_search_rsdt; sdt_search_paddr = rsdp->RsdtPhysicalAddress; } else { sdt_search_func = sdt_search_xsdt; sdt_search_paddr = rsdp->XsdtPhysicalAddress; } pmap_unmapdev((vm_offset_t)ptr, mapsz); }