diff options
author | Keir Fraser <keir@xensource.com> | 2007-09-26 09:14:33 +0100 |
---|---|---|
committer | Keir Fraser <keir@xensource.com> | 2007-09-26 09:14:33 +0100 |
commit | ebe41ed23dd74a268aca04bf8b6ffb231efeb8ac (patch) | |
tree | 1dc706f25d9b6edea5daaea83b051a77badd8bfb /tools | |
parent | f0acc4f6f1cda745b2be66256f568e950cd2ec55 (diff) | |
download | xen-ebe41ed23dd74a268aca04bf8b6ffb231efeb8ac.tar.gz xen-ebe41ed23dd74a268aca04bf8b6ffb231efeb8ac.tar.bz2 xen-ebe41ed23dd74a268aca04bf8b6ffb231efeb8ac.zip |
hvm: Improve tcgbios code for finding ACPI RSDP.
Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/firmware/rombios/32bit/tcgbios/tcgbios.c | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/tools/firmware/rombios/32bit/tcgbios/tcgbios.c b/tools/firmware/rombios/32bit/tcgbios/tcgbios.c index e4483982c4..c9b10f8327 100644 --- a/tools/firmware/rombios/32bit/tcgbios/tcgbios.c +++ b/tools/firmware/rombios/32bit/tcgbios/tcgbios.c @@ -260,31 +260,44 @@ uint8_t acpi_validate_entry(struct acpi_header *hdr) } +/* + * Search for the RSDP ACPI table in the memory starting at addr and + * ending at addr + len - 1. + */ +static struct acpi_20_rsdp *find_rsdp(const void *start, unsigned int len) +{ + char *rsdp = (char *)start; + char *end = rsdp + len; + /* scan memory in steps of 16 bytes */ + while (rsdp < end) { + /* check for expected string */ + if (!strncmp( rsdp, "RSD PTR ", 8)) + return (struct acpi_20_rsdp *)rsdp; + rsdp += 0x10; + } + return 0; +} + void tcpa_acpi_init(void) { struct acpi_20_rsdt *rsdt; - uint32_t length; struct acpi_20_tcpa *tcpa = (void *)0; - uint16_t found = 0; - uint16_t rsdp_off; + struct acpi_20_rsdp *rsdp; + uint32_t length; uint16_t off; - struct acpi_20_rsdp *rsdp = (void *)0; + int found = 0; + uint16_t ebda_seg; if (MA_IsTPMPresent() == 0) { return; } - /* scan memory in steps of 16 bytes in the ACPI_SEGMENT segment */ - found = 0; - for (rsdp_off = 0; rsdp_off < 0xfff0; rsdp_off += 0x10) { - char *_rsdp = (char *)(ACPI_SEGMENT << 4); - /* check for expected string */ - if (!strncmp( &_rsdp[rsdp_off], "RSD PTR ", 8)) { - found = 1; - rsdp = (struct acpi_20_rsdp *)&_rsdp[rsdp_off]; - break; - } - } + /* RSDP in EBDA? */ + ebda_seg = *(uint16_t *)ADDR_FROM_SEG_OFF(0x40, 0xe); + rsdp = find_rsdp((void *)(ebda_seg << 16), 1024); + + if (!rsdp) + rsdp = find_rsdp((void *)(ACPI_SEGMENT << 4), 0x20000); if (rsdp) { uint32_t ctr = 0; |