static virtual_addr_t __init find_root_system_descriptor(void) { struct acpi_search_area *carea = &acpi_areas[0]; virtual_addr_t area_map; virtual_addr_t rsdp_base = 0; virtual_size_t sz = 0; while (carea->area_name) { vmm_printf("Search for RSDP in %s... ", carea->area_name); sz = carea->phys_end - carea->phys_start; area_map = vmm_host_memmap(carea->phys_start, sz, VMM_MEMORY_FLAGS_NORMAL_NOCACHE); BUG_ON((void *)area_map == NULL); if ((rsdp_base = locate_rsdp_in_area(area_map, sz)) != 0) { vmm_printf("found.\n"); break; } rsdp_base = 0; carea++; vmm_host_memunmap(area_map); vmm_printf("not found.\n"); } if (likely(rsdp_base)) vmm_printf("RSDP Base: 0x%x\n", rsdp_base); return rsdp_base; }
static virtual_addr_t find_root_system_descriptor(void) { struct acpi_search_area *carea = &acpi_areas[0]; virtual_addr_t area_map; virtual_addr_t rsdp_base = 0; while (carea->area_name) { area_map = vmm_host_iomap(carea->phys_start, (carea->phys_end - carea->phys_start)); BUG_ON((void *)area_map == NULL, "Failed to map the %s for RSDP search.\n", carea->area_name); if ((rsdp_base = locate_rsdp_in_area(area_map, (carea->phys_end - carea->phys_start))) != 0) { break; } rsdp_base = 0; carea++; vmm_host_iounmap(area_map, (carea->phys_end - carea->phys_start)); } return rsdp_base; }