qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] Propagate OEM ID info into other tables when us


From: Laszlo Ersek
Subject: Re: [Qemu-devel] [PATCH] Propagate OEM ID info into other tables when using SLIC
Date: Mon, 18 Jan 2016 12:49:19 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1

On 01/18/16 06:38, Xiao Guangrong wrote:
> Hi,
> 
> Is this you wanted?
> https://www.mail-archive.com/address@hidden/msg345911.html

Right, there's now some renewed interest in this issue; I guess probably
because of <https://github.com/tianocore/edk2/issues/5>.

We have a long-standing RHBZ for it (see link in the edk2 issue tracker
entry), but Aleksei reported a bug in the upstream QEMU tracker too
<https://bugs.launchpad.net/qemu/+bug/1533848>. I think Steven noticed
the upstream QEMU bug report, and resurrected & reworked the Debain patch.

My series is a bit different -- I don't like pushing down special
knowledge into build_header(). That's a very generic utility function;
the knowledge should be in the caller(s).

If it's okay with you, Steven, let's continue with my series. I got good
comments from Michael Tsirkin; once we have testing feedback in
<https://bugzilla.redhat.com/show_bug.cgi?id=1248758>, I plan to post v2.

Of course, if Michael prefers your patch, I'm game to drop mine.

Thanks
Laszlo

