edb6c78
From 88d16feb9d6982cc9c09f2ae9b76b26f0d9c96e0 Mon Sep 17 00:00:00 2001
edb6c78
From: Al Stone <ahs3@redhat.com>
edb6c78
Date: Wed, 30 Sep 2020 17:48:04 -0600
edb6c78
Subject: [PATCH 36/40] Support IORT in a big-endian world
edb6c78
edb6c78
Signed-off-by: Al Stone <ahs3@redhat.com>
edb6c78
---
edb6c78
 source/common/dmtbdump2.c  | 73 ++++++++++++++++++++++----------------
edb6c78
 source/compiler/dttable1.c | 37 ++++++++++---------
edb6c78
 2 files changed, 64 insertions(+), 46 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
@@ -75,16 +75,19 @@ AcpiDmDumpIort (
edb6c78
     ACPI_IORT_SMMU          *IortSmmu = NULL;
edb6c78
     UINT32                  Offset;
edb6c78
     UINT32                  NodeOffset;
edb6c78
+    UINT32                  NodeLength;
edb6c78
     UINT32                  Length;
edb6c78
     ACPI_DMTABLE_INFO       *InfoTable;
edb6c78
     char                    *String;
edb6c78
     UINT32                  i;
edb6c78
     UINT32                  MappingByteLength;
edb6c78
+    UINT32                  MappingCount;
edb6c78
+    UINT32                  TableLength = AcpiUtReadUint32(&Table->Length);
edb6c78
 
edb6c78
 
edb6c78
     /* Main table */
edb6c78
 
edb6c78
-    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort);
edb6c78
+    Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoIort);
edb6c78
     if (ACPI_FAILURE (Status))
