Use the correct location of the EBDA for searching for the RSDP.

The EBDA is the 1 KB area addressed by the 16 bit pointer at 0x40E.

Pointed out by:	robert.moore AT intel.com
This commit is contained in:
Nate Lawson 2004-05-25 05:52:48 +00:00
parent 3ffbc0cd8e
commit 2c0d74e8e8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=129702
3 changed files with 40 additions and 26 deletions

View File

@ -84,22 +84,24 @@ biosacpi_detect(void)
} }
/* /*
* Find the RSDP in low memory. * Find the RSDP in low memory. See section 5.2.2 of the ACPI spec.
*/ */
static RSDP_DESCRIPTOR * static RSDP_DESCRIPTOR *
biosacpi_find_rsdp(void) biosacpi_find_rsdp(void)
{ {
RSDP_DESCRIPTOR *rsdp; RSDP_DESCRIPTOR *rsdp;
uint16_t *addr;
/* search the EBDA */ /* EBDA is the 1 KB addressed by the 16 bit pointer at 0x40E. */
if ((rsdp = biosacpi_search_rsdp((char *)0, 0x400)) != NULL) addr = (uint16_t *)0x40E;
return(rsdp); if ((rsdp = biosacpi_search_rsdp((char *)(*addr << 4), 0x400)) != NULL)
return (rsdp);
/* search the BIOS space */ /* Check the upper memory BIOS space, 0xe0000 - 0xfffff. */
if ((rsdp = biosacpi_search_rsdp((char *)0xe0000, 0x20000)) != NULL) if ((rsdp = biosacpi_search_rsdp((char *)0xe0000, 0x20000)) != NULL)
return(rsdp); return (rsdp);
return(NULL); return (NULL);
} }
static RSDP_DESCRIPTOR * static RSDP_DESCRIPTOR *

View File

@ -121,6 +121,34 @@ acpi_get_rsdp(u_long addr)
return (acpi_map_physical(addr, len)); return (acpi_map_physical(addr, len));
} }
static struct ACPIrsdp *
acpi_scan_rsd_ptr(void)
{
#if defined(__i386__)
struct ACPIrsdp *rsdp;
u_long addr, end;
/*
* On ia32, scan physical memory for the RSD PTR if above failed.
* According to section 5.2.2 of the ACPI spec, we only consider
* two regions for the base address:
* 1. EBDA (1 KB area addressed by the 16 bit pointer at 0x40E
* 2. High memory (0xE0000 - 0xFFFFF)
*/
addr = RSDP_EBDA_PTR;
pread(acpi_mem_fd, &addr, sizeof(uint16_t), addr);
addr <<= 4;
end = addr + RSDP_EBDA_SIZE;
for (; addr < end; addr += 16)
if ((rsdp = acpi_get_rsdp(addr)) != NULL)
return (rsdp);
for (addr = RSDP_HI_START; addr < RSDP_HI_END; addr += 16)
if ((rsdp = acpi_get_rsdp(addr)) != NULL)
return (rsdp);
#endif /* __i386__ */
return (NULL);
}
/* /*
* Public interfaces * Public interfaces
*/ */
@ -143,23 +171,7 @@ acpi_find_rsd_ptr(void)
machdep_acpi_root); machdep_acpi_root);
} }
#if defined(__i386__) return (acpi_scan_rsd_ptr());
/*
* On ia32, scan physical memory for the RSD PTR if above failed.
* According to section 5.2.2 of the ACPI spec, we only consider
* two regions for the base address:
* 1. EBDA (0x0 - 0x3FF)
* 2. High memory (0xE0000 - 0xFFFFF)
*/
for (addr = RSDP_EBDA_START; addr < RSDP_EBDA_END; addr += 16)
if ((rsdp = acpi_get_rsdp(addr)) != NULL)
return (rsdp);
for (addr = RSDP_HI_START; addr < RSDP_HI_END; addr += 16)
if ((rsdp = acpi_get_rsdp(addr)) != NULL)
return (rsdp);
#endif
return (NULL);
} }
void * void *

View File

@ -299,8 +299,8 @@ struct ECDTbody {
* 1. EBDA (0x0 - 0x3FF) * 1. EBDA (0x0 - 0x3FF)
* 2. High memory (0xE0000 - 0xFFFFF) * 2. High memory (0xE0000 - 0xFFFFF)
*/ */
#define RSDP_EBDA_START 0 #define RSDP_EBDA_PTR 0x40E
#define RSDP_EBDA_END (0x400 - sizeof(struct ACPIrsdp)) #define RSDP_EBDA_SIZE (1024 - sizeof(struct ACPIrsdp))
#define RSDP_HI_START 0xE0000 #define RSDP_HI_START 0xE0000
#define RSDP_HI_END (0x100000 - sizeof(struct ACPIrsdp)) #define RSDP_HI_END (0x100000 - sizeof(struct ACPIrsdp))