[edk2-devel] [PATCH v2 16/21] DynamicTablesPkg: AML code generation to Return a NameString

PierreGondois posted 21 patches 4 years, 4 months ago
There is a newer version of this series
[edk2-devel] [PATCH v2 16/21] DynamicTablesPkg: AML code generation to Return a NameString
Posted by PierreGondois 4 years, 4 months ago
From: Pierre Gondois <Pierre.Gondois@arm.com>

Add AmlCodeGenReturnNameString() to generate AML code for a
Return object node, returning the object as a NameString.

AmlCodeGenReturn ("NAM1", ParentNode, NewObjectNode) is
equivalent of the following ASL code:
  Return(NAM1)

Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
---
 .../Common/AmlLib/CodeGen/AmlCodeGen.c        | 181 ++++++++++++++++++
 1 file changed, 181 insertions(+)

diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
index dd519bc67007..93d4ba79e937 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
+++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
@@ -1154,3 +1154,184 @@ error_handler1:
   }
   return Status;
 }
+
+/** AML code generation for a Return object node.
+
+  AmlCodeGenReturn (ReturnNode, ParentNode, NewObjectNode) is
+  equivalent of the following ASL code:
+    Return([Content of the ReturnNode])
+
+  The ACPI 6.3 specification, s20.2.5.3 "Type 1 Opcodes Encoding" states:
+    DefReturn := ReturnOp ArgObject
+    ReturnOp := 0xA4
+    ArgObject := TermArg => DataRefObject
+
+  Thus, the ReturnNode must be evaluated as a DataRefObject. It can
+  be a NameString referencing an object. As this CodeGen Api doesn't
+  do semantic checking, it is strongly advised to check the AML bytecode
+  generated by this function against an ASL compiler.
+
+  The ReturnNode must be generated inside a Method body scope.
+
+  @param [in]  ReturnNode     The object returned by the Return ASL statement.
+                              This node is deleted if an error occurs.
+  @param [in]  ParentNode     If provided, set ParentNode as the parent
+                              of the node created.
+                              Must be a MethodOp node.
+  @param [out] NewObjectNode  If success, contains the created node.
+
+  @retval EFI_SUCCESS             Success.
+  @retval EFI_INVALID_PARAMETER   Invalid parameter.
+  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+AmlCodeGenReturn (
+  IN  AML_NODE_HEADER     * ReturnNode,
+  IN  AML_NODE_HEADER     * ParentNode,     OPTIONAL
+  OUT AML_OBJECT_NODE    ** NewObjectNode   OPTIONAL
+  )
+{
+  EFI_STATUS        Status;
+  AML_OBJECT_NODE * ObjectNode;
+
+  if ((ReturnNode == NULL)                              ||
+      ((ParentNode == NULL) && (NewObjectNode == NULL)) ||
+      ((ParentNode != NULL) &&
+        !AmlNodeCompareOpCode (
+            (AML_OBJECT_NODE*)ParentNode, AML_METHOD_OP, 0))) {
+    ASSERT (0);
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = AmlCreateObjectNode (
+             AmlGetByteEncodingByOpCode (AML_RETURN_OP, 0),
+             0,
+             &ObjectNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    goto error_handler;
+  }
+
+  Status = AmlSetFixedArgument (
+             ObjectNode,
+             EAmlParseIndexTerm0,
+             (AML_NODE_HEADER*)ReturnNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    goto error_handler;
+  }
+
+  ReturnNode = NULL;
+
+  Status = LinkNode (
+             ObjectNode,
+             ParentNode,
+             NewObjectNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    goto error_handler;
+  }
+
+  return Status;
+
+error_handler:
+  if (ReturnNode != NULL) {
+    AmlDeleteTree (ReturnNode);
+  }
+  if (ObjectNode != NULL) {
+    AmlDeleteTree ((AML_NODE_HEADER*)ObjectNode);
+  }
+  return Status;
+}
+
+/** AML code generation for a Return object node,
+    returning the object as an input NameString.
+
+  AmlCodeGenReturn ("NAM1", ParentNode, NewObjectNode) is
+  equivalent of the following ASL code:
+    Return(NAM1)
+
+  The ACPI 6.3 specification, s20.2.5.3 "Type 1 Opcodes Encoding" states:
+    DefReturn := ReturnOp ArgObject
+    ReturnOp := 0xA4
+    ArgObject := TermArg => DataRefObject
+
+  Thus, the ReturnNode must be evaluated as a DataRefObject. It can
+  be a NameString referencing an object. As this CodeGen Api doesn't
+  do semantic checking, it is strongly advised to check the AML bytecode
+  generated by this function against an ASL compiler.
+
+  The ReturnNode must be generated inside a Method body scope.
+
+  @param [in]  NameString     The object referenced by this NameString
+                              is returned by the Return ASL statement.
+                              Must be a NULL-terminated ASL NameString
+                              e.g.: "NAM1", "_SB.NAM1", etc.
+                              The input string is copied.
+  @param [in]  ParentNode     If provided, set ParentNode as the parent
+                              of the node created.
+                              Must be a MethodOp node.
+  @param [out] NewObjectNode  If success, contains the created node.
+
+  @retval EFI_SUCCESS             Success.
+  @retval EFI_INVALID_PARAMETER   Invalid parameter.
+  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
+**/
+STATIC
+EFI_STATUS
+EFIAPI
+AmlCodeGenReturnNameString (
+  IN  CONST CHAR8               * NameString,
+  IN        AML_NODE_HEADER     * ParentNode,     OPTIONAL
+  OUT       AML_OBJECT_NODE    ** NewObjectNode   OPTIONAL
+  )
+{
+  EFI_STATUS          Status;
+  AML_DATA_NODE     * DataNode;
+  CHAR8             * AmlNameString;
+  UINT32              AmlNameStringSize;
+
+  DataNode = NULL;
+
+  Status = ConvertAslNameToAmlName (NameString, &AmlNameString);
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    return Status;
+  }
+
+  Status = AmlGetNameStringSize (AmlNameString, &AmlNameStringSize);
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    goto exit_handler;
+  }
+
+  Status = AmlCreateDataNode (
+             EAmlNodeDataTypeNameString,
+             (UINT8*)AmlNameString,
+             AmlNameStringSize,
+             &DataNode
+             );
+  if (EFI_ERROR (Status)) {
+    ASSERT (0);
+    goto exit_handler;
+  }
+
+  // AmlCodeGenReturn() deletes DataNode if error.
+  Status = AmlCodeGenReturn (
+             (AML_NODE_HEADER*)DataNode,
+             ParentNode,
+             NewObjectNode
+             );
+  ASSERT_EFI_ERROR (Status);
+
+exit_handler:
+  if (AmlNameString != NULL) {
+    FreePool (AmlNameString);
+  }
+  return Status;
+}
-- 
2.17.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#81597): https://edk2.groups.io/g/devel/message/81597
Mute This Topic: https://groups.io/mt/86148211/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [PATCH v2 16/21] DynamicTablesPkg: AML code generation to Return a NameString
Posted by Sami Mujawar 4 years, 4 months ago
Hi Pierre,

