qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [Patch] Small fix for qemu APIC for Mac OS X support


From: adq
Subject: Re: [Qemu-devel] [Patch] Small fix for qemu APIC for Mac OS X support
Date: Sun, 5 Dec 2010 14:36:21 +0000

On 26 November 2010 12:40, Isaku Yamahata <address@hidden> wrote:
> On Thu, Nov 25, 2010 at 08:18:45PM +0000, adq wrote:
>> On 25 November 2010 11:28, Isaku Yamahata <address@hidden> wrote:
>> > On Wed, Nov 24, 2010 at 02:08:16PM +0000, adq wrote:
>> >> > Interesting. I was also thinking that maybe we can leverage overriding 
>> >> > mechanisms that are already available. Maybe it's possible to squeeze 
>> >> > the HPET node into an SSDT. Maybe we need to override the whole DSDT 
>> >> > from the command line.
>> >>
>> >> We'll definitely need to override the DSDT for the applesmc device. I
>> >> was thinking something along the lines of an additional DSDT binary
>> >> supplied with QEMU for use when emulating apple hardware as you
>> >> suggest.
>> >
>> > The patches for qemu and seabios have been floating around.
>> > I wrote them for Q35 chipset support, but no one has gotten interested in 
>> > it.
>> > But now, you are there. I'm willing to rebase/resend them.
>>
>> I'd definitely be interested to see those!
>
> Here is seabios part.
>
> From 7a6e97b74bc0d25aca42a43cabcc68836edaf6c0 Mon Sep 17 00:00:00 2001
> Message-Id: <address@hidden>
> In-Reply-To: <address@hidden>
> References: <address@hidden>
> From: Isaku Yamahata <address@hidden>
> Date: Tue, 15 Jun 2010 12:41:13 +0900
> Subject: [PATCH 1/1] seabios: acpi: allow qemu to load dsdt as external acpi 
> table.
>
> allow qemu to load dsdt as external acpi table.
>
> Signed-off-by: Isaku Yamahata <address@hidden>
>
> ---
> changes v1 -> v2.
> - load qemu table first and they try default dsdt table if
>  qemu doesn't supply dsdt.
>  Thus unnecessary malloc_high()/free() is avoided.
> ---
>  src/acpi.c |   44 ++++++++++++++++++++++++++++++++++++--------
>  1 files changed, 36 insertions(+), 8 deletions(-)
>
> diff --git a/src/acpi.c b/src/acpi.c
> index 18830dc..f4e0780 100644
> --- a/src/acpi.c
> +++ b/src/acpi.c
> @@ -54,6 +54,11 @@ struct facs_descriptor_rev1
>
>
>  /*
> + * Differentiated System Descrition Table (DSDT)
> + */
> +#define DSDT_SIGNATURE 0x54445344 // DSDT
> +
> +/*
>  * MADT values and structures
>  */
>
> @@ -221,14 +226,20 @@ static const struct pci_device_id fadt_init_tbl[] = {
>     PCI_DEVICE_END
>  };
>
> +static void fill_dsdt(struct fadt_descriptor_rev1 *fadt, void *dsdt)
> +{
> +    fadt->dsdt = cpu_to_le32((u32)dsdt);
> +    fadt->checksum -= checksum(fadt, sizeof(*fadt));
> +    dprintf(1, "ACPI DSDT=%p\n", dsdt);
> +}
> +
>  static void*
>  build_fadt(int bdf)
>  {
>     struct fadt_descriptor_rev1 *fadt = malloc_high(sizeof(*fadt));
>     struct facs_descriptor_rev1 *facs = memalign_high(64, sizeof(*facs));
> -    void *dsdt = malloc_high(sizeof(AmlCode));
>
> -    if (!fadt || !facs || !dsdt) {
> +    if (!fadt || !facs) {
>         warn_noalloc();
>         return NULL;
>     }
> @@ -238,13 +249,11 @@ build_fadt(int bdf)
>     facs->signature = FACS_SIGNATURE;
>     facs->length = cpu_to_le32(sizeof(*facs));
>
> -    /* DSDT */
> -    memcpy(dsdt, AmlCode, sizeof(AmlCode));
> -
>     /* FADT */
>     memset(fadt, 0, sizeof(*fadt));
>     fadt->firmware_ctrl = cpu_to_le32((u32)facs);
> -    fadt->dsdt = cpu_to_le32((u32)dsdt);
> +    fadt->dsdt = 0;  /* dsdt will be filled later in acpi_bios_init()
> +                        by fill_dsdt() */
>     fadt->model = 1;
>     fadt->reserved1 = 0;
>     int pm_sci_int = pci_config_readb(bdf, PCI_INTERRUPT_LINE);
> @@ -620,7 +629,8 @@ acpi_bios_init(void)
>     } while(0)
>
>     // Add tables
> -    ACPI_INIT_TABLE(build_fadt(bdf));
> +    struct fadt_descriptor_rev1 *fadt = build_fadt(bdf);
> +    ACPI_INIT_TABLE(fadt);
>     ACPI_INIT_TABLE(build_ssdt());
>     ACPI_INIT_TABLE(build_madt());
>     ACPI_INIT_TABLE(build_hpet());
> @@ -635,12 +645,30 @@ acpi_bios_init(void)
>             warn_noalloc();
>             continue;
>         }
> -        ACPI_INIT_TABLE(qemu_cfg_next_acpi_table_load(addr, len));
> +        struct acpi_table_header *header =
> +            qemu_cfg_next_acpi_table_load(addr, len);
> +        if (header->signature == DSDT_SIGNATURE) {
> +            if (fadt) {
> +                fill_dsdt(fadt, addr);
> +            }
> +        } else {
> +            ACPI_INIT_TABLE(header);
> +        }
>         if (tbl_idx == MAX_ACPI_TABLES) {
>             warn_noalloc();
>             break;
>         }
>     }
> +    if (fadt && !fadt->dsdt) {
> +        /* default DSDT */
> +        void *dsdt = malloc_high(sizeof(AmlCode));
> +        if (!dsdt) {
> +            warn_noalloc();
> +            return;
> +        }
> +        memcpy(dsdt, AmlCode, sizeof(AmlCode));
> +        fill_dsdt(fadt, dsdt);
> +    }
>
>     struct rsdt_descriptor_rev1 *rsdt;
>     size_t rsdt_len = sizeof(*rsdt) + sizeof(u32) * tbl_idx;

Hi, looks great, sorry for the delay in answering, I got caught up
with other things.

I'm currently figuring out why the e1000 doesn't work; I suspect
something is slightly wrong with qemu/macosx's microwire bitbanging
implementation (and I've verified macosx is using microwire) causing
eeprom reads to fail.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]