mirror of https://github.com/acidanthera/audk.git
402 lines
12 KiB
C
402 lines
12 KiB
C
/** @file
|
|
AML String.
|
|
|
|
Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved. <BR>
|
|
Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
**/
|
|
|
|
#ifndef AML_STRING_H_
|
|
#define AML_STRING_H_
|
|
|
|
/* This header file does not include internal Node definition,
|
|
i.e. AML_ROOT_NODE, AML_OBJECT_NODE, etc. The node definitions
|
|
must be included by the caller file. The function prototypes must
|
|
only expose AML_NODE_HANDLE, AML_ROOT_NODE_HANDLE, etc. node
|
|
definitions.
|
|
This allows to keep the functions defined here both internal and
|
|
potentially external. If necessary, any function of this file can
|
|
be exposed externally.
|
|
The Api folder is internal to the AmlLib, but should only use these
|
|
functions. They provide a "safe" way to interact with the AmlLib.
|
|
*/
|
|
|
|
#include <AmlInclude.h>
|
|
|
|
/** Check NameString/path information is valid.
|
|
|
|
Root, ParentPrefix and SegCount cannot be 0 at the same time.
|
|
This function works for ASL and AML name strings.
|
|
|
|
@param [in] Root Number of root char.
|
|
Must be 0 or 1.
|
|
@param [in] ParentPrefix Number of carets char ('^').
|
|
Must be [0-255].
|
|
@param [in] SegCount Number of NameSeg (s).
|
|
Must be [0-255].
|
|
|
|
@retval TRUE id the input information is in the right boundaries.
|
|
FALSE otherwise.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AmlIsNameString (
|
|
IN UINT32 Root,
|
|
IN UINT32 ParentPrefix,
|
|
IN UINT32 SegCount
|
|
);
|
|
|
|
/** Copy bytes from SrcBuffer to DstBuffer and convert to upper case.
|
|
Don't copy more than MaxDstBufferSize bytes.
|
|
|
|
@param [out] DstBuffer Destination buffer.
|
|
@param [in] MaxDstBufferSize Maximum size of DstBuffer.
|
|
Must be non-zero.
|
|
@param [in] SrcBuffer Source buffer.
|
|
@param [in] Count Count of bytes to copy from SrcBuffer.
|
|
Return success if 0.
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AmlUpperCaseMemCpyS (
|
|
OUT CHAR8 *DstBuffer,
|
|
IN UINT32 MaxDstBufferSize,
|
|
IN CONST CHAR8 *SrcBuffer,
|
|
IN UINT32 Count
|
|
);
|
|
|
|
/** Check whether Buffer is a root path ('\').
|
|
|
|
This function works for both ASL and AML pathnames.
|
|
Buffer must be at least 2 bytes long.
|
|
|
|
@param [in] Buffer An ASL/AML path.
|
|
|
|
@retval TRUE Buffer is a root path
|
|
@retval FALSE Buffer is not a root path.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AmlIsRootPath (
|
|
IN CONST CHAR8 *Buffer
|
|
);
|
|
|
|
/** Check whether Ch is an ASL/AML LeadName.
|
|
|
|
This function works for both ASL and AML pathnames.
|
|
|
|
ACPI 6.3 specification, s19.2.2. "ASL Name and Pathname Terms":
|
|
LeadNameChar := 'A'-'Z' | 'a'-'z' | '_'
|
|
|
|
ACPI 6.3 specification, s20.2.2. "Name Objects Encoding":
|
|
LeadNameChar := 'A'-'Z' | 'a'-'z' | '_'
|
|
|
|
@param [in] Ch The char to test.
|
|
|
|
@retval TRUE Ch is an ASL/AML LeadName.
|
|
@retval FALSE Ch is not an ASL/AML LeadName.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AmlIsLeadNameChar (
|
|
IN CHAR8 Ch
|
|
);
|
|
|
|
/** Check whether Ch is an ASL/AML NameChar.
|
|
|
|
This function works for both ASL and AML pathnames.
|
|
|
|
ACPI 6.3 specification, s19.2.2. "ASL Name and Pathname Terms":
|
|
NameChar := DigitChar | LeadNameChar
|
|
LeadNameChar := 'A'-'Z' | 'a'-'z' | '_'
|
|
DigitChar := '0'-'9'
|
|
|
|
ACPI 6.3 specification, s20.2.2. "Name Objects Encoding":
|
|
NameChar := DigitChar | LeadNameChar
|
|
LeadNameChar := 'A'-'Z' | 'a'-'z' | '_'
|
|
DigitChar := '0'-'9'
|
|
|
|
@param [in] Ch The char to test.
|
|
|
|
@retval TRUE Ch is an ASL/AML NameChar.
|
|
@retval FALSE Ch is not an ASL/AML NameChar.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AmlIsNameChar (
|
|
IN CHAR8 Ch
|
|
);
|
|
|
|
/** Check whether AslBuffer is an ASL NameSeg.
|
|
|
|
This function only works for ASL NameStrings/pathnames.
|
|
ASL NameStrings/pathnames are at most 4 chars long.
|
|
|
|
@param [in] AslBuffer Pointer in an ASL NameString/pathname.
|
|
@param [out] Size Size of the NameSeg.
|
|
|
|
@retval TRUE AslBuffer is an ASL NameSeg.
|
|
@retval FALSE AslBuffer is not an ASL NameSeg.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AslIsNameSeg (
|
|
IN CONST CHAR8 *AslBuffer,
|
|
OUT UINT32 *Size
|
|
);
|
|
|
|
/** Check whether AmlBuffer is an AML NameSeg.
|
|
|
|
This function only works for AML NameStrings/pathnames.
|
|
AML NameStrings/pathnames must be 4 chars long.
|
|
|
|
@param [in] AmlBuffer Pointer in an AML NameString/pathname.
|
|
|
|
@retval TRUE AmlBuffer is an AML NameSeg.
|
|
@retval FALSE AmlBuffer is not an AML NameSeg.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AmlIsNameSeg (
|
|
IN CONST CHAR8 *AmlBuffer
|
|
);
|
|
|
|
/** Parse an ASL NameString/path.
|
|
|
|
An ASL NameString/path must be NULL terminated.
|
|
Information found in the ASL NameString/path is returned via pointers:
|
|
Root, ParentPrefix, SegCount.
|
|
|
|
@param [in] Buffer ASL NameString/path.
|
|
@param [out] Root Pointer holding the number of root char.
|
|
Can be 0 or 1.
|
|
@param [out] ParentPrefix Pointer holding the number of carets char ('^').
|
|
Can be [0-255].
|
|
@param [out] SegCount Pointer holding the number of NameSeg (s).
|
|
Can be [0-255].
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AslParseNameStringInfo (
|
|
IN CONST CHAR8 *Buffer,
|
|
OUT UINT32 *Root,
|
|
OUT UINT32 *ParentPrefix,
|
|
OUT UINT32 *SegCount
|
|
);
|
|
|
|
/** Parse an AML NameString/path.
|
|
|
|
It is possible to determine the size of an AML NameString/path just
|
|
by sight reading it. So no overflow can occur.
|
|
Information found in the AML NameString/path is returned via pointers:
|
|
Root, ParentPrefix, SegCount.
|
|
|
|
@param [in] Buffer AML NameString/path.
|
|
@param [out] Root Pointer holding the number of root char.
|
|
Can be 0 or 1.
|
|
@param [out] ParentPrefix Pointer holding the number of carets char ('^').
|
|
Can be [0-255].
|
|
@param [out] SegCount Pointer holding the number of NameSeg(s).
|
|
Can be [0-255].
|
|
|
|
@retval EFI_SUCCESS The function completed successfully.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AmlParseNameStringInfo (
|
|
IN CONST CHAR8 *Buffer,
|
|
OUT UINT32 *Root,
|
|
OUT UINT32 *ParentPrefix,
|
|
OUT UINT32 *SegCount
|
|
);
|
|
|
|
/** Compute the ASL NameString/path size from NameString
|
|
information (Root, ParentPrefix, SegCount).
|
|
|
|
@param [in] Root Number of root char.
|
|
Can be 0 or 1.
|
|
@param [in] ParentPrefix Number of carets char ('^').
|
|
Can be [0-255].
|
|
@param [in] SegCount Pointer holding the number of NameSeg(s).
|
|
Can be [0-255].
|
|
|
|
@return Size of the ASL NameString/path.
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AslComputeNameStringSize (
|
|
IN UINT32 Root,
|
|
IN UINT32 ParentPrefix,
|
|
IN UINT32 SegCount
|
|
);
|
|
|
|
/** Compute the AML NameString/path size from NameString
|
|
information (Root, ParentPrefix, SegCount).
|
|
|
|
@param [in] Root Number of root char.
|
|
Can be 0 or 1.
|
|
@param [in] ParentPrefix Number of carets char ('^').
|
|
Can be [0-255].
|
|
@param [in] SegCount Pointer holding the number of NameSeg(s).
|
|
Can be [0-255].
|
|
|
|
@return Size of the AML NameString/path.
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AmlComputeNameStringSize (
|
|
IN UINT32 Root,
|
|
IN UINT32 ParentPrefix,
|
|
IN UINT32 SegCount
|
|
);
|
|
|
|
/** Get the ASL NameString/path size.
|
|
|
|
@param [in] AslPath An ASL NameString/path.
|
|
@param [out] AslPathSizePtr Pointer holding the ASL NameString/path size.
|
|
|
|
@retval EFI_SUCCESS Success.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AslGetNameStringSize (
|
|
IN CONST CHAR8 *AslPath,
|
|
OUT UINT32 *AslPathSizePtr
|
|
);
|
|
|
|
/** Get the AML NameString/path size.
|
|
|
|
@param [in] AmlPath An AML NameString/path.
|
|
@param [out] AmlPathSizePtr Pointer holding the AML NameString/path size.
|
|
|
|
@retval EFI_SUCCESS Success.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
AmlGetNameStringSize (
|
|
IN CONST CHAR8 *AmlPath,
|
|
OUT UINT32 *AmlPathSizePtr
|
|
);
|
|
|
|
/** Convert an ASL NameString/path to an AML NameString/path.
|
|
The caller must free the memory allocated in this function
|
|
for AmlPath using FreePool ().
|
|
|
|
@param [in] AslPath An ASL NameString/path.
|
|
@param [out] OutAmlPath Buffer containing the AML path.
|
|
|
|
@retval EFI_SUCCESS Success.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
ConvertAslNameToAmlName (
|
|
IN CONST CHAR8 *AslPath,
|
|
OUT CHAR8 **OutAmlPath
|
|
);
|
|
|
|
/** Convert an AML NameString/path to an ASL NameString/path.
|
|
The caller must free the memory allocated in this function.
|
|
using FreePool ().
|
|
|
|
@param [in] AmlPath An AML NameString/path.
|
|
@param [out] OutAslPath Buffer containing the ASL path.
|
|
|
|
@retval EFI_SUCCESS Success.
|
|
@retval EFI_INVALID_PARAMETER Invalid parameter.
|
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
ConvertAmlNameToAslName (
|
|
IN CONST CHAR8 *AmlPath,
|
|
OUT CHAR8 **OutAslPath
|
|
);
|
|
|
|
/** Compare two ASL NameStrings.
|
|
|
|
@param [in] AslName1 First NameString to compare.
|
|
@param [in] AslName2 Second NameString to compare.
|
|
|
|
@retval TRUE if the two strings are identical.
|
|
@retval FALSE otherwise, or if error.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AslCompareNameString (
|
|
IN CONST CHAR8 *AslName1,
|
|
IN CONST CHAR8 *AslName2
|
|
);
|
|
|
|
/** Compare two AML NameStrings.
|
|
|
|
@param [in] AmlName1 First NameString to compare.
|
|
@param [in] AmlName2 Second NameString to compare.
|
|
|
|
@retval TRUE if the two strings are identical.
|
|
@retval FALSE otherwise, or if error.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AmlCompareNameString (
|
|
IN CONST CHAR8 *AmlName1,
|
|
IN CONST CHAR8 *AmlName2
|
|
);
|
|
|
|
/** Compare an AML NameString and an ASL NameString.
|
|
|
|
The ASL NameString is converted to an AML NameString before
|
|
being compared with the ASL NameString. This allows to expand
|
|
NameSegs shorter than 4 chars.
|
|
E.g.: AslName: "DEV" will be expanded to "DEV_" before being
|
|
compared.
|
|
|
|
@param [in] AmlName1 AML NameString to compare.
|
|
@param [in] AslName2 ASL NameString to compare.
|
|
|
|
@retval TRUE if the two strings are identical.
|
|
@retval FALSE otherwise, or if error.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
CompareAmlWithAslNameString (
|
|
IN CONST CHAR8 *AmlName1,
|
|
IN CONST CHAR8 *AslName2
|
|
);
|
|
|
|
/** Given an AmlPath, return the address of the first NameSeg.
|
|
|
|
It is possible to determine the size of an AML NameString/path just
|
|
by sight reading it. So no overflow can occur.
|
|
|
|
@param [in] AmlPath The AML pathname.
|
|
@param [in] Root The AML pathname starts with a root char.
|
|
It is an absolute path.
|
|
@param [in] ParentPrefix The AML pathname has ParentPrefix
|
|
carets in its name.
|
|
|
|
@return Pointer to the first NameSeg of the NameString.
|
|
Return NULL if AmlPath is NULL.
|
|
**/
|
|
CONST
|
|
CHAR8 *
|
|
EFIAPI
|
|
AmlGetFirstNameSeg (
|
|
IN CONST CHAR8 *AmlPath,
|
|
IN UINT32 Root,
|
|
IN UINT32 ParentPrefix
|
|
);
|
|
|
|
#endif // AML_STRING_H_
|