edb6c78416
This update also means a major update for all of the big-endian patching that has been done. The older mechanism was getting to unwieldy to keep maintained, and too sensitive to upstream changes. Hence, redid all of the old patches, and took the opportunity to make them more amenable to change over time. Ultimately, the goal is to have upstream accept these in some form. Signed-off-by: Al Stone <ahs3@redhat.com>
257 lines
9.9 KiB
Diff
257 lines
9.9 KiB
Diff
From af44bec6c062a26034a43809d81af2a0ea17343e Mon Sep 17 00:00:00 2001
|
|
From: Al Stone <ahs3@redhat.com>
|
|
Date: Fri, 25 Sep 2020 16:05:59 -0600
|
|
Subject: [PATCH 24/40] Support SDEV in a big-endian world
|
|
|
|
Signed-off-by: Al Stone <ahs3@redhat.com>
|
|
---
|
|
source/common/dmtbdump2.c | 50 +++++++++++++++++++-----------------
|
|
source/compiler/dttable2.c | 52 ++++++++++++++++++++++++++++----------
|
|
2 files changed, 65 insertions(+), 37 deletions(-)
|
|
|
|
Index: acpica-unix2-20200925/source/common/dmtbdump2.c
|
|
===================================================================
|
|
--- acpica-unix2-20200925.orig/source/common/dmtbdump2.c
|
|
+++ acpica-unix2-20200925/source/common/dmtbdump2.c
|
|
@@ -1871,17 +1871,18 @@ AcpiDmDumpSdev (
|
|
ACPI_SDEV_PCIE *Pcie;
|
|
ACPI_SDEV_NAMESPACE *Namesp;
|
|
ACPI_DMTABLE_INFO *InfoTable;
|
|
- UINT32 Length = Table->Length;
|
|
+ UINT32 TableLength = AcpiUtReadUint32(&Table->Length);
|
|
UINT32 Offset = sizeof (ACPI_TABLE_SDEV);
|
|
UINT16 PathOffset;
|
|
UINT16 PathLength;
|
|
UINT16 VendorDataOffset;
|
|
UINT16 VendorDataLength;
|
|
+ UINT16 SubtableLength;
|
|
|
|
|
|
/* Main table */
|
|
|
|
- Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoSdev);
|
|
+ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoSdev);
|
|
if (ACPI_FAILURE (Status))
|
|
{
|
|
return;
|
|
@@ -1890,13 +1891,14 @@ AcpiDmDumpSdev (
|
|
/* Subtables */
|
|
|
|
Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Table, Offset);
|
|
- while (Offset < Table->Length)
|
|
+ while (Offset < TableLength)
|
|
{
|
|
/* Common subtable header */
|
|
|
|
AcpiOsPrintf ("\n");
|
|
- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
|
|
- Subtable->Length, AcpiDmTableInfoSdevHdr);
|
|
+ SubtableLength = AcpiUtReadUint16(&Subtable->Length);
|
|
+ Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
|
|
+ SubtableLength, AcpiDmTableInfoSdevHdr);
|
|
if (ACPI_FAILURE (Status))
|
|
{
|
|
return;
|
|
@@ -1919,8 +1921,8 @@ AcpiDmDumpSdev (
|
|
}
|
|
|
|
AcpiOsPrintf ("\n");
|
|
- Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
|
|
- Subtable->Length, InfoTable);
|
|
+ Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
|
|
+ SubtableLength, InfoTable);
|
|
if (ACPI_FAILURE (Status))
|
|
{
|
|
return;
|
|
@@ -1933,12 +1935,12 @@ AcpiDmDumpSdev (
|
|
/* Dump the PCIe device ID(s) */
|
|
|
|
Namesp = ACPI_CAST_PTR (ACPI_SDEV_NAMESPACE, Subtable);
|
|
- PathOffset = Namesp->DeviceIdOffset;
|
|
- PathLength = Namesp->DeviceIdLength;
|
|
+ PathOffset = AcpiUtReadUint16(&Namesp->DeviceIdOffset);
|
|
+ PathLength = AcpiUtReadUint16(&Namesp->DeviceIdLength);
|
|
|
|
if (PathLength)
|
|
{
|
|
- Status = AcpiDmDumpTable (Table->Length, 0,
|
|
+ Status = AcpiDmDumpTable (TableLength, 0,
|
|
ACPI_ADD_PTR (UINT8, Namesp, PathOffset),
|
|
PathLength, AcpiDmTableInfoSdev0a);
|
|
if (ACPI_FAILURE (Status))
|
|
@@ -1949,14 +1951,14 @@ AcpiDmDumpSdev (
|
|
|
|
/* Dump the vendor-specific data */
|
|
|
|
- VendorDataLength =
|
|
- Namesp->VendorDataLength;
|
|
- VendorDataOffset =
|
|
- Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
|
|
+ VendorDataLength = AcpiUtReadUint16(&Namesp->VendorDataLength);
|
|
+ VendorDataOffset =
|
|
+ AcpiUtReadUint16(&Namesp->DeviceIdOffset) +
|
|
+ AcpiUtReadUint16(&Namesp->DeviceIdLength);
|
|
|
|
if (VendorDataLength)
|
|
{
|
|
- Status = AcpiDmDumpTable (Table->Length, 0,
|
|
+ Status = AcpiDmDumpTable (TableLength, 0,
|
|
ACPI_ADD_PTR (UINT8, Namesp, VendorDataOffset),
|
|
VendorDataLength, AcpiDmTableInfoSdev1b);
|
|
if (ACPI_FAILURE (Status))
|
|
@@ -1971,12 +1973,12 @@ AcpiDmDumpSdev (
|
|
/* PCI path substructures */
|
|
|
|
Pcie = ACPI_CAST_PTR (ACPI_SDEV_PCIE, Subtable);
|
|
- PathOffset = Pcie->PathOffset;
|
|
- PathLength = Pcie->PathLength;
|
|
+ PathOffset = AcpiUtReadUint16(&Pcie->PathOffset);
|
|
+ PathLength = AcpiUtReadUint16(&Pcie->PathLength);
|
|
|
|
while (PathLength)
|
|
{
|
|
- Status = AcpiDmDumpTable (Table->Length,
|
|
+ Status = AcpiDmDumpTable (TableLength,
|
|
PathOffset + Offset,
|
|
ACPI_ADD_PTR (UINT8, Pcie, PathOffset),
|
|
sizeof (ACPI_SDEV_PCIE_PATH), AcpiDmTableInfoSdev1a);
|
|
@@ -1991,12 +1993,14 @@ AcpiDmDumpSdev (
|
|
|
|
/* VendorData */
|
|
|
|
- VendorDataLength = Pcie->VendorDataLength;
|
|
- VendorDataOffset = Pcie->PathOffset + Pcie->PathLength;
|
|
+ VendorDataLength = AcpiUtReadUint16(&Pcie->VendorDataLength);
|
|
+ VendorDataOffset =
|
|
+ AcpiUtReadUint16(&Pcie->PathOffset) +
|
|
+ AcpiUtReadUint16(&Pcie->PathLength);
|
|
|
|
if (VendorDataLength)
|
|
{
|
|
- Status = AcpiDmDumpTable (Table->Length, 0,
|
|
+ Status = AcpiDmDumpTable (TableLength, 0,
|
|
ACPI_ADD_PTR (UINT8, Pcie, VendorDataOffset),
|
|
VendorDataLength, AcpiDmTableInfoSdev1b);
|
|
if (ACPI_FAILURE (Status))
|
|
@@ -2013,8 +2017,8 @@ AcpiDmDumpSdev (
|
|
NextSubtable:
|
|
/* Point to next subtable */
|
|
|
|
- Offset += Subtable->Length;
|
|
+ Offset += SubtableLength;
|
|
Subtable = ACPI_ADD_PTR (ACPI_SDEV_HEADER, Subtable,
|
|
- Subtable->Length);
|
|
+ SubtableLength);
|
|
}
|
|
}
|
|
Index: acpica-unix2-20200925/source/compiler/dttable2.c
|
|
===================================================================
|
|
--- acpica-unix2-20200925.orig/source/compiler/dttable2.c
|
|
+++ acpica-unix2-20200925/source/compiler/dttable2.c
|
|
@@ -1268,6 +1268,7 @@ DtCompileSdev (
|
|
ACPI_SDEV_PCIE *Pcie = NULL;
|
|
ACPI_SDEV_NAMESPACE *Namesp = NULL;
|
|
UINT32 EntryCount;
|
|
+ UINT16 Tmp16;
|
|
|
|
|
|
/* Subtables */
|
|
@@ -1289,7 +1290,7 @@ DtCompileSdev (
|
|
DtPushSubtable (Subtable);
|
|
|
|
SdevHeader = ACPI_CAST_PTR (ACPI_SDEV_HEADER, Subtable->Buffer);
|
|
- SdevHeader->Length = (UINT8)(sizeof (ACPI_SDEV_HEADER));
|
|
+ SdevHeader->Length = (UINT16) (sizeof (ACPI_SDEV_HEADER));
|
|
|
|
switch (SdevHeader->Type)
|
|
{
|
|
@@ -1345,7 +1346,7 @@ DtCompileSdev (
|
|
ParentTable = DtPeekSubtable ();
|
|
DtInsertSubtable (ParentTable, Subtable);
|
|
|
|
- Namesp->DeviceIdOffset = sizeof (ACPI_SDEV_NAMESPACE);
|
|
+ Namesp->DeviceIdOffset = (UINT16) sizeof (ACPI_SDEV_NAMESPACE);
|
|
Namesp->DeviceIdLength = (UINT16) Subtable->Length;
|
|
|
|
/* Append Vendor data */
|
|
@@ -1367,18 +1368,32 @@ DtCompileSdev (
|
|
ParentTable = DtPeekSubtable ();
|
|
DtInsertSubtable (ParentTable, Subtable);
|
|
|
|
- Namesp->VendorDataOffset =
|
|
- Namesp->DeviceIdOffset + Namesp->DeviceIdLength;
|
|
- Namesp->VendorDataLength =
|
|
- (UINT16) Subtable->Length;
|
|
+ Namesp->VendorDataOffset =
|
|
+ Namesp->DeviceIdOffset +
|
|
+ Namesp->DeviceIdLength;
|
|
+ Namesp->VendorDataLength = (UINT16) Subtable->Length;
|
|
|
|
/* Final size of entire namespace structure */
|
|
|
|
- SdevHeader->Length = (UINT16)(sizeof(ACPI_SDEV_NAMESPACE) +
|
|
- Subtable->Length + Namesp->DeviceIdLength);
|
|
+ SdevHeader->Length = (UINT16)
|
|
+ (sizeof(ACPI_SDEV_NAMESPACE) +
|
|
+ Subtable->Length +
|
|
+ Namesp->DeviceIdLength);
|
|
}
|
|
}
|
|
|
|
+ /* Make sure everything is now little-endian */
|
|
+ Tmp16 = AcpiUtReadUint16(&SdevHeader->Length);
|
|
+ SdevHeader->Length = Tmp16;
|
|
+ Tmp16 = AcpiUtReadUint16(&Namesp->DeviceIdOffset);
|
|
+ Namesp->DeviceIdOffset = Tmp16;
|
|
+ Tmp16 = AcpiUtReadUint16(&Namesp->DeviceIdLength);
|
|
+ Namesp->DeviceIdLength = Tmp16;
|
|
+ Tmp16 = AcpiUtReadUint16(&Namesp->VendorDataOffset);
|
|
+ Namesp->VendorDataOffset = Tmp16;
|
|
+ Tmp16 = AcpiUtReadUint16(&Namesp->VendorDataLength);
|
|
+ Namesp->VendorDataLength = Tmp16;
|
|
+
|
|
break;
|
|
|
|
case ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE:
|
|
@@ -1408,9 +1423,9 @@ DtCompileSdev (
|
|
|
|
/* Path offset will point immediately after the main subtable */
|
|
|
|
- Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
|
|
+ Pcie->PathOffset = sizeof (ACPI_SDEV_PCIE);
|
|
Pcie->PathLength = (UINT16)
|
|
- (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
|
|
+ (EntryCount * sizeof (ACPI_SDEV_PCIE_PATH));
|
|
|
|
/* Append the Vendor Data last */
|
|
|
|
@@ -1432,15 +1447,24 @@ DtCompileSdev (
|
|
DtInsertSubtable (ParentTable, Subtable);
|
|
|
|
Pcie->VendorDataOffset =
|
|
- Pcie->PathOffset + Pcie->PathLength;
|
|
- Pcie->VendorDataLength = (UINT16)
|
|
- Subtable->Length;
|
|
+ Pcie->PathOffset + Pcie->PathLength;
|
|
+ Pcie->VendorDataLength = (UINT16) Subtable->Length;
|
|
}
|
|
}
|
|
|
|
SdevHeader->Length =
|
|
- sizeof (ACPI_SDEV_PCIE) +
|
|
+ sizeof (ACPI_SDEV_PCIE) +
|
|
Pcie->PathLength + Pcie->VendorDataLength;
|
|
+ Tmp16 = AcpiUtReadUint16(&SdevHeader->Length);
|
|
+ SdevHeader->Length = Tmp16;
|
|
+ Tmp16 = AcpiUtReadUint16(&Pcie->PathOffset);
|
|
+ Pcie->PathOffset = Tmp16;
|
|
+ Tmp16 = AcpiUtReadUint16(&Pcie->PathLength);
|
|
+ Pcie->PathLength = Tmp16;
|
|
+ Tmp16 = AcpiUtReadUint16(&Pcie->VendorDataOffset);
|
|
+ Pcie->VendorDataOffset = Tmp16;
|
|
+ Tmp16 = AcpiUtReadUint16(&Pcie->VendorDataLength);
|
|
+ Pcie->VendorDataLength = Tmp16;
|
|
break;
|
|
|
|
default:
|