> On 01/16/2016 04:19 AM, Steven Newbury wrote:
>> In order to support Windows 7 "Activation", the OEM ID info must match
>> in SLIC and RSDT, and for UEFI, FACP.  The OEM ID from the SLIC is only
>> applied when oemtableid is not specified expliicitly.
>>
>> This was originally based on the patch from Michael Tokarev but has
>> been significantly re-worked, and re-based.
>>
>> Signed-off-by: Steven Newbury <address@hidden>
>>
>> ---
>>   hw/acpi/aml-build.c         | 19 ++++++++++++++++---
>>   hw/acpi/core.c              | 11 +++++++++++
>>   hw/i386/acpi-build.c        |  9 ++++++++-
>>   include/hw/acpi/acpi_slic.h | 11 +++++++++++
>>   qemu-options.hx             |  2 ++
>>   5 files changed, 48 insertions(+), 4 deletions(-)
>>   create mode 100644 include/hw/acpi/acpi_slic.h
>>
>> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
>> index 78e1290..bc16dc2 100644
>> --- a/hw/acpi/aml-build.c
>> +++ b/hw/acpi/aml-build.c
>> @@ -29,6 +29,9 @@
>>   #include "qemu/bswap.h"
>>   #include "qemu/bitops.h"
>>   #include "hw/acpi/bios-linker-loader.h"
>> +#include "hw/acpi/acpi_slic.h"
>> +
>> +extern const struct slic_info oem_data;
>>
>>   static GArray *build_alloc_array(void)
>>   {
>> @@ -1435,13 +1438,23 @@ build_header(GArray *linker, GArray
>> *table_data,
>>       memcpy(&h->signature, sig, 4);
>>       h->length = cpu_to_le32(len);
>>       h->revision = rev;
>> -    memcpy(h->oem_id, ACPI_BUILD_APPNAME6, 6);
>>
>>       if (oem_table_id) {
>>           strncpy((char *)h->oem_table_id, oem_table_id, sizeof(h-
>>> oem_table_id));
>>       } else {
>> -        memcpy(h->oem_table_id, ACPI_BUILD_APPNAME4, 4);
>> -        memcpy(h->oem_table_id + 4, sig, 4);
>> +        /* When including the system SLIC Win7 requires all OEM info
>> to match
>> +        (including sig) in SLIC, RSDT and FACP.  Other tables could
>> match,
>> +        but is unnecessary to pass "Activation". Overriden by above.
>> */
>> +        if (oem_data.has_slic) {
>> +            memcpy(h->oem_id, &oem_data.oem_id, 6);
>> +            memcpy(h->oem_table_id, &oem_data.oem_table_id, 8);
>> +            if (memcmp(sig, "RSDT", 4) != 0 && memcmp(sig, "FACP", 4)
>> != 0)
>> +                memcpy(h->oem_table_id + 4, sig, 4);
>> +        } else {
>> +            memcpy(h->oem_id, ACPI_BUILD_APPNAME6, 6);
>> +            memcpy(h->oem_table_id, ACPI_BUILD_APPNAME4, 4);
>> +            memcpy(h->oem_table_id + 4, sig, 4);
>> +        }
>>       }
>>
>>       h->oem_revision = cpu_to_le32(1);
>> diff --git a/hw/acpi/core.c b/hw/acpi/core.c
>> index 21e113d..cbef437 100644
>> --- a/hw/acpi/core.c
>> +++ b/hw/acpi/core.c
>> @@ -22,6 +22,7 @@
>>   #include "hw/hw.h"
>>   #include "hw/i386/pc.h"
>>   #include "hw/acpi/acpi.h"
>> +#include "hw/acpi/acpi_slic.h"
>>   #include "hw/nvram/fw_cfg.h"
>>   #include "qemu/config-file.h"
>>   #include "qapi/opts-visitor.h"
>> @@ -29,6 +30,9 @@
>>   #include "qapi-visit.h"
>>   #include "qapi-event.h"
>>
>> +struct slic_info oem_data;
>> +
>> +
>>   struct acpi_table_header {
>>       uint16_t _length;         /* our length, not actual part of the
>> hdr */
>>                                 /* allows easier parsing for fw_cfg
>> clients */
>> @@ -227,6 +231,13 @@ static void acpi_table_install(const char unsigned
>> *blob, size_t bloblen,
>>       /* recalculate checksum */
>>       ext_hdr->checksum = acpi_checksum((const char unsigned *)ext_hdr +
>>                                         ACPI_TABLE_PFX_SIZE,
>> acpi_payload_size);
>> +
>> +    /* Copy OEM fields from SLIC for use in all relevant tables
>> +       (oem_id[6] + tableid[4] + tableid(sig)[4] = 14 bytes) */
>> +    if ((!oem_data.has_slic) && (memcmp(ext_hdr->sig, "SLIC", 4) ==
>> 0)) {
>> +       memcpy(&oem_data.oem_id, ext_hdr->oem_id, 14);
>> +       oem_data.has_slic = 1;
>> +    }
>>   }
>>
>>   void acpi_table_add(const QemuOpts *opts, Error **errp)
>> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
>> index 78758e2..fbe4f3a 100644
>> --- a/hw/i386/acpi-build.c
>> +++ b/hw/i386/acpi-build.c
>> @@ -55,6 +55,7 @@
>>   #include "hw/timer/hpet.h"
>>
>>   #include "hw/acpi/aml-build.h"
>> +#include "hw/acpi/acpi_slic.h"
>>
>>   #include "qapi/qmp/qint.h"
>>   #include "qom/qom-qobject.h"
>> @@ -122,6 +123,8 @@ typedef struct AcpiBuildPciBusHotplugState {
>>       bool pcihp_bridge_en;
>>   } AcpiBuildPciBusHotplugState;
>>
>> +extern const struct slic_info oem_data;
>> +
>>   static
>>   int acpi_add_cpu_info(Object *o, void *opaque)
>>   {
>> @@ -2542,7 +2545,11 @@ build_rsdp(GArray *rsdp_table, GArray *linker,
>> unsigned rsdt)
>>                                true /* fseg memory */);
>>
>>       memcpy(&rsdp->signature, "RSD PTR ", 8);
>> -    memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
>> +    if (oem_data.has_slic) {
>> +        memcpy(rsdp->oem_id, &oem_data.oem_id, 6);
>> +    } else {
>> +        memcpy(rsdp->oem_id, ACPI_BUILD_APPNAME6, 6);
>> +    }
>>       rsdp->rsdt_physical_address = cpu_to_le32(rsdt);
>>       /* Address to be filled by Guest linker */
>>       bios_linker_loader_add_pointer(linker, ACPI_BUILD_RSDP_FILE,
>> diff --git a/include/hw/acpi/acpi_slic.h b/include/hw/acpi/acpi_slic.h
>> new file mode 100644
>> index 0000000..bc04a71
>> --- /dev/null
>> +++ b/include/hw/acpi/acpi_slic.h
>> @@ -0,0 +1,11 @@
>> +#ifndef QEMU_HW_ACPI_SLIC_H
>> +#define QEMU_HW_ACPI_SLIC_H
>> +
>> +struct slic_info {
>> +    bool has_slic;
>> +    char oem_id[6];
>> +    char oem_table_id[8];
>> +};
>> +
>> +#endif /* !QEMU_HW_ACPI_SLIC_H */
>> +
>> \ No newline at end of file
>> diff --git a/qemu-options.hx b/qemu-options.hx
>> index 215d00d..f1488a1 100644
>> --- a/qemu-options.hx
>> +++ b/qemu-options.hx
>> @@ -1472,6 +1472,8 @@ ACPI headers (possible overridden by other
>> options).
>>   For data=, only data
>>   portion of the table is used, all header information is specified in
>> the
>>   command line.
>> +If a SLIC table is supplied to qemu, then the oem_id from the SLIC
>> table
>> +will be copied into the RSDT and FACP tables (this is a Debian
>> addition).
>>   ETEXI
>>
>>   DEF("smbios", HAS_ARG, QEMU_OPTION_smbios,
>> -- 
>> 2.6.4
>>
> 




reply via email to

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