Compare commits

...
6 Commits
Author SHA1 Message Date
josh 997d07b64b Look in known directories for OVMF 2025-05-06 19:47:57 -04:00
josh a175c46f25 Check for gnu-efi package in configure 2025-05-06 19:46:49 -04:00
josh d02f1a9efc Avoid qemu raw image format warning 2022-03-12 10:50:09 -05:00
josh edd7979b3f Print graphics modes 2022-03-12 10:48:48 -05:00
josh eb15f473c6 Create image file with Ruby instead of dd 2022-03-12 09:59:56 -05:00
josh df426afbc8 Move source to src directory 2022-03-12 09:58:34 -05:00
2 changed files with 48 additions and 8 deletions

No files matched your search

+10 -3
View File
@@ -1,13 +1,14 @@
configure do configure do
check_program "mformat" check_program "mformat"
check_program "x86_64-w64-mingw32-gcc" check_program "x86_64-w64-mingw32-gcc"
check_cfg package: "gnu-efi", use: false
end end
class Image < Builder class Image < Builder
def run(options) def run(options)
unless @cache.up_to_date?(@target, nil, @sources, @env) unless @cache.up_to_date?(@target, nil, @sources, @env)
print_run_message("Image <target>#{@target}<reset>", nil) print_run_message("Image <target>#{@target}<reset>", nil)
system(*%W[dd if=/dev/zero of=#{@target} bs=1k count=1440]) File.binwrite(@target, "\0" * (1440 * 1024))
system(*%W[mformat -i #{@target} -f 1440 ::]) system(*%W[mformat -i #{@target} -f 1440 ::])
system(*%W[mmd -i #{@target} ::/EFI]) system(*%W[mmd -i #{@target} ::/EFI])
system(*%W[mmd -i #{@target} ::/EFI/BOOT]) system(*%W[mmd -i #{@target} ::/EFI/BOOT])
@@ -25,11 +26,17 @@ uefi_env = env "uefi" do |env|
env["CFLAGS"] += %w[-ffreestanding] env["CFLAGS"] += %w[-ffreestanding]
env["LDFLAGS"] += %w[-nostdlib -Wl,-dll -shared -Wl,--subsystem,10 -e efi_main] env["LDFLAGS"] += %w[-nostdlib -Wl,-dll -shared -Wl,--subsystem,10 -e efi_main]
env["LIBS"] += %w[gcc] env["LIBS"] += %w[gcc]
env["sources"] = glob("*.c") env["sources"] = glob("src/**/*.c")
env.Program("^/BOOTX64.EFI", "${sources}") env.Program("^/BOOTX64.EFI", "${sources}")
env.Image("^/efi-loader.img", "^/BOOTX64.EFI") env.Image("^/efi-loader.img", "^/BOOTX64.EFI")
end end
task "run" do task "run" do
sh %W[qemu-system-x86_64 -bios OVMF.fd -hda #{uefi_env.expand("^/efi-loader.img")}] ovmf = "OVMF.fd"
if File.exist?("/usr/share/edk2/x64/OVMF.fd")
ovmf = "/usr/share/edk2/x64/OVMF.fd"
elsif File.exist?("/usr/share/edk2/x64/OVMF.4m.fd")
ovmf = "/usr/share/edk2/x64/OVMF.4m.fd"
end
sh %W[qemu-system-x86_64 -bios #{ovmf} -drive file=#{uefi_env.expand("^/efi-loader.img")},format=raw]
end end
+38 -5
View File
@@ -38,8 +38,19 @@ static void write_hex64(size_t n)
write_string(s); write_string(s);
} }
static void wait_key(void)
{
EFI_INPUT_KEY key;
write_string(L"Press any key...\r\n");
while (g_system_table->ConIn->ReadKeyStroke(g_system_table->ConIn, &key) == EFI_NOT_READY)
{
}
}
static void check_gop_handle(EFI_HANDLE handle) static void check_gop_handle(EFI_HANDLE handle)
{ {
write_string(L"Going to check GOP handle...\r\n");
wait_key();
EFI_HANDLE interface = NULL; EFI_HANDLE interface = NULL;
EFI_STATUS status = g_system_table->BootServices->HandleProtocol(handle, EFI_STATUS status = g_system_table->BootServices->HandleProtocol(handle,
&(EFI_GUID)EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID, &(EFI_GUID)EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID,
@@ -63,6 +74,32 @@ static void check_gop_handle(EFI_HANDLE handle)
write_string(L"\r\n"); write_string(L"\r\n");
EFI_GRAPHICS_OUTPUT_PROTOCOL * gop = (EFI_GRAPHICS_OUTPUT_PROTOCOL *)interface; EFI_GRAPHICS_OUTPUT_PROTOCOL * gop = (EFI_GRAPHICS_OUTPUT_PROTOCOL *)interface;
UINTN info_size;
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION * info;
for (uint32_t mode_number = 0u;
(status = gop->QueryMode(gop, mode_number, &info_size, &info)) == EFI_SUCCESS;
mode_number++)
{
write_string(L"Mode ");
write_uint(mode_number);
write_string(L": ");
write_uint(info->HorizontalResolution);
write_string(L"x");
write_uint(info->VerticalResolution);
write_string(L" f=");
write_uint(info->PixelFormat);
write_string(L" s=");
write_uint(info->PixelsPerScanLine);
write_string(L"\r\n");
g_system_table->BootServices->FreePool(info);
if ((mode_number % 20) == 19)
{
wait_key();
}
}
write_string(L"Error ");
write_uint(status);
write_string(L" from QueryMode\r\n");
} }
static void dump_memory_map(void) static void dump_memory_map(void)
@@ -114,7 +151,6 @@ EFI_STATUS
efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * system_table) efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * system_table)
{ {
EFI_STATUS status; EFI_STATUS status;
EFI_INPUT_KEY key;
g_system_table = system_table; g_system_table = system_table;
@@ -151,10 +187,7 @@ efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * system_table)
check_gop_handle(buffer[i]); check_gop_handle(buffer[i]);
} }
write_string(L"Press any key...\r\n"); wait_key();
while ((status = system_table->ConIn->ReadKeyStroke(system_table->ConIn, &key)) == EFI_NOT_READY)
{
}
return status; return status;
} }