edb6c78
     {
edb6c78
         return;
edb6c78
@@ -95,25 +98,26 @@ AcpiDmDumpIort (
edb6c78
 
edb6c78
     /* Dump the OptionalPadding (optional) */
edb6c78
 
edb6c78
-    if (Iort->NodeOffset > Offset)
edb6c78
+    NodeOffset = AcpiUtReadUint32(&Iort->NodeOffset);
edb6c78
+    if (NodeOffset > Offset)
edb6c78
     {
edb6c78
-        Status = AcpiDmDumpTable (Table->Length, Offset, Table,
edb6c78
-            Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad);
edb6c78
+        Status = AcpiDmDumpTable (TableLength, Offset, Table,
edb6c78
+            NodeOffset - Offset, AcpiDmTableInfoIortPad);
edb6c78
         if (ACPI_FAILURE (Status))
edb6c78
         {
edb6c78
             return;
edb6c78
         }
edb6c78
     }
edb6c78
 
edb6c78
-    Offset = Iort->NodeOffset;
edb6c78
-    while (Offset < Table->Length)
edb6c78
+    Offset = AcpiUtReadUint32(&Iort->NodeOffset);
edb6c78
+    while (Offset < TableLength)
edb6c78
     {
edb6c78
         /* Common subtable header */
edb6c78
 
edb6c78
         IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset);
edb6c78
         AcpiOsPrintf ("\n");
edb6c78
         Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
edb6c78
-        Status = AcpiDmDumpTable (Table->Length, Offset,
edb6c78
+        Status = AcpiDmDumpTable (TableLength, Offset,
edb6c78
             IortNode, Length, AcpiDmTableInfoIortHdr);
edb6c78
         if (ACPI_FAILURE (Status))
edb6c78
         {
edb6c78
@@ -142,7 +146,7 @@ AcpiDmDumpIort (
edb6c78
         case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
edb6c78
 
edb6c78
             InfoTable = AcpiDmTableInfoIort2;
edb6c78
-            Length = IortNode->Length - NodeOffset;
edb6c78
+            Length = AcpiUtReadUint16(&IortNode->Length) - NodeOffset;
edb6c78
             break;
edb6c78
 
edb6c78
         case ACPI_IORT_NODE_SMMU:
edb6c78
@@ -155,13 +159,13 @@ AcpiDmDumpIort (
edb6c78
         case ACPI_IORT_NODE_SMMU_V3:
edb6c78
 
edb6c78
             InfoTable = AcpiDmTableInfoIort4;
edb6c78
-            Length = IortNode->Length - NodeOffset;
edb6c78
+            Length = AcpiUtReadUint16(&IortNode->Length) - NodeOffset;
edb6c78
             break;
edb6c78
 
edb6c78
         case ACPI_IORT_NODE_PMCG:
edb6c78
 
edb6c78
             InfoTable = AcpiDmTableInfoIort5;
edb6c78
-            Length = IortNode->Length - NodeOffset;
edb6c78
+            Length = AcpiUtReadUint16(&IortNode->Length) - NodeOffset;
edb6c78
             break;
edb6c78
 
edb6c78
         default:
edb6c78
@@ -171,7 +175,7 @@ AcpiDmDumpIort (
edb6c78
 
edb6c78
             /* Attempt to continue */
edb6c78
 
edb6c78
-            if (!IortNode->Length)
edb6c78
+            if (!AcpiUtReadUint16(&IortNode->Length))
edb6c78
             {
edb6c78
                 AcpiOsPrintf ("Invalid zero length IORT node\n");
edb6c78
                 return;
edb6c78
@@ -182,7 +186,7 @@ AcpiDmDumpIort (
edb6c78
         /* Dump the node subtable header */
edb6c78
 
edb6c78
         AcpiOsPrintf ("\n");
edb6c78
-        Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
edb6c78
+        Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset,
edb6c78
             ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
edb6c78
             Length, InfoTable);
edb6c78
         if (ACPI_FAILURE (Status))
edb6c78
@@ -202,9 +206,11 @@ AcpiDmDumpIort (
edb6c78
 
edb6c78
             if (IortItsGroup)
edb6c78
             {
edb6c78
-                for (i = 0; i < IortItsGroup->ItsCount; i++)
edb6c78
+		UINT32 ItsCount = AcpiUtReadUint32(&IortItsGroup->ItsCount);
edb6c78
+
edb6c78
+                for (i = 0; i < ItsCount; i++)
edb6c78
                 {
edb6c78
-                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
edb6c78
+                    Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset,
edb6c78
                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
edb6c78
                         4, AcpiDmTableInfoIort0a);
edb6c78
                     if (ACPI_FAILURE (Status))
edb6c78
@@ -221,12 +227,14 @@ AcpiDmDumpIort (
edb6c78
 
edb6c78
             /* Dump the Padding (optional) */
edb6c78
 
edb6c78
-            if (IortNode->Length > NodeOffset)
edb6c78
+	    NodeLength = AcpiUtReadUint16(&IortNode->Length);
edb6c78
+            if (NodeLength > NodeOffset)
edb6c78
             {
edb6c78
                 MappingByteLength =
edb6c78
-                    IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING);
edb6c78
-                Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
edb6c78
-                    Table, IortNode->Length - NodeOffset - MappingByteLength,
edb6c78
+                    AcpiUtReadUint32(&IortNode->MappingCount) *
edb6c78
+		    sizeof (ACPI_IORT_ID_MAPPING);
edb6c78
+                Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset,
edb6c78
+                    Table, NodeLength - NodeOffset - MappingByteLength,
edb6c78
                     AcpiDmTableInfoIort1a);
edb6c78
                 if (ACPI_FAILURE (Status))
edb6c78
                 {
edb6c78
@@ -243,9 +251,11 @@ AcpiDmDumpIort (
edb6c78
 
edb6c78
             if (IortSmmu)
edb6c78
             {
edb6c78
+		UINT32 InterruptCount;
edb6c78
+
edb6c78
                 Length = 2 * sizeof (UINT64);
edb6c78
-                NodeOffset = IortSmmu->GlobalInterruptOffset;
edb6c78
-                Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
edb6c78
+                NodeOffset = AcpiUtReadUint32(&IortSmmu->GlobalInterruptOffset);
edb6c78
+                Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset,
edb6c78
                     ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
edb6c78
                     Length, AcpiDmTableInfoIort3a);
edb6c78
                 if (ACPI_FAILURE (Status))
edb6c78
@@ -253,10 +263,11 @@ AcpiDmDumpIort (
edb6c78
                     return;
edb6c78
                 }
edb6c78
 
edb6c78
-                NodeOffset = IortSmmu->ContextInterruptOffset;
edb6c78
-                for (i = 0; i < IortSmmu->ContextInterruptCount; i++)
edb6c78
+                NodeOffset = AcpiUtReadUint32(&IortSmmu->ContextInterruptOffset);
edb6c78
+		InterruptCount = AcpiUtReadUint32(&IortSmmu->ContextInterruptCount);
edb6c78
+                for (i = 0; i < InterruptCount; i++)
edb6c78
                 {
edb6c78
-                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
edb6c78
+                    Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset,
edb6c78
                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
edb6c78
                         8, AcpiDmTableInfoIort3b);
edb6c78
                     if (ACPI_FAILURE (Status))
edb6c78
@@ -267,10 +278,11 @@ AcpiDmDumpIort (
edb6c78
                     NodeOffset += 8;
edb6c78
                 }
edb6c78
 
edb6c78
-                NodeOffset = IortSmmu->PmuInterruptOffset;
edb6c78
-                for (i = 0; i < IortSmmu->PmuInterruptCount; i++)
edb6c78
+                NodeOffset = AcpiUtReadUint32(&IortSmmu->PmuInterruptOffset);
edb6c78
+		InterruptCount = AcpiUtReadUint32(&IortSmmu->PmuInterruptCount);
edb6c78
+                for (i = 0; i < InterruptCount; i++)
edb6c78
                 {
edb6c78
-                    Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
edb6c78
+                    Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset,
edb6c78
                         ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
edb6c78
                         8, AcpiDmTableInfoIort3c);
edb6c78
                     if (ACPI_FAILURE (Status))
edb6c78
@@ -290,12 +302,13 @@ AcpiDmDumpIort (
edb6c78
 
edb6c78
         /* Dump the ID mappings */
edb6c78
 
edb6c78
-        NodeOffset = IortNode->MappingOffset;
edb6c78
-        for (i = 0; i < IortNode->MappingCount; i++)
edb6c78
+        NodeOffset = AcpiUtReadUint32(&IortNode->MappingOffset);
edb6c78
+	MappingCount = AcpiUtReadUint32(&IortNode->MappingCount);
edb6c78
+        for (i = 0; i < MappingCount; i++)
edb6c78
         {
edb6c78
             AcpiOsPrintf ("\n");
edb6c78
             Length = sizeof (ACPI_IORT_ID_MAPPING);
edb6c78
-            Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset,
edb6c78
+            Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset,
edb6c78
                 ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset),
edb6c78
                 Length, AcpiDmTableInfoIortMap);
edb6c78
             if (ACPI_FAILURE (Status))
edb6c78
@@ -309,7 +322,7 @@ AcpiDmDumpIort (
edb6c78
 NextSubtable:
edb6c78
         /* Point to next node subtable */
edb6c78
 
edb6c78
-        Offset += IortNode->Length;
edb6c78
+        Offset += AcpiUtReadUint16(&IortNode->Length);
edb6c78
     }
edb6c78
 }
edb6c78
 
edb6c78
Index: acpica-unix2-20200925/source/compiler/dttable1.c
edb6c78
===================================================================
edb6c78
--- acpica-unix2-20200925.orig/source/compiler/dttable1.c
edb6c78
+++ acpica-unix2-20200925/source/compiler/dttable1.c
edb6c78
@@ -1516,6 +1516,7 @@ DtCompileIort (
edb6c78
     ACPI_IORT_NODE          *IortNode;
edb6c78
     ACPI_IORT_ITS_GROUP     *IortItsGroup;
edb6c78
     ACPI_IORT_SMMU          *IortSmmu;
edb6c78
+    UINT32                  IortNodeOffset;
edb6c78
     UINT32                  NodeNumber;
edb6c78
     UINT32                  NodeLength;
edb6c78
     UINT32                  IdMappingNumber;
edb6c78
@@ -1548,7 +1549,7 @@ DtCompileIort (
edb6c78
      * Optionally allows the generic data types to be used for filling
edb6c78
      * this field.
edb6c78
      */
edb6c78
-    Iort->NodeOffset = sizeof (ACPI_TABLE_IORT);
edb6c78
+    IortNodeOffset = sizeof (ACPI_TABLE_IORT);
edb6c78
     Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad,
edb6c78
         &Subtable);
edb6c78
     if (ACPI_FAILURE (Status))
edb6c78
@@ -1558,7 +1559,7 @@ DtCompileIort (
edb6c78
     if (Subtable)
edb6c78
     {
edb6c78
         DtInsertSubtable (ParentTable, Subtable);
edb6c78
-        Iort->NodeOffset += Subtable->Length;
edb6c78
+        IortNodeOffset += Subtable->Length;
edb6c78
     }
edb6c78
     else
edb6c78
     {
edb6c78
@@ -1568,8 +1569,9 @@ DtCompileIort (
edb6c78
         {
edb6c78
             return (Status);
edb6c78
         }
edb6c78
-        Iort->NodeOffset += PaddingLength;
edb6c78
+        IortNodeOffset += PaddingLength;
edb6c78
     }
edb6c78
+    Iort->NodeOffset = AcpiUtReadUint32(&IortNodeOffset);
edb6c78
 
edb6c78
     NodeNumber = 0;
edb6c78
     while (*PFieldList)
edb6c78
@@ -1623,7 +1625,7 @@ DtCompileIort (
edb6c78
                 ItsNumber++;
edb6c78
             }
edb6c78
 
edb6c78
-            IortItsGroup->ItsCount = ItsNumber;
edb6c78
+            IortItsGroup->ItsCount = AcpiUtReadUint32(&ItsNumber);
edb6c78
             break;
edb6c78
 
edb6c78
         case ACPI_IORT_NODE_NAMED_COMPONENT:
edb6c78
@@ -1657,15 +1659,18 @@ DtCompileIort (
edb6c78
             }
edb6c78
             else
edb6c78
             {
edb6c78
-                if (NodeLength > IortNode->MappingOffset)
edb6c78
+		UINT32 MappingOffset;
edb6c78
+
edb6c78
+		MappingOffset = IortNode->MappingOffset;
edb6c78
+                if (NodeLength > MappingOffset)
edb6c78
                 {
edb6c78
                     return (AE_BAD_DATA);
edb6c78
                 }
edb6c78
 
edb6c78
-                if (NodeLength < IortNode->MappingOffset)
edb6c78
+                if (NodeLength < MappingOffset)
edb6c78
                 {
edb6c78
                     Status = DtCompilePadding (
edb6c78
-                        IortNode->MappingOffset - NodeLength,
edb6c78
+                        MappingOffset - NodeLength,
edb6c78
                         &Subtable);
edb6c78
                     if (ACPI_FAILURE (Status))
edb6c78
                     {
edb6c78
@@ -1673,7 +1678,7 @@ DtCompileIort (
edb6c78
                     }
edb6c78
 
edb6c78
                     DtInsertSubtable (ParentTable, Subtable);
edb6c78
-                    NodeLength = IortNode->MappingOffset;
edb6c78
+                    NodeLength = MappingOffset;
edb6c78
                 }
edb6c78
             }
edb6c78
             break;
edb6c78
@@ -1706,7 +1711,7 @@ DtCompileIort (
edb6c78
 
edb6c78
             /* Compile global interrupt array */
edb6c78
 
edb6c78
-            IortSmmu->GlobalInterruptOffset = NodeLength;
edb6c78
+            IortSmmu->GlobalInterruptOffset = AcpiUtReadUint32(&NodeLength);
edb6c78
             Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a,
edb6c78
                 &Subtable);
edb6c78
             if (ACPI_FAILURE (Status))
edb6c78
@@ -1720,7 +1725,7 @@ DtCompileIort (
edb6c78
             /* Compile context interrupt array */
edb6c78
 
edb6c78
             ContextIrptNumber = 0;
edb6c78
-            IortSmmu->ContextInterruptOffset = NodeLength;
edb6c78
+            IortSmmu->ContextInterruptOffset = AcpiUtReadUint32(&NodeLength);
edb6c78
             while (*PFieldList)
edb6c78
             {
edb6c78
                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b,
edb6c78
@@ -1740,12 +1745,12 @@ DtCompileIort (
edb6c78
                 ContextIrptNumber++;
edb6c78
             }
edb6c78
 
edb6c78
-            IortSmmu->ContextInterruptCount = ContextIrptNumber;
edb6c78
+            IortSmmu->ContextInterruptCount = AcpiUtReadUint32(&ContextIrptNumber);
edb6c78
 
edb6c78
             /* Compile PMU interrupt array */
edb6c78
 
edb6c78
             PmuIrptNumber = 0;
edb6c78
-            IortSmmu->PmuInterruptOffset = NodeLength;
edb6c78
+            IortSmmu->PmuInterruptOffset = AcpiUtReadUint32(&NodeLength);
edb6c78
             while (*PFieldList)
edb6c78
             {
edb6c78
                 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c,
edb6c78
@@ -1765,7 +1770,7 @@ DtCompileIort (
edb6c78
                 PmuIrptNumber++;
edb6c78
             }
edb6c78
 
edb6c78
-            IortSmmu->PmuInterruptCount = PmuIrptNumber;
edb6c78
+            IortSmmu->PmuInterruptCount = AcpiUtReadUint32(&PmuIrptNumber);
edb6c78
             break;
edb6c78
 
edb6c78
         case ACPI_IORT_NODE_SMMU_V3:
edb6c78
@@ -1802,7 +1807,7 @@ DtCompileIort (
edb6c78
 
edb6c78
         /* Compile Array of ID mappings */
edb6c78
 
edb6c78
-        IortNode->MappingOffset = NodeLength;
edb6c78
+	IortNode->MappingOffset = AcpiUtReadUint32(&NodeLength);
edb6c78
         IdMappingNumber = 0;
edb6c78
         while (*PFieldList)
edb6c78
         {
edb6c78
@@ -1823,7 +1828,7 @@ DtCompileIort (
edb6c78
             IdMappingNumber++;
edb6c78
         }
edb6c78
 
edb6c78
-        IortNode->MappingCount = IdMappingNumber;
edb6c78
+        IortNode->MappingCount = AcpiUtReadUint32(&IdMappingNumber);
edb6c78
         if (!IdMappingNumber)
edb6c78
         {
edb6c78
             IortNode->MappingOffset = 0;
edb6c78
@@ -1838,7 +1843,7 @@ DtCompileIort (
edb6c78
         NodeNumber++;
edb6c78
     }
edb6c78
 
edb6c78
-    Iort->NodeCount = NodeNumber;
edb6c78
+    Iort->NodeCount = AcpiUtReadUint32(&NodeNumber);
edb6c78
     return (AE_OK);
edb6c78
 }
edb6c78