mirror of https://github.com/acidanthera/audk.git
189 lines
6.9 KiB
C
189 lines
6.9 KiB
C
/** @file
|
|
AML Method Parser.
|
|
|
|
Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
**/
|
|
|
|
#ifndef AML_METHOD_PARSER_H_
|
|
#define AML_METHOD_PARSER_H_
|
|
|
|
#include <AmlNodeDefines.h>
|
|
#include <Stream/AmlStream.h>
|
|
|
|
/** AML namespace reference node.
|
|
|
|
Namespace reference nodes allow to associate an AML absolute pathname
|
|
to the tree node defining this object in the namespace.
|
|
|
|
Namespace reference nodes are stored in a separate list. They are not part of
|
|
the tree.
|
|
*/
|
|
typedef struct AmlNameSpaceRefNode {
|
|
/// Double linked list.
|
|
/// This must be the first field in this structure.
|
|
LIST_ENTRY Link;
|
|
|
|
/// Node part of the AML namespace. It must have the AML_IN_NAMESPACE
|
|
/// attribute.
|
|
CONST AML_OBJECT_NODE *NodeRef;
|
|
|
|
/// Raw AML absolute pathname of the NodeRef.
|
|
/// This is a raw AML NameString (cf AmlNameSpace.c: A concatenated list
|
|
/// of 4 chars long names. The dual/multi NameString prefix have been
|
|
/// stripped.).
|
|
CONST CHAR8 *RawAbsolutePath;
|
|
|
|
/// Size of the raw AML absolute pathname buffer.
|
|
UINT32 RawAbsolutePathSize;
|
|
} AML_NAMESPACE_REF_NODE;
|
|
|
|
/** Delete a list of namespace reference nodes.
|
|
|
|
@param [in] NameSpaceRefList List of namespace reference nodes.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AmlDeleteNameSpaceRefList (
|
|
IN LIST_ENTRY *NameSpaceRefList
|
|
);
|
|
|
|
#if !defined (MDEPKG_NDEBUG)
|
|
|
|
/** Print the list of raw absolute paths of the NameSpace reference list.
|
|
|
|
@param [in] NameSpaceRefList List of NameSpace reference nodes.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AmlDbgPrintNameSpaceRefList (
|
|
IN CONST LIST_ENTRY *NameSpaceRefList
|
|
);
|
|
|
|
#endif // MDEPKG_NDEBUG
|
|
|
|
/** Check whether a pathname is a method invocation.
|
|
|
|
If there is a matching method definition, returns the corresponding
|
|
NameSpaceRef node.
|
|
|
|
To do so, the NameSpaceRefList is keeping track of every namespace node
|
|
and its raw AML absolute path.
|
|
To check whether a pathname is a method invocation, a corresponding raw
|
|
absolute pathname is built. This raw absolute pathname is then compared
|
|
to the list of available pathnames. If a pathname defining a method
|
|
matches the scope of the input pathname, return.
|
|
|
|
@param [in] ParentNode Parent node. Node to which the node to be
|
|
created will be attached.
|
|
@param [in] FStream Forward stream pointing to the NameString
|
|
to find.
|
|
@param [in] NameSpaceRefList List of NameSpaceRef nodes.
|
|
@param [out] OutNameSpaceRefNode If the NameString pointed by FStream is
|
|
a method invocation, OutNameSpaceRefNode
|
|
contains the NameSpaceRef corresponding
|
|
to the method definition.
|
|
NULL otherwise.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AmlIsMethodInvocation (
|
|
IN CONST AML_NODE_HEADER *ParentNode,
|
|
IN CONST AML_STREAM *FStream,
|
|
IN CONST LIST_ENTRY *NameSpaceRefList,
|
|
OUT AML_NAMESPACE_REF_NODE **OutNameSpaceRefNode
|
|
);
|
|
|
|
/** Create a namespace reference node and add it to the NameSpaceRefList.
|
|
|
|
When a namespace node is encountered, the namespace it defines must be
|
|
associated to the node. This allow to keep track of the nature of each
|
|
name present in the AML namespace.
|
|
|
|
In the end, this allows to recognize method invocations and parse the right
|
|
number of arguments after the method name.
|
|
|
|
@param [in] Node Namespace node.
|
|
@param [in, out] NameSpaceRefList List of namespace reference nodes.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AmlAddNameSpaceReference (
|
|
IN CONST AML_OBJECT_NODE *Node,
|
|
IN OUT LIST_ENTRY *NameSpaceRefList
|
|
);
|
|
|
|
/** Create a method invocation node.
|
|
|
|
The AML grammar does not attribute an OpCode/SubOpCode couple for
|
|
method invocations. This library is representing method invocations
|
|
as if they had one.
|
|
|
|
The AML encoding for method invocations in the ACPI specification 6.3 is:
|
|
MethodInvocation := NameString TermArgList
|
|
In this library, it is:
|
|
MethodInvocation := MethodInvocationOp NameString ArgumentCount TermArgList
|
|
ArgumentCount := ByteData
|
|
|
|
When computing the size of a tree or serializing it, the additional data is
|
|
not taken into account (i.e. the MethodInvocationOp and the ArgumentCount).
|
|
|
|
Method invocation nodes have the AML_METHOD_INVOVATION attribute.
|
|
|
|
@param [in] NameSpaceRefNode NameSpaceRef node pointing to the
|
|
the definition of the invoked
|
|
method.
|
|
@param [in] MethodInvocationName Data node containing the method
|
|
invocation name.
|
|
@param [out] MethodInvocationNodePtr Created method invocation node.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
@retval EFI_OUT_OF_RESOURCES Could not allocate memory.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AmlCreateMethodInvocationNode (
|
|
IN CONST AML_NAMESPACE_REF_NODE *NameSpaceRefNode,
|
|
IN AML_DATA_NODE *MethodInvocationName,
|
|
OUT AML_OBJECT_NODE **MethodInvocationNodePtr
|
|
);
|
|
|
|
/** Get the number of arguments of a method invocation node.
|
|
|
|
This function also allow to identify whether a node is a method invocation
|
|
node. If the input node is not a method invocation node, just return.
|
|
|
|
@param [in] MethodInvocationNode Method invocation node.
|
|
@param [out] IsMethodInvocation Boolean stating whether the input
|
|
node is a method invocation.
|
|
@param [out] ArgCount Number of arguments of the method
|
|
invocation.
|
|
Set to 0 if MethodInvocationNode
|
|
is not a method invocation.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_BUFFER_TOO_SMALL No space left in the buffer.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
@retval EFI_OUT_OF_RESOURCES Could not allocate memory.
|
|
*/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AmlGetMethodInvocationArgCount (
|
|
IN CONST AML_OBJECT_NODE *MethodInvocationNode,
|
|
OUT BOOLEAN *IsMethodInvocation,
|
|
OUT UINT8 *ArgCount
|
|
);
|
|
|
|
#endif // AML_METHOD_PARSER_H_
|