diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..11e8531 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "uefi-d"] + path = uefi-d + url = git://github.com/kubasz/uefi-d diff --git a/Rsconscript b/Rsconscript index 311dec6..fdc230a 100644 --- a/Rsconscript +++ b/Rsconscript @@ -3,9 +3,9 @@ path_prepend "x86_64-elf-gcc/bin" configure do rscons "x86_64-elf-gcc.rb", "-b", "#{build_dir}/x86_64-elf-gcc" - check_program "ldc2" - check_program "x86_64-w64-mingw32-gcc" - check_program "x86_64-elf-gcc" + check_d_compiler "ldc2", use: "ldc2" + check_c_compiler "x86_64-w64-mingw32-gcc", use: "x86_64-w64-mingw32-gcc" + check_c_compiler "x86_64-elf-gcc", use: "x86_64-elf-gcc" check_c_compiler check_program "mformat", on_fail: "Install the mtools package" check_cfg package: "freetype2", on_fail: "Install libfreetype-dev", use: "freetype" @@ -45,6 +45,7 @@ end # FontGen Environment fontgen_env = env "fontgen", use: "freetype" do |env| + env["LDCMD"].map! {|v| v == "-of" ? "-o" : v} env.Program("^/fontgen", glob("src/fontgen/**/*.c")) end @@ -69,7 +70,23 @@ end # env.Image("^/hos.img", %w[^/hos.elf]) #end -task "run", desc: "Run HOS in QEMU" do - img = kernel_env.expand("^/hos.img") - sh %W[qemu-system-x86_64 -bios OVMF.fd -hda #{img}] +hel_env = env "hel", use: %w[ldc2 x86_64-w64-mingw32-gcc] do |env| + env.add_builder(Image) + env["sources"] = glob("src/hel/**/*.d") + env["sources"] += glob("uefi-d/source/**/*.d") + env["DC"] = "ldc2" + env["DFLAGS"] += %w[-mtriple=x86_64-unknown-windows-coff --betterC -release -O3] + env["D_IMPORT_PATH"] += %w[src uefi-d/source] + env["LD"] = "x86_64-w64-mingw32-gcc" + env["LDFLAGS"] += %w[-nostdlib -Wl,-dll -shared -Wl,--subsystem,10 -e efi_main] + env["LDCMD"] = %w[${LD} -o ${_TARGET} ${LDFLAGS} ${_SOURCES} ${LIBDIRPREFIX}${LIBPATH} ${LIBLINKPREFIX}${LIBS}] + env["OBJDUMP"] = "x86_64-w64-mingw32-objdump" + env.Program("^/BOOTX64.EFI", "${sources}") + env.Disassemble("^/BOOTX64.txt", "^/BOOTX64.EFI") + env.Image("^/hos.img", "^/BOOTX64.EFI") +end + +task "run", desc: "Run HOS in QEMU" do + img = hel_env.expand("^/hos.img") + sh %W[qemu-system-x86_64 -bios OVMF.fd -drive file=#{img},format=raw] end diff --git a/src/hel/hel.d b/src/hel/hel.d new file mode 100644 index 0000000..c238ba1 --- /dev/null +++ b/src/hel/hel.d @@ -0,0 +1,17 @@ +import uefi; + +extern (C) EFI_STATUS efi_main(EFI_HANDLE image_handle, EFI_SYSTEM_TABLE * st) +{ + st.ConOut.ClearScreen(st.ConOut); + + st.ConOut.OutputString(st.ConOut, cast(CHAR16 *)"HOS EFI loader\r\n"w); + st.ConOut.OutputString(st.ConOut, cast(CHAR16 *)"Press any key...\r\n"w); + + st.ConIn.Reset(st.ConIn, FALSE); + EFI_INPUT_KEY key; + while (st.ConIn.ReadKeyStroke(st.ConIn, &key) == EFI_NOT_READY) + { + } + + return EFI_SUCCESS; +} diff --git a/uefi-d b/uefi-d new file mode 160000 index 0000000..e70959c --- /dev/null +++ b/uefi-d @@ -0,0 +1 @@ +Subproject commit e70959ce8ad1b113b5f7aa2111ea4d88f6b6ea63