]>
Commit | Line | Data |
---|---|---|
b643ab7e JB |
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 | |
5 | ||
6 | NB: this required correcting the starting pointer for the NFIT | |
7 | SMBIOS subtable; otherwise, disassembly did not work properly. | |
8 | ||
9 | Signed-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 | ||
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 ( | |
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 | ||
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 ( | |
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 | ||
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 ( | |
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: |