1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/** @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_
|