]> git.pld-linux.org Git - packages/acpica.git/blame - 0026-Support-NFIT-in-a-big-endian-world.patch
- updated tests
[packages/acpica.git] / 0026-Support-NFIT-in-a-big-endian-world.patch
CommitLineData
b643ab7e
JB
1From 5aec8511fc433a71cb8b6d26be464355d0c3f5cc Mon Sep 17 00:00:00 2001
2From: Al Stone <ahs3@redhat.com>
3Date: Thu, 24 Sep 2020 15:25:53 -0600
4Subject: [PATCH 26/45] Support NFIT in a big-endian world
5
6NB: this required correcting the starting pointer for the NFIT
7SMBIOS subtable; otherwise, disassembly did not work properly.
8
9Signed-off-by: Al Stone <ahs3@redhat.com>
10---
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(-)
15
16Index: 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 (
21
22 /* NFIT subtable types */
23
24- Temp16 = ACPI_GET16 (Target);
25+ Temp16 = AcpiUtReadUint16 (Target);
26 if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
27 {
28 Temp16 = ACPI_NFIT_TYPE_RESERVED;
29 }
30
31- AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
32+ AcpiOsPrintf (UINT16_FORMAT, Temp16,
33 AcpiDmNfitSubnames[Temp16]);
34 break;
35
36Index: 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 (
41 ACPI_STATUS Status;
42 UINT32 Offset = sizeof (ACPI_TABLE_NFIT);
43 UINT32 FieldOffset = 0;
44- UINT32 Length;
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;
51 UINT32 i;
52+ UINT32 Length;
53+ UINT32 LineCount;
54+ UINT16 SubtableLength;
55+ UINT16 SubtableType;
56+ UINT16 HintCount;
57
58
59 /* Main table */
60
61- Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoNfit);
62+ Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoNfit);
63 if (ACPI_FAILURE (Status))
64 {
65 return;
66@@ -1264,19 +1269,21 @@ AcpiDmDumpNfit (
67 /* Subtables */
68
69 Subtable = ACPI_ADD_PTR (ACPI_NFIT_HEADER, Table, Offset);
70- while (Offset < Table->Length)
71+ while (Offset < TableLength)
72 {
73 /* NFIT subtable header */
74
75 AcpiOsPrintf ("\n");
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))
83 {
84 return;
85 }
86
87- switch (Subtable->Type)
88+ switch (SubtableType)
89 {
90 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
91
92@@ -1327,11 +1334,11 @@ AcpiDmDumpNfit (
93
94 default:
95 AcpiOsPrintf ("\n**** Unknown NFIT subtable type 0x%X\n",
96- Subtable->Type);
97+ SubtableType);
98
99 /* Attempt to continue */
100
101- if (!Subtable->Length)
102+ if (!SubtableLength)
103 {
104 AcpiOsPrintf ("Invalid zero length subtable\n");
105 return;
106@@ -1340,8 +1347,8 @@ AcpiDmDumpNfit (
107 }
108
109 AcpiOsPrintf ("\n");
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))
115 {
116 return;
117@@ -1349,14 +1356,15 @@ AcpiDmDumpNfit (
118
119 /* Per-subtable variable-length fields */
120
121- switch (Subtable->Type)
122+ switch (SubtableType)
123 {
124 case ACPI_NFIT_TYPE_INTERLEAVE:
125
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++)
130 {
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 (
137
138 case ACPI_NFIT_TYPE_SMBIOS:
139
140- Length = Subtable->Length -
141+ Length = SubtableLength -
142 sizeof (ACPI_NFIT_SMBIOS) + sizeof (UINT8);
143
144 if (Length)
145 {
146- Status = AcpiDmDumpTable (Table->Length,
147+ Status = AcpiDmDumpTable (TableLength,
148 sizeof (ACPI_NFIT_SMBIOS) - sizeof (UINT8),
149- SmbiosInfo,
150+ SmbiosInfo + Offset,
151 Length, AcpiDmTableInfoNfit3a);
152 if (ACPI_FAILURE (Status))
153 {
154@@ -1390,9 +1398,10 @@ AcpiDmDumpNfit (
155 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
156
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++)
161 {
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 (
168 NextSubtable:
169 /* Point to next subtable */
170
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);
175 }
176 }
177
178Index: 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 (
183 UINT32 Count;
184 ACPI_NFIT_INTERLEAVE *Interleave = NULL;
185 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
186+ UINT16 NfitHeaderType;
187
188
189 /* Main table */
190@@ -539,7 +540,8 @@ DtCompileNfit (
191
192 NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
193
194- switch (NfitHeader->Type)
195+ NfitHeaderType = AcpiUtReadUint16 (&NfitHeader->Type);
196+ switch (NfitHeaderType)
197 {
198 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
199
200@@ -599,7 +601,7 @@ DtCompileNfit (
201 DtInsertSubtable (ParentTable, Subtable);
202 DtPopSubtable ();
203
204- switch (NfitHeader->Type)
205+ switch (NfitHeaderType)
206 {
207 case ACPI_NFIT_TYPE_INTERLEAVE:
208
209@@ -625,7 +627,8 @@ DtCompileNfit (
210 Count++;
211 }
212
213- Interleave->LineCount = Count;
214+ AcpiUtWriteUint (&Interleave->LineCount, sizeof (UINT32),
215+ &Count, sizeof (UINT32));
216 break;
217
218 case ACPI_NFIT_TYPE_SMBIOS:
219@@ -671,6 +674,8 @@ DtCompileNfit (
220 }
221
222 Hint->HintCount = (UINT16) Count;
223+ AcpiUtWriteUint (&Hint->HintCount, sizeof (UINT16),
224+ &Count, sizeof (UINT32));
225 break;
226
227 default:
This page took 0.140095 seconds and 4 git commands to generate.