void *find_acpi_rsdp(void) { unsigned long start = SYMBOL(zonefseg_start); unsigned long end = SYMBOL(zonefseg_end); unsigned long pos; for (pos = ALIGN(start, 0x10); pos <= ALIGN_DOWN(end, 0x10); pos += 0x10) if (get_acpi_rsdp_length((void *)pos, end - pos) >= 0) return (void *)pos; return NULL; }
void *find_acpi_rsdp(void) { extern u8 zonefseg_start[], zonefseg_end[]; unsigned long start = (unsigned long)zonefseg_start; unsigned long end = (unsigned long)zonefseg_end; unsigned long pos; for (pos = ALIGN(start, 0x10); pos <= ALIGN_DOWN(end, 0x10); pos += 0x10) if (get_acpi_rsdp_length((void *)pos, end - pos) >= 0) return (void *)pos; return NULL; }
static void copy_acpi_rsdp(void *pos) { if (RsdpAddr) return; int length = get_acpi_rsdp_length(pos, -1); if (length < 0) return; void *newpos = malloc_fseg(length); if (!newpos) { warn_noalloc(); return; } dprintf(1, "Copying ACPI RSDP from %p to %p\n", pos, newpos); memcpy(newpos, pos, length); RsdpAddr = newpos; }