Blame 0024-Support-SDEV-in-a-big-endian-world.patch

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