]>
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 | ||
12 | Index: acpica-unix2-20220331/source/common/dmtbdump2.c | |
13 | =================================================================== | |
14 | --- acpica-unix2-20220331.orig/source/common/dmtbdump2.c | |
15 | +++ acpica-unix2-20220331/source/common/dmtbdump2.c | |
16 | @@ -2029,39 +2029,41 @@ AcpiDmDumpPhat ( | |
17 | ACPI_PHAT_HEADER *Subtable; | |
18 | ACPI_PHAT_VERSION_DATA *VersionData; | |
19 | UINT32 RecordCount; | |
20 | - UINT32 Length = Table->Length; | |
21 | + UINT32 TableLength = AcpiUtReadUint32 (&Table->Length); | |
22 | UINT32 Offset = sizeof (ACPI_TABLE_PHAT); | |
23 | - UINT32 SubtableLength; | |
24 | + UINT16 SubtableLength; | |
25 | UINT32 PathLength; | |
26 | UINT32 VendorLength; | |
27 | + UINT16 SubtableType; | |
28 | ||
29 | ||
30 | Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Table, sizeof (ACPI_TABLE_PHAT)); | |
31 | ||
32 | - while (Offset < Table->Length) | |
33 | + while (Offset < TableLength) | |
34 | { | |
35 | /* Common subtable header */ | |
36 | ||
37 | + SubtableType = AcpiUtReadUint16 (&Subtable->Type); | |
38 | + SubtableLength = AcpiUtReadUint16 (&Subtable->Length); | |
39 | + | |
40 | AcpiOsPrintf ("\n"); | |
41 | - Status = AcpiDmDumpTable (Length, 0, Subtable, | |
42 | + Status = AcpiDmDumpTable (TableLength, 0, Subtable, | |
43 | sizeof (ACPI_PHAT_HEADER), AcpiDmTableInfoPhatHdr); | |
44 | if (ACPI_FAILURE (Status)) | |
45 | { | |
46 | return; | |
47 | } | |
48 | ||
49 | - switch (Subtable->Type) | |
50 | + switch (SubtableType) | |
51 | { | |
52 | case ACPI_PHAT_TYPE_FW_VERSION_DATA: | |
53 | ||
54 | InfoTable = AcpiDmTableInfoPhat0; | |
55 | - SubtableLength = sizeof (ACPI_PHAT_VERSION_DATA); | |
56 | break; | |
57 | ||
58 | case ACPI_PHAT_TYPE_FW_HEALTH_DATA: | |
59 | ||
60 | InfoTable = AcpiDmTableInfoPhat1; | |
61 | - SubtableLength = sizeof (ACPI_PHAT_HEALTH_DATA); | |
62 | break; | |
63 | ||
64 | default: | |
65 | @@ -2072,22 +2074,22 @@ AcpiDmDumpPhat ( | |
66 | return; | |
67 | } | |
68 | ||
69 | - Status = AcpiDmDumpTable (Length, 0, Subtable, | |
70 | + Status = AcpiDmDumpTable (TableLength, 0, Subtable, | |
71 | SubtableLength, InfoTable); | |
72 | if (ACPI_FAILURE (Status)) | |
73 | { | |
74 | return; | |
75 | } | |
76 | ||
77 | - switch (Subtable->Type) | |
78 | + switch (SubtableType) | |
79 | { | |
80 | case ACPI_PHAT_TYPE_FW_VERSION_DATA: | |
81 | ||
82 | VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, Subtable); | |
83 | - RecordCount = VersionData->ElementCount; | |
84 | + RecordCount = AcpiUtReadUint32 (&VersionData->ElementCount); | |
85 | while (RecordCount) | |
86 | { | |
87 | - Status = AcpiDmDumpTable (Length, Offset, | |
88 | + Status = AcpiDmDumpTable (TableLength, Offset, | |
89 | ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_VERSION_DATA)), | |
90 | sizeof (ACPI_PHAT_VERSION_ELEMENT), AcpiDmTableInfoPhat0a); | |
91 | if (ACPI_FAILURE (Status)) | |
92 | @@ -2105,7 +2107,7 @@ AcpiDmDumpPhat ( | |
93 | /* account for the null terminator */ | |
94 | ||
95 | PathLength = strlen (ACPI_ADD_PTR (char, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA))) + 1; | |
96 | - Status = AcpiDmDumpTable (Length, Offset, | |
97 | + Status = AcpiDmDumpTable (TableLength, Offset, | |
98 | ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA)), | |
99 | PathLength, AcpiDmTableInfoPhat1a); | |
100 | if (ACPI_FAILURE (Status)) | |
101 | @@ -2116,8 +2118,8 @@ AcpiDmDumpPhat ( | |
102 | /* Get vendor data - data length is the remaining subtable length */ | |
103 | ||
104 | VendorLength = | |
105 | - Subtable->Length - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength; | |
106 | - Status = AcpiDmDumpTable (Length, 0, | |
107 | + SubtableLength - sizeof (ACPI_PHAT_HEALTH_DATA) - PathLength; | |
108 | + Status = AcpiDmDumpTable (TableLength, 0, | |
109 | ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, sizeof (ACPI_PHAT_HEALTH_DATA) + PathLength), | |
110 | VendorLength, AcpiDmTableInfoPhat1b); | |
111 | if (ACPI_FAILURE (Status)) | |
112 | @@ -2129,15 +2131,15 @@ AcpiDmDumpPhat ( | |
113 | default: | |
114 | ||
115 | AcpiOsPrintf ("\n**** Unknown PHAT subtable type 0x%X\n\n", | |
116 | - Subtable->Type); | |
117 | + SubtableType); | |
118 | return; | |
119 | } | |
120 | ||
121 | /* Next subtable */ | |
122 | ||
123 | - Offset += Subtable->Length; | |
124 | + Offset += SubtableLength; | |
125 | Subtable = ACPI_ADD_PTR (ACPI_PHAT_HEADER, Subtable, | |
126 | - Subtable->Length); | |
127 | + SubtableLength); | |
128 | } | |
129 | } | |
130 | ||
131 | Index: acpica-unix2-20220331/source/compiler/dttable2.c | |
132 | =================================================================== | |
133 | --- acpica-unix2-20220331.orig/source/compiler/dttable2.c | |
134 | +++ acpica-unix2-20220331/source/compiler/dttable2.c | |
135 | @@ -1267,6 +1267,8 @@ DtCompilePhat ( | |
136 | ACPI_DMTABLE_INFO *Info; | |
137 | ACPI_PHAT_VERSION_DATA *VersionData; | |
138 | UINT32 RecordCount; | |
139 | + UINT16 SubtableType; | |
140 | + UINT16 Tmp16; | |
141 | ||
142 | ||
143 | /* The table consist of subtables */ | |
144 | @@ -1284,8 +1286,9 @@ DtCompilePhat ( | |
145 | DtPushSubtable (Subtable); | |
146 | ||
147 | PhatHeader = ACPI_CAST_PTR (ACPI_PHAT_HEADER, Subtable->Buffer); | |
148 | + SubtableType = AcpiUtReadUint16 (&PhatHeader->Type); | |
149 | ||
150 | - switch (PhatHeader->Type) | |
151 | + switch (SubtableType) | |
152 | { | |
153 | case ACPI_PHAT_TYPE_FW_VERSION_DATA: | |
154 | ||
155 | @@ -1316,13 +1319,13 @@ DtCompilePhat ( | |
156 | ParentTable = DtPeekSubtable (); | |
157 | DtInsertSubtable (ParentTable, Subtable); | |
158 | ||
159 | - switch (PhatHeader->Type) | |
160 | + switch (SubtableType) | |
161 | { | |
162 | case ACPI_PHAT_TYPE_FW_VERSION_DATA: | |
163 | ||
164 | VersionData = ACPI_CAST_PTR (ACPI_PHAT_VERSION_DATA, | |
165 | (Subtable->Buffer - sizeof (ACPI_PHAT_HEADER))); | |
166 | - RecordCount = VersionData->ElementCount; | |
167 | + RecordCount = AcpiUtReadUint32 (&VersionData->ElementCount); | |
168 | ||
169 | while (RecordCount) | |
170 | { | |
171 | @@ -1373,6 +1376,9 @@ DtCompilePhat ( | |
172 | DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, *PFieldList, "PHAT"); | |
173 | return (AE_ERROR); | |
174 | } | |
175 | + | |
176 | + Tmp16 = AcpiUtReadUint16 (&PhatHeader->Length); | |
177 | + PhatHeader->Length = Tmp16; | |
178 | } | |
179 | ||
180 | return (Status); |