summaryrefslogtreecommitdiff
path: root/bootstrap/stage1
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 /bootstrap/stage1
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>
Diffstat (limited to 'bootstrap/stage1')
-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
4 files changed, 95 insertions, 0 deletions
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)