From 88d16feb9d6982cc9c09f2ae9b76b26f0d9c96e0 Mon Sep 17 00:00:00 2001 From: Al Stone Date: Wed, 30 Sep 2020 17:48:04 -0600 Subject: [PATCH 36/40] Support IORT in a big-endian world Signed-off-by: Al Stone --- source/common/dmtbdump2.c | 73 ++++++++++++++++++++++---------------- source/compiler/dttable1.c | 37 ++++++++++--------- 2 files changed, 64 insertions(+), 46 deletions(-) Index: acpica-unix2-20200925/source/common/dmtbdump2.c =================================================================== --- acpica-unix2-20200925.orig/source/common/dmtbdump2.c +++ acpica-unix2-20200925/source/common/dmtbdump2.c @@ -75,16 +75,19 @@ AcpiDmDumpIort ( ACPI_IORT_SMMU *IortSmmu = NULL; UINT32 Offset; UINT32 NodeOffset; + UINT32 NodeLength; UINT32 Length; ACPI_DMTABLE_INFO *InfoTable; char *String; UINT32 i; UINT32 MappingByteLength; + UINT32 MappingCount; + UINT32 TableLength = AcpiUtReadUint32(&Table->Length); /* Main table */ - Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoIort); + Status = AcpiDmDumpTable (TableLength, 0, Table, 0, AcpiDmTableInfoIort); if (ACPI_FAILURE (Status)) { return; @@ -95,25 +98,26 @@ AcpiDmDumpIort ( /* Dump the OptionalPadding (optional) */ - if (Iort->NodeOffset > Offset) + NodeOffset = AcpiUtReadUint32(&Iort->NodeOffset); + if (NodeOffset > Offset) { - Status = AcpiDmDumpTable (Table->Length, Offset, Table, - Iort->NodeOffset - Offset, AcpiDmTableInfoIortPad); + Status = AcpiDmDumpTable (TableLength, Offset, Table, + NodeOffset - Offset, AcpiDmTableInfoIortPad); if (ACPI_FAILURE (Status)) { return; } } - Offset = Iort->NodeOffset; - while (Offset < Table->Length) + Offset = AcpiUtReadUint32(&Iort->NodeOffset); + while (Offset < TableLength) { /* Common subtable header */ IortNode = ACPI_ADD_PTR (ACPI_IORT_NODE, Table, Offset); AcpiOsPrintf ("\n"); Length = ACPI_OFFSET (ACPI_IORT_NODE, NodeData); - Status = AcpiDmDumpTable (Table->Length, Offset, + Status = AcpiDmDumpTable (TableLength, Offset, IortNode, Length, AcpiDmTableInfoIortHdr); if (ACPI_FAILURE (Status)) { @@ -142,7 +146,7 @@ AcpiDmDumpIort ( case ACPI_IORT_NODE_PCI_ROOT_COMPLEX: InfoTable = AcpiDmTableInfoIort2; - Length = IortNode->Length - NodeOffset; + Length = AcpiUtReadUint16(&IortNode->Length) - NodeOffset; break; case ACPI_IORT_NODE_SMMU: @@ -155,13 +159,13 @@ AcpiDmDumpIort ( case ACPI_IORT_NODE_SMMU_V3: InfoTable = AcpiDmTableInfoIort4; - Length = IortNode->Length - NodeOffset; + Length = AcpiUtReadUint16(&IortNode->Length) - NodeOffset; break; case ACPI_IORT_NODE_PMCG: InfoTable = AcpiDmTableInfoIort5; - Length = IortNode->Length - NodeOffset; + Length = AcpiUtReadUint16(&IortNode->Length) - NodeOffset; break; default: @@ -171,7 +175,7 @@ AcpiDmDumpIort ( /* Attempt to continue */ - if (!IortNode->Length) + if (!AcpiUtReadUint16(&IortNode->Length)) { AcpiOsPrintf ("Invalid zero length IORT node\n"); return; @@ -182,7 +186,7 @@ AcpiDmDumpIort ( /* Dump the node subtable header */ AcpiOsPrintf ("\n"); - Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, + Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), Length, InfoTable); if (ACPI_FAILURE (Status)) @@ -202,9 +206,11 @@ AcpiDmDumpIort ( if (IortItsGroup) { - for (i = 0; i < IortItsGroup->ItsCount; i++) + UINT32 ItsCount = AcpiUtReadUint32(&IortItsGroup->ItsCount); + + for (i = 0; i < ItsCount; i++) { - Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, + Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 4, AcpiDmTableInfoIort0a); if (ACPI_FAILURE (Status)) @@ -221,12 +227,14 @@ AcpiDmDumpIort ( /* Dump the Padding (optional) */ - if (IortNode->Length > NodeOffset) + NodeLength = AcpiUtReadUint16(&IortNode->Length); + if (NodeLength > NodeOffset) { MappingByteLength = - IortNode->MappingCount * sizeof (ACPI_IORT_ID_MAPPING); - Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, - Table, IortNode->Length - NodeOffset - MappingByteLength, + AcpiUtReadUint32(&IortNode->MappingCount) * + sizeof (ACPI_IORT_ID_MAPPING); + Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, + Table, NodeLength - NodeOffset - MappingByteLength, AcpiDmTableInfoIort1a); if (ACPI_FAILURE (Status)) { @@ -243,9 +251,11 @@ AcpiDmDumpIort ( if (IortSmmu) { + UINT32 InterruptCount; + Length = 2 * sizeof (UINT64); - NodeOffset = IortSmmu->GlobalInterruptOffset; - Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, + NodeOffset = AcpiUtReadUint32(&IortSmmu->GlobalInterruptOffset); + Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), Length, AcpiDmTableInfoIort3a); if (ACPI_FAILURE (Status)) @@ -253,10 +263,11 @@ AcpiDmDumpIort ( return; } - NodeOffset = IortSmmu->ContextInterruptOffset; - for (i = 0; i < IortSmmu->ContextInterruptCount; i++) + NodeOffset = AcpiUtReadUint32(&IortSmmu->ContextInterruptOffset); + InterruptCount = AcpiUtReadUint32(&IortSmmu->ContextInterruptCount); + for (i = 0; i < InterruptCount; i++) { - Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, + Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 8, AcpiDmTableInfoIort3b); if (ACPI_FAILURE (Status)) @@ -267,10 +278,11 @@ AcpiDmDumpIort ( NodeOffset += 8; } - NodeOffset = IortSmmu->PmuInterruptOffset; - for (i = 0; i < IortSmmu->PmuInterruptCount; i++) + NodeOffset = AcpiUtReadUint32(&IortSmmu->PmuInterruptOffset); + InterruptCount = AcpiUtReadUint32(&IortSmmu->PmuInterruptCount); + for (i = 0; i < InterruptCount; i++) { - Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, + Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), 8, AcpiDmTableInfoIort3c); if (ACPI_FAILURE (Status)) @@ -290,12 +302,13 @@ AcpiDmDumpIort ( /* Dump the ID mappings */ - NodeOffset = IortNode->MappingOffset; - for (i = 0; i < IortNode->MappingCount; i++) + NodeOffset = AcpiUtReadUint32(&IortNode->MappingOffset); + MappingCount = AcpiUtReadUint32(&IortNode->MappingCount); + for (i = 0; i < MappingCount; i++) { AcpiOsPrintf ("\n"); Length = sizeof (ACPI_IORT_ID_MAPPING); - Status = AcpiDmDumpTable (Table->Length, Offset + NodeOffset, + Status = AcpiDmDumpTable (TableLength, Offset + NodeOffset, ACPI_ADD_PTR (ACPI_IORT_NODE, IortNode, NodeOffset), Length, AcpiDmTableInfoIortMap); if (ACPI_FAILURE (Status)) @@ -309,7 +322,7 @@ AcpiDmDumpIort ( NextSubtable: /* Point to next node subtable */ - Offset += IortNode->Length; + Offset += AcpiUtReadUint16(&IortNode->Length); } } Index: acpica-unix2-20200925/source/compiler/dttable1.c =================================================================== --- acpica-unix2-20200925.orig/source/compiler/dttable1.c +++ acpica-unix2-20200925/source/compiler/dttable1.c @@ -1516,6 +1516,7 @@ DtCompileIort ( ACPI_IORT_NODE *IortNode; ACPI_IORT_ITS_GROUP *IortItsGroup; ACPI_IORT_SMMU *IortSmmu; + UINT32 IortNodeOffset; UINT32 NodeNumber; UINT32 NodeLength; UINT32 IdMappingNumber; @@ -1548,7 +1549,7 @@ DtCompileIort ( * Optionally allows the generic data types to be used for filling * this field. */ - Iort->NodeOffset = sizeof (ACPI_TABLE_IORT); + IortNodeOffset = sizeof (ACPI_TABLE_IORT); Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad, &Subtable); if (ACPI_FAILURE (Status)) @@ -1558,7 +1559,7 @@ DtCompileIort ( if (Subtable) { DtInsertSubtable (ParentTable, Subtable); - Iort->NodeOffset += Subtable->Length; + IortNodeOffset += Subtable->Length; } else { @@ -1568,8 +1569,9 @@ DtCompileIort ( { return (Status); } - Iort->NodeOffset += PaddingLength; + IortNodeOffset += PaddingLength; } + Iort->NodeOffset = AcpiUtReadUint32(&IortNodeOffset); NodeNumber = 0; while (*PFieldList) @@ -1623,7 +1625,7 @@ DtCompileIort ( ItsNumber++; } - IortItsGroup->ItsCount = ItsNumber; + IortItsGroup->ItsCount = AcpiUtReadUint32(&ItsNumber); break; case ACPI_IORT_NODE_NAMED_COMPONENT: @@ -1657,15 +1659,18 @@ DtCompileIort ( } else { - if (NodeLength > IortNode->MappingOffset) + UINT32 MappingOffset; + + MappingOffset = IortNode->MappingOffset; + if (NodeLength > MappingOffset) { return (AE_BAD_DATA); } - if (NodeLength < IortNode->MappingOffset) + if (NodeLength < MappingOffset) { Status = DtCompilePadding ( - IortNode->MappingOffset - NodeLength, + MappingOffset - NodeLength, &Subtable); if (ACPI_FAILURE (Status)) { @@ -1673,7 +1678,7 @@ DtCompileIort ( } DtInsertSubtable (ParentTable, Subtable); - NodeLength = IortNode->MappingOffset; + NodeLength = MappingOffset; } } break; @@ -1706,7 +1711,7 @@ DtCompileIort ( /* Compile global interrupt array */ - IortSmmu->GlobalInterruptOffset = NodeLength; + IortSmmu->GlobalInterruptOffset = AcpiUtReadUint32(&NodeLength); Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a, &Subtable); if (ACPI_FAILURE (Status)) @@ -1720,7 +1725,7 @@ DtCompileIort ( /* Compile context interrupt array */ ContextIrptNumber = 0; - IortSmmu->ContextInterruptOffset = NodeLength; + IortSmmu->ContextInterruptOffset = AcpiUtReadUint32(&NodeLength); while (*PFieldList) { Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b, @@ -1740,12 +1745,12 @@ DtCompileIort ( ContextIrptNumber++; } - IortSmmu->ContextInterruptCount = ContextIrptNumber; + IortSmmu->ContextInterruptCount = AcpiUtReadUint32(&ContextIrptNumber); /* Compile PMU interrupt array */ PmuIrptNumber = 0; - IortSmmu->PmuInterruptOffset = NodeLength; + IortSmmu->PmuInterruptOffset = AcpiUtReadUint32(&NodeLength); while (*PFieldList) { Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c, @@ -1765,7 +1770,7 @@ DtCompileIort ( PmuIrptNumber++; } - IortSmmu->PmuInterruptCount = PmuIrptNumber; + IortSmmu->PmuInterruptCount = AcpiUtReadUint32(&PmuIrptNumber); break; case ACPI_IORT_NODE_SMMU_V3: @@ -1802,7 +1807,7 @@ DtCompileIort ( /* Compile Array of ID mappings */ - IortNode->MappingOffset = NodeLength; + IortNode->MappingOffset = AcpiUtReadUint32(&NodeLength); IdMappingNumber = 0; while (*PFieldList) { @@ -1823,7 +1828,7 @@ DtCompileIort ( IdMappingNumber++; } - IortNode->MappingCount = IdMappingNumber; + IortNode->MappingCount = AcpiUtReadUint32(&IdMappingNumber); if (!IdMappingNumber) { IortNode->MappingOffset = 0; @@ -1838,7 +1843,7 @@ DtCompileIort ( NodeNumber++; } - Iort->NodeCount = NodeNumber; + Iort->NodeCount = AcpiUtReadUint32(&NodeNumber); return (AE_OK); }