diff options
author | Danny Holman <dholman@gymli.org> | 2025-05-03 18:15:25 -0500 |
---|---|---|
committer | Danny Holman <dholman@gymli.org> | 2025-05-04 11:51:11 -0500 |
commit | 6535758dff5f02739f5b28c5539ebeea28ca2f23 (patch) | |
tree | 69b095cfd2c279825dd94a6165b85d4155decdd7 | |
parent | 1cfbd25dc9eb39467406686c8ae1efbfd5517865 (diff) |
Create build infrastructure for a bootloader implementation. This loader
should support UEFI and be able to load an ELF kernel at a designated
entry point.
Signed-off-by: Danny Holman <dholman@gymli.org>
-rw-r--r-- | bootstrap/Makefile | 17 | ||||
-rw-r--r-- | bootstrap/stage1/Makefile | 16 | ||||
-rw-r--r-- | bootstrap/stage1/arch/x86_64/efi/entry.s | 25 | ||||
-rw-r--r-- | bootstrap/stage1/arch/x86_64/efi/make.config | 5 | ||||
-rw-r--r-- | bootstrap/stage1/efi/Makefile | 49 | ||||
-rw-r--r-- | bootstrap/stage2/Makefile | 48 | ||||
-rw-r--r-- | bootstrap/stage2/arch/x86_64/linker.ld | 21 | ||||
-rw-r--r-- | bootstrap/stage2/arch/x86_64/make.config | 6 | ||||
-rw-r--r-- | bootstrap/stage2/init/init.c | 37 |
9 files changed, 224 insertions, 0 deletions
diff --git a/bootstrap/Makefile b/bootstrap/Makefile new file mode 100644 index 0000000..92f4c3e --- /dev/null +++ b/bootstrap/Makefile @@ -0,0 +1,17 @@ +SUBDIRS:=stage1 \ + stage2 \ + +export ARCH VERSION DESTDIR SYS_INCLUDE + +.PHONY: all clean $(SUBDIRS) + +all: $(SUBDIRS) + +subdirs: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) $(MAKECMDGOALS) -C $@ + +clean: $(SUBDIRS) + +install: $(SUBDIRS) diff --git a/bootstrap/stage1/Makefile b/bootstrap/stage1/Makefile new file mode 100644 index 0000000..b09f1ad --- /dev/null +++ b/bootstrap/stage1/Makefile @@ -0,0 +1,16 @@ +SUBDIRS:=efi \ + +export ARCH VERSION DESTDIR SYS_INCLUDE + +.PHONY: all clean $(SUBDIRS) + +all: $(SUBDIRS) + +subdirs: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) $(MAKECMDGOALS) -C $@ + +clean: $(SUBDIRS) + +install: $(SUBDIRS) diff --git a/bootstrap/stage1/arch/x86_64/efi/entry.s b/bootstrap/stage1/arch/x86_64/efi/entry.s new file mode 100644 index 0000000..411a9b2 --- /dev/null +++ b/bootstrap/stage1/arch/x86_64/efi/entry.s @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2025 Danny Holman <dholman@gymli.org> + * + * This file is part of BoxOS, a free and open-source Unix-like operating + * system. + * + * BoxOS is free software; you can redistribute it and/or modify under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * BoxOS; if not, see <https://www.gnu.org/licenses/>. + */ + +.section .text + +.global _uefi_start +_uefi_start: + call efi_main + ret diff --git a/bootstrap/stage1/arch/x86_64/efi/make.config b/bootstrap/stage1/arch/x86_64/efi/make.config new file mode 100644 index 0000000..eea15d2 --- /dev/null +++ b/bootstrap/stage1/arch/x86_64/efi/make.config @@ -0,0 +1,5 @@ +STAGE1_ARCH_INCLUDE=-I$(ARCHDIR)/include +STAGE1_ARCH_CFLAGS=-target x86_64-pc-win32-coff +STAGE1_ARCH_LDFLAGS= + +STAGE1_ARCH_OBJS=$(ARCHDIR)/entry.o \ diff --git a/bootstrap/stage1/efi/Makefile b/bootstrap/stage1/efi/Makefile new file mode 100644 index 0000000..b1a96ef --- /dev/null +++ b/bootstrap/stage1/efi/Makefile @@ -0,0 +1,49 @@ +INCLUDE?=-I$(ROOTDIR)kernel/arch/$(ARCH)/include +CFLAGS?=-O0 -fno-stack-protector -ffreestanding -fno-builtin -nostdinc -nostdlib +LDFLAGS?=-subsystem:efi_application -entry:_uefi_start + +# -- Do not edit below this line -- + +LD:=lld-link +INCLUDE:=$(INCLUDE) $(SYS_INCLUDE) +CFLAGS:=$(CFLAGS) -Wall -Wextra -DVERSION=\"$(VERSION)\" -DARCH=\"$(ARCH)\" -g +LDFLAGS:=$(LDFLAGS) +ARCH:=$(ARCH) +EFI:=boot-stage1.efi + +ARCHDIR=../arch/$(ARCH)/efi + +include $(ARCHDIR)/make.config + +INCLUDE:=$(INCLUDE) $(STAGE1_ARCH_INCLUDE) +CFLAGS:=$(CFLAGS) $(STAGE1_ARCH_CFLAGS) +LDFLAGS:=$(LDFLAGS) $(STAGE1_ARCH_LDFLAGS) + +OBJS=$(STAGE1_ARCH_OBJS) \ + efi.o \ + +.PHONY: all clean install +.SUFFIXES: .o .c .s + +all: $(EFI) + +$(EFI): $(OBJS) + @$(LD) $(LDFLAGS) -out:$@ $^ + @echo [LD] $@ + +.c.o: + @$(CC) -MD -c $< -o $@ $(CFLAGS) $(INCLUDE) -DVERSION=\"$(VERSION)\" + @echo [CC] $@ + +.s.o: + @$(CC) -MD -c $< -o $@ $(CFLAGS) $(INCLUDE) -DVERSION=\"$(VERSION)\" + @echo [AS] $@ + +clean: + $(RM) $(EFI) $(EFI:.efi=.lib) $(OBJS) $(OBJS:.o=.d) + +install: $(EFI) + mkdir -p $(DESTDIR)$(BOOTDIR) + install -m 0755 $(EFI) $(DESTDIR)$(BOOTDIR)/$(EFI) + +-include $(OBJS:.o=.d) diff --git a/bootstrap/stage2/Makefile b/bootstrap/stage2/Makefile new file mode 100644 index 0000000..938b5e8 --- /dev/null +++ b/bootstrap/stage2/Makefile @@ -0,0 +1,48 @@ +INCLUDE?=-Iinclude -I$(ROOTDIR)kernel/arch/$(ARCH)/include +CFLAGS?=-O0 -ffreestanding -std=gnu11 -fno-stack-protector +LDFLAGS?=-nostdlib + +# -- Do not edit below this line -- + +INCLUDE:=$(INCLUDE) $(SYS_INCLUDE) +CFLAGS:=$(CFLAGS) -Wall -Wextra -DVERSION=\"$(VERSION)\" -DARCH=\"$(ARCH)\" -g +LDFLAGS:=$(LDFLAGS) +ARCH:=$(ARCH) +ELF:=boot-stage2 + +ARCHDIR=arch/$(ARCH) + +include $(ARCHDIR)/make.config + +INCLUDE:=$(INCLUDE) $(STAGE2_ARCH_INCLUDE) +CFLAGS:=$(CFLAGS) $(STAGE2_ARCH_CFLAGS) +LDFLAGS:=$(LDFLAGS) $(STAGE2_ARCH_LDFLAGS) + +OBJS=$(STAGE2_ARCH_OBJS) \ + init/init.o \ + drivers/sata/sata.o \ + +.PHONY: all clean install +.SUFFIXES: .o .c .s + +all: $(ELF) + +$(ELF): $(OBJS) + @$(LD) --script=$(ARCHDIR)/linker.ld $(LDFLAGS) -o $@ $^ + @echo [LD] $@ + +.c.o: + @$(CC) -MD -c $< -o $@ $(CFLAGS) $(INCLUDE) + @echo [CC] $@ + +.s.o: + @$(CC) -MD -c $< -o $@ $(CFLAGS) $(INCLUDE) + @echo [AS] $@ + +clean: + $(RM) $(ELF) $(OBJS) $(OBJS:.o=.d) + +install: $(ELF) + install -m 0644 $(ELF) $(DESTDIR)$(BOOTDIR) + +-include $(OBJS:.o=.d) diff --git a/bootstrap/stage2/arch/x86_64/linker.ld b/bootstrap/stage2/arch/x86_64/linker.ld new file mode 100644 index 0000000..04b6148 --- /dev/null +++ b/bootstrap/stage2/arch/x86_64/linker.ld @@ -0,0 +1,21 @@ +ENTRY(bootstrap_main) + +SECTIONS { + . = 0x2000; + __bstart = .; + + .text : { + *(.text) + } + + .data : { + *(.data) + } + + .bss : { + *(.bss) + *(COMMON) + } + + __bend = .; +} diff --git a/bootstrap/stage2/arch/x86_64/make.config b/bootstrap/stage2/arch/x86_64/make.config new file mode 100644 index 0000000..3c73a35 --- /dev/null +++ b/bootstrap/stage2/arch/x86_64/make.config @@ -0,0 +1,6 @@ +STAGE2_ARCH_INCLUDE=-I$(ARCHDIR)/include +STAGE2_ARCH_CFLAGS=-target x86_64-pc-none-elf -mno-red-zone -mno-mmx -mno-sse -mno-sse2 +STAGE2_ARCH_LDFLAGS= +STAGE2_ARCH_LIBS= + +STAGE2_ARCH_OBJS= diff --git a/bootstrap/stage2/init/init.c b/bootstrap/stage2/init/init.c new file mode 100644 index 0000000..e224e19 --- /dev/null +++ b/bootstrap/stage2/init/init.c @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 Danny Holman <dholman@gymli.org> + * + * This file is part of BoxOS, a free and open-source Unix-like operating + * system. + * + * BoxOS is free software; you can redistribute it and/or modify under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * BoxOS is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * BoxOS; if not, see <https://www.gnu.org/licenses/>. + */ + +#include <sys/memory_map.h> +#include <sys/efi.h> +#include <elf.h> +#include <stdint.h> +#include <string.h> + +char* read_file(const char *filename) { +} + +uintptr_t load_kernel(const char *filename) { + char *buffer; +} + +void parse_cfg(const char *filename) { +} + +int bootstrap_main(mmap_entry_t *mmap, uintptr_t num_entries) { +} |