Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}