diff --git a/src/hel/hel.d b/src/hel/hel.d index 467d1a7..051de08 100644 --- a/src/hel/hel.d +++ b/src/hel/hel.d @@ -16,8 +16,20 @@ private void wait_key() } } +private bool in_qemu() +{ + ulong * firmware_vendor = cast(ulong *) st.FirmwareVendor; + ulong fv1 = firmware_vendor[0]; + return fv1 == + ((cast(ulong)'E') | + (cast(ulong)'D' << 16) | + (cast(ulong)'K' << 32) | + (cast(ulong)' ' << 48)); +} + private bool set_graphics_mode() { + uint max_horizontal_resolution = in_qemu() ? 1920u : 0xFFFFFFFFu; UINTN buffer_size = heap_free(); EFI_GUID gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID; EFI_HANDLE * handles = cast(EFI_HANDLE *)heap_base(); @@ -51,14 +63,19 @@ private bool set_graphics_mode() (status = gop.QueryMode(gop, mode_number, &info_size, &info)) == EFI_SUCCESS; mode_number++) { - if (info.HorizontalResolution > best_width) + if ((info.HorizontalResolution > best_width) && + (info.HorizontalResolution <= max_horizontal_resolution)) { best_width = info.HorizontalResolution; best_mode_number = mode_number; } st.BootServices.FreePool(info); } - gop.SetMode(gop, best_mode_number); + if ((status = gop.SetMode(gop, best_mode_number)) != EFI_SUCCESS) + { + writeln("SetMode: Error %u\n", status); + return false; + } return true; }