if (pci->device == PCI_DEVICE_ID_INTEL_ICH9_LPC)
ACPI_INIT_TABLE(build_mcfg_q35());
- 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) {
+ struct romfile_s *file = NULL;
+ for (;;) {
+ file = romfile_findprefix("acpi/", file);
+ if (!file)
+ break;
+ struct acpi_table_header *table = malloc_high(file->size);
+ if (!table) {
warn_noalloc();
continue;
}
- struct acpi_table_header *header =
- qemu_cfg_next_acpi_table_load(addr, len);
- if (header->signature == DSDT_SIGNATURE) {
+ int ret = file->copy(file, table, file->size);
+ if (ret <= sizeof(*table))
+ continue;
+ if (table->signature == DSDT_SIGNATURE) {
if (fadt) {
- fill_dsdt(fadt, addr);
+ fill_dsdt(fadt, table);
}
} else {
- ACPI_INIT_TABLE(header);
+ ACPI_INIT_TABLE(table);
}
if (tbl_idx == MAX_ACPI_TABLES) {
warn_noalloc();
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;
-}
-
u16 qemu_cfg_smbios_entries(void)
{
u16 cnt;
romfile_add(file);
}
+// Populate romfile entries for legacy fw_cfg ports (that predate the
+// "file" interface).
+static void
+qemu_cfg_legacy(void)
+{
+ // ACPI tables
+ char name[128];
+ u16 cnt;
+ qemu_cfg_read_entry(&cnt, QEMU_CFG_ACPI_TABLES, sizeof(cnt));
+ int i, offset = sizeof(cnt);
+ for (i = 0; i < cnt; i++) {
+ u16 len;
+ qemu_cfg_read(&len, sizeof(len));
+ offset += sizeof(len);
+ snprintf(name, sizeof(name), "acpi/table%d", i);
+ qemu_romfile_add(name, QEMU_CFG_ACPI_TABLES, offset, len);
+ qemu_cfg_skip(len);
+ offset += len;
+ }
+}
+
struct QemuCfgFile {
u32 size; /* file size */
u16 select; /* write this to 0x510 to read it */
if (!CONFIG_QEMU || !qemu_cfg_present)
return;
+ // Populate romfiles for legacy fw_cfg entries
+ qemu_cfg_legacy();
+
+ // Load files found in the fw_cfg file directory
u32 count;
qemu_cfg_read_entry(&count, QEMU_CFG_FILE_DIR, sizeof(count));
count = be32_to_cpu(count);
int qemu_cfg_show_boot_menu(void);
void qemu_cfg_get_uuid(u8 *uuid);
int qemu_cfg_irq0_override(void);
-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);
u16 qemu_cfg_smbios_entries(void);
size_t qemu_cfg_smbios_load_field(int type, size_t offset, void *addr);
int qemu_cfg_smbios_load_external(int type, char **p, unsigned *nr_structs,