mirror of https://github.com/acidanthera/audk.git
127 lines
7.7 KiB
C
127 lines
7.7 KiB
C
/** @file
|
|
|
|
Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
@par Glossary:
|
|
- Cm or CM - Configuration Manager
|
|
- Obj or OBJ - Object
|
|
**/
|
|
|
|
#ifndef CONFIGURATION_MANAGER_HELPER_H_
|
|
#define CONFIGURATION_MANAGER_HELPER_H_
|
|
|
|
/** The GET_OBJECT_LIST macro expands to a function that is used to retrieve
|
|
an object or an object list from the Configuration Manager using the
|
|
Configuration Manager Protocol interface.
|
|
|
|
The macro expands to a function which has the following prototype:
|
|
|
|
STATIC
|
|
EFI_STATUS
|
|
EFIAPI
|
|
Get<CmObjectId> (
|
|
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,
|
|
IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
|
|
OUT Type ** List,
|
|
OUT UINT32 * Count OPTIONAL
|
|
);
|
|
|
|
Generated function parameters:
|
|
@param [in] CfgMgrProtocol Pointer to the Configuration Manager protocol
|
|
interface.
|
|
@param [in] Token Reference token for the Object.
|
|
@param [out] List Pointer to the Object list.
|
|
@param [out] Count Count of the objects returned in the list.
|
|
|
|
Macro Parameters:
|
|
@param [in] CmObjectNameSpace The Object Namespace
|
|
@param [in] CmObjectId Object Id.
|
|
@param [in] Type Structure used to describe the Object.
|
|
|
|
@retval EFI_SUCCESS Success.
|
|
@retval EFI_INVALID_PARAMETER A parameter is invalid.
|
|
@retval EFI_NOT_FOUND The required object information is not found.
|
|
@retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration
|
|
Manager is less than the Object size for the
|
|
requested object.
|
|
**/
|
|
#define GET_OBJECT_LIST(CmObjectNameSpace, CmObjectId, Type) \
|
|
STATIC \
|
|
EFI_STATUS \
|
|
EFIAPI \
|
|
Get##CmObjectId ( \
|
|
IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol, \
|
|
IN CONST CM_OBJECT_TOKEN Token OPTIONAL, \
|
|
OUT Type ** List, \
|
|
OUT UINT32 * CONST Count OPTIONAL \
|
|
) \
|
|
{ \
|
|
EFI_STATUS Status; \
|
|
CM_OBJ_DESCRIPTOR CmObjectDesc; \
|
|
UINT32 ObjCount = 0; \
|
|
if (List == NULL) { \
|
|
Status = EFI_INVALID_PARAMETER; \
|
|
DEBUG (( \
|
|
DEBUG_ERROR, \
|
|
"ERROR: Get" #CmObjectId ": Invalid out parameter for" \
|
|
" object list. Status = %r\n", \
|
|
Status \
|
|
)); \
|
|
goto error_handler; \
|
|
} \
|
|
Status = CfgMgrProtocol->GetObject ( \
|
|
CfgMgrProtocol, \
|
|
CREATE_CM_OBJECT_ID ( \
|
|
CmObjectNameSpace, \
|
|
CmObjectId \
|
|
), \
|
|
Token, \
|
|
&CmObjectDesc \
|
|
); \
|
|
if (EFI_ERROR (Status)) { \
|
|
DEBUG (( \
|
|
DEBUG_INFO, \
|
|
"INFO: Get" #CmObjectId ": Platform does not implement " \
|
|
#CmObjectId ". Status = %r\n", \
|
|
Status \
|
|
)); \
|
|
*List = NULL; \
|
|
goto error_handler; \
|
|
} \
|
|
if (CmObjectDesc.ObjectId != \
|
|
CREATE_CM_OBJECT_ID (CmObjectNameSpace, CmObjectId)) { \
|
|
DEBUG (( \
|
|
DEBUG_ERROR, \
|
|
"ERROR: Get" #CmObjectId ": " #CmObjectId \
|
|
": Invalid ObjectId = 0x%x\n, expected Id = 0x%x\n", \
|
|
CmObjectDesc.ObjectId, \
|
|
CREATE_CM_OBJECT_ID (CmObjectNameSpace, CmObjectId) \
|
|
)); \
|
|
ASSERT (FALSE); \
|
|
Status = EFI_INVALID_PARAMETER; \
|
|
goto error_handler; \
|
|
} \
|
|
if (CmObjectDesc.Size < (sizeof (Type) * CmObjectDesc.Count)) { \
|
|
DEBUG (( \
|
|
DEBUG_ERROR, \
|
|
"ERROR: Get" #CmObjectId ": " #CmObjectId \
|
|
": Buffer too small, size = 0x%x\n", \
|
|
CmObjectDesc.Size \
|
|
)); \
|
|
ASSERT (FALSE); \
|
|
Status = EFI_BAD_BUFFER_SIZE; \
|
|
goto error_handler; \
|
|
} \
|
|
ObjCount = CmObjectDesc.Count; \
|
|
*List = (Type*)CmObjectDesc.Data; \
|
|
error_handler: \
|
|
if (Count != NULL) { \
|
|
*Count = ObjCount; \
|
|
} \
|
|
return Status; \
|
|
}
|
|
|
|
#endif // CONFIGURATION_MANAGER_HELPER_H_
|