diff options
Diffstat (limited to 'tools/firmware/hvmloader/acpi/build.c')
-rw-r--r-- | tools/firmware/hvmloader/acpi/build.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c index 247c3b5928..e33cc04795 100644 --- a/tools/firmware/hvmloader/acpi/build.c +++ b/tools/firmware/hvmloader/acpi/build.c @@ -62,11 +62,18 @@ static int uart_exists(uint16_t uart_base) return ((b == 0) && (c == 0xf)); } +static int hpet_exists(unsigned long hpet_base) +{ + uint32_t hpet_id = *(uint32_t *)hpet_base; + return ((hpet_id >> 16) == 0x8086); +} + static int construct_bios_info_table(uint8_t *buf) { struct bios_info { uint8_t com1_present:1; uint8_t com2_present:1; + uint8_t hpet_present:1; uint32_t pci_min, pci_len; } *bios_info = (struct bios_info *)buf; @@ -75,6 +82,8 @@ static int construct_bios_info_table(uint8_t *buf) bios_info->com1_present = uart_exists(0x3f8); bios_info->com2_present = uart_exists(0x2f8); + bios_info->hpet_present = hpet_exists(ACPI_HPET_ADDRESS); + bios_info->pci_min = 0xf0000000; bios_info->pci_len = 0x0c000000; @@ -272,9 +281,12 @@ static int construct_secondary_tables(uint8_t *buf, unsigned long *table_ptrs) } /* HPET. */ - hpet = (struct acpi_20_hpet *)&buf[offset]; - offset += construct_hpet(hpet); - table_ptrs[nr_tables++] = (unsigned long)hpet; + if ( hpet_exists(ACPI_HPET_ADDRESS) ) + { + hpet = (struct acpi_20_hpet *)&buf[offset]; + offset += construct_hpet(hpet); + table_ptrs[nr_tables++] = (unsigned long)hpet; + } /* Processor Object SSDT. */ table_ptrs[nr_tables++] = (unsigned long)&buf[offset]; |