Il 09/10/2012 05:30, Jason Baron ha scritto:
> 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.

Not just for q35, so the commit message is wrong, but the patch is
otherwise good.

We should import the source code for the DSDT from SeaBIOS, and support
building it + installing it.  You made this a hard failure, so it has to
be done before this patch goes in, doesn't it?

Paolo

> 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);
> +    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();
> 


Reply via email to