Thanks you for this patch.

Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>

Regards,

Sami Mujawar

On 07/10/2021 04:32 PM, Pierre.Gondois@arm.com wrote:
> From: Pierre Gondois <Pierre.Gondois@arm.com>
>
> Add AmlCodeGenReturnNameString() to generate AML code for a
> Return object node, returning the object as a NameString.
>
> AmlCodeGenReturn ("NAM1", ParentNode, NewObjectNode) is
> equivalent of the following ASL code:
>    Return(NAM1)
>
> Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
> ---
>   .../Common/AmlLib/CodeGen/AmlCodeGen.c        | 181 ++++++++++++++++++
>   1 file changed, 181 insertions(+)
>
> diff --git a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> index dd519bc67007..93d4ba79e937 100644
> --- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> +++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
> @@ -1154,3 +1154,184 @@ error_handler1:
>     }
>     return Status;
>   }
> +
> +/** AML code generation for a Return object node.
> +
> +  AmlCodeGenReturn (ReturnNode, ParentNode, NewObjectNode) is
> +  equivalent of the following ASL code:
> +    Return([Content of the ReturnNode])
> +
> +  The ACPI 6.3 specification, s20.2.5.3 "Type 1 Opcodes Encoding" states:
> +    DefReturn := ReturnOp ArgObject
> +    ReturnOp := 0xA4
> +    ArgObject := TermArg => DataRefObject
> +
> +  Thus, the ReturnNode must be evaluated as a DataRefObject. It can
> +  be a NameString referencing an object. As this CodeGen Api doesn't
> +  do semantic checking, it is strongly advised to check the AML bytecode
> +  generated by this function against an ASL compiler.
> +
> +  The ReturnNode must be generated inside a Method body scope.
> +
> +  @param [in]  ReturnNode     The object returned by the Return ASL statement.
> +                              This node is deleted if an error occurs.
> +  @param [in]  ParentNode     If provided, set ParentNode as the parent
> +                              of the node created.
> +                              Must be a MethodOp node.
> +  @param [out] NewObjectNode  If success, contains the created node.
> +
> +  @retval EFI_SUCCESS             Success.
> +  @retval EFI_INVALID_PARAMETER   Invalid parameter.
> +  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +AmlCodeGenReturn (
> +  IN  AML_NODE_HEADER     * ReturnNode,
> +  IN  AML_NODE_HEADER     * ParentNode,     OPTIONAL
> +  OUT AML_OBJECT_NODE    ** NewObjectNode   OPTIONAL
> +  )
> +{
> +  EFI_STATUS        Status;
> +  AML_OBJECT_NODE * ObjectNode;
> +
> +  if ((ReturnNode == NULL)                              ||
> +      ((ParentNode == NULL) && (NewObjectNode == NULL)) ||
> +      ((ParentNode != NULL) &&
> +        !AmlNodeCompareOpCode (
> +            (AML_OBJECT_NODE*)ParentNode, AML_METHOD_OP, 0))) {
> +    ASSERT (0);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Status = AmlCreateObjectNode (
> +             AmlGetByteEncodingByOpCode (AML_RETURN_OP, 0),
> +             0,
> +             &ObjectNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  Status = AmlSetFixedArgument (
> +             ObjectNode,
> +             EAmlParseIndexTerm0,
> +             (AML_NODE_HEADER*)ReturnNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  ReturnNode = NULL;
> +
> +  Status = LinkNode (
> +             ObjectNode,
> +             ParentNode,
> +             NewObjectNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto error_handler;
> +  }
> +
> +  return Status;
> +
> +error_handler:
> +  if (ReturnNode != NULL) {
> +    AmlDeleteTree (ReturnNode);
> +  }
> +  if (ObjectNode != NULL) {
> +    AmlDeleteTree ((AML_NODE_HEADER*)ObjectNode);
> +  }
> +  return Status;
> +}
> +
> +/** AML code generation for a Return object node,
> +    returning the object as an input NameString.
> +
> +  AmlCodeGenReturn ("NAM1", ParentNode, NewObjectNode) is
> +  equivalent of the following ASL code:
> +    Return(NAM1)
> +
> +  The ACPI 6.3 specification, s20.2.5.3 "Type 1 Opcodes Encoding" states:
> +    DefReturn := ReturnOp ArgObject
> +    ReturnOp := 0xA4
> +    ArgObject := TermArg => DataRefObject
> +
> +  Thus, the ReturnNode must be evaluated as a DataRefObject. It can
> +  be a NameString referencing an object. As this CodeGen Api doesn't
> +  do semantic checking, it is strongly advised to check the AML bytecode
> +  generated by this function against an ASL compiler.
> +
> +  The ReturnNode must be generated inside a Method body scope.
> +
> +  @param [in]  NameString     The object referenced by this NameString
> +                              is returned by the Return ASL statement.
> +                              Must be a NULL-terminated ASL NameString
> +                              e.g.: "NAM1", "_SB.NAM1", etc.
> +                              The input string is copied.
> +  @param [in]  ParentNode     If provided, set ParentNode as the parent
> +                              of the node created.
> +                              Must be a MethodOp node.
> +  @param [out] NewObjectNode  If success, contains the created node.
> +
> +  @retval EFI_SUCCESS             Success.
> +  @retval EFI_INVALID_PARAMETER   Invalid parameter.
> +  @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +AmlCodeGenReturnNameString (
> +  IN  CONST CHAR8               * NameString,
> +  IN        AML_NODE_HEADER     * ParentNode,     OPTIONAL
> +  OUT       AML_OBJECT_NODE    ** NewObjectNode   OPTIONAL
> +  )
> +{
> +  EFI_STATUS          Status;
> +  AML_DATA_NODE     * DataNode;
> +  CHAR8             * AmlNameString;
> +  UINT32              AmlNameStringSize;
> +
> +  DataNode = NULL;
> +
> +  Status = ConvertAslNameToAmlName (NameString, &AmlNameString);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    return Status;
> +  }
> +
> +  Status = AmlGetNameStringSize (AmlNameString, &AmlNameStringSize);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto exit_handler;
> +  }
> +
> +  Status = AmlCreateDataNode (
> +             EAmlNodeDataTypeNameString,
> +             (UINT8*)AmlNameString,
> +             AmlNameStringSize,
> +             &DataNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);
> +    goto exit_handler;
> +  }
> +
> +  // AmlCodeGenReturn() deletes DataNode if error.
> +  Status = AmlCodeGenReturn (
> +             (AML_NODE_HEADER*)DataNode,
> +             ParentNode,
> +             NewObjectNode
> +             );
> +  ASSERT_EFI_ERROR (Status);
> +
> +exit_handler:
> +  if (AmlNameString != NULL) {
> +    FreePool (AmlNameString);
> +  }
> +  return Status;
> +}

IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#81670): https://edk2.groups.io/g/devel/message/81670
Mute This Topic: https://groups.io/mt/86148211/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-