retrage.github.io

EFI_STATUSの値

毎回EFI_STATUSの値を調べるのが手間なのでここでまとめておく.

TL;DR

EFI_STATUSValue (64-bit)
EFI_SUCCESS0x0
EFI_LOAD_ERROR0x8000000000000001
EFI_INVALID_PARAMETER0x8000000000000002
EFI_UNSUPPORTED0x8000000000000003
EFI_BAD_BUFFER_SIZE0x8000000000000004
EFI_BUFFER_TOO_SMALL0x8000000000000005
EFI_NOT_READY0x8000000000000006
EFI_DEVICE_ERROR0x8000000000000007
EFI_WRITE_PROTECTED0x8000000000000008
EFI_OUT_OF_RESOURCES0x8000000000000009
EFI_VOLUME_CORRUPTED0x800000000000000a
EFI_VOLUME_FULL0x800000000000000b
EFI_NO_MEDIA0x800000000000000c
EFI_MEDIA_CHANGED0x800000000000000d
EFI_NOT_FOUND0x800000000000000e
EFI_ACCESS_DENIED0x800000000000000f
EFI_NO_RESPONSE0x8000000000000010
EFI_NO_MAPPING0x8000000000000011
EFI_TIMEOUT0x8000000000000012
EFI_NOT_STARTED0x8000000000000013
EFI_ALREADY_STARTED0x8000000000000014
EFI_ABORTED0x8000000000000015
EFI_ICMP_ERROR0x8000000000000016
EFI_TFTP_ERROR0x8000000000000017
EFI_PROTOCOL_ERROR0x8000000000000018
EFI_INCOMPATIBLE_VERSION0x8000000000000019
EFI_SECURITY_VIOLATION0x800000000000001a
EFI_CRC_ERROR0x800000000000001b
EFI_END_OF_MEDIA0x800000000000001c
EFI_END_OF_FILE0x800000000000001f
EFI_INVALID_LANGUAGE0x8000000000000020
EFI_COMPROMISED_DATA0x8000000000000021
EFI_HTTP_ERROR0x8000000000000023
EFI_NETWORK_UNREACHABLE0x8000000000000064
EFI_HOST_UNREACHABLE0x8000000000000065
EFI_PROTOCOL_UNREACHABLE0x8000000000000066
EFI_PORT_UNREACHABLE0x8000000000000067
EFI_CONNECTION_FIN0x8000000000000068
EFI_CONNECTION_RESET0x8000000000000069
EFI_CONNECTION_REFUSED0x800000000000006a
EFI_WARN_UNKNOWN_GLYPH0x1
EFI_WARN_DELETE_FAILURE0x2
EFI_WARN_WRITE_FAILURE0x3
EFI_WARN_BUFFER_TOO_SMALL0x4
EFI_WARN_STALE_DATA0x5
EFI_WARN_FILE_SYSTEM0x6

EDK2での定義

///
/// Function return status for EFI API.
///
typedef RETURN_STATUS             EFI_STATUS;
//
// Status codes common to all execution phases
//
typedef UINTN RETURN_STATUS;

なのでEFI_STATUSUINTNである. x64ではUINTNUINT64となっている.

