From: Laszlo Ersek <lersek@redhat.com>
To: "Zeng, Star" <star.zeng@intel.com>,
"Fan, Jeff" <jeff.fan@intel.com>,
edk2-devel-01 <edk2-devel@ml01.01.org>
Cc: "Tian, Feng" <feng.tian@intel.com>,
Michael Tsirkin <mtsirkin@redhat.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Phil Dennis-Jordan <phil@philjordan.eu>,
"Yao, Jiewen" <jiewen.yao@intel.com>,
Leo Duran <leo.duran@amd.com>, Al Stone <ahs3@redhat.com>
Subject: Re: [PATCH v2 2/2] MdeModulePkg/AcpiTableDxe: improve FADT.{DSDT, X_DSDT} mutual exclusion
Date: Wed, 15 Mar 2017 16:10:37 +0100 [thread overview]
Message-ID: <d1e318d5-9e0a-8076-2f43-c3a701daf416@redhat.com> (raw)
In-Reply-To: <a6e95f2d-4fb5-e54d-4b3e-e19beef3dc4b@intel.com>
On 03/15/17 02:22, Zeng, Star wrote:
> On 2017/3/14 21:13, Laszlo Ersek wrote:
>> On 03/14/17 09:33, Zeng, Star wrote:
>>> In original code for < 4G table,
>>> Dsdt and XDsdt will be both assigned if FADT is installed before
>>> DSDT, but
>>> Dsdt and XDsdt will have mutual exclusion if FADT is installed after
>>> DSDT.
>>>
>>> They are inconsistent.
>>
>> That's right. The revert would not solve this original problem.
>>
>>>
>>> Is there any negative impact found to assign both Dsdt and XDsdt for
>>> < 4G table except the spec volation?
>>
>> No, I don't think so; the spec violation is the only impact to my
>> knowledge.
>>
>> Are you suggesting that we:
>> - delete RequireDsdtXDsdtExclusion(),
>> - replace all invocations of RequireDsdtXDsdtExclusion() with FALSE,
>> - and then simplify the resultant code (that is, eliminate the
>> always-FALSE branches, and un-indent the always-TRUE branches)?
>>
>> This would be [VARIANT A], regardless of ACPI spec version.
>>
>> I think that could work (as long as we don't mind breaking the ACPI spec
>> versions that require mutual exclusion).
>
> Yes. Then the code could have maximum compatibility and the behavior
> could be consistent, sure more comments about code behavior and ACPI
> spec could be added.
Do you want me to submit the patch, or can one of you guys do it? I'm
happy to review the patch, but I would be slower to post it.
Thanks!
Laszlo
>
> Thanks,
> Star
>
>>
>> Thanks
>> Laszlo
>>
>>>
>>> Thanks,
>>> Star
>>> -----Original Message-----
>>> From: Fan, Jeff
>>> Sent: Tuesday, March 14, 2017 3:57 PM
>>> To: Laszlo Ersek <lersek@redhat.com>; edk2-devel-01
>>> <edk2-devel@ml01.01.org>
>>> Cc: Tian, Feng <feng.tian@intel.com>; Michael Tsirkin
>>> <mtsirkin@redhat.com>; Ard Biesheuvel <ard.biesheuvel@linaro.org>;
>>> Phil Dennis-Jordan <phil@philjordan.eu>; Leo Duran
>>> <leo.duran@amd.com>; Yao, Jiewen <jiewen.yao@intel.com>; Al Stone
>>> <ahs3@redhat.com>; Zeng, Star <star.zeng@intel.com>
>>> Subject: RE: [edk2] [PATCH v2 2/2] MdeModulePkg/AcpiTableDxe: improve
>>> FADT.{DSDT, X_DSDT} mutual exclusion
>>>
>>> Laszlo,
>>>
>>> Basically, I agree with this is OS assumption. I did not find better
>>> fix to handle such compatibility issue.
>>>
>>> I agree to revert this patch 2/2 to fix Windows 2012 R2 boot issue.
>>>
>>> I don't know if the other guys have other suggestions. :-)
>>>
>>> Thanks!
>>> Jeff
>>>
>>> -----Original Message-----
>>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>>> Sent: Monday, March 13, 2017 10:44 PM
>>> To: Fan, Jeff; edk2-devel-01
>>> Cc: Tian, Feng; Michael Tsirkin; Ard Biesheuvel; Phil Dennis-Jordan;
>>> Leo Duran; Yao, Jiewen; Al Stone; Zeng, Star
>>> Subject: Re: [edk2] [PATCH v2 2/2] MdeModulePkg/AcpiTableDxe: improve
>>> FADT.{DSDT, X_DSDT} mutual exclusion
>>>
>>> On 03/13/17 04:07, Fan, Jeff wrote:
>>>> Laszlo,
>>>>
>>>> We found one Windows Server 2012 R2 blue screen issue with ACPI 6.1
>>>> FADT table.
>>>>
>>>> We did the following configuration test with DSDT under 4GB.
>>>> .DSDT .X_DSDT Window Server 2012 R2
>>>> ---------- ------------ -------------------------------
>>>> set clear Failed // current
>>>> implementation
>>>> clear set Succeed
>>>> set set Succeed
>>>
>>> That looks like a Windows bug. The above configuration satisfies ACPI
>>> 6.1:
>>>
>>> DSDT -- Physical memory address of the DSDT. If the X_DSDT field
>>> contains a non-zero value then this field must be zero.
>>>
>>> X_DSDT -- Extended physical address of the DSDT. If the DSDT field
>>> contains a non-zero value then this field must be zero.
>>>
>>> Michael told me that "6.1 errata will specify X_DSDT takes preference
>>> over DSDT but both can be present legaly", however, here X_DSDT
>>> cannot take precedence because it is zero.
>>>
>>> Based on past experience, I don't expect that Microsoft will ever fix
>>> this ACPI bug in Windows Server 2012 R2. I don't even expect that
>>> they would share with us a list of ACPI spec versions that should be
>>> exempted from RequireDsdtXDsdtExclusion() -- despite the spec clearly
>>> requiring DSDT / X_DSDT exclusion --, for bug compatibility.
>>>
>>> That leaves us with trial and error, to see what works and what doesn't.
>>> Unfortunately, I don't have ACPI tables for several ACPI spec
>>> versions; I don't think I can experiment with this. If you find a
>>> workaround, that would be great, but if we can't, I guess the patch
>>> should be reverted.
>>> (Note however that the BSOD will remain possible to trigger, with the
>>> DSDT, FADT installation order.)
>>>
>>> Thanks
>>> Laszlo
>>>
>>>> -----Original Message-----
>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>>>> Laszlo Ersek
>>>> Sent: Thursday, March 09, 2017 3:59 AM
>>>> To: edk2-devel-01
>>>> Cc: Tian, Feng; Michael Tsirkin; Ard Biesheuvel; Phil Dennis-Jordan;
>>>> Leo Duran; Yao, Jiewen; Al Stone; Zeng, Star
>>>> Subject: [edk2] [PATCH v2 2/2] MdeModulePkg/AcpiTableDxe: improve
>>>> FADT.{DSDT, X_DSDT} mutual exclusion
>>>>
>>>> The ACPI specification, up to and including revision 5.1 Errata A,
>>>> allows the DSDT and X_DSDT fields to be both set in the FADT.
>>>> (Obviously, this only makes sense if the DSDT address is representable
>>>> in 4 bytes.)
>>>>
>>>> Starting with 5.1 Errata B, specifically for Mantis 1393
>>>> <https://mantis.uefi.org/mantis/view.php?id=1393>, the spec requires
>>>> at most one of DSDT and X_DSDT to be set to a nonzero value.
>>>>
>>>> MdeModulePkg/AcpiTableDxe handles this mutual exclusion somewhat
>>>> inconsistently.
>>>>
>>>> - If the caller of EFI_ACPI_TABLE_PROTOCOL.InstallAcpiTable()
>>>> installs the
>>>> tables in "DSDT, FADT" order, then we enforce the exclusion
>>>> between the
>>>> DSDT and X_DSDT fields:
>>>>
>>>> DSDT under 4GB FADT.DSDT FADT.X_DSDT [VARIANT B]
>>>> -------------- --------- -----------
>>>> yes set clear
>>>> no clear set
>>>>
>>>> This behavior conforms to 5.1 Errata B. (And it's not required by
>>>> earlier versions of the spec.)
>>>>
>>>> - If the caller passes in the tables in "FADT, DSDT" relative order,
>>>> then
>>>> we do not enforce the exclusion:
>>>>
>>>> DSDT under 4GB FADT.DSDT FADT.X_DSDT [VARIANT A]
>>>> -------------- --------- -----------
>>>> yes set set
>>>> no clear set
>>>>
>>>> This satisfies 5.1 Errata A and earlier, but breaks 5.1 Errata B and
>>>> later.
>>>>
>>>> Unify the handling of both relative orders. In particular, check the
>>>> major and minor version numbers in the FADT. If the FADT version is
>>>> strictly before 5.1, then implement [VARIANT A]. If the FADT version
>>>> is equal to or larger than 5.1, then implement [VARIANT B].
>>>>
>>>> We make three observations:
>>>>
>>>> - We can't check the FADT table version precisely against "5.1
>>>> Errata B";
>>>> erratum levels are not captured in the table. We err in the safe
>>>> direction, namely we enforce the exclusion for "5.1" and "5.1
>>>> Errata A".
>>>>
>>>> - The same applies to "6.0" versus "6.0 Errata A". Because we cannot
>>>> distinguish these two, we consider "6.0" to be "equal to or larger
>>>> than
>>>> 5.1", and apply [VARIANT B], enforcing the exclusion.
>>>>
>>>> - While a blanket [VARIANT B] would be simpler, there is a significant
>>>> benefit to [VARIANT A], under the spec versions that permit it:
>>>> compatibility with a wider range of OSPMs (typically, older ones).
>>>>
>>>> For example, Igor reported about a "DELL R430 system with rev4 FADT
>>>> where DSDT and X_DSDT are pointing to the same address". Michael also
>>>> reported about several systems that exhibit the same.
>>>>
>>>> Regression tested with the following KVM guests (QEMU built at
>>>> ata0def594286d, "Merge remote-tracking branch
>>>> 'remotes/bonzini/tags/for-upstream' into staging", 2017-01-30):
>>>>
>>>> - OVMF: boot and S3 suspend/resume
>>>> - Ia32, Q35, SMM
>>>> - Fedlet 20141209
>>>> - Ia32X64, Q35, SMM
>>>> - Fedora 22
>>>> - Windows 7
>>>> - Windows 8.1
>>>> - Windows 10
>>>> - Windows Server 2008 R2
>>>> - Windows Server 2012 R2
>>>> - Windows Server 2016 Tech Preview 4
>>>> - X64, I440FX, no SMM
>>>> - Fedora 24
>>>> - RHEL-6.7
>>>> - RHEL-7.2-ish
>>>> - ArmVirtQemu: boot test with virtio-gpu
>>>> - AARCH64
>>>> - Fedora 24
>>>> - RHELSA-7.3
>>>> - openSUSE Tumbleweed (4.8.4-based)
>>>>
>>>> This change is connected to ASWG ticket
>>>> <https://mantis.uefi.org/mantis/view.php?id=1757>, which is now
>>>> closed/fixed.
>>>>
>>>> Cc: Al Stone <ahs3@redhat.com>
>>>> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>>>> Cc: Feng Tian <feng.tian@intel.com>
>>>> Cc: Igor Mammedov <imammedo@redhat.com>
>>>> Cc: Jiewen Yao <jiewen.yao@intel.com>
>>>> Cc: Leo Duran <leo.duran@amd.com>
>>>> Cc: Michael Tsirkin <mtsirkin@redhat.com>
>>>> Cc: Phil Dennis-Jordan <phil@philjordan.eu>
>>>> Cc: Star Zeng <star.zeng@intel.com>
>>>> Reported-by: Phil Dennis-Jordan <phil@philjordan.eu>
>>>> Suggested-by: Igor Mammedov <imammedo@redhat.com>
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
>>>> Reviewed-by: Phil Dennis-Jordan <phil@philjordan.eu>
>>>> ---
>>>>
>>>> Notes:
>>>> v2:
>>>> - simplify logic in RequireDsdtXDsdtExclusion() [Jiewen]
>>>> - pick up Phil's R-b nonetheless (the above change is a minimal
>>>> reformulation of code, with no behavioral difference)
>>>> - add reference to Mantis#1757 to the commit message
>>>>
>>>> v1:
>>>> NOTE for people on the CC list:
>>>>
>>>> If you are not presently subscribed to edk2-devel and wish to
>>>> comment on
>>>> this patch publicly, you need to subscribe first, and wait for the
>>>> subscription request to *complete* (see your inbox), *before*
>>>> sending
>>>> your followup. This is not ideal, but edk2-devel requires
>>>> subscription
>>>> before reflecting messages from someone.
>>>>
>>>> Subscribe at <https://lists.01.org/mailman/listinfo/edk2-devel>.
>>>> Thanks.
>>>>
>>>> MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 62
>>>> +++++++++++++++++++-
>>>> 1 file changed, 59 insertions(+), 3 deletions(-)
>>>>
>>>> diff --git
>>>> a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
>>>> b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
>>>> index 7795ff7269ca..4bb848df5203 100644
>>>> --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
>>>> +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
>>>> @@ -430,6 +430,51 @@ ReallocateAcpiTableBuffer (
>>>> mEfiAcpiMaxNumTables = NewMaxTableNumber;
>>>> return EFI_SUCCESS;
>>>> }
>>>> +
>>>> +/**
>>>> + Determine whether the FADT table passed in as parameter requires
>>>> +mutual
>>>> + exclusion between the DSDT and X_DSDT fields. (That is, whether
>>>> +there exists
>>>> + an explicit requirement that at most one of those fields is
>>>> +permitted to be
>>>> + nonzero.)
>>>> +
>>>> + @param[in] Fadt The EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE
>>>> object to
>>>> + check.
>>>> +
>>>> + @retval TRUE Fadt requires mutual exclusion between DSDT and
>>>> X_DSDT.
>>>> + @retval FALSE Otherwise.
>>>> +**/
>>>> +BOOLEAN
>>>> +RequireDsdtXDsdtExclusion (
>>>> + IN EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt
>>>> + )
>>>> +{
>>>> + //
>>>> + // Mantis ticket #1393 was addressed in ACPI 5.1 Errata B.
>>>> +Unfortunately, we
>>>> + // can't tell apart 5.1 Errata A and 5.1 Errata B just from looking
>>>> +at the
>>>> + // FADT table. Therefore let's require exclusion for table
>>>> versions >= 5.1.
>>>> + //
>>>> + // While this needlessly covers 5.1 and 5.1A too, it is safer to
>>>> +require
>>>> + // DSDT<->X_DSDT exclusion for lax (5.1, 5.1A) versions of the spec
>>>> +than to
>>>> + // permit DSDT<->X_DSDT duplication for strict (5.1B) versions of
>>>> the spec.
>>>> + //
>>>> + // The same applies to 6.0 vs. 6.0A. While 6.0 does not require the
>>>> + // exclusion, 6.0A and 6.1 do. Since we cannot distinguish 6.0 from
>>>> +6.0A
>>>> + // based on just the FADT, we lump 6.0 in with the rest of >= 5.1.
>>>> + //
>>>> + if ((Fadt->Header.Revision < 5) ||
>>>> + ((Fadt->Header.Revision == 5) &&
>>>> + (((EFI_ACPI_5_1_FIXED_ACPI_DESCRIPTION_TABLE
>>>> *)Fadt)->MinorVersion == 0))) {
>>>> + //
>>>> + // version <= 5.0
>>>> + //
>>>> + return FALSE;
>>>> + }
>>>> + //
>>>> + // version >= 5.1
>>>> + //
>>>> + return TRUE;
>>>> +}
>>>> +
>>>> /**
>>>> This function adds an ACPI table to the table list. It will
>>>> detect FACS and
>>>> allocate the correct type of memory and properly align the table.
>>>> @@ -647,12 +692,16 @@ AddTableToList (
>>>> }
>>>> if ((UINT64)(UINTN)AcpiTableInstance->Dsdt3 < BASE_4GB) {
>>>> AcpiTableInstance->Fadt3->Dsdt = (UINT32) (UINTN)
>>>> AcpiTableInstance->Dsdt3;
>>>> - ZeroMem (&AcpiTableInstance->Fadt3->XDsdt, sizeof (UINT64));
>>>> + if (RequireDsdtXDsdtExclusion (AcpiTableInstance->Fadt3)) {
>>>> + Buffer64 = 0;
>>>> + } else {
>>>> + Buffer64 = AcpiTableInstance->Fadt3->Dsdt;
>>>> + }
>>>> } else {
>>>> AcpiTableInstance->Fadt3->Dsdt = 0;
>>>> Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Dsdt3;
>>>> - CopyMem (&AcpiTableInstance->Fadt3->XDsdt, &Buffer64,
>>>> sizeof (UINT64));
>>>> }
>>>> + CopyMem (&AcpiTableInstance->Fadt3->XDsdt, &Buffer64, sizeof
>>>> + (UINT64));
>>>>
>>>> //
>>>> // RSDP OEM information is updated to match the FADT OEM
>>>> information @@ -847,8 +896,15 @@ AddTableToList (
>>>> if (AcpiTableInstance->Fadt3 != NULL) {
>>>> if ((UINT64)(UINTN)AcpiTableInstance->Dsdt3 < BASE_4GB) {
>>>> AcpiTableInstance->Fadt3->Dsdt = (UINT32) (UINTN)
>>>> AcpiTableInstance->Dsdt3;
>>>> + if (RequireDsdtXDsdtExclusion (AcpiTableInstance->Fadt3)) {
>>>> + Buffer64 = 0;
>>>> + } else {
>>>> + Buffer64 = AcpiTableInstance->Fadt3->Dsdt;
>>>> + }
>>>> + } else {
>>>> + AcpiTableInstance->Fadt3->Dsdt = 0;
>>>> + Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Dsdt3;
>>>> }
>>>> - Buffer64 = (UINT64) (UINTN) AcpiTableInstance->Dsdt3;
>>>> CopyMem (&AcpiTableInstance->Fadt3->XDsdt, &Buffer64, sizeof
>>>> (UINT64));
>>>>
>>>> //
>>>> --
>>>> 2.9.3
>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org
>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>>
>>>
>
next prev parent reply other threads:[~2017-03-15 15:10 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-08 19:58 [PATCH v2 0/2] MdeModulePkg/AcpiTableDxe: improve FADT.{DSDT, X_DSDT} mutual exclusion Laszlo Ersek
2017-03-08 19:58 ` [PATCH v2 1/2] MdeModulePkg/AcpiTableDxe: condense whitespace around FADT.{DSDT, X_DSDT} Laszlo Ersek
2017-03-09 0:47 ` Yao, Jiewen
2017-03-08 19:58 ` [PATCH v2 2/2] MdeModulePkg/AcpiTableDxe: improve FADT.{DSDT, X_DSDT} mutual exclusion Laszlo Ersek
2017-03-09 0:47 ` Yao, Jiewen
2017-03-13 3:07 ` Fan, Jeff
2017-03-13 14:44 ` Laszlo Ersek
2017-03-14 7:56 ` Fan, Jeff
2017-03-14 8:33 ` Zeng, Star
2017-03-14 13:13 ` Laszlo Ersek
2017-03-15 1:22 ` Zeng, Star
2017-03-15 15:10 ` Laszlo Ersek [this message]
2017-03-09 1:59 ` [PATCH v2 0/2] " Zeng, Star
2017-03-09 14:06 ` Laszlo Ersek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d1e318d5-9e0a-8076-2f43-c3a701daf416@redhat.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox