]>
Commit | Line | Data |
---|---|---|
b643ab7e JB |
1 | From 2cb0b87a15682da4f19f707fa3ffece504f94b5a Mon Sep 17 00:00:00 2001 |
2 | From: Al Stone <ahs3@redhat.com> | |
3 | Date: Sat, 19 Sep 2020 13:37:38 -0600 | |
4 | Subject: [PATCH 11/45] Support DBG2 table in a big-endian world | |
5 | ||
6 | Signed-off-by: Al Stone <ahs3@redhat.com> | |
7 | --- | |
8 | source/common/dmtbdump1.c | 37 ++++++++++++++++++-------------- | |
9 | source/compiler/dttable1.c | 43 ++++++++++++++++++++++++-------------- | |
10 | 2 files changed, 48 insertions(+), 32 deletions(-) | |
11 | ||
12 | Index: acpica-unix2-20220331/source/common/dmtbdump1.c | |
13 | =================================================================== | |
14 | --- acpica-unix2-20220331.orig/source/common/dmtbdump1.c | |
15 | +++ acpica-unix2-20220331/source/common/dmtbdump1.c | |
16 | @@ -669,7 +669,7 @@ AcpiDmDumpCsrt ( | |
17 | ACPI_CSRT_GROUP *Subtable; | |
18 | ACPI_CSRT_SHARED_INFO *SharedInfoTable; | |
19 | ACPI_CSRT_DESCRIPTOR *SubSubtable; | |
20 | - UINT32 Length = Table->Length; | |
21 | + UINT32 Length = AcpiUtReadUint32 (&Table->Length); | |
22 | UINT32 Offset = sizeof (ACPI_TABLE_CSRT); | |
23 | UINT32 SubOffset; | |
24 | UINT32 SubSubOffset; | |
25 | @@ -681,7 +681,7 @@ AcpiDmDumpCsrt ( | |
26 | /* Subtables (Resource Groups) */ | |
27 | ||
28 | Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset); | |
29 | - while (Offset < Table->Length) | |
30 | + while (Offset < Length) | |
31 | { | |
32 | /* Resource group subtable */ | |
33 | ||
34 | @@ -715,7 +715,7 @@ AcpiDmDumpCsrt ( | |
35 | Offset + SubOffset); | |
36 | ||
37 | while ((SubOffset < Subtable->Length) && | |
38 | - ((Offset + SubOffset) < Table->Length)) | |
39 | + ((Offset + SubOffset) < Length)) | |
40 | { | |
41 | AcpiOsPrintf ("\n"); | |
42 | Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable, | |
43 | @@ -776,12 +776,13 @@ AcpiDmDumpDbg2 ( | |
44 | { | |
45 | ACPI_STATUS Status; | |
46 | ACPI_DBG2_DEVICE *Subtable; | |
47 | - UINT32 Length = Table->Length; | |
48 | + UINT32 Length = AcpiUtReadUint32 (&Table->Length); | |
49 | UINT32 Offset = sizeof (ACPI_TABLE_DBG2); | |
50 | UINT32 i; | |
51 | UINT32 ArrayOffset; | |
52 | UINT32 AbsoluteOffset; | |
53 | UINT8 *Array; | |
54 | + UINT16 SubtableLength; | |
55 | ||
56 | ||
57 | /* Main table */ | |
58 | @@ -795,11 +796,12 @@ AcpiDmDumpDbg2 ( | |
59 | /* Subtables */ | |
60 | ||
61 | Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Table, Offset); | |
62 | - while (Offset < Table->Length) | |
63 | + while (Offset < Length) | |
64 | { | |
65 | AcpiOsPrintf ("\n"); | |
66 | + SubtableLength = AcpiUtReadUint16 (&Subtable->Length); | |
67 | Status = AcpiDmDumpTable (Length, Offset, Subtable, | |
68 | - Subtable->Length, AcpiDmTableInfoDbg2Device); | |
69 | + SubtableLength, AcpiDmTableInfoDbg2Device); | |
70 | if (ACPI_FAILURE (Status)) | |
71 | { | |
72 | return; | |
73 | @@ -809,13 +811,13 @@ AcpiDmDumpDbg2 ( | |
74 | ||
75 | for (i = 0; i < Subtable->RegisterCount; i++) | |
76 | { | |
77 | - ArrayOffset = Subtable->BaseAddressOffset + | |
78 | + ArrayOffset = AcpiUtReadUint16 (&Subtable->BaseAddressOffset) + | |
79 | (sizeof (ACPI_GENERIC_ADDRESS) * i); | |
80 | AbsoluteOffset = Offset + ArrayOffset; | |
81 | Array = (UINT8 *) Subtable + ArrayOffset; | |
82 | ||
83 | Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, | |
84 | - Subtable->Length, AcpiDmTableInfoDbg2Addr); | |
85 | + SubtableLength, AcpiDmTableInfoDbg2Addr); | |
86 | if (ACPI_FAILURE (Status)) | |
87 | { | |
88 | return; | |
89 | @@ -826,13 +828,13 @@ AcpiDmDumpDbg2 ( | |
90 | ||
91 | for (i = 0; i < Subtable->RegisterCount; i++) | |
92 | { | |
93 | - ArrayOffset = Subtable->AddressSizeOffset + | |
94 | + ArrayOffset = AcpiUtReadUint16 (&Subtable->AddressSizeOffset) + | |
95 | (sizeof (UINT32) * i); | |
96 | AbsoluteOffset = Offset + ArrayOffset; | |
97 | Array = (UINT8 *) Subtable + ArrayOffset; | |
98 | ||
99 | Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, | |
100 | - Subtable->Length, AcpiDmTableInfoDbg2Size); | |
101 | + SubtableLength, AcpiDmTableInfoDbg2Size); | |
102 | if (ACPI_FAILURE (Status)) | |
103 | { | |
104 | return; | |
105 | @@ -842,12 +844,12 @@ AcpiDmDumpDbg2 ( | |
106 | /* Dump the Namestring (required) */ | |
107 | ||
108 | AcpiOsPrintf ("\n"); | |
109 | - ArrayOffset = Subtable->NamepathOffset; | |
110 | + ArrayOffset = AcpiUtReadUint16 (&Subtable->NamepathOffset); | |
111 | AbsoluteOffset = Offset + ArrayOffset; | |
112 | Array = (UINT8 *) Subtable + ArrayOffset; | |
113 | ||
114 | Status = AcpiDmDumpTable (Length, AbsoluteOffset, Array, | |
115 | - Subtable->Length, AcpiDmTableInfoDbg2Name); | |
116 | + SubtableLength, AcpiDmTableInfoDbg2Name); | |
117 | if (ACPI_FAILURE (Status)) | |
118 | { | |
119 | return; | |
120 | @@ -857,8 +859,11 @@ AcpiDmDumpDbg2 ( | |
121 | ||
122 | if (Subtable->OemDataOffset) | |
123 | { | |
124 | - Status = AcpiDmDumpTable (Length, Offset + Subtable->OemDataOffset, | |
125 | - Table, Subtable->OemDataLength, | |
126 | + Array = (UINT8 *) Subtable + AcpiUtReadUint16 (&Subtable->OemDataOffset); | |
127 | + | |
128 | + Status = AcpiDmDumpTable (Length, | |
129 | + Offset + AcpiUtReadUint16 (&Subtable->OemDataOffset), | |
130 | + Array, AcpiUtReadUint16 (&Subtable->OemDataLength), | |
131 | AcpiDmTableInfoDbg2OemData); | |
132 | if (ACPI_FAILURE (Status)) | |
133 | { | |
134 | @@ -868,9 +873,9 @@ AcpiDmDumpDbg2 ( | |
135 | ||
136 | /* Point to next subtable */ | |
137 | ||
138 | - Offset += Subtable->Length; | |
139 | + Offset += SubtableLength; | |
140 | Subtable = ACPI_ADD_PTR (ACPI_DBG2_DEVICE, Subtable, | |
141 | - Subtable->Length); | |
142 | + SubtableLength); | |
143 | } | |
144 | } | |
145 | ||
146 | Index: acpica-unix2-20220331/source/compiler/dttable1.c | |
147 | =================================================================== | |
148 | --- acpica-unix2-20220331.orig/source/compiler/dttable1.c | |
149 | +++ acpica-unix2-20220331/source/compiler/dttable1.c | |
150 | @@ -718,6 +718,7 @@ DtCompileCsrt ( | |
151 | DT_FIELD **PFieldList = (DT_FIELD **) List; | |
152 | UINT32 DescriptorCount; | |
153 | UINT32 GroupLength; | |
154 | + UINT32 Tmp; | |
155 | ||
156 | ||
157 | /* Subtables (Resource Groups) */ | |
158 | @@ -736,12 +737,13 @@ DtCompileCsrt ( | |
159 | ||
160 | /* Compute the number of resource descriptors */ | |
161 | ||
162 | - GroupLength = | |
163 | - (ACPI_CAST_PTR (ACPI_CSRT_GROUP, | |
164 | - Subtable->Buffer))->Length - | |
165 | - (ACPI_CAST_PTR (ACPI_CSRT_GROUP, | |
166 | - Subtable->Buffer))->SharedInfoLength - | |
167 | - sizeof (ACPI_CSRT_GROUP); | |
168 | + Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP, | |
169 | + Subtable->Buffer))->Length); | |
170 | + GroupLength = Tmp; | |
171 | + Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP, | |
172 | + Subtable->Buffer))->SharedInfoLength); | |
173 | + GroupLength -= Tmp; | |
174 | + GroupLength -= sizeof (ACPI_CSRT_GROUP); | |
175 | ||
176 | DescriptorCount = (GroupLength / | |
177 | sizeof (ACPI_CSRT_DESCRIPTOR)); | |
178 | @@ -829,6 +831,7 @@ DtCompileDbg2 ( | |
179 | ACPI_DBG2_DEVICE *DeviceInfo; | |
180 | UINT16 CurrentOffset; | |
181 | UINT32 i; | |
182 | + UINT32 Tmp; | |
183 | ||
184 | ||
185 | /* Main table */ | |
186 | @@ -845,10 +848,12 @@ DtCompileDbg2 ( | |
187 | /* Main table fields */ | |
188 | ||
189 | Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer); | |
190 | - Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF ( | |
191 | - ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header); | |
192 | + Tmp = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF ( | |
193 | + ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header); | |
194 | + AcpiUtWriteUint (&Dbg2Header->InfoOffset, sizeof (UINT32), | |
195 | + &Tmp, sizeof (UINT32)); | |
196 | ||
197 | - SubtableCount = Dbg2Header->InfoCount; | |
198 | + SubtableCount = Tmp; | |
199 | DtPushSubtable (Subtable); | |
200 | ||
201 | /* Process all Device Information subtables (Count = InfoCount) */ | |
202 | @@ -875,7 +880,8 @@ DtCompileDbg2 ( | |
203 | ||
204 | /* BaseAddressRegister GAS array (Required, size is RegisterCount) */ | |
205 | ||
206 | - DeviceInfo->BaseAddressOffset = CurrentOffset; | |
207 | + AcpiUtWriteUint (&DeviceInfo->BaseAddressOffset, sizeof (UINT16), | |
208 | + &CurrentOffset, sizeof (UINT16)); | |
209 | for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++) | |
210 | { | |
211 | Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr, | |
212 | @@ -891,7 +897,8 @@ DtCompileDbg2 ( | |
213 | ||
214 | /* AddressSize array (Required, size = RegisterCount) */ | |
215 | ||
216 | - DeviceInfo->AddressSizeOffset = CurrentOffset; | |
217 | + AcpiUtWriteUint (&DeviceInfo->AddressSizeOffset, sizeof (UINT16), | |
218 | + &CurrentOffset, sizeof (UINT16)); | |
219 | for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++) | |
220 | { | |
221 | Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size, | |
222 | @@ -907,7 +914,8 @@ DtCompileDbg2 ( | |
223 | ||
224 | /* NamespaceString device identifier (Required, size = NamePathLength) */ | |
225 | ||
226 | - DeviceInfo->NamepathOffset = CurrentOffset; | |
227 | + AcpiUtWriteUint (&DeviceInfo->NamepathOffset, sizeof (UINT16), | |
228 | + &CurrentOffset, sizeof (UINT16)); | |
229 | Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name, | |
230 | &Subtable); | |
231 | if (ACPI_FAILURE (Status)) | |
232 | @@ -917,8 +925,9 @@ DtCompileDbg2 ( | |
233 | ||
234 | /* Update the device info header */ | |
235 | ||
236 | - DeviceInfo->NamepathLength = (UINT16) Subtable->Length; | |
237 | - CurrentOffset += (UINT16) DeviceInfo->NamepathLength; | |
238 | + AcpiUtWriteUint (&DeviceInfo->NamepathLength, sizeof (UINT16), | |
239 | + &Subtable->Length, sizeof (UINT32)); | |
240 | + CurrentOffset += AcpiUtReadUint16 (&DeviceInfo->NamepathLength); | |
241 | DtInsertSubtable (ParentTable, Subtable); | |
242 | ||
243 | /* OemData - Variable-length data (Optional, size = OemDataLength) */ | |
244 | @@ -945,8 +954,10 @@ DtCompileDbg2 ( | |
245 | ||
246 | if (Subtable && Subtable->Length) | |
247 | { | |
248 | - DeviceInfo->OemDataOffset = CurrentOffset; | |
249 | - DeviceInfo->OemDataLength = (UINT16) Subtable->Length; | |
250 | + AcpiUtWriteUint (&DeviceInfo->OemDataOffset, sizeof (UINT16), | |
251 | + &CurrentOffset, sizeof (UINT16)); | |
252 | + AcpiUtWriteUint (&DeviceInfo->OemDataLength, sizeof (UINT16), | |
253 | + &Subtable->Length, sizeof (UINT32)); | |
254 | ||
255 | DtInsertSubtable (ParentTable, Subtable); | |
256 | } |