416465f
From 5aec8511fc433a71cb8b6d26be464355d0c3f5cc Mon Sep 17 00:00:00 2001
edb6c78
From: Al Stone <ahs3@redhat.com>
edb6c78
Date: Thu, 24 Sep 2020 15:25:53 -0600
416465f
Subject: [PATCH 26/45] Support NFIT in a big-endian world
416465f
416465f
NB: this required correcting the starting pointer for the NFIT
416465f
SMBIOS subtable; otherwise, disassembly did not work properly.
edb6c78
edb6c78
Signed-off-by: Al Stone <ahs3@redhat.com>
edb6c78
---
edb6c78
 source/common/dmtable.c    |  4 ++--
416465f
 source/common/dmtbdump2.c  | 49 ++++++++++++++++++++++----------------
edb6c78
 source/compiler/dttable2.c | 11 ++++++---
416465f
 3 files changed, 39 insertions(+), 25 deletions(-)
edb6c78
fc3eef6
Index: acpica-unix2-20220331/source/common/dmtable.c
edb6c78
===================================================================
fc3eef6
--- acpica-unix2-20220331.orig/source/common/dmtable.c
fc3eef6
+++ acpica-unix2-20220331/source/common/dmtable.c
fc3eef6
@@ -1766,13 +1766,13 @@ AcpiDmDumpTable (
edb6c78
 
edb6c78
             /* NFIT subtable types */
edb6c78
 
edb6c78
-            Temp16 = ACPI_GET16 (Target);
416465f
+            Temp16 = AcpiUtReadUint16 (Target);
edb6c78
             if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
edb6c78
             {
edb6c78
                 Temp16 = ACPI_NFIT_TYPE_RESERVED;
edb6c78
             }
edb6c78
 
edb6c78
-            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
edb6c78
+            AcpiOsPrintf (UINT16_FORMAT, Temp16,
edb6c78
                 AcpiDmNfitSubnames[Temp16]);
edb6c78
             break;
edb6c78
 
fc3eef6
Index: acpica-unix2-20220331/source/common/dmtbdump2.c
edb6c78
===================================================================
fc3eef6
--- acpica-unix2-20220331.orig/source/common/dmtbdump2.c
fc3eef6
+++ acpica-unix2-20220331/source/common/dmtbdump2.c
fc3eef6
@@ -1244,18 +1244,23 @@ AcpiDmDumpNfit (
edb6c78
     ACPI_STATUS             Status;
edb6c78
     UINT32                  Offset = sizeof (ACPI_TABLE_NFIT);
edb6c78
     UINT32                  FieldOffset = 0;
edb6c78
-    UINT32                  Length;
416465f
+    UINT32                  TableLength = AcpiUtReadUint32 (&Table->Length);
edb6c78
     ACPI_NFIT_HEADER        *Subtable;
edb6c78
     ACPI_DMTABLE_INFO       *InfoTable;
edb6c78
     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
edb6c78
     ACPI_NFIT_SMBIOS        *SmbiosInfo = NULL;
edb6c78
     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
edb6c78
     UINT32                  i;
edb6c78
+    UINT32                  Length;
edb6c78
+    UINT32                  LineCount;
edb6c78
+    UINT16                  SubtableLength;
edb6c78
+    UINT16                  SubtableType;
edb6c78
+    UINT16                  HintCount;
edb6c78
 
edb6c78
 
edb6c78
     /* Main table */
edb6c78
 
edb6c78
-    Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
edb6c78
+    Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNfit);
edb6c78
     if (ACPI_FAILURE (Status))
edb6c78
     {
edb6c78
         return;
fc3eef6
@@ -1264,19 +1269,21 @@ AcpiDmDumpNfit (
edb6c78
     /* Subtables */
edb6c78
 
edb6c78
     Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
edb6c78
-    while (Offset < Table->Length)
edb6c78
+    while (Offset < TableLength)
edb6c78
     {
edb6c78
         /* NFIT subtable header */
edb6c78
 
edb6c78
         AcpiOsPrintf ("\n");
edb6c78
-        Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
edb6c78
-            Subtable->Length, AcpiDmTableInfoNfitHdr);
416465f
+        SubtableType = AcpiUtReadUint16 (&Subtable->Type);
416465f
+        SubtableLength = AcpiUtReadUint16 (&Subtable->Length);
edb6c78
+        Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
edb6c78
+            SubtableLength, AcpiDmTableInfoNfitHdr);
edb6c78
         if (ACPI_FAILURE (Status))
edb6c78
         {
edb6c78
             return;
edb6c78
         }
edb6c78
 
edb6c78
-        switch (Subtable->Type)
edb6c78
+        switch (SubtableType)
edb6c78
         {
edb6c78
         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
edb6c78
 
fc3eef6
@@ -1327,11 +1334,11 @@ AcpiDmDumpNfit (
edb6c78
 
edb6c78
         default:
edb6c78
             AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
edb6c78
-                Subtable->Type);
edb6c78
+                SubtableType);
edb6c78
 
edb6c78
             /* Attempt to continue */
edb6c78
 
edb6c78
-            if (!Subtable->Length)
edb6c78
+            if (!SubtableLength)
edb6c78
             {
edb6c78
                 AcpiOsPrintf ("Invalid zero length subtable\n");
edb6c78
                 return;
fc3eef6
@@ -1340,8 +1347,8 @@ AcpiDmDumpNfit (
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;
fc3eef6
@@ -1349,14 +1356,15 @@ AcpiDmDumpNfit (
edb6c78
 
edb6c78
         /* Per-subtable variable-length fields */
edb6c78
 
edb6c78
-        switch (Subtable->Type)
edb6c78
+        switch (SubtableType)
edb6c78
         {
edb6c78
         case ACPI_NFIT_TYPE_INTERLEAVE:
edb6c78
 
edb6c78
             Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
edb6c78
-            for (i = 0; i < Interleave->LineCount; i++)
416465f
+            LineCount = AcpiUtReadUint32 (&Interleave->LineCount);
edb6c78
+            for (i = 0; i < LineCount; i++)
edb6c78
             {
edb6c78
-                Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
edb6c78
+                Status = AcpiDmDumpTable (TableLength, Offset + FieldOffset,
edb6c78
                     &Interleave->LineOffset[i],
edb6c78
                     sizeof (UINT32), AcpiDmTableInfoNfit2a);
edb6c78
                 if (ACPI_FAILURE (Status))
fc3eef6
@@ -1370,14 +1378,14 @@ AcpiDmDumpNfit (
edb6c78
 
edb6c78
         case ACPI_NFIT_TYPE_SMBIOS:
edb6c78
 
edb6c78
-            Length = Subtable->Length -
edb6c78
+            Length = SubtableLength -
edb6c78
                 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
edb6c78
 
edb6c78
             if (Length)
edb6c78
             {
edb6c78
-                Status = AcpiDmDumpTable (Table->Length,
edb6c78
+                Status = AcpiDmDumpTable (TableLength,
edb6c78
                     sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
416465f
-                    SmbiosInfo,
416465f
+                    SmbiosInfo + Offset,
edb6c78
                     Length, AcpiDmTableInfoNfit3a);
416465f
                 if (ACPI_FAILURE (Status))
416465f
                 {
fc3eef6
@@ -1390,9 +1398,10 @@ AcpiDmDumpNfit (
edb6c78
         case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
edb6c78
 
edb6c78
             Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
edb6c78
-            for (i = 0; i < Hint->HintCount; i++)
416465f
+            HintCount = AcpiUtReadUint16 (&Hint->HintCount);
edb6c78
+            for (i = 0; i < HintCount; i++)
edb6c78
             {
edb6c78
-                Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
edb6c78
+                Status = AcpiDmDumpTable (TableLength, Offset + FieldOffset,
edb6c78
                     &Hint->HintAddress[i],
edb6c78
                     sizeof (UINT64), AcpiDmTableInfoNfit6a);
edb6c78
                 if (ACPI_FAILURE (Status))
fc3eef6
@@ -1411,8 +1420,8 @@ AcpiDmDumpNfit (
edb6c78
 NextSubtable:
edb6c78
         /* Point to next subtable */
edb6c78
 
edb6c78
-        Offset += Subtable->Length;
edb6c78
-        Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
edb6c78
+        Offset += SubtableLength;
edb6c78
+        Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, SubtableLength);
edb6c78
     }
edb6c78
 }
edb6c78
 
fc3eef6
Index: acpica-unix2-20220331/source/compiler/dttable2.c
edb6c78
===================================================================
fc3eef6
--- acpica-unix2-20220331.orig/source/compiler/dttable2.c
fc3eef6
+++ acpica-unix2-20220331/source/compiler/dttable2.c
fc3eef6
@@ -506,6 +506,7 @@ DtCompileNfit (
edb6c78
     UINT32                  Count;
edb6c78
     ACPI_NFIT_INTERLEAVE    *Interleave = NULL;
edb6c78
     ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
edb6c78
+    UINT16                  NfitHeaderType;
edb6c78
 
edb6c78
 
edb6c78
     /* Main table */
fc3eef6
@@ -539,7 +540,8 @@ DtCompileNfit (
edb6c78
 
edb6c78
         NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
edb6c78
 
edb6c78
-        switch (NfitHeader->Type)
416465f
+        NfitHeaderType = AcpiUtReadUint16 (&NfitHeader->Type);
edb6c78
+        switch (NfitHeaderType)
edb6c78
         {
edb6c78
         case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
edb6c78
 
fc3eef6
@@ -599,7 +601,7 @@ DtCompileNfit (
edb6c78
         DtInsertSubtable (ParentTable, Subtable);
edb6c78
         DtPopSubtable ();
edb6c78
 
edb6c78
-        switch (NfitHeader->Type)
edb6c78
+        switch (NfitHeaderType)
edb6c78
         {
edb6c78
         case ACPI_NFIT_TYPE_INTERLEAVE:
edb6c78
 
fc3eef6
@@ -625,7 +627,8 @@ DtCompileNfit (
edb6c78
                 Count++;
edb6c78
             }
edb6c78
 
edb6c78
-            Interleave->LineCount = Count;
416465f
+            AcpiUtWriteUint (&Interleave->LineCount, sizeof (UINT32),
416465f
+                &Count, sizeof (UINT32));
edb6c78
             break;
edb6c78
 
edb6c78
         case ACPI_NFIT_TYPE_SMBIOS:
fc3eef6
@@ -671,6 +674,8 @@ DtCompileNfit (
edb6c78
             }
edb6c78
 
edb6c78
             Hint->HintCount = (UINT16) Count;
416465f
+            AcpiUtWriteUint (&Hint->HintCount, sizeof (UINT16),
416465f
+                &Count, sizeof (UINT32));
edb6c78
             break;
edb6c78
 
edb6c78
         default: