이전에 PlatformDxe
모듈의 HII 리소스를 살펴봤다.
https://github.com/tianocore/edk2/blob/master/OvmfPkg/PlatformDxe
이 리소스는 패키지 DEC 파일이나 *.c
파일에 참조되지 않은 GUID 번호로 등록되어 있다는 것을 알 수 있다.
PackageList[9]: GUID=D9DCC5DF-4007-435E-9098-8970935504B2; size=0x855
Package[0]: type=FORMS; size=0x1F6
Package[1]: type=STRINGS; size=0x62B
Package[2]: type=DEVICE_PATH; size=0x1C
Package[3]: type=END; size=0x4
GUID 값은 모듈 INF 파일의 FILE_GUID
값과 동일하다.
https://github.com/tianocore/edk2/blob/master/OvmfPkg/PlatformDxe/Platform.inf
[Defines]
...
BASE_NAME = PlatformDxe
FILE_GUID = D9DCC5DF-4007-435E-9098-8970935504B2
...
GUID를 C 코드에 가져오는 방법은 EDK2의 빌드 시스템을 사용해 간단하게 할 가져올 수 있다. INF 파일의 FILE_GUID
키의 GUID는 자동으로 몇 가지 다른 값과 함께 Autoconf 헤더로 이동한다.
https://github.com/tianocore/edk2/blob/master/BaseTools/Source/Python/AutoGen/GenC.py
def CreateHeaderCode(Info, AutoGenC, AutoGenH):
...
#
# Publish the CallerId Guid
#
AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED GUID gEfiCallerIdGuid = %s;\n' % GuidStringToGuidStructureString(Info.Guid))
AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED GUID gEdkiiDscPlatformGuid = %s;\n' % GuidStringToGuidStructureString(Info.PlatformInfo.Guid))
AutoGenC.Append('\nGLOBAL_REMOVE_IF_UNREFERENCED CHAR8 *gEfiCallerBaseName = "%s";\n' % Info.Name)
이런 값은 Build/OvmfX64/RELEASE_GCC5/X64/OvmfPkg/PlatformDxe/Platform/DEBUG/AutoGen.h
에서 확인할 수 있다.
extern GUID gEfiCallerIdGuid;
extern GUID gEdkiiDscPlatformGuid;
extern CHAR8 *gEfiCallerBaseName;
#define EFI_CALLER_ID_GUID \
{0xD9DCC5DF, 0x4007, 0x435E, {0x90, 0x98, 0x89, 0x70, 0x93, 0x55, 0x04, 0xB2}}
#define EDKII_DSC_PLATFORM_GUID \
{0x5a9e7754, 0xd81b, 0x49ea, {0x85, 0xad, 0x69, 0xea, 0xa7, 0xb1, 0x53, 0x9b}}
그리고 Build/OvmfX64/RELEASE_GCC5/X64/OvmfPkg/PlatformDxe/Platform/DEBUG/AutoGen.c
에서도 확인할 수 있다.
이 세 가지 변수는 우리가 생성한 모듈을 포함해 모든 모듈에 대한 Autoconf 파일에 존재한다.
gEfiCallerIdGuid
- 모듈 INF 파일의 FILE_GUID
키 값
gEdkiiDscPlatformGuid
- 모듈 패키지 DSC 파일의 PLATFORM_GUID
키 값
gEfiCallerBaseName
- ASCII 문자열로 인코딩된 모듈 INF 파일의 BASE_NAME
키 값
아래 링크에서 gEfiCallerIdGuid
가 사용되는 코드를 확인할 수 있다.
https://github.com/tianocore/edk2/blob/master/OvmfPkg/PlatformDxe/Platform.c
EFI_STATUS
EFIAPI
PlatformInit (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
...
mInstalledPackages = HiiAddPackages (
&gEfiCallerIdGuid, // PackageListGuid
ImageHandle, // associated DeviceHandle
PlatformDxeStrings, // 1st package
PlatformFormsBin, // 2nd package
NULL // terminator
);
...
EDK2 코드베이스에서 gEdkiiDscPlatformGuid
가 사용되지 않는 것처럼 보이지만 원하는 경우 다른 GUID와 같은 방식으로 사용할 수 있다.
gEfiCallerBaseName
의 경우 디버깅 출력에 자주 사용된다.
DEBUG ((DEBUG_ERROR, "%a: %a: MyFunction(): %r\n", gEfiCallerBaseName, __FUNCTION__, Status));
gEfiCallerBaseName
문자열은 ASCII(=CHAR8*
)로 인코딩되므로 출력하려면 %a
형식을 사용해야 한다.