///
/// Enumeration of EFI_STATUS.
///@{
#define EFI_SUCCESS               RETURN_SUCCESS
#define EFI_LOAD_ERROR            RETURN_LOAD_ERROR
#define EFI_INVALID_PARAMETER     RETURN_INVALID_PARAMETER
#define EFI_UNSUPPORTED           RETURN_UNSUPPORTED
#define EFI_BAD_BUFFER_SIZE       RETURN_BAD_BUFFER_SIZE
#define EFI_BUFFER_TOO_SMALL      RETURN_BUFFER_TOO_SMALL
#define EFI_NOT_READY             RETURN_NOT_READY
#define EFI_DEVICE_ERROR          RETURN_DEVICE_ERROR
#define EFI_WRITE_PROTECTED       RETURN_WRITE_PROTECTED
#define EFI_OUT_OF_RESOURCES      RETURN_OUT_OF_RESOURCES
#define EFI_VOLUME_CORRUPTED      RETURN_VOLUME_CORRUPTED
#define EFI_VOLUME_FULL           RETURN_VOLUME_FULL
#define EFI_NO_MEDIA              RETURN_NO_MEDIA
#define EFI_MEDIA_CHANGED         RETURN_MEDIA_CHANGED
#define EFI_NOT_FOUND             RETURN_NOT_FOUND
#define EFI_ACCESS_DENIED         RETURN_ACCESS_DENIED
#define EFI_NO_RESPONSE           RETURN_NO_RESPONSE
#define EFI_NO_MAPPING            RETURN_NO_MAPPING
#define EFI_TIMEOUT               RETURN_TIMEOUT
#define EFI_NOT_STARTED           RETURN_NOT_STARTED
#define EFI_ALREADY_STARTED       RETURN_ALREADY_STARTED
#define EFI_ABORTED               RETURN_ABORTED
#define EFI_ICMP_ERROR            RETURN_ICMP_ERROR
#define EFI_TFTP_ERROR            RETURN_TFTP_ERROR
#define EFI_PROTOCOL_ERROR        RETURN_PROTOCOL_ERROR
#define EFI_INCOMPATIBLE_VERSION  RETURN_INCOMPATIBLE_VERSION
#define EFI_SECURITY_VIOLATION    RETURN_SECURITY_VIOLATION
#define EFI_CRC_ERROR             RETURN_CRC_ERROR
#define EFI_END_OF_MEDIA          RETURN_END_OF_MEDIA
#define EFI_END_OF_FILE           RETURN_END_OF_FILE
#define EFI_INVALID_LANGUAGE      RETURN_INVALID_LANGUAGE
#define EFI_COMPROMISED_DATA      RETURN_COMPROMISED_DATA
#define EFI_HTTP_ERROR            RETURN_HTTP_ERROR

#define EFI_WARN_UNKNOWN_GLYPH    RETURN_WARN_UNKNOWN_GLYPH
#define EFI_WARN_DELETE_FAILURE   RETURN_WARN_DELETE_FAILURE
#define EFI_WARN_WRITE_FAILURE    RETURN_WARN_WRITE_FAILURE
#define EFI_WARN_BUFFER_TOO_SMALL RETURN_WARN_BUFFER_TOO_SMALL
#define EFI_WARN_STALE_DATA       RETURN_WARN_STALE_DATA
#define EFI_WARN_FILE_SYSTEM      RETURN_WARN_FILE_SYSTEM
///@}

///
/// Define macro to encode the status code.
///
#define EFIERR(_a)                ENCODE_ERROR(_a)

#define EFI_ERROR(A)              RETURN_ERROR(A)

///
/// ICMP error definitions
///@{
#define EFI_NETWORK_UNREACHABLE   EFIERR(100)
#define EFI_HOST_UNREACHABLE      EFIERR(101)
#define EFI_PROTOCOL_UNREACHABLE  EFIERR(102)
#define EFI_PORT_UNREACHABLE      EFIERR(103)
///@}

