Blame 0008-Support-DBG2-table-in-a-big-endian-world.patch

edb6c78
From 2d7396fe2b270b0bed6a6436f9e3d15cfbb9abfc Mon Sep 17 00:00:00 2001
edb6c78
From: Al Stone <ahs3@redhat.com>
edb6c78
Date: Sat, 19 Sep 2020 13:37:38 -0600
edb6c78
Subject: [PATCH 08/40] Support DBG2 table in a big-endian world
edb6c78
edb6c78
Signed-off-by: Al Stone <ahs3@redhat.com>
edb6c78
---
edb6c78
 source/common/dmtbdump1.c  | 35 +++++++++++++++++--------------
edb6c78
 source/compiler/dttable1.c | 43 ++++++++++++++++++++++++--------------
edb6c78
 2 files changed, 46 insertions(+), 32 deletions(-)
edb6c78
edb6c78
Index: acpica-unix2-20200925/source/common/dmtbdump1.c
edb6c78
===================================================================
edb6c78
--- acpica-unix2-20200925.orig/source/common/dmtbdump1.c
edb6c78
+++ acpica-unix2-20200925/source/common/dmtbdump1.c
edb6c78
@@ -298,7 +298,7 @@ AcpiDmDumpCsrt (
edb6c78
     ACPI_CSRT_GROUP         *Subtable;
edb6c78
     ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
edb6c78
     ACPI_CSRT_DESCRIPTOR    *SubSubtable;
edb6c78
-    UINT32                  Length = Table->Length;
edb6c78
+    UINT32                  Length = AcpiUtReadUint32(&Table->Length);
edb6c78
     UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
edb6c78
     UINT32                  SubOffset;
edb6c78
     UINT32                  SubSubOffset;
edb6c78
@@ -310,7 +310,7 @@ AcpiDmDumpCsrt (
edb6c78
     /* Subtables (Resource Groups) */
edb6c78
 
edb6c78
     Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
edb6c78
-    while (Offset < Table->Length)
edb6c78
+    while (Offset < Length)
edb6c78
     {
edb6c78
         /* Resource group subtable */
edb6c78
 
edb6c78
@@ -344,7 +344,7 @@ AcpiDmDumpCsrt (
edb6c78
             Offset + SubOffset);
edb6c78
 
edb6c78
         while ((SubOffset < Subtable->Length) &&
edb6c78
-              ((Offset + SubOffset) < Table->Length))
edb6c78
+              ((Offset + SubOffset) < Length))
edb6c78
         {
edb6c78
             AcpiOsPrintf ("\n");
edb6c78
             Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
edb6c78
@@ -405,12 +405,13 @@ AcpiDmDumpDbg2 (
edb6c78
 {
edb6c78
     ACPI_STATUS             Status;
edb6c78
     ACPI_DBG2_DEVICE        *Subtable;
edb6c78
-    UINT32                  Length = Table->Length;
edb6c78
+    UINT32                  Length = AcpiUtReadUint32(&Table->Length);
edb6c78
     UINT32                  Offset = sizeof (ACPI_TABLE_DBG2);
edb6c78
     UINT32                  i;
edb6c78
     UINT32                  ArrayOffset;
edb6c78
     UINT32                  AbsoluteOffset;
edb6c78
     UINT8                   *Array;
edb6c78
+    UINT16                  SubtableLength;
edb6c78
 
edb6c78
 
edb6c78
     /* Main table */
edb6c78
@@ -424,11 +425,12 @@ AcpiDmDumpDbg2 (
edb6c78
     /* Subtables */
edb6c78
 
edb6c78
     Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset);
edb6c78
-    while (Offset < Table->Length)
edb6c78
+    while (Offset < Length)
edb6c78
     {
edb6c78
         AcpiOsPrintf ("\n");
edb6c78
+	SubtableLength = AcpiUtReadUint16(&Subtable->Length);
edb6c78
         Status = AcpiDmDumpTable (Length, Offset, Subtable,
edb6c78
-            Subtable->Length, AcpiDmTableInfoDbg2Device);
edb6c78
+            SubtableLength, AcpiDmTableInfoDbg2Device);
edb6c78
         if (ACPI_FAILURE (Status))
edb6c78
         {
edb6c78
             return;
edb6c78
@@ -438,13 +440,13 @@ AcpiDmDumpDbg2 (
edb6c78
 
edb6c78
         for (i = 0; i < Subtable->RegisterCount; i++)
edb6c78
         {
edb6c78
-            ArrayOffset = Subtable->BaseAddressOffset +
edb6c78
+            ArrayOffset = AcpiUtReadUint16(&Subtable->BaseAddressOffset) +
edb6c78
                 (sizeof (ACPI_GENERIC_ADDRESS) * i);
edb6c78
             AbsoluteOffset = Offset + ArrayOffset;
edb6c78
             Array = (UINT8 *) Subtable + ArrayOffset;
edb6c78
 
edb6c78
             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
edb6c78
-                Subtable->Length, AcpiDmTableInfoDbg2Addr);
edb6c78
+                SubtableLength, AcpiDmTableInfoDbg2Addr);
edb6c78
             if (ACPI_FAILURE (Status))
edb6c78
             {
edb6c78
                 return;
edb6c78
@@ -455,13 +457,13 @@ AcpiDmDumpDbg2 (
edb6c78
 
edb6c78
         for (i = 0; i < Subtable->RegisterCount; i++)
edb6c78
         {
edb6c78
-            ArrayOffset = Subtable->AddressSizeOffset +
edb6c78
+            ArrayOffset = AcpiUtReadUint16(&Subtable->AddressSizeOffset) +
edb6c78
                 (sizeof (UINT32) * i);
edb6c78
             AbsoluteOffset = Offset + ArrayOffset;
edb6c78
             Array = (UINT8 *) Subtable + ArrayOffset;
edb6c78
 
edb6c78
             Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
edb6c78
-                Subtable->Length, AcpiDmTableInfoDbg2Size);
edb6c78
+                SubtableLength, AcpiDmTableInfoDbg2Size);
edb6c78
             if (ACPI_FAILURE (Status))
edb6c78
             {
edb6c78
                 return;
edb6c78
@@ -471,12 +473,12 @@ AcpiDmDumpDbg2 (
edb6c78
         /* Dump the Namestring (required) */
edb6c78
 
edb6c78
         AcpiOsPrintf ("\n");
edb6c78
-        ArrayOffset = Subtable->NamepathOffset;
edb6c78
+        ArrayOffset = AcpiUtReadUint16(&Subtable->NamepathOffset);
edb6c78
         AbsoluteOffset = Offset + ArrayOffset;
edb6c78
         Array = (UINT8 *) Subtable + ArrayOffset;
edb6c78
 
edb6c78
         Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array,
edb6c78
-            Subtable->Length, AcpiDmTableInfoDbg2Name);
edb6c78
+            SubtableLength, AcpiDmTableInfoDbg2Name);
edb6c78
         if (ACPI_FAILURE (Status))
edb6c78
         {
edb6c78
             return;
edb6c78
@@ -486,8 +488,9 @@ AcpiDmDumpDbg2 (
edb6c78
 
edb6c78
         if (Subtable->OemDataOffset)
edb6c78
         {
edb6c78
-            Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset,
edb6c78
-                Table, Subtable->OemDataLength,
edb6c78
+            Status = AcpiDmDumpTable (Length,
edb6c78
+		Offset + AcpiUtReadUint16(&Subtable->OemDataOffset),
edb6c78
+                Table, AcpiUtReadUint16(&Subtable->OemDataLength),
edb6c78
                 AcpiDmTableInfoDbg2OemData);
edb6c78
             if (ACPI_FAILURE (Status))
edb6c78
             {
edb6c78
@@ -497,9 +500,9 @@ AcpiDmDumpDbg2 (
edb6c78
 
edb6c78
         /* Point to next subtable */
edb6c78
 
edb6c78
-        Offset += Subtable->Length;
edb6c78
+        Offset += SubtableLength;
edb6c78
         Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable,
edb6c78
-            Subtable->Length);
edb6c78
+            SubtableLength);
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
@@ -281,6 +281,7 @@ DtCompileCsrt (
edb6c78
     DT_FIELD                **PFieldList = (DT_FIELD **) List;
edb6c78
     UINT32                  DescriptorCount;
edb6c78
     UINT32                  GroupLength;
edb6c78
+    UINT32                  Tmp;
edb6c78
 
edb6c78
 
edb6c78
     /* Subtables (Resource Groups) */
edb6c78
@@ -299,12 +300,13 @@ DtCompileCsrt (
edb6c78
 
edb6c78
         /* Compute the number of resource descriptors */
edb6c78
 
edb6c78
-        GroupLength =
edb6c78
-            (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
edb6c78
-                Subtable->Buffer))->Length -
edb6c78
-            (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
edb6c78
-                Subtable->Buffer))->SharedInfoLength -
edb6c78
-            sizeof (ACPI_CSRT_GROUP);
edb6c78
+	Tmp = AcpiUtReadUint32(&(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
edb6c78
+                		 Subtable->Buffer))->Length);
edb6c78
+	GroupLength = Tmp;
edb6c78
+	Tmp = AcpiUtReadUint32(&(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
edb6c78
+                		 Subtable->Buffer))->SharedInfoLength);
edb6c78
+        GroupLength -= Tmp;
edb6c78
+        GroupLength -= sizeof (ACPI_CSRT_GROUP);
edb6c78
 
edb6c78
         DescriptorCount = (GroupLength  /
edb6c78
             sizeof (ACPI_CSRT_DESCRIPTOR));
edb6c78
@@ -392,6 +394,7 @@ DtCompileDbg2 (
edb6c78
     ACPI_DBG2_DEVICE        *DeviceInfo;
edb6c78
     UINT16                  CurrentOffset;
edb6c78
     UINT32                  i;
edb6c78
+    UINT32                  Tmp;
edb6c78
 
edb6c78
 
edb6c78
     /* Main table */
edb6c78
@@ -408,10 +411,12 @@ DtCompileDbg2 (
edb6c78
     /* Main table fields */
edb6c78
 
edb6c78
     Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
edb6c78
-    Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
edb6c78
-        ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
edb6c78
+    Tmp = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
edb6c78
+       ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
edb6c78
+    AcpiUtWriteUint(&Dbg2Header->InfoOffset, sizeof(UINT32),
edb6c78
+		    &Tmp, sizeof(UINT32));
edb6c78
 
edb6c78
-    SubtableCount = Dbg2Header->InfoCount;
edb6c78
+    SubtableCount = Tmp;
edb6c78
     DtPushSubtable (Subtable);
edb6c78
 
edb6c78
     /* Process all Device Information subtables (Count = InfoCount) */
edb6c78
@@ -438,7 +443,8 @@ DtCompileDbg2 (
edb6c78
 
edb6c78
         /* BaseAddressRegister GAS array (Required, size is RegisterCount) */
edb6c78
 
edb6c78
-        DeviceInfo->BaseAddressOffset = CurrentOffset;
edb6c78
+        AcpiUtWriteUint(&DeviceInfo->BaseAddressOffset, sizeof(UINT16),
edb6c78
+		       	&CurrentOffset, sizeof(UINT16));
edb6c78
         for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
edb6c78
         {
edb6c78
             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr,
edb6c78
@@ -454,7 +460,8 @@ DtCompileDbg2 (
edb6c78
 
edb6c78
         /* AddressSize array (Required, size = RegisterCount) */
edb6c78
 
edb6c78
-        DeviceInfo->AddressSizeOffset = CurrentOffset;
edb6c78
+        AcpiUtWriteUint(&DeviceInfo->AddressSizeOffset, sizeof(UINT16),
edb6c78
+		        &CurrentOffset, sizeof(UINT16));
edb6c78
         for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
edb6c78
         {
edb6c78
             Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size,
edb6c78
@@ -470,7 +477,8 @@ DtCompileDbg2 (
edb6c78
 
edb6c78
         /* NamespaceString device identifier (Required, size = NamePathLength) */
edb6c78
 
edb6c78
-        DeviceInfo->NamepathOffset = CurrentOffset;
edb6c78
+        AcpiUtWriteUint(&DeviceInfo->NamepathOffset, sizeof(UINT16),
edb6c78
+			&CurrentOffset, sizeof(UINT16));
edb6c78
         Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name,
edb6c78
             &Subtable);
edb6c78
         if (ACPI_FAILURE (Status))
edb6c78
@@ -480,8 +488,9 @@ DtCompileDbg2 (
edb6c78
 
edb6c78
         /* Update the device info header */
edb6c78
 
edb6c78
-        DeviceInfo->NamepathLength = (UINT16) Subtable->Length;
edb6c78
-        CurrentOffset += (UINT16) DeviceInfo->NamepathLength;
edb6c78
+        AcpiUtWriteUint(&DeviceInfo->NamepathLength, sizeof(UINT16),
edb6c78
+			&Subtable->Length, sizeof(UINT32));
edb6c78
+        CurrentOffset += AcpiUtReadUint16(&DeviceInfo->NamepathLength);
edb6c78
         DtInsertSubtable (ParentTable, Subtable);
edb6c78
 
edb6c78
         /* OemData - Variable-length data (Optional, size = OemDataLength) */
edb6c78
@@ -508,8 +517,10 @@ DtCompileDbg2 (
edb6c78
 
edb6c78
         if (Subtable && Subtable->Length)
edb6c78
         {
edb6c78
-            DeviceInfo->OemDataOffset = CurrentOffset;
edb6c78
-            DeviceInfo->OemDataLength = (UINT16) Subtable->Length;
edb6c78
+            AcpiUtWriteUint(&DeviceInfo->OemDataOffset, sizeof(UINT16),
edb6c78
+			    &CurrentOffset, sizeof(UINT16));
edb6c78
+            AcpiUtWriteUint(&DeviceInfo->OemDataLength, sizeof(UINT16),
edb6c78
+			    &Subtable->Length, sizeof(UINT32));
edb6c78
 
edb6c78
             DtInsertSubtable (ParentTable, Subtable);
edb6c78
         }