Change to limine bootloader
This commit is contained in:
+3
-3
@@ -1,9 +1,9 @@
|
|||||||
CompileFlags:
|
CompileFlags:
|
||||||
Compiler: i686-elf-gcc
|
Compiler: x86_64-elf-gcc
|
||||||
Add:
|
Add:
|
||||||
- "-target"
|
- "-target"
|
||||||
- "i686-elf"
|
- "x86_64-elf"
|
||||||
- "-ffreestanding"
|
- "-ffreestanding"
|
||||||
- "-nostdlibinc"
|
- "-nostdlibinc"
|
||||||
- "-isystem"
|
- "-isystem"
|
||||||
- "${env:I686_ELF_GCC_INCLUDE}"
|
- "${env:X86_64_ELF_GCC_INCLUDE}"
|
||||||
@@ -11,14 +11,14 @@ bool render_clangd_config(void) {
|
|||||||
return false;
|
return false;
|
||||||
nob_sb_append_null(&tmpl);
|
nob_sb_append_null(&tmpl);
|
||||||
|
|
||||||
const char *include_path = getenv("I686_ELF_GCC_INCLUDE");
|
const char *include_path = getenv("x86_64_ELF_GCC_INCLUDE");
|
||||||
if (include_path == NULL) {
|
if (include_path == NULL) {
|
||||||
nob_log(NOB_ERROR, "I686_ELF_GCC_INCLUDE not set");
|
nob_log(NOB_ERROR, "x86_64_ELF_GCC_INCLUDE not set");
|
||||||
nob_sb_free(tmpl);
|
nob_sb_free(tmpl);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *needle = "${env:I686_ELF_GCC_INCLUDE}";
|
const char *needle = "${env:X86_64_ELF_GCC_INCLUDE}";
|
||||||
Nob_String_Builder out = {0};
|
Nob_String_Builder out = {0};
|
||||||
|
|
||||||
const char *cursor = tmpl.items;
|
const char *cursor = tmpl.items;
|
||||||
@@ -45,7 +45,7 @@ bool build_assembly(Nob_Cmd *cmd) {
|
|||||||
if (!rebuild)
|
if (!rebuild)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
nob_cmd_append(cmd, "i686-elf-as", "-o", BUILD_FOLDER "boot.o", SRC_FOLDER "boot.s");
|
nob_cmd_append(cmd, "x86_64-elf-as", "-o", BUILD_FOLDER "boot.o", SRC_FOLDER "boot.s");
|
||||||
if (!nob_cmd_run(cmd))
|
if (!nob_cmd_run(cmd))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -61,9 +61,14 @@ bool build_c(Nob_Cmd *cmd) {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
nob_cmd_append(cmd,
|
nob_cmd_append(cmd,
|
||||||
"i686-elf-gcc",
|
"x86_64-elf-gcc",
|
||||||
"-std=gnu99",
|
"-std=gnu99",
|
||||||
"-ffreestanding",
|
"-ffreestanding",
|
||||||
|
"-mcmodel=large",
|
||||||
|
"-mno-red-zone",
|
||||||
|
"-mno-mmx",
|
||||||
|
"-mno-sse",
|
||||||
|
"-mno-sse2",
|
||||||
"-Wall",
|
"-Wall",
|
||||||
"-Wextra",
|
"-Wextra",
|
||||||
"-O2",
|
"-O2",
|
||||||
@@ -86,7 +91,7 @@ bool link_everything(Nob_Cmd *cmd) {
|
|||||||
|
|
||||||
const char *objectFiles[] = {BUILD_FOLDER "kernel.o", BUILD_FOLDER "boot.o"};
|
const char *objectFiles[] = {BUILD_FOLDER "kernel.o", BUILD_FOLDER "boot.o"};
|
||||||
nob_cmd_append(cmd,
|
nob_cmd_append(cmd,
|
||||||
"i686-elf-gcc",
|
"x86_64-elf-gcc",
|
||||||
"-T", SRC_FOLDER "linker.ld",
|
"-T", SRC_FOLDER "linker.ld",
|
||||||
"-o", BUILD_FOLDER "kernel",
|
"-o", BUILD_FOLDER "kernel",
|
||||||
"-ffreestanding",
|
"-ffreestanding",
|
||||||
@@ -137,10 +142,10 @@ bool clean_dir(const char *dir_path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool build_bootable_image(Nob_Cmd *cmd) {
|
bool build_bootable_image(Nob_Cmd *cmd) {
|
||||||
|
// NOTE: this does not rebuild on change of limine bins
|
||||||
const char *output = BUILD_FOLDER "kernel.iso";
|
const char *output = BUILD_FOLDER "kernel.iso";
|
||||||
const char *input[] = {BUILD_FOLDER "kernel", SRC_FOLDER "grub.cfg"};
|
const char *input[] = {BUILD_FOLDER "kernel", SRC_FOLDER "limine.conf"};
|
||||||
int rebuild = nob_needs_rebuild(output, input, NOB_ARRAY_LEN(input));
|
int rebuild = nob_needs_rebuild(output, input, NOB_ARRAY_LEN(input));
|
||||||
|
|
||||||
if (!rebuild)
|
if (!rebuild)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@@ -148,18 +153,58 @@ bool build_bootable_image(Nob_Cmd *cmd) {
|
|||||||
return false;
|
return false;
|
||||||
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/boot"))
|
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/boot"))
|
||||||
return false;
|
return false;
|
||||||
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/boot/grub"))
|
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/boot/limine"))
|
||||||
|
return false;
|
||||||
|
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/EFI"))
|
||||||
|
return false;
|
||||||
|
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "isodir/EFI/BOOT"))
|
||||||
|
return false;
|
||||||
|
if (!nob_mkdir_if_not_exists(BUILD_FOLDER "limine"))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
nob_cmd_append(cmd, "cp", BUILD_FOLDER "kernel", BUILD_FOLDER "isodir/boot/kernel");
|
if (!nob_file_exists(BUILD_FOLDER "limine")) {
|
||||||
|
nob_cmd_append(cmd, "git", "clone", "https://github.com/limine-bootloader/limine.git", "--branch=v11.x-binary", "--depth=1", BUILD_FOLDER "limine");
|
||||||
|
if (!nob_cmd_run(cmd))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
nob_cmd_append(cmd, "make", "-C", BUILD_FOLDER "limine");
|
||||||
if (!nob_cmd_run(cmd))
|
if (!nob_cmd_run(cmd))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
nob_cmd_append(cmd, "cp", SRC_FOLDER "grub.cfg", BUILD_FOLDER "isodir/boot/grub/grub.cfg");
|
nob_cmd_append(cmd, "cp",
|
||||||
|
BUILD_FOLDER "limine/limine-bios.sys",
|
||||||
|
BUILD_FOLDER "limine/limine-bios-cd.bin",
|
||||||
|
BUILD_FOLDER "limine/limine-uefi-cd.bin",
|
||||||
|
BUILD_FOLDER "isodir/boot/limine/");
|
||||||
if (!nob_cmd_run(cmd))
|
if (!nob_cmd_run(cmd))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
nob_cmd_append(cmd, "grub-mkrescue", "-o", BUILD_FOLDER "kernel.iso", BUILD_FOLDER "isodir");
|
nob_cmd_append(cmd, "cp",
|
||||||
|
BUILD_FOLDER "limine/BOOTIA32.EFI",
|
||||||
|
BUILD_FOLDER "limine/BOOTX64.EFI",
|
||||||
|
BUILD_FOLDER "isodir/EFI/BOOT/");
|
||||||
|
if (!nob_cmd_run(cmd))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
nob_cmd_append(cmd, "cp", SRC_FOLDER "limine.conf", BUILD_FOLDER "isodir/boot/limine/limine.conf");
|
||||||
|
if (!nob_cmd_run(cmd))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
nob_cmd_append(cmd, "cp", BUILD_FOLDER "kernel", BUILD_FOLDER "isodir/boot/");
|
||||||
|
if (!nob_cmd_run(cmd))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
nob_cmd_append(cmd, "xorriso", "-as", "mkisofs",
|
||||||
|
"-b", "boot/limine/limine-bios-cd.bin",
|
||||||
|
"-no-emul-boot", "-boot-load-size", "4", "-boot-info-table",
|
||||||
|
"--efi-boot", "boot/limine/limine-uefi-cd.bin",
|
||||||
|
"-efi-boot-part", "--efi-boot-image", "--protective-msdos-label",
|
||||||
|
BUILD_FOLDER "isodir", "-o", BUILD_FOLDER "kernel.iso");
|
||||||
|
if (!nob_cmd_run(cmd))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
nob_cmd_append(cmd, BUILD_FOLDER "limine/limine", "bios-install", BUILD_FOLDER "kernel.iso");
|
||||||
if (!nob_cmd_run(cmd))
|
if (!nob_cmd_run(cmd))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -167,7 +212,7 @@ bool build_bootable_image(Nob_Cmd *cmd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool runQemu(Nob_Cmd *cmd) {
|
bool runQemu(Nob_Cmd *cmd) {
|
||||||
nob_cmd_append(cmd, "qemu-system-i386", "-cdrom", BUILD_FOLDER "kernel.iso", "-serial", "stdio");
|
nob_cmd_append(cmd, "qemu-system-x86_64", "-cdrom", BUILD_FOLDER "kernel.iso", "-serial", "stdio");
|
||||||
if (!nob_cmd_run(cmd))
|
if (!nob_cmd_run(cmd))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -3,15 +3,16 @@
|
|||||||
pkgs.mkShell {
|
pkgs.mkShell {
|
||||||
nativeBuildInputs =
|
nativeBuildInputs =
|
||||||
with pkgs; [
|
with pkgs; [
|
||||||
pkgsCross.i686-embedded.buildPackages.gcc
|
pkgsCross.x86_64-embedded.buildPackages.gcc
|
||||||
pkgsCross.i686-embedded.buildPackages.binutils
|
pkgsCross.x86_64-embedded.buildPackages.binutils
|
||||||
gdb
|
gdb
|
||||||
grub2
|
grub2
|
||||||
xorriso
|
xorriso
|
||||||
qemu
|
qemu
|
||||||
|
limine
|
||||||
];
|
];
|
||||||
|
|
||||||
shellHook = ''
|
shellHook = ''
|
||||||
export I686_ELF_GCC_INCLUDE="${pkgs.pkgsCross.i686-embedded.buildPackages.gcc.cc}/lib/gcc/i686-elf/${pkgs.pkgsCross.i686-embedded.buildPackages.gcc.version}/include"
|
export x86_64_ELF_GCC_INCLUDE="${pkgs.pkgsCross.x86_64-embedded.buildPackages.gcc.cc}/lib/gcc/x86_64-elf/${pkgs.pkgsCross.x86_64-embedded.buildPackages.gcc.version}/include"
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -20,8 +20,9 @@ stack_top:
|
|||||||
.section .text
|
.section .text
|
||||||
.global _start
|
.global _start
|
||||||
.type _start, @function
|
.type _start, @function
|
||||||
|
|
||||||
_start:
|
_start:
|
||||||
mov $stack_top, %esp
|
mov $stack_top, %rsp
|
||||||
|
|
||||||
/* Initialize processor state here */
|
/* Initialize processor state here */
|
||||||
|
|
||||||
|
|||||||
+22
-2
@@ -6,10 +6,24 @@
|
|||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
#error "Not using cross compiler"
|
#error "Not using cross compiler"
|
||||||
#endif
|
#endif
|
||||||
#if !defined(__i386__)
|
#if !defined(__x86_64__)
|
||||||
#error "Not using a ix86-elf compiler"
|
#error "Not using a x86_64-elf compiler"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static inline uint64_t read_msr(uint32_t msr) {
|
||||||
|
uint32_t lo, hi;
|
||||||
|
__asm__ volatile("rdmsr" : "=a"(lo), "=d"(hi) : "c"(msr));
|
||||||
|
return ((uint64_t)hi << 32) | lo;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define IA32_EFER 0xC0000080
|
||||||
|
#define EFER_LMA (1 << 10)
|
||||||
|
|
||||||
|
int is_long_mode_active(void) {
|
||||||
|
uint64_t efer = read_msr(IA32_EFER);
|
||||||
|
return (efer & EFER_LMA) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
void kernel_main(void) {
|
void kernel_main(void) {
|
||||||
init_serial();
|
init_serial();
|
||||||
if (!test_serial()) {
|
if (!test_serial()) {
|
||||||
@@ -17,4 +31,10 @@ void kernel_main(void) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
serial_log(S_LOG, "Init serial succesfully.");
|
serial_log(S_LOG, "Init serial succesfully.");
|
||||||
|
|
||||||
|
if (!is_long_mode_active()) {
|
||||||
|
serial_log(S_ERR, "Kernel is not in long mode!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
serial_log(S_LOG, "Kernel is in long mode.");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/SimpleKernel
|
||||||
|
protocol: multiboot1
|
||||||
|
kernel_path: boot():/boot/kernel
|
||||||
Reference in New Issue
Block a user