|
|
edb6c78 |
From 3288b60b3ddc2df4656842d424bfc1e6a51b2ad2 Mon Sep 17 00:00:00 2001
|
|
|
edb6c78 |
From: Al Stone <ahs3@redhat.com>
|
|
|
edb6c78 |
Date: Sun, 20 Sep 2020 11:42:21 -0600
|
|
|
edb6c78 |
Subject: [PATCH 13/40] Support FADT (aka, FACP) in a big-endian world
|
|
|
edb6c78 |
|
|
|
edb6c78 |
Signed-off-by: Al Stone <ahs3@redhat.com>
|
|
|
edb6c78 |
---
|
|
|
edb6c78 |
source/common/dmtbdump.c | 25 ++++++++++++-----------
|
|
|
edb6c78 |
source/components/tables/tbfadt.c | 34 +++++++++++++++++++++++--------
|
|
|
edb6c78 |
2 files changed, 38 insertions(+), 21 deletions(-)
|
|
|
edb6c78 |
|
|
|
edb6c78 |
Index: acpica-unix2-20200925/source/common/dmtbdump.c
|
|
|
edb6c78 |
===================================================================
|
|
|
edb6c78 |
--- acpica-unix2-20200925.orig/source/common/dmtbdump.c
|
|
|
edb6c78 |
+++ acpica-unix2-20200925/source/common/dmtbdump.c
|
|
|
edb6c78 |
@@ -358,11 +358,12 @@ AcpiDmDumpFadt (
|
|
|
edb6c78 |
ACPI_TABLE_HEADER *Table)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
ACPI_STATUS Status;
|
|
|
edb6c78 |
+ UINT32 TableLength = AcpiUtReadUint32(&Table->Length);
|
|
|
edb6c78 |
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/* Always dump the minimum FADT revision 1 fields (ACPI 1.0) */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
|
|
|
edb6c78 |
+ Status = AcpiDmDumpTable (TableLength, 0, Table, 0,
|
|
|
edb6c78 |
AcpiDmTableInfoFadt1);
|
|
|
edb6c78 |
if (ACPI_FAILURE (Status))
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
@@ -371,10 +372,10 @@ AcpiDmDumpFadt (
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/* Check for FADT revision 2 fields (ACPI 1.0B MS extensions) */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- if ((Table->Length > ACPI_FADT_V1_SIZE) &&
|
|
|
edb6c78 |
- (Table->Length <= ACPI_FADT_V2_SIZE))
|
|
|
edb6c78 |
+ if ((TableLength > ACPI_FADT_V1_SIZE) &&
|
|
|
edb6c78 |
+ (TableLength <= ACPI_FADT_V2_SIZE))
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
|
|
|
edb6c78 |
+ Status = AcpiDmDumpTable (TableLength, 0, Table, 0,
|
|
|
edb6c78 |
AcpiDmTableInfoFadt2);
|
|
|
edb6c78 |
if (ACPI_FAILURE (Status))
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
@@ -384,9 +385,9 @@ AcpiDmDumpFadt (
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/* Check for FADT revision 3/4 fields and up (ACPI 2.0+ extended data) */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- else if (Table->Length > ACPI_FADT_V2_SIZE)
|
|
|
edb6c78 |
+ else if (TableLength > ACPI_FADT_V2_SIZE)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
|
|
|
edb6c78 |
+ Status = AcpiDmDumpTable (TableLength, 0, Table, 0,
|
|
|
edb6c78 |
AcpiDmTableInfoFadt3);
|
|
|
edb6c78 |
if (ACPI_FAILURE (Status))
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
@@ -395,9 +396,9 @@ AcpiDmDumpFadt (
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/* Check for FADT revision 5 fields and up (ACPI 5.0+) */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- if (Table->Length > ACPI_FADT_V3_SIZE)
|
|
|
edb6c78 |
+ if (TableLength > ACPI_FADT_V3_SIZE)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
|
|
|
edb6c78 |
+ Status = AcpiDmDumpTable (TableLength, 0, Table, 0,
|
|
|
edb6c78 |
AcpiDmTableInfoFadt5);
|
|
|
edb6c78 |
if (ACPI_FAILURE (Status))
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
@@ -407,9 +408,9 @@ AcpiDmDumpFadt (
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/* Check for FADT revision 6 fields and up (ACPI 6.0+) */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- if (Table->Length > ACPI_FADT_V3_SIZE)
|
|
|
edb6c78 |
+ if (TableLength > ACPI_FADT_V3_SIZE)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0,
|
|
|
edb6c78 |
+ Status = AcpiDmDumpTable (TableLength, 0, Table, 0,
|
|
|
edb6c78 |
AcpiDmTableInfoFadt6);
|
|
|
edb6c78 |
if (ACPI_FAILURE (Status))
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
@@ -420,11 +421,11 @@ AcpiDmDumpFadt (
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/* Validate various fields in the FADT, including length */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- AcpiTbCreateLocalFadt (Table, Table->Length);
|
|
|
edb6c78 |
+ AcpiTbCreateLocalFadt (Table, TableLength);
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/* Validate FADT length against the revision */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
- AcpiDmValidateFadtLength (Table->Revision, Table->Length);
|
|
|
edb6c78 |
+ AcpiDmValidateFadtLength (Table->Revision, TableLength);
|
|
|
edb6c78 |
}
|
|
|
edb6c78 |
|
|
|
edb6c78 |
|
|
|
edb6c78 |
Index: acpica-unix2-20200925/source/components/tables/tbfadt.c
|
|
|
edb6c78 |
===================================================================
|
|
|
edb6c78 |
--- acpica-unix2-20200925.orig/source/components/tables/tbfadt.c
|
|
|
edb6c78 |
+++ acpica-unix2-20200925/source/components/tables/tbfadt.c
|
|
|
edb6c78 |
@@ -289,7 +289,6 @@ AcpiTbSelectAddress (
|
|
|
edb6c78 |
UINT32 Address32,
|
|
|
edb6c78 |
UINT64 Address64)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
-
|
|
|
edb6c78 |
if (!Address64)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
/* 64-bit address is zero, use 32-bit address */
|
|
|
edb6c78 |
@@ -520,6 +519,9 @@ AcpiTbConvertFadt (
|
|
|
edb6c78 |
UINT8 Length;
|
|
|
edb6c78 |
UINT8 Flags;
|
|
|
edb6c78 |
UINT32 i;
|
|
|
edb6c78 |
+ UINT32 Tmp;
|
|
|
edb6c78 |
+ UINT32 Value32;
|
|
|
edb6c78 |
+ UINT64 Value64;
|
|
|
edb6c78 |
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/*
|
|
|
edb6c78 |
@@ -533,7 +535,7 @@ AcpiTbConvertFadt (
|
|
|
edb6c78 |
* Note: The FADT revision value is unreliable. Only the length can be
|
|
|
edb6c78 |
* trusted.
|
|
|
edb6c78 |
*/
|
|
|
edb6c78 |
- if (AcpiGbl_FADT.Header.Length <= ACPI_FADT_V2_SIZE)
|
|
|
edb6c78 |
+ if (AcpiUtReadUint32(&AcpiGbl_FADT.Header.Length) <= ACPI_FADT_V2_SIZE)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
AcpiGbl_FADT.PreferredProfile = 0;
|
|
|
edb6c78 |
AcpiGbl_FADT.PstateControl = 0;
|
|
|
edb6c78 |
@@ -546,14 +548,19 @@ AcpiTbConvertFadt (
|
|
|
edb6c78 |
* current FADT version as defined by the ACPI specification.
|
|
|
edb6c78 |
* Thus, we will have a common FADT internally.
|
|
|
edb6c78 |
*/
|
|
|
edb6c78 |
- AcpiGbl_FADT.Header.Length = sizeof (ACPI_TABLE_FADT);
|
|
|
edb6c78 |
+ Tmp = sizeof (ACPI_TABLE_FADT);
|
|
|
edb6c78 |
+ AcpiUtWriteUint(&AcpiGbl_FADT.Header.Length, sizeof(UINT32),
|
|
|
edb6c78 |
+ &Tmp, sizeof(UINT32));
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/*
|
|
|
edb6c78 |
* Expand the 32-bit DSDT addresses to 64-bit as necessary.
|
|
|
edb6c78 |
* Later ACPICA code will always use the X 64-bit field.
|
|
|
edb6c78 |
*/
|
|
|
edb6c78 |
- AcpiGbl_FADT.XDsdt = AcpiTbSelectAddress ("DSDT",
|
|
|
edb6c78 |
- AcpiGbl_FADT.Dsdt, AcpiGbl_FADT.XDsdt);
|
|
|
edb6c78 |
+ Value32 = AcpiUtReadUint32(&AcpiGbl_FADT.Dsdt);
|
|
|
edb6c78 |
+ Value64 = AcpiUtReadUint64(&AcpiGbl_FADT.XDsdt);
|
|
|
edb6c78 |
+ Value64 = AcpiTbSelectAddress ("DSDT", Value32, Value64);
|
|
|
edb6c78 |
+ AcpiUtWriteUint(&AcpiGbl_FADT.XDsdt, sizeof(UINT64),
|
|
|
edb6c78 |
+ &Value64, sizeof(UINT64));
|
|
|
edb6c78 |
|
|
|
edb6c78 |
/* If Hardware Reduced flag is set, we are all done */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
@@ -614,7 +621,11 @@ AcpiTbConvertFadt (
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
if (Address64->Address)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
- if (Address64->Address != (UINT64) Address32)
|
|
|
edb6c78 |
+ Value32 = AcpiUtReadUint32(&Address32);
|
|
|
edb6c78 |
+ Value64 = AcpiUtReadUint64(&Address64->Address);
|
|
|
edb6c78 |
+
|
|
|
edb6c78 |
+ /* if (Address64->Address != (UINT64) Address32) */
|
|
|
edb6c78 |
+ if (Value64 != (UINT64) Value32)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
/* Address mismatch */
|
|
|
edb6c78 |
|
|
|
edb6c78 |
@@ -655,9 +666,10 @@ AcpiTbConvertFadt (
|
|
|
edb6c78 |
*/
|
|
|
edb6c78 |
if (!Address64->Address || AcpiGbl_Use32BitFadtAddresses)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
+ Value32 = AcpiUtReadUint32(&Address32);
|
|
|
edb6c78 |
AcpiTbInitGenericAddress (Address64,
|
|
|
edb6c78 |
ACPI_ADR_SPACE_SYSTEM_IO, Length,
|
|
|
edb6c78 |
- (UINT64) Address32, Name, Flags);
|
|
|
edb6c78 |
+ (UINT64) Value32, Name, Flags);
|
|
|
edb6c78 |
}
|
|
|
edb6c78 |
}
|
|
|
edb6c78 |
|
|
|
edb6c78 |
@@ -780,10 +792,14 @@ AcpiTbSetupFadtRegisters (
|
|
|
edb6c78 |
|
|
|
edb6c78 |
if (Source64->Address)
|
|
|
edb6c78 |
{
|
|
|
edb6c78 |
+ UINT64 Address64;
|
|
|
edb6c78 |
+
|
|
|
edb6c78 |
+ Address64 = AcpiUtReadUint64(&Source64->Address);
|
|
|
edb6c78 |
+ Address64 +=
|
|
|
edb6c78 |
+ (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth);
|
|
|
edb6c78 |
AcpiTbInitGenericAddress (FadtPmInfoTable[i].Target,
|
|
|
edb6c78 |
Source64->SpaceId, Pm1RegisterByteWidth,
|
|
|
edb6c78 |
- Source64->Address +
|
|
|
edb6c78 |
- (FadtPmInfoTable[i].RegisterNum * Pm1RegisterByteWidth),
|
|
|
edb6c78 |
+ Address64,
|
|
|
edb6c78 |
"PmRegisters", 0);
|
|
|
edb6c78 |
}
|
|
|
edb6c78 |
}
|