1 From 0d87ee42adda7837bec3cc0ff86e40c2f2e8dc4f Mon Sep 17 00:00:00 2001
2 From: Al Stone <ahs3@redhat.com>
3 Date: Fri, 9 Jul 2021 14:52:55 -0600
4 Subject: [PATCH 45/45] CSRT: fixed use of optional ResourceInfo
6 In a resource sub-sub-table, there may be a ResourceInfo entry. Neither
7 the compiler nor disassembler accounted for that possibility properly.
9 Signed-off-by: Al Stone <ahs3@redhat.com>
11 source/common/dmtbdump1.c | 43 +++++++++++++++++++++-----------------
12 source/compiler/dttable1.c | 28 +++++++++++++------------
13 2 files changed, 39 insertions(+), 32 deletions(-)
15 Index: acpica-unix2-20220331/source/common/dmtbdump1.c
16 ===================================================================
17 --- acpica-unix2-20220331.orig/source/common/dmtbdump1.c
18 +++ acpica-unix2-20220331/source/common/dmtbdump1.c
19 @@ -669,11 +669,13 @@ AcpiDmDumpCsrt (
20 ACPI_CSRT_GROUP *Subtable;
21 ACPI_CSRT_SHARED_INFO *SharedInfoTable;
22 ACPI_CSRT_DESCRIPTOR *SubSubtable;
23 - UINT32 Length = AcpiUtReadUint32 (&Table->Length);
24 + UINT32 TableLength = AcpiUtReadUint32 (&Table->Length);
25 UINT32 Offset = sizeof (ACPI_TABLE_CSRT);
29 + UINT32 SubtableLength;
30 + UINT32 SubSubtableLength;
33 /* The main table only contains the ACPI header, thus already handled */
34 @@ -681,13 +683,14 @@ AcpiDmDumpCsrt (
35 /* Subtables (Resource Groups) */
37 Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
38 - while (Offset < Length)
39 + while (Offset < TableLength)
41 /* Resource group subtable */
43 + SubtableLength = AcpiUtReadUint32 (&Subtable->Length);
45 - Status = AcpiDmDumpTable (Length, Offset, Subtable,
46 - Subtable->Length, AcpiDmTableInfoCsrt0);
47 + Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
48 + SubtableLength, AcpiDmTableInfoCsrt0);
49 if (ACPI_FAILURE (Status))
52 @@ -700,26 +703,28 @@ AcpiDmDumpCsrt (
56 - Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
57 - sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
58 + Status = AcpiDmDumpTable (TableLength, Offset + SubOffset,
59 + SharedInfoTable, sizeof (ACPI_CSRT_SHARED_INFO),
60 + AcpiDmTableInfoCsrt1);
61 if (ACPI_FAILURE (Status))
66 - SubOffset += Subtable->SharedInfoLength;
67 + SubOffset += AcpiUtReadUint32 (&Subtable->SharedInfoLength);
69 /* Sub-Subtables (Resource Descriptors) */
71 SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
74 - while ((SubOffset < Subtable->Length) &&
75 - ((Offset + SubOffset) < Length))
76 + while ((SubOffset < SubtableLength) &&
77 + ((Offset + SubOffset) < TableLength))
79 + SubSubtableLength = AcpiUtReadUint32 (&SubSubtable->Length);
81 - Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
82 - SubSubtable->Length, AcpiDmTableInfoCsrt2);
83 + Status = AcpiDmDumpTable (TableLength, Offset + SubOffset,
84 + SubSubtable, SubSubtableLength, AcpiDmTableInfoCsrt2);
85 if (ACPI_FAILURE (Status))
88 @@ -729,11 +734,12 @@ AcpiDmDumpCsrt (
90 /* Resource-specific info buffer */
92 - InfoLength = SubSubtable->Length - SubSubOffset;
93 + InfoLength = SubSubtableLength - SubSubOffset;
96 - Status = AcpiDmDumpTable (Length,
97 - Offset + SubOffset + SubSubOffset, Table,
98 + Status = AcpiDmDumpTable (TableLength,
99 + Offset + SubOffset + SubSubOffset,
100 + (UINT8 *)SubSubtable + SubSubOffset,
101 InfoLength, AcpiDmTableInfoCsrt2a);
102 if (ACPI_FAILURE (Status))
104 @@ -743,16 +749,15 @@ AcpiDmDumpCsrt (
106 /* Point to next sub-subtable */
108 - SubOffset += SubSubtable->Length;
109 + SubOffset += SubSubtableLength;
110 SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
111 - SubSubtable->Length);
112 + SubSubtableLength);
115 /* Point to next subtable */
117 - Offset += Subtable->Length;
118 - Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
120 + Offset += SubtableLength;
121 + Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable, SubtableLength);
125 Index: acpica-unix2-20220331/source/compiler/dttable1.c
126 ===================================================================
127 --- acpica-unix2-20220331.orig/source/compiler/dttable1.c
128 +++ acpica-unix2-20220331/source/compiler/dttable1.c
129 @@ -716,14 +716,16 @@ DtCompileCsrt (
130 DT_SUBTABLE *Subtable;
131 DT_SUBTABLE *ParentTable;
132 DT_FIELD **PFieldList = (DT_FIELD **) List;
133 - UINT32 DescriptorCount;
134 + UINT32 DescriptorLength;
140 /* Subtables (Resource Groups) */
142 ParentTable = DtPeekSubtable ();
146 /* Resource group subtable */
147 @@ -738,16 +740,13 @@ DtCompileCsrt (
148 /* Compute the number of resource descriptors */
150 Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
151 - Subtable->Buffer))->Length);
152 + Subtable->Buffer))->Length);
154 Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
155 - Subtable->Buffer))->SharedInfoLength);
156 + Subtable->Buffer))->SharedInfoLength);
158 GroupLength -= sizeof (ACPI_CSRT_GROUP);
160 - DescriptorCount = (GroupLength /
161 - sizeof (ACPI_CSRT_DESCRIPTOR));
163 DtInsertSubtable (ParentTable, Subtable);
164 DtPushSubtable (Subtable);
165 ParentTable = DtPeekSubtable ();
166 @@ -762,10 +761,13 @@ DtCompileCsrt (
169 DtInsertSubtable (ParentTable, Subtable);
170 + DtPushSubtable (Subtable);
171 + ParentTable = DtPeekSubtable ();
173 /* Sub-Subtables (Resource Descriptors) */
175 - while (*PFieldList && DescriptorCount)
177 + while (*PFieldList && (Offset < GroupLength))
180 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
181 @@ -774,6 +776,10 @@ DtCompileCsrt (
185 + DescriptorLength = AcpiUtReadUint32 (
186 + &(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
187 + Subtable->Buffer))->Length);
190 DtInsertSubtable (ParentTable, Subtable);
192 @@ -783,11 +789,7 @@ DtCompileCsrt (
194 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a,
196 - if (ACPI_FAILURE (Status))
201 + if (ACPI_SUCCESS (Status) && Subtable)
203 DtInsertSubtable (ParentTable, Subtable);
205 @@ -795,7 +797,7 @@ DtCompileCsrt (
208 ParentTable = DtPeekSubtable ();
210 + Offset += DescriptorLength;