]>
Commit | Line | Data |
---|---|---|
b643ab7e JB |
1 | From 5fd729c8f6c4ce295edd142fc41e03e831ba4afb Mon Sep 17 00:00:00 2001 |
2 | From: Al Stone <ahs3@redhat.com> | |
3 | Date: Mon, 12 Jul 2021 09:39:38 -0600 | |
4 | Subject: [PATCH] Support PHAT in a big-endian world | |
5 | ||
6 | Signed-off-by: Al Stone <ahs3@redhat.com> | |
7 | --- | |
8 | source/common/dmtbdump2.c | 36 ++++++++++++++++++++---------------- | |
9 | source/compiler/dttable2.c | 12 +++++++++--- | |
10 | 2 files changed, 29 insertions(+), 19 deletions(-) | |
11 | ||
e0da2c9b JB |
12 | --- acpica-unix2-20221020/source/common/dmtbdump2.c.orig 2023-07-01 21:55:10.515514255 +0200 |
13 | +++ acpica-unix2-20221020/source/common/dmtbdump2.c 2023-07-02 08:00:29.075426396 +0200 | |
14 | @@ -2029,25 +2029,30 @@ AcpiDmDumpPhat ( | |
15 | ACPI_DMTABLE_INFO *InfoTable; | |
b643ab7e JB |
16 | ACPI_PHAT_HEADER *Subtable; |
17 | ACPI_PHAT_VERSION_DATA *VersionData; | |
e0da2c9b | 18 | + UINT32 VersionDataHeaderLength; |
b643ab7e JB |
19 | UINT32 RecordCount; |
20 | - UINT32 Length = Table->Length; | |
21 | + UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); | |
22 | UINT32 Offset = sizeof (ACPI_TABLE_PHAT); | |
e0da2c9b | 23 | UINT32 OriginalOffset; |
b643ab7e JB |
24 | - UINT32 SubtableLength; |
25 | + UINT16 SubtableLength; | |
26 | UINT32 PathLength; | |
27 | UINT32 VendorLength; | |
e0da2c9b | 28 | UINT16 RecordType; |
b643ab7e | 29 | + UINT16 SubtableType; |
e0da2c9b | 30 | const wchar_t *WideString; |
b643ab7e JB |
31 | |
32 | ||
33 | Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT)); | |
34 | ||
35 | - while (Offset < Table->Length) | |
36 | + while (Offset < TableLength) | |
37 | { | |
38 | /* Common subtable header */ | |
39 | ||
40 | + SubtableType = AcpiUtReadUint16 (&Subtable->Type); | |
41 | + SubtableLength = AcpiUtReadUint16 (&Subtable->Length); | |
42 | + | |
43 | AcpiOsPrintf ("\n"); | |
e0da2c9b JB |
44 | - Status = AcpiDmDumpTable (Length, Offset, Subtable, |
45 | + Status = AcpiDmDumpTable (TableLength, Offset, Subtable, | |
b643ab7e JB |
46 | sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr); |
47 | if (ACPI_FAILURE (Status)) | |
48 | { | |
e0da2c9b JB |
49 | @@ -2057,29 +2062,29 @@ AcpiDmDumpPhat ( |
50 | DbgPrint (ASL_DEBUG_OUTPUT, "\n/* %u, Subtable->Type %X */\n", | |
51 | __LINE__, Subtable->Type); | |
b643ab7e JB |
52 | |
53 | - switch (Subtable->Type) | |
54 | + switch (SubtableType) | |
55 | { | |
56 | case ACPI_PHAT_TYPE_FW_VERSION_DATA: | |
57 | ||
58 | InfoTable = AcpiDmTableInfoPhat0; | |
e0da2c9b JB |
59 | - SubtableLength = Offset += sizeof (ACPI_PHAT_VERSION_DATA); |
60 | + Offset += sizeof (ACPI_PHAT_VERSION_DATA); | |
b643ab7e JB |
61 | break; |
62 | ||
63 | case ACPI_PHAT_TYPE_FW_HEALTH_DATA: | |
64 | ||
65 | InfoTable = AcpiDmTableInfoPhat1; | |
e0da2c9b JB |
66 | - SubtableLength = Offset += sizeof (ACPI_PHAT_TYPE_FW_HEALTH_DATA); |
67 | + Offset += sizeof (ACPI_PHAT_TYPE_FW_HEALTH_DATA); | |
b643ab7e JB |
68 | break; |
69 | ||
70 | default: | |
e0da2c9b JB |
71 | |
72 | DbgPrint (ASL_DEBUG_OUTPUT, "\n**** Unknown PHAT subtable type 0x%X\n\n", | |
73 | - Subtable->Type); | |
74 | + SubtableType); | |
75 | ||
b643ab7e JB |
76 | return; |
77 | } | |
78 | ||
e0da2c9b JB |
79 | - Status = AcpiDmDumpTable (Length, SubtableLength, Subtable, |
80 | + Status = AcpiDmDumpTable (TableLength, SubtableLength, Subtable, | |
b643ab7e JB |
81 | SubtableLength, InfoTable); |
82 | if (ACPI_FAILURE (Status)) | |
83 | { | |
e0da2c9b | 84 | @@ -2087,25 +2092,26 @@ AcpiDmDumpPhat ( |
b643ab7e JB |
85 | } |
86 | ||
e0da2c9b | 87 | OriginalOffset = Offset; |
b643ab7e JB |
88 | - switch (Subtable->Type) |
89 | + switch (SubtableType) | |
90 | { | |
91 | case ACPI_PHAT_TYPE_FW_VERSION_DATA: | |
92 | ||
93 | VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable); | |
94 | - RecordCount = VersionData->ElementCount; | |
95 | + RecordCount = AcpiUtReadUint32 (&VersionData->ElementCount); | |
e0da2c9b JB |
96 | RecordType = *ACPI_CAST_PTR (UINT8, Subtable); |
97 | + VersionDataHeaderLength = AcpiUtReadUint32 (&(VersionData->Header.Length)); | |
98 | ||
99 | /* | |
100 | * Skip past a zero-valued block (not part of the ACPI PHAT specification). | |
101 | * First, check for a zero length record and a zero element count | |
102 | */ | |
103 | - if (!VersionData->Header.Length && !VersionData->ElementCount) | |
104 | + if (!VersionDataHeaderLength && !RecordCount) | |
b643ab7e | 105 | { |
e0da2c9b JB |
106 | while (RecordType == 0) |
107 | { | |
108 | Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset); | |
109 | RecordType = *ACPI_CAST_PTR (UINT8, Subtable); | |
110 | - RecordCount = VersionData->ElementCount; | |
111 | + RecordCount = AcpiUtReadUint32 (&VersionData->ElementCount); | |
112 | Offset += 1; | |
113 | } | |
114 | ||
115 | @@ -2120,13 +2126,13 @@ AcpiDmDumpPhat ( | |
116 | ||
117 | /* Emit each of the version elements */ | |
118 | ||
119 | - while (RecordCount && VersionData->Header.Length) | |
120 | + while (RecordCount && VersionDataHeaderLength) | |
121 | { | |
122 | AcpiOsPrintf ("\n/* Version Element #%Xh Offset %Xh */\n\n", | |
123 | VersionData->ElementCount - RecordCount + 1, Offset); | |
124 | ||
125 | Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, Offset); | |
126 | - Status = AcpiDmDumpTable (Length, Offset, Subtable, | |
127 | + Status = AcpiDmDumpTable (TableLength, Offset, Subtable, | |
b643ab7e JB |
128 | sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a); |
129 | if (ACPI_FAILURE (Status)) | |
e0da2c9b JB |
130 | { |
131 | @@ -2150,9 +2156,9 @@ AcpiDmDumpPhat ( | |
132 | ||
133 | PathLength = (wcslen (WideString) * 2) + 2; | |
134 | DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, PathLength %X, Offset %X, Table->Length %X */\n", | |
135 | - __LINE__, PathLength, Offset, Length); | |
136 | + __LINE__, PathLength, Offset, TableLength); | |
b643ab7e | 137 | |
b643ab7e JB |
138 | - Status = AcpiDmDumpTable (Length, Offset, |
139 | + Status = AcpiDmDumpTable (TableLength, Offset, | |
140 | ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)), | |
141 | PathLength, AcpiDmTableInfoPhat1a); | |
e0da2c9b JB |
142 | Offset += PathLength; |
143 | @@ -2164,15 +2170,15 @@ AcpiDmDumpPhat ( | |
144 | /* Get Device-Specific Data - length of which is the remaining subtable length. */ | |
b643ab7e JB |
145 | |
146 | VendorLength = | |
147 | - Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength; | |
b643ab7e | 148 | + SubtableLength - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength; |
e0da2c9b JB |
149 | DbgPrint (ASL_DEBUG_OUTPUT, "%u, Subtable->Length %X, VendorLength %X, Offset %X PathLength: %X\n", |
150 | - __LINE__, Subtable->Length, VendorLength, Offset, PathLength); | |
151 | + __LINE__, SubtableLength, VendorLength, Offset, PathLength); | |
152 | ||
153 | if (VendorLength) | |
154 | { | |
155 | /* Point past the Device Path, Compile the Device-Specific Data */ | |
156 | ||
157 | - Status = AcpiDmDumpTable (Length, Offset, | |
158 | + Status = AcpiDmDumpTable (TableLength, Offset, | |
159 | ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength), | |
160 | VendorLength, AcpiDmTableInfoPhat1b); | |
161 | if (ACPI_FAILURE (Status)) | |
162 | @@ -2192,7 +2198,7 @@ AcpiDmDumpPhat ( | |
b643ab7e JB |
163 | default: |
164 | ||
165 | AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n", | |
166 | - Subtable->Type); | |
167 | + SubtableType); | |
168 | return; | |
169 | } | |
170 | ||
e0da2c9b JB |
171 | @@ -2200,7 +2206,7 @@ AcpiDmDumpPhat ( |
172 | ||
173 | DbgPrint (ASL_DEBUG_OUTPUT, "/* %u, Bottom of main loop: Offset %X, " | |
174 | "Subtable->Length %X, Table->Length %X */\n", | |
175 | - __LINE__, Offset, Subtable->Length, Table->Length); | |
176 | + __LINE__, Offset, SubtableLength, TableLength); | |
177 | ||
178 | Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, | |
179 | Offset); | |
180 | --- acpica-unix2-20221020/source/compiler/dttable2.c.orig 2023-07-02 08:01:19.868484559 +0200 | |
181 | +++ acpica-unix2-20221020/source/compiler/dttable2.c 2023-07-02 08:06:56.953325081 +0200 | |
182 | @@ -1278,6 +1278,8 @@ DtCompilePhat ( | |
183 | UINT32 TableOffset = 0; | |
184 | UINT32 DataOffsetValue; | |
185 | UINT32 i; | |
b643ab7e JB |
186 | + UINT16 SubtableType; |
187 | + UINT16 Tmp16; | |
188 | ||
189 | ||
e0da2c9b JB |
190 | /* The table consists of subtables */ |
191 | @@ -1300,8 +1302,9 @@ DtCompilePhat ( | |
b643ab7e JB |
192 | DtPushSubtable (Subtable); |
193 | ||
194 | PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer); | |
195 | + SubtableType = AcpiUtReadUint16 (&PhatHeader->Type); | |
196 | ||
197 | - switch (PhatHeader->Type) | |
198 | + switch (SubtableType) | |
199 | { | |
200 | case ACPI_PHAT_TYPE_FW_VERSION_DATA: | |
201 | ||
e0da2c9b | 202 | @@ -1389,13 +1392,13 @@ DtCompilePhat ( |
b643ab7e JB |
203 | ParentTable = DtPeekSubtable (); |
204 | DtInsertSubtable (ParentTable, Subtable); | |
205 | ||
206 | - switch (PhatHeader->Type) | |
207 | + switch (SubtableType) | |
208 | { | |
209 | case ACPI_PHAT_TYPE_FW_VERSION_DATA: | |
210 | ||
211 | VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, | |
212 | (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER))); | |
213 | - RecordCount = VersionData->ElementCount; | |
214 | + RecordCount = AcpiUtReadUint32 (&VersionData->ElementCount); | |
215 | ||
e0da2c9b JB |
216 | /* Compile all of the Version Elements */ |
217 | ||
218 | @@ -1498,6 +1501,9 @@ DtCompilePhat ( | |
b643ab7e JB |
219 | DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); |
220 | return (AE_ERROR); | |
221 | } | |
222 | + | |
223 | + Tmp16 = AcpiUtReadUint16 (&PhatHeader->Length); | |
224 | + PhatHeader->Length = Tmp16; | |
225 | } | |
226 | ||
227 | return (Status); |