10. EFI_STATUS 타입 과 EFI_ERROR 매크로

UEFI 코드에서는 아래와 같은 구성의 코드를 일반적으로 사용한다.

if (!EFI_ERROR(Status) {
  ...
} else {
  ...
}

EFI_STATUS 기능의 내부 구현에 대해서 아래의 경로의 파일을 확인하면 된다. (MdePkg/Include/Uefi/UefiBaseType.h MdePkg/Include/Base.h)

#define EFI_ERROR(A)              RETURN_ERROR(A)

...

/**
  Returns TRUE if a specified RETURN_STATUS code is an error code.

  This function returns TRUE if StatusCode has the high bit set.  Otherwise, FALSE is returned.

  @param  StatusCode    The status code value to evaluate.

  @retval TRUE          The high bit of StatusCode is set.
  @retval FALSE         The high bit of StatusCode is clear.

**/
#define RETURN_ERROR(StatusCode)     (((INTN)(RETURN_STATUS)(StatusCode)) < 0)

...

//
// Status codes common to all execution phases
//
typedef UINTN RETURN_STATUS;

따라서 EFI_ERROR 매크로는 단순히 전달된 값이 음수인지 테스트를 하며 이는 signed integer에 대해서도 마찬가지이다. 가능한 EFI_STATUS의 값은 MdePkg/Include/Uefi/UefiBaseType.h에 명시되어 있다.

만약 해당 값을 인코딩 하는 방법을 보려면 MdePkg\Include\Base.h를 확인하면 된다.

이제 코드에서 EFI_ERROR 매크로를 사용하고 Print%r 출력 옵션을 사용하여 에러가 출력되는지 확인 해보겠다.

ImageHandle 대신 NULL 포인터를 인자로 전달하여 오류 표시 테스트할 수 있다.

빌드 후 실행하면 아래와 같은 에러 문구를 볼 수 있다.

Last updated