aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorKeir Fraser <keir@xensource.com>2007-09-26 09:14:33 +0100
committerKeir Fraser <keir@xensource.com>2007-09-26 09:14:33 +0100
commitebe41ed23dd74a268aca04bf8b6ffb231efeb8ac (patch)
tree1dc706f25d9b6edea5daaea83b051a77badd8bfb /tools
parentf0acc4f6f1cda745b2be66256f568e950cd2ec55 (diff)
downloadxen-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.c43
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;