From dba1ca186dfd0a8bfc06a3f40dec9218df41516d Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Tue, 3 Jan 2017 08:03:07 -0800 Subject: [PATCH] Discover and set the best video mode supported by the UEFI graphics driver --- Makefile | 5 +++++ src/arch/x86_64/main.c | 45 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 5d4ad1f..ec3e3a2 100644 --- a/Makefile +++ b/Makefile @@ -144,6 +144,11 @@ $(BUILD_D)/fs.img: $(BUILD_D)/kernel.efi rm $(TEMPFILE) mv $@.tmp $@ +$(BUILD_D)/fs.iso: $(BUILD_D)/fs.img + mkdir -p $(BUILD_D)/iso + cp $< $(BUILD_D)/iso/ + xorriso -as mkisofs -R -f -e fs.img -no-emul-boot -o $@ $(BUILD_D)/iso + qemu: $(BUILD_D)/fs.img "$(QEMU)" $(QEMUOPTS) diff --git a/src/arch/x86_64/main.c b/src/arch/x86_64/main.c index e9a15b0..6f42fcc 100644 --- a/src/arch/x86_64/main.c +++ b/src/arch/x86_64/main.c @@ -12,11 +12,46 @@ efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) InitializeLib(ImageHandle, SystemTable); -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" - status = ST->ConOut->OutputString(ST->ConOut, L"Hello from UEFI\n\r"); -#pragma GCC diagnostic pop - check_status(status, L"OutputString"); + Print(L"Popcorn OS " GIT_VERSION L" booting...\n"); + + Print(L"Setting console display mode... "); + + EFI_GRAPHICS_OUTPUT_PROTOCOL *gfx_out_proto; + EFI_GUID gfx_out_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; + status = SystemTable->BootServices->LocateProtocol(&gfx_out_guid, NULL, (void**)&gfx_out_proto); + check_status(status, "LocateProtocol gfx"); + + const uint32_t modes = gfx_out_proto->Mode->MaxMode; + uint32_t res = + gfx_out_proto->Mode->Info->HorizontalResolution * + gfx_out_proto->Mode->Info->VerticalResolution; + uint32_t best = (uint32_t)-1; + + for (uint32_t i = 0; i < modes; ++i) { + UINTN size = 0; + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info = NULL; + status = gfx_out_proto->QueryMode(gfx_out_proto, i, &size, &info); + check_status(status, "QueryMode"); + + const uint32_t new_res = + info->HorizontalResolution * + info->VerticalResolution; + + if (new_res > res) { + best = i; + res = new_res; + } + } + + if (best != (uint32_t)-1) { + status = gfx_out_proto->SetMode(gfx_out_proto, best); + check_status(status, "SetMode"); + Print(L"*"); + } + Print(L"%ux%u\n", + gfx_out_proto->Mode->Info->HorizontalResolution, + gfx_out_proto->Mode->Info->VerticalResolution); + Print(L" SystemTable: %x\n", SystemTable); if (SystemTable)