備忘録やめた

備忘録として使用していたけどやめた.このブログに載せてあるコードのライセンスは別途記載がない限りWTFPL OR NYSLです.

GOPを楽に取得する

コード

uefi-rsを使用しています.

fn fetch_gop<'a>(system_table: &'a SystemTable<Boot>) -> &'a mut gop::GraphicsOutput<'a> {
    let gop = system_table
        .boot_services()
        .locate_protocol::<gop::GraphicsOutput>()
        .expect_success("Your computer does not support Graphics Output Protocol!");

    unsafe { &mut *gop.get() }
}

解説

使用しているlocate_protocolメソッドは,UEFIで提供されているLocateProtocol関数のラッパです.

今までは以下のように,LocateHandleBuffer関数とOpenProtocol関数を使用していたのですが,LocateProtocol関数だけで十分だということが分かりました.以下のコードはC++です.

EFI_STATUS FetchGop(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE* SystemTable, OUT EFI_GRAPHICS_OUTPUT_PROTOCOL** gop)
{
    // Don't replace handle_count with NULL. It won't work.
    UINTN handle_count = 0;
    EFI_HANDLE* handle_buffer;
    EFI_STATUS status = SystemTable->BootServices->LocateHandleBuffer(ByProtocol, &kEfiGraphicsOutputProtocolGuid, NULL, &handle_count, &handle_buffer);
    if (EFI_ERROR(status)) {
        return status;
    }

    return SystemTable->BootServices->OpenProtocol(handle_buffer[0], &kEfiGraphicsOutputProtocolGuid, (VOID**)gop, ImageHandle, NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
}

参考

uefi-rs/gop.rs at 0c3999e6ee9b7d8a69edb19bde73c798b696c799 · rust-osdev/uefi-rs · GitHub