/* Size of ITS Group Node +\r
Size of ITS Identifier array\r
*/\r
- return sizeof (EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE) +\r
- (Node->ItsIdCount * sizeof (UINT32));\r
+ return (UINT32)(sizeof (EFI_ACPI_6_0_IO_REMAPPING_ITS_NODE) +\r
+ (Node->ItsIdCount * sizeof (UINT32)));\r
}\r
\r
/** Returns the total size required for the ITS Group nodes and\r
@retval Total size of the ITS Group Nodes.\r
**/\r
STATIC\r
-UINT32\r
+UINT64\r
GetSizeofItsGroupNodes (\r
IN CONST UINT32 NodeStartOffset,\r
IN CONST CM_ARM_ITS_GROUP_NODE * NodeList,\r
IN OUT IORT_NODE_INDEXER ** CONST NodeIndexer\r
)\r
{\r
- UINT32 Size;\r
+ UINT64 Size;\r
\r
ASSERT (NodeList != NULL);\r
\r
while (NodeCount-- != 0) {\r
(*NodeIndexer)->Token = NodeList->Token;\r
(*NodeIndexer)->Object = (VOID*)NodeList;\r
- (*NodeIndexer)->Offset = Size + NodeStartOffset;\r
+ (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset);\r
DEBUG ((\r
DEBUG_INFO,\r
"IORT: Node Indexer = %p, Token = %p, Object = %p, Offset = 0x%x\n",\r
Size of ID mapping array +\r
Size of ASCII string + 'padding to 32-bit word aligned'.\r
*/\r
- return sizeof (EFI_ACPI_6_0_IO_REMAPPING_NAMED_COMP_NODE) +\r
- (Node->IdMappingCount *\r
- sizeof (EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE)) +\r
- ALIGN_VALUE (AsciiStrSize (Node->ObjectName), 4);\r
+ return (UINT32)(sizeof (EFI_ACPI_6_0_IO_REMAPPING_NAMED_COMP_NODE) +\r
+ (Node->IdMappingCount *\r
+ sizeof (EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE)) +\r
+ ALIGN_VALUE (AsciiStrSize (Node->ObjectName), 4));\r
}\r
\r
/** Returns the total size required for the Named Component nodes and\r
@retval Total size of the Named Component nodes.\r
**/\r
STATIC\r
-UINT32\r
+UINT64\r
GetSizeofNamedComponentNodes (\r
IN CONST UINT32 NodeStartOffset,\r
IN CONST CM_ARM_NAMED_COMPONENT_NODE * NodeList,\r
IN OUT IORT_NODE_INDEXER ** CONST NodeIndexer\r
)\r
{\r
- UINT32 Size;\r
+ UINT64 Size;\r
\r
ASSERT (NodeList != NULL);\r
\r
while (NodeCount-- != 0) {\r
(*NodeIndexer)->Token = NodeList->Token;\r
(*NodeIndexer)->Object = (VOID*)NodeList;\r
- (*NodeIndexer)->Offset = Size + NodeStartOffset;\r
+ (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset);\r
DEBUG ((\r
DEBUG_INFO,\r
"IORT: Node Indexer = %p, Token = %p, Object = %p, Offset = 0x%x\n",\r
/* Size of Root Complex node +\r
Size of ID mapping array\r
*/\r
- return sizeof (EFI_ACPI_6_0_IO_REMAPPING_RC_NODE) +\r
- (Node->IdMappingCount *\r
- sizeof (EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE));\r
+ return (UINT32)(sizeof (EFI_ACPI_6_0_IO_REMAPPING_RC_NODE) +\r
+ (Node->IdMappingCount *\r
+ sizeof (EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE)));\r
}\r
\r
/** Returns the total size required for the Root Complex nodes and\r
@retval Total size of the Root Complex nodes.\r
**/\r
STATIC\r
-UINT32\r
+UINT64\r
GetSizeofRootComplexNodes (\r
IN CONST UINT32 NodeStartOffset,\r
IN CONST CM_ARM_ROOT_COMPLEX_NODE * NodeList,\r
IN OUT IORT_NODE_INDEXER ** CONST NodeIndexer\r
)\r
{\r
- UINT32 Size;\r
+ UINT64 Size;\r
\r
ASSERT (NodeList != NULL);\r
\r
while (NodeCount-- != 0) {\r
(*NodeIndexer)->Token = NodeList->Token;\r
(*NodeIndexer)->Object = (VOID*)NodeList;\r
- (*NodeIndexer)->Offset = Size + NodeStartOffset;\r
+ (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset);\r
DEBUG ((\r
DEBUG_INFO,\r
"IORT: Node Indexer = %p, Token = %p, Object = %p, Offset = 0x%x\n",\r
Size of context interrupt array +\r
Size of PMU interrupt array\r
*/\r
- return sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE) +\r
- (Node->IdMappingCount *\r
- sizeof (EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE)) +\r
- (Node->ContextInterruptCount *\r
- sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT)) +\r
- (Node->PmuInterruptCount *\r
- sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT));\r
+ return (UINT32)(sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_NODE) +\r
+ (Node->IdMappingCount *\r
+ sizeof (EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE)) +\r
+ (Node->ContextInterruptCount *\r
+ sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT)) +\r
+ (Node->PmuInterruptCount *\r
+ sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT)));\r
}\r
\r
/** Returns the total size required for the SMMUv1/SMMUv2 nodes and\r
@retval Total size of the SMMUv1/SMMUv2 nodes.\r
**/\r
STATIC\r
-UINT32\r
+UINT64\r
GetSizeofSmmuV1V2Nodes (\r
IN CONST UINT32 NodeStartOffset,\r
IN CONST CM_ARM_SMMUV1_SMMUV2_NODE * NodeList,\r
IN OUT IORT_NODE_INDEXER ** CONST NodeIndexer\r
)\r
{\r
- UINT32 Size;\r
+ UINT64 Size;\r
\r
ASSERT (NodeList != NULL);\r
\r
while (NodeCount-- != 0) {\r
(*NodeIndexer)->Token = NodeList->Token;\r
(*NodeIndexer)->Object = (VOID*)NodeList;\r
- (*NodeIndexer)->Offset = Size + NodeStartOffset;\r
+ (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset);\r
DEBUG ((\r
DEBUG_INFO,\r
"IORT: Node Indexer = %p, Token = %p, Object = %p, Offset = 0x%x\n",\r
/* Size of SMMU v1/SMMU v2 node +\r
Size of ID mapping array\r
*/\r
- return sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE) +\r
- (Node->IdMappingCount *\r
- sizeof (EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE));\r
+ return (UINT32)(sizeof (EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE) +\r
+ (Node->IdMappingCount *\r
+ sizeof (EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE)));\r
}\r
\r
/** Returns the total size required for the SMMUv3 nodes and\r
@retval Total size of the SMMUv3 nodes.\r
**/\r
STATIC\r
-UINT32\r
+UINT64\r
GetSizeofSmmuV3Nodes (\r
IN CONST UINT32 NodeStartOffset,\r
IN CONST CM_ARM_SMMUV3_NODE * NodeList,\r
IN OUT IORT_NODE_INDEXER ** CONST NodeIndexer\r
)\r
{\r
- UINT32 Size;\r
+ UINT64 Size;\r
\r
ASSERT (NodeList != NULL);\r
\r
while (NodeCount-- != 0) {\r
(*NodeIndexer)->Token = NodeList->Token;\r
(*NodeIndexer)->Object = (VOID*)NodeList;\r
- (*NodeIndexer)->Offset = Size + NodeStartOffset;\r
+ (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset);\r
DEBUG ((\r
DEBUG_INFO,\r
"IORT: Node Indexer = %p, Token = %p, Object = %p, Offset = 0x%x\n",\r
/* Size of PMCG node +\r
Size of ID mapping array\r
*/\r
- return sizeof (EFI_ACPI_6_0_IO_REMAPPING_PMCG_NODE) +\r
- (Node->IdMappingCount *\r
- sizeof (EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE));\r
+ return (UINT32)(sizeof (EFI_ACPI_6_0_IO_REMAPPING_PMCG_NODE) +\r
+ (Node->IdMappingCount *\r
+ sizeof (EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE)));\r
}\r
\r
/** Returns the total size required for the PMCG nodes and\r
@retval Total size of the PMCG nodes.\r
**/\r
STATIC\r
-UINT32\r
+UINT64\r
GetSizeofPmcgNodes (\r
IN CONST UINT32 NodeStartOffset,\r
IN CONST CM_ARM_PMCG_NODE * NodeList,\r
IN OUT IORT_NODE_INDEXER ** CONST NodeIndexer\r
)\r
{\r
- UINT32 Size;\r
+ UINT64 Size;\r
\r
ASSERT (NodeList != NULL);\r
\r
while (NodeCount-- != 0) {\r
(*NodeIndexer)->Token = NodeList->Token;\r
(*NodeIndexer)->Object = (VOID*)NodeList;\r
- (*NodeIndexer)->Offset = Size + NodeStartOffset;\r
+ (*NodeIndexer)->Offset = (UINT32)(Size + NodeStartOffset);\r
DEBUG ((\r
DEBUG_INFO,\r
"IORT: Node Indexer = %p, Token = %p, Object = %p, Offset = 0x%x\n",\r
CM_ARM_ITS_IDENTIFIER * ItsIdentifier;\r
UINT32 ItsIdentifierCount;\r
UINT32 IdIndex;\r
+ UINT64 NodeLength;\r
\r
ASSERT (Iort != NULL);\r
\r
NodesStartOffset);\r
\r
while (NodeCount-- != 0) {\r
+ NodeLength = GetItsGroupNodeSize (NodeList);\r
+ if (NodeLength > MAX_UINT16) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: ITS Id Array Node length 0x%lx > MAX_UINT16."\r
+ " Status = %r\n",\r
+ NodeLength,\r
+ Status\r
+ ));\r
+ return Status;\r
+ }\r
+\r
// Populate the node header\r
ItsGroupNode->Node.Type = EFI_ACPI_IORT_TYPE_ITS_GROUP;\r
- ItsGroupNode->Node.Length = GetItsGroupNodeSize (NodeList);\r
+ ItsGroupNode->Node.Length = (UINT16)NodeLength;\r
ItsGroupNode->Node.Revision = 0;\r
ItsGroupNode->Node.Reserved = EFI_ACPI_RESERVED_DWORD;\r
ItsGroupNode->Node.NumIdMappings = 0;\r
EFI_STATUS Status;\r
EFI_ACPI_6_0_IO_REMAPPING_NAMED_COMP_NODE * NcNode;\r
EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE * IdMapArray;\r
- UINT32 ObjectNameLenght;\r
CHAR8 * ObjectName;\r
+ UINTN ObjectNameLength;\r
+ UINT64 NodeLength;\r
\r
ASSERT (Iort != NULL);\r
\r
NodesStartOffset);\r
\r
while (NodeCount-- != 0) {\r
+ NodeLength = GetNamedComponentNodeSize (NodeList);\r
+ if (NodeLength > MAX_UINT16) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: Named Component Node length 0x%lx > MAX_UINT16."\r
+ " Status = %r\n",\r
+ NodeLength,\r
+ Status\r
+ ));\r
+ return Status;\r
+ }\r
+\r
// Populate the node header\r
NcNode->Node.Type = EFI_ACPI_IORT_TYPE_NAMED_COMP;\r
- NcNode->Node.Length =\r
- GetNamedComponentNodeSize (NodeList);\r
+ NcNode->Node.Length = (UINT16)NodeLength;\r
NcNode->Node.Revision = 2;\r
NcNode->Node.Reserved = EFI_ACPI_RESERVED_DWORD;\r
NcNode->Node.NumIdMappings = NodeList->IdMappingCount;\r
\r
- ObjectNameLenght = AsciiStrLen (NodeList->ObjectName) + 1;\r
+ ObjectNameLength = AsciiStrLen (NodeList->ObjectName) + 1;\r
NcNode->Node.IdReference =\r
- sizeof (EFI_ACPI_6_0_IO_REMAPPING_NAMED_COMP_NODE) +\r
- (ALIGN_VALUE (ObjectNameLenght, 4));\r
+ (UINT32)(sizeof (EFI_ACPI_6_0_IO_REMAPPING_NAMED_COMP_NODE) +\r
+ (ALIGN_VALUE (ObjectNameLength, 4)));\r
\r
// Named Component specific data\r
NcNode->Flags = NodeList->Flags;\r
sizeof (EFI_ACPI_6_0_IO_REMAPPING_NAMED_COMP_NODE));\r
Status = AsciiStrCpyS (\r
ObjectName,\r
- ObjectNameLenght,\r
+ ObjectNameLength,\r
NodeList->ObjectName\r
);\r
if (EFI_ERROR (Status)) {\r
EFI_STATUS Status;\r
EFI_ACPI_6_0_IO_REMAPPING_RC_NODE * RcNode;\r
EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE * IdMapArray;\r
+ UINT64 NodeLength;\r
\r
ASSERT (Iort != NULL);\r
\r
NodesStartOffset);\r
\r
while (NodeCount-- != 0) {\r
+ NodeLength = GetRootComplexNodeSize (NodeList);\r
+ if (NodeLength > MAX_UINT16) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: Root Complex Node length 0x%lx > MAX_UINT16."\r
+ " Status = %r\n",\r
+ NodeLength,\r
+ Status\r
+ ));\r
+ return Status;\r
+ }\r
+\r
// Populate the node header\r
RcNode->Node.Type = EFI_ACPI_IORT_TYPE_ROOT_COMPLEX;\r
- RcNode->Node.Length = GetRootComplexNodeSize (NodeList);\r
+ RcNode->Node.Length = (UINT16)NodeLength;\r
RcNode->Node.Revision = 1;\r
RcNode->Node.Reserved = EFI_ACPI_RESERVED_DWORD;\r
RcNode->Node.NumIdMappings = NodeList->IdMappingCount;\r
\r
EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT * ContextInterruptArray;\r
EFI_ACPI_6_0_IO_REMAPPING_SMMU_INT * PmuInterruptArray;\r
+ UINT64 NodeLength;\r
\r
ASSERT (Iort != NULL);\r
\r
NodesStartOffset);\r
\r
while (NodeCount-- != 0) {\r
+ NodeLength = GetSmmuV1V2NodeSize (NodeList);\r
+ if (NodeLength > MAX_UINT16) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: SMMU V1/V2 Node length 0x%lx > MAX_UINT16. Status = %r\n",\r
+ NodeLength,\r
+ Status\r
+ ));\r
+ return Status;\r
+ }\r
+\r
// Populate the node header\r
SmmuNode->Node.Type = EFI_ACPI_IORT_TYPE_SMMUv1v2;\r
- SmmuNode->Node.Length = GetSmmuV1V2NodeSize (NodeList);\r
+ SmmuNode->Node.Length = (UINT16)NodeLength;\r
SmmuNode->Node.Revision = 0;\r
SmmuNode->Node.Reserved = EFI_ACPI_RESERVED_DWORD;\r
SmmuNode->Node.NumIdMappings = NodeList->IdMappingCount;\r
EFI_STATUS Status;\r
EFI_ACPI_6_0_IO_REMAPPING_SMMU3_NODE * SmmuV3Node;\r
EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE * IdMapArray;\r
+ UINT64 NodeLength;\r
\r
ASSERT (Iort != NULL);\r
\r
NodesStartOffset);\r
\r
while (NodeCount-- != 0) {\r
+ NodeLength = GetSmmuV3NodeSize (NodeList);\r
+ if (NodeLength > MAX_UINT16) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: SMMU V3 Node length 0x%lx > MAX_UINT16. Status = %r\n",\r
+ NodeLength,\r
+ Status\r
+ ));\r
+ return Status;\r
+ }\r
+\r
// Populate the node header\r
SmmuV3Node->Node.Type = EFI_ACPI_IORT_TYPE_SMMUv3;\r
- SmmuV3Node->Node.Length = GetSmmuV3NodeSize (NodeList);\r
+ SmmuV3Node->Node.Length = (UINT16)NodeLength;\r
SmmuV3Node->Node.Revision = 2;\r
SmmuV3Node->Node.Reserved = EFI_ACPI_RESERVED_DWORD;\r
SmmuV3Node->Node.NumIdMappings = NodeList->IdMappingCount;\r
EFI_ACPI_6_0_IO_REMAPPING_PMCG_NODE * PmcgNode;\r
EFI_ACPI_6_0_IO_REMAPPING_ID_TABLE * IdMapArray;\r
ACPI_IORT_GENERATOR * Generator;\r
+ UINT64 NodeLength;\r
\r
ASSERT (Iort != NULL);\r
\r
NodesStartOffset);\r
\r
while (NodeCount-- != 0) {\r
+ NodeLength = GetPmcgNodeSize (NodeList);\r
+ if (NodeLength > MAX_UINT16) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: PMCG Node length 0x%lx > MAX_UINT16. Status = %r\n",\r
+ NodeLength,\r
+ Status\r
+ ));\r
+ return Status;\r
+ }\r
+\r
// Populate the node header\r
PmcgNode->Node.Type = EFI_ACPI_IORT_TYPE_PMCG;\r
- PmcgNode->Node.Length = GetPmcgNodeSize (NodeList);\r
+ PmcgNode->Node.Length = (UINT16)NodeLength;\r
PmcgNode->Node.Revision = 1;\r
PmcgNode->Node.Reserved = EFI_ACPI_RESERVED_DWORD;\r
PmcgNode->Node.NumIdMappings = NodeList->IdMappingCount;\r
)\r
{\r
EFI_STATUS Status;\r
- UINT32 TableSize;\r
- UINT32 IortNodeCount;\r
\r
+ UINT64 TableSize;\r
+ UINT64 NodeSize;\r
+\r
+ UINT32 IortNodeCount;\r
UINT32 ItsGroupNodeCount;\r
UINT32 NamedComponentNodeCount;\r
UINT32 RootComplexNodeCount;\r
\r
// ITS Group Nodes\r
if (ItsGroupNodeCount > 0) {\r
- ItsGroupOffset = TableSize;\r
+ ItsGroupOffset = (UINT32)TableSize;\r
// Size of ITS Group node list.\r
- TableSize += GetSizeofItsGroupNodes (\r
- ItsGroupOffset,\r
- ItsGroupNodeList,\r
- ItsGroupNodeCount,\r
- &NodeIndexer\r
- );\r
+ NodeSize = GetSizeofItsGroupNodes (\r
+ ItsGroupOffset,\r
+ ItsGroupNodeList,\r
+ ItsGroupNodeCount,\r
+ &NodeIndexer\r
+ );\r
+ if (NodeSize > MAX_UINT32) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: Invalid Size of Group Nodes. Status = %r\n",\r
+ Status\r
+ ));\r
+ goto error_handler;\r
+ }\r
+ TableSize += NodeSize;\r
}\r
\r
// Named Component Nodes\r
if (NamedComponentNodeCount > 0) {\r
- NamedComponentOffset = TableSize;\r
+ NamedComponentOffset = (UINT32)TableSize;\r
// Size of Named Component node list.\r
- TableSize += GetSizeofNamedComponentNodes (\r
- NamedComponentOffset,\r
- NamedComponentNodeList,\r
- NamedComponentNodeCount,\r
- &NodeIndexer\r
- );\r
+ NodeSize = GetSizeofNamedComponentNodes (\r
+ NamedComponentOffset,\r
+ NamedComponentNodeList,\r
+ NamedComponentNodeCount,\r
+ &NodeIndexer\r
+ );\r
+ if (NodeSize > MAX_UINT32) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: Invalid Size of Named Component Nodes. Status = %r\n",\r
+ Status\r
+ ));\r
+ goto error_handler;\r
+ }\r
+ TableSize += NodeSize;\r
}\r
\r
// Root Complex Nodes\r
if (RootComplexNodeCount > 0) {\r
- RootComplexOffset = TableSize;\r
+ RootComplexOffset = (UINT32)TableSize;\r
// Size of Root Complex node list.\r
- TableSize += GetSizeofRootComplexNodes (\r
- RootComplexOffset,\r
- RootComplexNodeList,\r
- RootComplexNodeCount,\r
- &NodeIndexer\r
- );\r
+ NodeSize = GetSizeofRootComplexNodes (\r
+ RootComplexOffset,\r
+ RootComplexNodeList,\r
+ RootComplexNodeCount,\r
+ &NodeIndexer\r
+ );\r
+ if (NodeSize > MAX_UINT32) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: Invalid Size of Root Complex Nodes. Status = %r\n",\r
+ Status\r
+ ));\r
+ goto error_handler;\r
+ }\r
+ TableSize += NodeSize;\r
}\r
\r
// SMMUv1/SMMUv2 Nodes\r
if (SmmuV1V2NodeCount > 0) {\r
- SmmuV1V2Offset = TableSize;\r
+ SmmuV1V2Offset = (UINT32)TableSize;\r
// Size of SMMUv1/SMMUv2 node list.\r
- TableSize += GetSizeofSmmuV1V2Nodes (\r
- SmmuV1V2Offset,\r
- SmmuV1V2NodeList,\r
- SmmuV1V2NodeCount,\r
- &NodeIndexer\r
- );\r
+ NodeSize = GetSizeofSmmuV1V2Nodes (\r
+ SmmuV1V2Offset,\r
+ SmmuV1V2NodeList,\r
+ SmmuV1V2NodeCount,\r
+ &NodeIndexer\r
+ );\r
+ if (NodeSize > MAX_UINT32) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: Invalid Size of SMMUv1/v2 Nodes. Status = %r\n",\r
+ Status\r
+ ));\r
+ goto error_handler;\r
+ }\r
+ TableSize += NodeSize;\r
}\r
\r
// SMMUv3 Nodes\r
if (SmmuV3NodeCount > 0) {\r
- SmmuV3Offset = TableSize;\r
+ SmmuV3Offset = (UINT32)TableSize;\r
// Size of SMMUv3 node list.\r
- TableSize += GetSizeofSmmuV3Nodes (\r
- SmmuV3Offset,\r
- SmmuV3NodeList,\r
- SmmuV3NodeCount,\r
- &NodeIndexer\r
- );\r
+ NodeSize = GetSizeofSmmuV3Nodes (\r
+ SmmuV3Offset,\r
+ SmmuV3NodeList,\r
+ SmmuV3NodeCount,\r
+ &NodeIndexer\r
+ );\r
+ if (NodeSize > MAX_UINT32) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: Invalid Size of SMMUv3 Nodes. Status = %r\n",\r
+ Status\r
+ ));\r
+ goto error_handler;\r
+ }\r
+ TableSize += NodeSize;\r
}\r
\r
// PMCG Nodes\r
if (PmcgNodeCount > 0) {\r
- PmcgOffset = TableSize;\r
+ PmcgOffset = (UINT32)TableSize;\r
// Size of PMCG node list.\r
- TableSize += GetSizeofPmcgNodes (\r
- PmcgOffset,\r
- PmcgNodeList,\r
- PmcgNodeCount,\r
- &NodeIndexer\r
- );\r
+ NodeSize = GetSizeofPmcgNodes (\r
+ PmcgOffset,\r
+ PmcgNodeList,\r
+ PmcgNodeCount,\r
+ &NodeIndexer\r
+ );\r
+ if (NodeSize > MAX_UINT32) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: Invalid Size of PMCG Nodes. Status = %r\n",\r
+ Status\r
+ ));\r
+ goto error_handler;\r
+ }\r
+ TableSize += NodeSize;\r
}\r
\r
DEBUG ((\r
DEBUG_INFO,\r
"INFO: IORT:\n" \\r
" IortNodeCount = %d\n" \\r
- " TableSize = %d\n",\r
+ " TableSize = 0x%lx\n",\r
IortNodeCount,\r
TableSize\r
));\r
PmcgOffset\r
));\r
\r
+ if (TableSize > MAX_UINT32) {\r
+ Status = EFI_INVALID_PARAMETER;\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "ERROR: IORT: IORT Table Size 0x%lx > MAX_UINT32," \\r
+ " Status = %r\n",\r
+ TableSize,\r
+ Status\r
+ ));\r
+ goto error_handler;\r
+ }\r
+\r
// Allocate the Buffer for IORT table\r
*Table = (EFI_ACPI_DESCRIPTION_HEADER*)AllocateZeroPool (TableSize);\r
if (*Table == NULL) {\r
\r
DEBUG ((\r
DEBUG_INFO,\r
- "IORT: Iort = 0x%p TableSize = 0x%x\n",\r
+ "IORT: Iort = 0x%p TableSize = 0x%lx\n",\r
Iort,\r
TableSize\r
));\r
This,\r
&Iort->Header,\r
AcpiTableInfo,\r
- TableSize\r
+ (UINT32)TableSize\r
);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((\r