///
/// Tcp connection status definitions
///@{
#define EFI_CONNECTION_FIN        EFIERR(104)
#define EFI_CONNECTION_RESET      EFIERR(105)
#define EFI_CONNECTION_REFUSED    EFIERR(106)
///@}
#define RETURN_SUCCESS               0
#define RETURN_LOAD_ERROR            ENCODE_ERROR (1)
#define RETURN_INVALID_PARAMETER     ENCODE_ERROR (2)
#define RETURN_UNSUPPORTED           ENCODE_ERROR (3)
#define RETURN_BAD_BUFFER_SIZE       ENCODE_ERROR (4)
#define RETURN_BUFFER_TOO_SMALL      ENCODE_ERROR (5)
#define RETURN_NOT_READY             ENCODE_ERROR (6)
#define RETURN_DEVICE_ERROR          ENCODE_ERROR (7)
#define RETURN_WRITE_PROTECTED       ENCODE_ERROR (8)
#define RETURN_OUT_OF_RESOURCES      ENCODE_ERROR (9)
#define RETURN_VOLUME_CORRUPTED      ENCODE_ERROR (10)
#define RETURN_VOLUME_FULL           ENCODE_ERROR (11)
#define RETURN_NO_MEDIA              ENCODE_ERROR (12)
#define RETURN_MEDIA_CHANGED         ENCODE_ERROR (13)
#define RETURN_NOT_FOUND             ENCODE_ERROR (14)
#define RETURN_ACCESS_DENIED         ENCODE_ERROR (15)
#define RETURN_NO_RESPONSE           ENCODE_ERROR (16)
#define RETURN_NO_MAPPING            ENCODE_ERROR (17)
#define RETURN_TIMEOUT               ENCODE_ERROR (18)
#define RETURN_NOT_STARTED           ENCODE_ERROR (19)
#define RETURN_ALREADY_STARTED       ENCODE_ERROR (20)
#define RETURN_ABORTED               ENCODE_ERROR (21)
#define RETURN_ICMP_ERROR            ENCODE_ERROR (22)
#define RETURN_TFTP_ERROR            ENCODE_ERROR (23)
#define RETURN_PROTOCOL_ERROR        ENCODE_ERROR (24)
#define RETURN_INCOMPATIBLE_VERSION  ENCODE_ERROR (25)
#define RETURN_SECURITY_VIOLATION    ENCODE_ERROR (26)
#define RETURN_CRC_ERROR             ENCODE_ERROR (27)
#define RETURN_END_OF_MEDIA          ENCODE_ERROR (28)
#define RETURN_END_OF_FILE           ENCODE_ERROR (31)
#define RETURN_INVALID_LANGUAGE      ENCODE_ERROR (32)
#define RETURN_COMPROMISED_DATA      ENCODE_ERROR (33)
#define RETURN_HTTP_ERROR            ENCODE_ERROR (35)
#define RETURN_WARN_UNKNOWN_GLYPH    ENCODE_WARNING (1)
#define RETURN_WARN_DELETE_FAILURE   ENCODE_WARNING (2)
#define RETURN_WARN_WRITE_FAILURE    ENCODE_WARNING (3)
#define RETURN_WARN_BUFFER_TOO_SMALL ENCODE_WARNING (4)
#define RETURN_WARN_STALE_DATA       ENCODE_WARNING (5)
#define RETURN_WARN_FILE_SYSTEM      ENCODE_WARNING (6)
#define ENCODE_ERROR(StatusCode)     ((RETURN_STATUS)(MAX_BIT | (StatusCode)))
#define ENCODE_WARNING(StatusCode)   ((RETURN_STATUS)(StatusCode))

ここでMAX_BITはx64では次のようになっている.

#define MAX_BIT     0x8000000000000000ULL

以上をまとめるとx64ではEFI_STATUSの値は最初に示した表のようになる. 以下は表の生成に利用したスクリプトである.

#!/usr/bin/env python

import sys

MAX_BIT = 0x8000000000000000
# MAX_BIT = 0x80000000

def print_row(status, val, status_width, val_width):
    status_padding = status_width - len(status)
    val_padding = val_width - len(val)
    print('| ' + status + ' ' * status_padding + ' | ' \
            + val + ' ' * val_padding + ' |')

def main():
    if len(sys.argv) < 3:
        return -1

    efi_status_path = sys.argv[1]
    efi_to_return = dict()
    with open(efi_status_path, 'r') as fp: 
        for line in fp: 
            [_, efi_status, return_status] = line.strip().split()
            efi_to_return[efi_status] = return_status

    return_status_path = sys.argv[2]
    return_to_val = dict()
    with open(return_status_path, 'r') as fp: 
        for line in fp: 
            [_, return_status, val] = line.strip().split()
            return_to_val[return_status] = val 

    status_width = max(map(len, efi_to_return.keys()))
    val_width = len(hex(MAX_BIT))

    print_row('EFI_STATUS', 'Value (64-bit)', status_width, val_width)
    print_row('-' * status_width, '-' * val_width, status_width, val_width)

    for (efi_status, return_status) in efi_to_return.items():
        if return_status.startswith('EFIERR'):
            v = return_status
        else:
            v = return_to_val[return_status]
        if v.startswith('ENCODE_ERROR') or v.startswith('EFIERR'):
            val = MAX_BIT | int(v[v.index('(')+1:v.index(')')])
        elif v.startswith('ENCODE_WARNING'):
            val = int(v[v.index('(')+1:v.index(')')])
        else:
            val = int(v) # 0 is expected
        print_row(efi_status, hex(val), status_width, val_width)

    return 0

if __name__ == '__main__':
    sys.exit(main())