mirror of https://github.com/acidanthera/audk.git
DynamicTablesPkg: Set EndTag's Checksum if RdList is modified
ACPI 6.4, s6.4.2.9 "End Tag": "This checksum is generated such that adding it to the sum of all the data bytes will produce a zero sum." "If the checksum field is zero, the resource data is treated as if the checksum operation succeeded. Configuration proceeds normally." To avoid re-computing checksums, if a new resource data elements is added/removed/modified in a list of resource data elements, the AmlLib resets the checksum to 0. This patch also refactors the AmlAppendRdNode() function by getting the last Resource Data node directly instead of iterating over all the elements of the list of Resource Data node. Reviewed-by: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
This commit is contained in:
parent
74addfeab6
commit
7b2022d39e
|
@ -513,6 +513,13 @@ AmlUpdateDataNode (
|
||||||
ASSERT (0);
|
ASSERT (0);
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Status = AmlSetRdListCheckSum (ParentNode, 0);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ASSERT (0);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EAmlNodeDataTypeFieldPkgLen:
|
case EAmlNodeDataTypeFieldPkgLen:
|
||||||
|
|
|
@ -566,8 +566,7 @@ AmlAppendRdNode (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
AML_DATA_NODE * CurrRdNode;
|
AML_DATA_NODE * LastRdNode;
|
||||||
AML_RD_HEADER RdDataType;
|
|
||||||
|
|
||||||
if (!AmlNodeCompareOpCode (BufferOpNode, AML_BUFFER_OP, 0) ||
|
if (!AmlNodeCompareOpCode (BufferOpNode, AML_BUFFER_OP, 0) ||
|
||||||
!IS_AML_DATA_NODE (NewRdNode) ||
|
!IS_AML_DATA_NODE (NewRdNode) ||
|
||||||
|
@ -576,56 +575,39 @@ AmlAppendRdNode (
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the first Resource data node in the variable list of
|
// To avoid re-computing checksums, if a new resource data elements is
|
||||||
// argument of the BufferOp node.
|
// added/removed/modified in a list of resource data elements, the AmlLib
|
||||||
CurrRdNode = (AML_DATA_NODE*)AmlGetNextVariableArgument (
|
// resets the checksum to 0.
|
||||||
|
// It is possible to have only one Resource Data in a BufferOp with
|
||||||
|
// no EndTag, but it should not be possible to add a new Resource Data
|
||||||
|
// in the list in this case.
|
||||||
|
Status = AmlSetRdListCheckSum (BufferOpNode, 0);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
ASSERT (0);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the last Resource data node in the variable list of argument of the
|
||||||
|
// BufferOp node. This must be an EndTag, otherwise setting the checksum
|
||||||
|
// would have failed.
|
||||||
|
LastRdNode = (AML_DATA_NODE*)AmlGetPreviousVariableArgument (
|
||||||
(AML_NODE_HEADER*)BufferOpNode,
|
(AML_NODE_HEADER*)BufferOpNode,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if ((CurrRdNode == NULL) ||
|
if ((LastRdNode == NULL) ||
|
||||||
!IS_AML_DATA_NODE (CurrRdNode) ||
|
!IS_AML_DATA_NODE (LastRdNode) ||
|
||||||
(CurrRdNode->DataType != EAmlNodeDataTypeResourceData)) {
|
(LastRdNode->DataType != EAmlNodeDataTypeResourceData)) {
|
||||||
ASSERT (0);
|
ASSERT (0);
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterate through the Resource Data nodes to find the End Tag.
|
// Add NewRdNode before the EndTag.
|
||||||
while (TRUE) {
|
Status = AmlVarListAddBefore (
|
||||||
Status = AmlGetResourceDataType (CurrRdNode, &RdDataType);
|
(AML_NODE_HEADER*)LastRdNode,
|
||||||
if (EFI_ERROR (Status)) {
|
(AML_NODE_HEADER*)NewRdNode)
|
||||||
ASSERT (0);
|
;
|
||||||
return Status;
|
ASSERT_EFI_ERROR (Status);
|
||||||
}
|
return Status;
|
||||||
|
|
||||||
// If the Resource Data is an End Tag,
|
|
||||||
// add the new node before and return.
|
|
||||||
if (AmlRdCompareDescId (
|
|
||||||
&RdDataType,
|
|
||||||
AML_RD_BUILD_SMALL_DESC_ID (ACPI_SMALL_END_TAG_DESCRIPTOR_NAME))) {
|
|
||||||
Status = AmlVarListAddBefore (
|
|
||||||
(AML_NODE_HEADER*)CurrRdNode,
|
|
||||||
(AML_NODE_HEADER*)NewRdNode)
|
|
||||||
;
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
ASSERT (0);
|
|
||||||
}
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the next Resource Data node.
|
|
||||||
// If this was the last node and no End Tag was found, return error.
|
|
||||||
// It is possible to have only one Resource Data in a BufferOp,
|
|
||||||
// but it should not be possible to add a new Resource Data in the list
|
|
||||||
// in this case.
|
|
||||||
CurrRdNode = (AML_DATA_NODE*)AmlGetSiblingVariableArgument (
|
|
||||||
(AML_NODE_HEADER*)CurrRdNode
|
|
||||||
);
|
|
||||||
if (!IS_AML_DATA_NODE (CurrRdNode) ||
|
|
||||||
(CurrRdNode->DataType != EAmlNodeDataTypeResourceData)) {
|
|
||||||
ASSERT (0);
|
|
||||||
return EFI_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
} // while
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Replace the fixed argument at the Index of the ParentNode with the NewNode.
|
/** Replace the fixed argument at the Index of the ParentNode with the NewNode.
|
||||||
|
|
Loading…
Reference in New Issue