summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanny Holman <dholman@gymli.org>2025-05-03 18:15:25 -0500
committerDanny Holman <dholman@gymli.org>2025-05-04 11:51:11 -0500
commit6535758dff5f02739f5b28c5539ebeea28ca2f23 (patch)
tree69b095cfd2c279825dd94a6165b85d4155decdd7
parent1cfbd25dc9eb39467406686c8ae1efbfd5517865 (diff)
bootstrap: create build filesHEADmaster
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/Makefile17
-rw-r--r--bootstrap/stage1/Makefile16
-rw-r--r--bootstrap/stage1/arch/x86_64/efi/entry.s25
-rw-r--r--bootstrap/stage1/arch/x86_64/efi/make.config5
-rw-r--r--bootstrap/stage1/efi/Makefile49
-rw-r--r--bootstrap/stage2/Makefile48
-rw-r--r--bootstrap/stage2/arch/x86_64/linker.ld21
-rw-r--r--bootstrap/stage2/arch/x86_64/make.config6
-rw-r--r--bootstrap/stage2/init/init.c37
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) {
+}