|
|
416465f |
From 0d87ee42adda7837bec3cc0ff86e40c2f2e8dc4f Mon Sep 17 00:00:00 2001
|
|
|
416465f |
From: Al Stone <ahs3@redhat.com>
|
|
|
416465f |
Date: Fri, 9 Jul 2021 14:52:55 -0600
|
|
|
416465f |
Subject: [PATCH 45/45] CSRT: fixed use of optional ResourceInfo
|
|
|
416465f |
|
|
|
416465f |
In a resource sub-sub-table, there may be a ResourceInfo entry. Neither
|
|
|
416465f |
the compiler nor disassembler accounted for that possibility properly.
|
|
|
416465f |
|
|
|
416465f |
Signed-off-by: Al Stone <ahs3@redhat.com>
|
|
|
416465f |
---
|
|
|
416465f |
source/common/dmtbdump1.c | 43 +++++++++++++++++++++-----------------
|
|
|
416465f |
source/compiler/dttable1.c | 28 +++++++++++++------------
|
|
|
416465f |
2 files changed, 39 insertions(+), 32 deletions(-)
|
|
|
416465f |
|
|
|
fc3eef6 |
Index: acpica-unix2-20220331/source/common/dmtbdump1.c
|
|
|
416465f |
===================================================================
|
|
|
fc3eef6 |
--- acpica-unix2-20220331.orig/source/common/dmtbdump1.c
|
|
|
fc3eef6 |
+++ acpica-unix2-20220331/source/common/dmtbdump1.c
|
|
|
fc3eef6 |
@@ -669,11 +669,13 @@ AcpiDmDumpCsrt (
|
|
|
416465f |
ACPI_CSRT_GROUP *Subtable;
|
|
|
416465f |
ACPI_CSRT_SHARED_INFO *SharedInfoTable;
|
|
|
416465f |
ACPI_CSRT_DESCRIPTOR *SubSubtable;
|
|
|
416465f |
- UINT32 Length = AcpiUtReadUint32 (&Table->Length);
|
|
|
416465f |
+ UINT32 TableLength = AcpiUtReadUint32 (&Table->Length);
|
|
|
416465f |
UINT32 Offset = sizeof (ACPI_TABLE_CSRT);
|
|
|
416465f |
UINT32 SubOffset;
|
|
|
416465f |
UINT32 SubSubOffset;
|
|
|
416465f |
UINT32 InfoLength;
|
|
|
416465f |
+ UINT32 SubtableLength;
|
|
|
416465f |
+ UINT32 SubSubtableLength;
|
|
|
416465f |
|
|
|
416465f |
|
|
|
416465f |
/* The main table only contains the ACPI header, thus already handled */
|
|
|
fc3eef6 |
@@ -681,13 +683,14 @@ AcpiDmDumpCsrt (
|
|
|
416465f |
/* Subtables (Resource Groups) */
|
|
|
416465f |
|
|
|
416465f |
Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
|
|
|
416465f |
- while (Offset < Length)
|
|
|
416465f |
+ while (Offset < TableLength)
|
|
|
416465f |
{
|
|
|
416465f |
/* Resource group subtable */
|
|
|
416465f |
|
|
|
416465f |
+ SubtableLength = AcpiUtReadUint32 (&Subtable->Length);
|
|
|
416465f |
AcpiOsPrintf ("\n");
|
|
|
416465f |
- Status = AcpiDmDumpTable (Length, Offset, Subtable,
|
|
|
416465f |
- Subtable->Length, AcpiDmTableInfoCsrt0);
|
|
|
416465f |
+ Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
|
|
|
416465f |
+ SubtableLength, AcpiDmTableInfoCsrt0);
|
|
|
416465f |
if (ACPI_FAILURE (Status))
|
|
|
416465f |
{
|
|
|
416465f |
return;
|
|
|
fc3eef6 |
@@ -700,26 +703,28 @@ AcpiDmDumpCsrt (
|
|
|
416465f |
Offset + SubOffset);
|
|
|
416465f |
|
|
|
416465f |
AcpiOsPrintf ("\n");
|
|
|
416465f |
- Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
|
|
|
416465f |
- sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
|
|
|
416465f |
+ Status = AcpiDmDumpTable (TableLength, Offset + SubOffset,
|
|
|
416465f |
+ SharedInfoTable, sizeof (ACPI_CSRT_SHARED_INFO),
|
|
|
416465f |
+ AcpiDmTableInfoCsrt1);
|
|
|
416465f |
if (ACPI_FAILURE (Status))
|
|
|
416465f |
{
|
|
|
416465f |
return;
|
|
|
416465f |
}
|
|
|
416465f |
|
|
|
416465f |
- SubOffset += Subtable->SharedInfoLength;
|
|
|
416465f |
+ SubOffset += AcpiUtReadUint32 (&Subtable->SharedInfoLength);
|
|
|
416465f |
|
|
|
416465f |
/* Sub-Subtables (Resource Descriptors) */
|
|
|
416465f |
|
|
|
416465f |
SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
|
|
|
416465f |
Offset + SubOffset);
|
|
|
416465f |
|
|
|
416465f |
- while ((SubOffset < Subtable->Length) &&
|
|
|
416465f |
- ((Offset + SubOffset) < Length))
|
|
|
416465f |
+ while ((SubOffset < SubtableLength) &&
|
|
|
416465f |
+ ((Offset + SubOffset) < TableLength))
|
|
|
416465f |
{
|
|
|
416465f |
+ SubSubtableLength = AcpiUtReadUint32 (&SubSubtable->Length);
|
|
|
416465f |
AcpiOsPrintf ("\n");
|
|
|
416465f |
- Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
|
|
|
416465f |
- SubSubtable->Length, AcpiDmTableInfoCsrt2);
|
|
|
416465f |
+ Status = AcpiDmDumpTable (TableLength, Offset + SubOffset,
|
|
|
416465f |
+ SubSubtable, SubSubtableLength, AcpiDmTableInfoCsrt2);
|
|
|
416465f |
if (ACPI_FAILURE (Status))
|
|
|
416465f |
{
|
|
|
416465f |
return;
|
|
|
fc3eef6 |
@@ -729,11 +734,12 @@ AcpiDmDumpCsrt (
|
|
|
416465f |
|
|
|
416465f |
/* Resource-specific info buffer */
|
|
|
416465f |
|
|
|
416465f |
- InfoLength = SubSubtable->Length - SubSubOffset;
|
|
|
416465f |
+ InfoLength = SubSubtableLength - SubSubOffset;
|
|
|
416465f |
if (InfoLength)
|
|
|
416465f |
{
|
|
|
416465f |
- Status = AcpiDmDumpTable (Length,
|
|
|
416465f |
- Offset + SubOffset + SubSubOffset, Table,
|
|
|
416465f |
+ Status = AcpiDmDumpTable (TableLength,
|
|
|
416465f |
+ Offset + SubOffset + SubSubOffset,
|
|
|
416465f |
+ (UINT8 *)SubSubtable + SubSubOffset,
|
|
|
416465f |
InfoLength, AcpiDmTableInfoCsrt2a);
|
|
|
416465f |
if (ACPI_FAILURE (Status))
|
|
|
416465f |
{
|
|
|
fc3eef6 |
@@ -743,16 +749,15 @@ AcpiDmDumpCsrt (
|
|
|
416465f |
|
|
|
416465f |
/* Point to next sub-subtable */
|
|
|
416465f |
|
|
|
416465f |
- SubOffset += SubSubtable->Length;
|
|
|
416465f |
+ SubOffset += SubSubtableLength;
|
|
|
416465f |
SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
|
|
|
416465f |
- SubSubtable->Length);
|
|
|
416465f |
+ SubSubtableLength);
|
|
|
416465f |
}
|
|
|
416465f |
|
|
|
416465f |
/* Point to next subtable */
|
|
|
416465f |
|
|
|
416465f |
- Offset += Subtable->Length;
|
|
|
416465f |
- Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
|
|
|
416465f |
- Subtable->Length);
|
|
|
416465f |
+ Offset += SubtableLength;
|
|
|
416465f |
+ Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable, SubtableLength);
|
|
|
416465f |
}
|
|
|
416465f |
}
|
|
|
416465f |
|
|
|
fc3eef6 |
Index: acpica-unix2-20220331/source/compiler/dttable1.c
|
|
|
416465f |
===================================================================
|
|
|
fc3eef6 |
--- acpica-unix2-20220331.orig/source/compiler/dttable1.c
|
|
|
fc3eef6 |
+++ acpica-unix2-20220331/source/compiler/dttable1.c
|
|
|
fc3eef6 |
@@ -716,14 +716,16 @@ DtCompileCsrt (
|
|
|
416465f |
DT_SUBTABLE *Subtable;
|
|
|
416465f |
DT_SUBTABLE *ParentTable;
|
|
|
416465f |
DT_FIELD **PFieldList = (DT_FIELD **) List;
|
|
|
416465f |
- UINT32 DescriptorCount;
|
|
|
416465f |
+ UINT32 DescriptorLength;
|
|
|
416465f |
UINT32 GroupLength;
|
|
|
416465f |
UINT32 Tmp;
|
|
|
416465f |
+ UINT32 Offset;
|
|
|
416465f |
|
|
|
416465f |
|
|
|
416465f |
/* Subtables (Resource Groups) */
|
|
|
416465f |
|
|
|
416465f |
ParentTable = DtPeekSubtable ();
|
|
|
416465f |
+
|
|
|
416465f |
while (*PFieldList)
|
|
|
416465f |
{
|
|
|
416465f |
/* Resource group subtable */
|
|
|
fc3eef6 |
@@ -738,16 +740,13 @@ DtCompileCsrt (
|
|
|
416465f |
/* Compute the number of resource descriptors */
|
|
|
416465f |
|
|
|
416465f |
Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
|
|
|
416465f |
- Subtable->Buffer))->Length);
|
|
|
416465f |
+ Subtable->Buffer))->Length);
|
|
|
416465f |
GroupLength = Tmp;
|
|
|
416465f |
Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
|
|
|
416465f |
- Subtable->Buffer))->SharedInfoLength);
|
|
|
416465f |
+ Subtable->Buffer))->SharedInfoLength);
|
|
|
416465f |
GroupLength -= Tmp;
|
|
|
416465f |
GroupLength -= sizeof (ACPI_CSRT_GROUP);
|
|
|
416465f |
|
|
|
416465f |
- DescriptorCount = (GroupLength /
|
|
|
416465f |
- sizeof (ACPI_CSRT_DESCRIPTOR));
|
|
|
416465f |
-
|
|
|
416465f |
DtInsertSubtable (ParentTable, Subtable);
|
|
|
416465f |
DtPushSubtable (Subtable);
|
|
|
416465f |
ParentTable = DtPeekSubtable ();
|
|
|
fc3eef6 |
@@ -762,10 +761,13 @@ DtCompileCsrt (
|
|
|
416465f |
}
|
|
|
416465f |
|
|
|
416465f |
DtInsertSubtable (ParentTable, Subtable);
|
|
|
416465f |
+ DtPushSubtable (Subtable);
|
|
|
416465f |
+ ParentTable = DtPeekSubtable ();
|
|
|
416465f |
|
|
|
416465f |
/* Sub-Subtables (Resource Descriptors) */
|
|
|
416465f |
|
|
|
416465f |
- while (*PFieldList && DescriptorCount)
|
|
|
416465f |
+ Offset = 0;
|
|
|
416465f |
+ while (*PFieldList && (Offset < GroupLength))
|
|
|
416465f |
{
|
|
|
416465f |
|
|
|
416465f |
Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
|
|
|
fc3eef6 |
@@ -774,6 +776,10 @@ DtCompileCsrt (
|
|
|
416465f |
{
|
|
|
416465f |
return (Status);
|
|
|
416465f |
}
|
|
|
416465f |
+ DescriptorLength = AcpiUtReadUint32 (
|
|
|
416465f |
+ &(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
|
|
|
416465f |
+ Subtable->Buffer))->Length);
|
|
|
416465f |
+
|
|
|
416465f |
|
|
|
416465f |
DtInsertSubtable (ParentTable, Subtable);
|
|
|
416465f |
|
|
|
fc3eef6 |
@@ -783,11 +789,7 @@ DtCompileCsrt (
|
|
|
416465f |
{
|
|
|
416465f |
Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a,
|
|
|
416465f |
&Subtable);
|
|
|
416465f |
- if (ACPI_FAILURE (Status))
|
|
|
416465f |
- {
|
|
|
416465f |
- return (Status);
|
|
|
416465f |
- }
|
|
|
416465f |
- if (Subtable)
|
|
|
416465f |
+ if (ACPI_SUCCESS (Status) && Subtable)
|
|
|
416465f |
{
|
|
|
416465f |
DtInsertSubtable (ParentTable, Subtable);
|
|
|
416465f |
}
|
|
|
fc3eef6 |
@@ -795,7 +797,7 @@ DtCompileCsrt (
|
|
|
416465f |
|
|
|
416465f |
DtPopSubtable ();
|
|
|
416465f |
ParentTable = DtPeekSubtable ();
|
|
|
416465f |
- DescriptorCount--;
|
|
|
416465f |
+ Offset += DescriptorLength;
|
|
|
416465f |
}
|
|
|
416465f |
|
|
|
416465f |
DtPopSubtable ();
|