56. 코드에서 FILE_GUID 및 BASE_NAME을 가져오기

이전에 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 형식을 사용해야 한다.

Last updated