1 From 5aec8511fc433a71cb8b6d26be464355d0c3f5cc Mon Sep 17 00:00:00 2001
2 From: Al Stone <ahs3@redhat.com>
3 Date: Thu, 24 Sep 2020 15:25:53 -0600
4 Subject: [PATCH 26/45] Support NFIT in a big-endian world
6 NB: this required correcting the starting pointer for the NFIT
7 SMBIOS subtable; otherwise, disassembly did not work properly.
9 Signed-off-by: Al Stone <ahs3@redhat.com>
11 source/common/dmtable.c | 4 ++--
12 source/common/dmtbdump2.c | 49 ++++++++++++++++++++++----------------
13 source/compiler/dttable2.c | 11 ++++++---
14 3 files changed, 39 insertions(+), 25 deletions(-)
16 Index: acpica-unix2-20220331/source/common/dmtable.c
17 ===================================================================
18 --- acpica-unix2-20220331.orig/source/common/dmtable.c
19 +++ acpica-unix2-20220331/source/common/dmtable.c
20 @@ -1766,13 +1766,13 @@ AcpiDmDumpTable (
22 /* NFIT subtable types */
24 - Temp16 = ACPI_GET16 (Target);
25 + Temp16 = AcpiUtReadUint16 (Target);
26 if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
28 Temp16 = ACPI_NFIT_TYPE_RESERVED;
31 - AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
32 + AcpiOsPrintf (UINT16_FORMAT, Temp16,
33 AcpiDmNfitSubnames[Temp16]);
36 Index: acpica-unix2-20220331/source/common/dmtbdump2.c
37 ===================================================================
38 --- acpica-unix2-20220331.orig/source/common/dmtbdump2.c
39 +++ acpica-unix2-20220331/source/common/dmtbdump2.c
40 @@ -1244,18 +1244,23 @@ AcpiDmDumpNfit (
42 UINT32 Offset = sizeof (ACPI_TABLE_NFIT);
43 UINT32 FieldOffset = 0;
45 + UINT32 TableLength = AcpiUtReadUint32 (&Table->Length);
46 ACPI_NFIT_HEADER *Subtable;
47 ACPI_DMTABLE_INFO *InfoTable;
48 ACPI_NFIT_INTERLEAVE *Interleave = NULL;
49 ACPI_NFIT_SMBIOS *SmbiosInfo = NULL;
50 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
54 + UINT16 SubtableLength;
55 + UINT16 SubtableType;
61 - Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
62 + Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNfit);
63 if (ACPI_FAILURE (Status))
66 @@ -1264,19 +1269,21 @@ AcpiDmDumpNfit (
69 Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
70 - while (Offset < Table->Length)
71 + while (Offset < TableLength)
73 /* NFIT subtable header */
76 - Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
77 - Subtable->Length, AcpiDmTableInfoNfitHdr);
78 + SubtableType = AcpiUtReadUint16 (&Subtable->Type);
79 + SubtableLength = AcpiUtReadUint16 (&Subtable->Length);
80 + Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
81 + SubtableLength, AcpiDmTableInfoNfitHdr);
82 if (ACPI_FAILURE (Status))
87 - switch (Subtable->Type)
88 + switch (SubtableType)
90 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
92 @@ -1327,11 +1334,11 @@ AcpiDmDumpNfit (
95 AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
99 /* Attempt to continue */
101 - if (!Subtable->Length)
102 + if (!SubtableLength)
104 AcpiOsPrintf ("Invalid zero length subtable\n");
106 @@ -1340,8 +1347,8 @@ AcpiDmDumpNfit (
110 - Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
111 - Subtable->Length, InfoTable);
112 + Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
113 + SubtableLength, InfoTable);
114 if (ACPI_FAILURE (Status))
117 @@ -1349,14 +1356,15 @@ AcpiDmDumpNfit (
119 /* Per-subtable variable-length fields */
121 - switch (Subtable->Type)
122 + switch (SubtableType)
124 case ACPI_NFIT_TYPE_INTERLEAVE:
126 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable);
127 - for (i = 0; i < Interleave->LineCount; i++)
128 + LineCount = AcpiUtReadUint32 (&Interleave->LineCount);
129 + for (i = 0; i < LineCount; i++)
131 - Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
132 + Status = AcpiDmDumpTable (TableLength, Offset + FieldOffset,
133 &Interleave->LineOffset[i],
134 sizeof (UINT32), AcpiDmTableInfoNfit2a);
135 if (ACPI_FAILURE (Status))
136 @@ -1370,14 +1378,14 @@ AcpiDmDumpNfit (
138 case ACPI_NFIT_TYPE_SMBIOS:
140 - Length = Subtable->Length -
141 + Length = SubtableLength -
142 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
146 - Status = AcpiDmDumpTable (Table->Length,
147 + Status = AcpiDmDumpTable (TableLength,
148 sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
150 + SmbiosInfo + Offset,
151 Length, AcpiDmTableInfoNfit3a);
152 if (ACPI_FAILURE (Status))
154 @@ -1390,9 +1398,10 @@ AcpiDmDumpNfit (
155 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
157 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable);
158 - for (i = 0; i < Hint->HintCount; i++)
159 + HintCount = AcpiUtReadUint16 (&Hint->HintCount);
160 + for (i = 0; i < HintCount; i++)
162 - Status = AcpiDmDumpTable (Table->Length, Offset + FieldOffset,
163 + Status = AcpiDmDumpTable (TableLength, Offset + FieldOffset,
164 &Hint->HintAddress[i],
165 sizeof (UINT64), AcpiDmTableInfoNfit6a);
166 if (ACPI_FAILURE (Status))
167 @@ -1411,8 +1420,8 @@ AcpiDmDumpNfit (
169 /* Point to next subtable */
171 - Offset += Subtable->Length;
172 - Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, Subtable->Length);
173 + Offset += SubtableLength;
174 + Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Subtable, SubtableLength);
178 Index: acpica-unix2-20220331/source/compiler/dttable2.c
179 ===================================================================
180 --- acpica-unix2-20220331.orig/source/compiler/dttable2.c
181 +++ acpica-unix2-20220331/source/compiler/dttable2.c
182 @@ -506,6 +506,7 @@ DtCompileNfit (
184 ACPI_NFIT_INTERLEAVE *Interleave = NULL;
185 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
186 + UINT16 NfitHeaderType;
190 @@ -539,7 +540,8 @@ DtCompileNfit (
192 NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
194 - switch (NfitHeader->Type)
195 + NfitHeaderType = AcpiUtReadUint16 (&NfitHeader->Type);
196 + switch (NfitHeaderType)
198 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
200 @@ -599,7 +601,7 @@ DtCompileNfit (
201 DtInsertSubtable (ParentTable, Subtable);
204 - switch (NfitHeader->Type)
205 + switch (NfitHeaderType)
207 case ACPI_NFIT_TYPE_INTERLEAVE:
209 @@ -625,7 +627,8 @@ DtCompileNfit (
213 - Interleave->LineCount = Count;
214 + AcpiUtWriteUint (&Interleave->LineCount, sizeof (UINT32),
215 + &Count, sizeof (UINT32));
218 case ACPI_NFIT_TYPE_SMBIOS:
219 @@ -671,6 +674,8 @@ DtCompileNfit (
222 Hint->HintCount = (UINT16) Count;
223 + AcpiUtWriteUint (&Hint->HintCount, sizeof (UINT16),
224 + &Count, sizeof (UINT32));