From: Kevin O'Connor Date: Fri, 9 Oct 2009 01:18:41 +0000 (-0400) Subject: Add support for passing additional acpi tables from qemu. X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=commitdiff_plain;h=cc6dc46b196b4ba1412efba7bcd7cfb070a57ccb;p=seabios.git Add support for passing additional acpi tables from qemu. Signed-off-by: Gleb Natapov --- diff --git a/src/acpi.c b/src/acpi.c index b9d449f..dafd8c8 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -11,7 +11,7 @@ #include "biosvar.h" // GET_EBDA #include "pci_ids.h" // PCI_VENDOR_ID_INTEL #include "pci_regs.h" // PCI_INTERRUPT_LINE - +#include "paravirt.h" /****************************************************/ /* ACPI tables init */ @@ -444,6 +444,22 @@ acpi_bios_init(void) ACPI_INIT_TABLE(build_ssdt()); ACPI_INIT_TABLE(build_madt()); + u16 i, external_tables = qemu_cfg_acpi_additional_tables(); + + for(i = 0; i < external_tables; i++) { + u16 len = qemu_cfg_next_acpi_table_len(); + void *addr = malloc_high(len); + if (!addr) { + dprintf(1, "Not enogh memory of ext acpi table of size %d!\n", len); + continue; + } + ACPI_INIT_TABLE(qemu_cfg_next_acpi_table_load(addr, len)); + if (tbl_idx == MAX_ACPI_TABLES) { + dprintf(1, "To many external table!\n"); + break; + } + } + struct rsdt_descriptor_rev1 *rsdt; size_t rsdt_len = sizeof(*rsdt) + sizeof(u32) * tbl_idx; rsdt = malloc_high(rsdt_len); diff --git a/src/paravirt.c b/src/paravirt.c index 56d8421..cd1f263 100644 --- a/src/paravirt.c +++ b/src/paravirt.c @@ -72,3 +72,30 @@ int qemu_cfg_show_boot_menu(void) return v; } +u16 qemu_cfg_acpi_additional_tables(void) +{ + u16 cnt; + + if (!qemu_cfg_present) + return 0; + + qemu_cfg_read_entry(&cnt, QEMU_CFG_ACPI_TABLES, sizeof(cnt)); + + return cnt; +} + +u16 qemu_cfg_next_acpi_table_len(void) +{ + u16 len; + + qemu_cfg_read((u8*)&len, sizeof(len)); + + return len; +} + +void* qemu_cfg_next_acpi_table_load(void *addr, u16 len) +{ + qemu_cfg_read(addr, len); + return addr; +} + diff --git a/src/paravirt.h b/src/paravirt.h index 6997cff..c2bab71 100644 --- a/src/paravirt.h +++ b/src/paravirt.h @@ -40,5 +40,8 @@ extern int qemu_cfg_present; void qemu_cfg_port_probe(void); int qemu_cfg_show_boot_menu(void); void qemu_cfg_get_uuid(u8 *uuid); +u16 qemu_cfg_acpi_additional_tables(void); +u16 qemu_cfg_next_acpi_table_len(void); +void *qemu_cfg_next_acpi_table_load(void *addr, u16 len); #endif