From: Jan Kiszka Date: Mon, 29 Aug 2011 15:50:10 +0000 (+0200) Subject: Probe HPET existence X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=seabios.git;a=commitdiff_plain;h=b8a90f513ba83283ee2ac3961d6ce7ae731498d0 Probe HPET existence QEMU does not provide a HPET block if it was configured with -no-hpet, other machines SeaBIOS runs on may lack a HPET as well. Perform basic checks the ID register for a reasonable vendor ID and a clock period within the valid range, do not build the HPET table if that fails. Signed-off-by: Jan Kiszka --- diff --git a/src/acpi.c b/src/acpi.c index ea7b171..29160f4 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -158,6 +158,9 @@ struct acpi_20_hpet { } PACKED; #define ACPI_HPET_ADDRESS 0xFED00000UL +#define HPET_ID 0x000 +#define HPET_PERIOD 0x004 + /* * SRAT (NUMA topology description) table */ @@ -464,7 +467,16 @@ build_ssdt(void) static void* build_hpet(void) { - struct acpi_20_hpet *hpet = malloc_high(sizeof(*hpet)); + struct acpi_20_hpet *hpet; + const void *hpet_base = (void *)ACPI_HPET_ADDRESS; + u32 hpet_vendor = readl(hpet_base + HPET_ID) >> 16; + u32 hpet_period = readl(hpet_base + HPET_PERIOD); + + if (hpet_vendor == 0 || hpet_vendor == 0xffff || + hpet_period == 0 || hpet_period > 0x05F5E100) + return NULL; + + hpet = malloc_high(sizeof(*hpet)); if (!hpet) { warn_noalloc(); return NULL;