Skip to content

Instantly share code, notes, and snippets.

@tnishinaga
Last active March 13, 2018 16:14
Show Gist options
  • Save tnishinaga/7ec080ca1ad636abdcbd0879ff5cd404 to your computer and use it in GitHub Desktop.
Save tnishinaga/7ec080ca1ad636abdcbd0879ff5cd404 to your computer and use it in GitHub Desktop.
EFI_TCP4_SERVICE_BINDING_PROTOCOLとEFI_TCP4_PROTOCOLに関するメモ

EFI_TCP4_SERVICE_BINDING_PROTOCOLとEFI_TCP4_PROTOCOLに関するメモ

結論

EFI_TCP4_PROTOCOLはEFI_TCP4_SERVICE_BINDING_PROTOCOLのCreateChildで作ったEFI_HANDLEから呼び出す。

メモ

Env: gnu-efi-3.0.6

EFI_TCP4_PROTOCOLのGUIDからLocateHandleBufferでハンドラを探し、そのハンドラからプロトコルを呼び出して使うという方法でEFI_TCP4_PROTOCOLの関数(GetModeDataなど)を使うと、EFI_NOT_STARTED(19)が帰ってくる。

EFI_TCP4_SERVICE_BINDING_PROTOCOLはLocateHandleBufferで呼び出す。 コード例は以下。

EFI_STATUS
find_tcp4_service_binding_handlers (
    EFI_HANDLE **handlers,
    UINTN *nohandlers
)
{
    EFI_STATUS efi_status;
    // load handler
    EFI_GUID tcp4_service_binding_protocol_guid = EFI_TCP4_SERVICE_BINDING_PROTOCOL;
    efi_status = uefi_call_wrapper(
        BS->LocateHandleBuffer,
        5,
        ByProtocol,
        &tcp4_service_binding_protocol_guid,
        NULL, /* SearchKey is ignored */
        (UINTN *)nohandlers,
        (EFI_HANDLE **)handlers
    );
    return efi_status;
}

EFI_TCP4_SERVICE_BINDING_PROTOCOLのハンドラを取得したら、プロトコルを取得する。 プロトコルの型はEFI_SERVICE_BINDING、定義は inc/efiprot.h にある。

EFI_STATUS
load_tcp4_service_binding_protocol(
    EFI_SERVICE_BINDING **protocol,
    EFI_HANDLE *handlers,
    UINTN port
)
{
    EFI_STATUS efi_status;
    EFI_GUID tcp4_service_binding_protocol_guid = EFI_TCP4_SERVICE_BINDING_PROTOCOL;
    efi_status = uefi_call_wrapper(
        BS->HandleProtocol,
        3,
        handlers[port],
        &tcp4_service_binding_protocol_guid,
        (VOID **)protocol
    );
    return efi_status;
}

CreateChild関数の定義も inc/efiprot.h にある。EFI_TCP4_PROTOCOLのハンドラを作るコード例は以下。

EFI_SERVICE_BINDING *tcp4_service_binding_protocol;

/* tcp4_service_binding_protocolを取得 */

EFI_HANDLE tcp4_handlers;
efi_status = uefi_call_wrapper(
    tcp4_service_binding_protocol->CreateChild,
    2,
    tcp4_service_binding_protocol,
    &tcp4_handlers
);

以上。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment