On Tue, Oct 9, 2012 at 3:30 AM, Jason Baron <jba...@redhat.com> wrote: > From: Jason Baron <jba...@redhat.com> > > Automatically, locate the required q35 dsdt table on load. Otherwise we error > out. This could be done in the bios, but its harder to produce a good error > message. > > Signed-off-by: Jason Baron <jba...@redhat.com> > --- > hw/pc.c | 19 +++++++++++++++++++ > hw/pc.h | 2 ++ > hw/pc_piix.c | 7 +++++++ > hw/pc_q35.c | 7 +++++++ > 4 files changed, 35 insertions(+), 0 deletions(-) > > diff --git a/hw/pc.c b/hw/pc.c > index f5fbd0c..4ee41a1 100644 > --- a/hw/pc.c > +++ b/hw/pc.c > @@ -1172,3 +1172,22 @@ void ioapic_init_gsi(GSIState *gsi_state, const char > *parent_name) > gsi_state->ioapic_irq[i] = qdev_get_gpio_in(dev, i); > } > } > + > +int find_and_load_dsdt(const char *dsdt_name) > +{ > + char *filename; > + char buf[1024]; > + > + filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, dsdt_name); > + if (!filename) { > + return -1; > + } > + snprintf(buf, 1024, "file=%s", filename);
Please use sizeof(buf) instead of 1024, or introduce a constant. > + g_free(filename); > + if (acpi_table_add(buf) < 0) { > + fprintf(stderr, "Wrong acpi table provided\n"); > + return -1; > + } > + > + return 0; > +} > diff --git a/hw/pc.h b/hw/pc.h > index 125c1fd..5e93ae1 100644 > --- a/hw/pc.h > +++ b/hw/pc.h > @@ -227,5 +227,7 @@ void pc_system_firmware_init(MemoryRegion *rom_memory); > #define E820_UNUSABLE 5 > > int e820_add_entry(uint64_t, uint64_t, uint32_t); > +int find_and_load_dsdt(const char *dsdt_name); > + > > #endif > diff --git a/hw/pc_piix.c b/hw/pc_piix.c > index e133630..06bb40e 100644 > --- a/hw/pc_piix.c > +++ b/hw/pc_piix.c > @@ -126,6 +126,13 @@ static void pc_init1(MemoryRegion *system_memory, > MemoryRegion *rom_memory; > void *fw_cfg = NULL; > > + /* let's first see if we can find the proper dsdt */ > + if (find_and_load_dsdt("acpi-dsdt.aml")) { > + fprintf(stderr, "Couldn't find piix dsdt table!\n" > + "Try updating your bios.\n"); > + exit(1); > + } > + > pc_cpus_init(cpu_model); > > if (kvmclock_enabled) { > diff --git a/hw/pc_q35.c b/hw/pc_q35.c > index 48083bb..1f96af0 100644 > --- a/hw/pc_q35.c > +++ b/hw/pc_q35.c > @@ -356,6 +356,13 @@ static void pc_q35_init(ram_addr_t ram_size, > qemu_irq *i8259; > int i; > > + /* let's first see if we can find the proper dsdt */ > + if (find_and_load_dsdt("q35-acpi-dsdt.aml")) { > + fprintf(stderr, "Couldn't find q35 dsdt table!\n" > + "Try updating your bios.\n"); > + exit(1); > + } > + > pc_cpus_init(cpu_model); > > kvmclock_create(); > -- > 1.7.1 >