aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/linker.ld61
-rw-r--r--src/makefile69
2 files changed, 114 insertions, 16 deletions
diff --git a/src/linker.ld b/src/linker.ld
new file mode 100644
index 0000000..8eba287
--- /dev/null
+++ b/src/linker.ld
@@ -0,0 +1,61 @@
+ENTRY(_start)
+OUTPUT_FORMAT(elf32-i386)
+
+VADDR_BASE = 0xc0000000;
+
+SECTIONS
+{
+ /*
+ * First put the multiboot header, as it is required to be put very early
+ * early in the image or the bootloader won't recognize the file format.
+ */
+ . = 0;
+ .multiboot : {
+ . = ALIGN(8);
+ begin_multiboot = .;
+ KEEP(*(.multiboot.header))
+ *(.multiboot.text)
+ *(.multiboot.pages))
+ end_multiboot = .;
+ }
+
+ /* Begin putting sections at 4 MiB */
+ . = VADDR_BASE;
+
+ .text ALIGN(4K) : AT(ADDR(.text) - VADDR_BASE + 4M) {
+ begin_text = .;
+ *(.text*)
+ end_text = .;
+ }
+
+ /* Read-only data. */
+ .rodata ALIGN(4K) : AT(ADDR(.rodata) - VADDR_BASE + 4M) {
+ begin_rodata = .;
+ *(.rodata*)
+ end_rodata = .;
+ }
+
+ /* Read-write data (initialized) */
+ .data ALIGN(4K) : AT(ADDR(.data) - VADDR_BASE + 4M) {
+ begin_data = .;
+ begin_constinit = .;
+ *(.constinit)
+ end_constinit = .;
+
+ begin_ctors = .;
+ KEEP(*(.init_array)); /* global constructors */
+ end_ctors = .;
+
+ *(.data)
+ end_data = .;
+ }
+
+ /* Read-write data (uninitialized) and stack */
+ .bss ALIGN(4K) : AT(ADDR(.bss) - VADDR_BASE + 4M) {
+ begin_bss = .;
+ *(.pages)
+ *(.bss*)
+ *(.stack)
+ end_bss = .;
+ }
+}
diff --git a/src/makefile b/src/makefile
index 6e8545d..96507ce 100644
--- a/src/makefile
+++ b/src/makefile
@@ -1,18 +1,21 @@
-AS_OBJ += src/boot.o \
- src/idt/stubs.o
-
-CXX_OBJ += src/kernel.o \
- src/kernel/dump_gdt.o src/kernel/dump_multiboot.o src/kernel/multiboot.o \
- src/cpu/cpu.o \
- src/gdt.o \
- src/gdt/segmentdescriptor.o \
- src/idt.o \
- src/idt/exception.o src/idt/interruptgate.o src/idt/interrupthandler.o \
- src/vmm.o \
- src/allocator.o \
- src/scheduler.o src/scheduler/task.o
-
-src/cpu/irq.h: $(OBJ_DIR)/src/idt/stubs.o
+AS_OBJ = boot.o idt/stubs.o
+AS_OBJ := $(addprefix $(OBJ_DIR)/, $(AS_OBJ))
+
+CXX_OBJ = kernel.o \
+ kernel/dump_gdt.o kernel/dump_multiboot.o kernel/multiboot.o \
+ cpu/cpu.o \
+ gdt.o \
+ gdt/segmentdescriptor.o \
+ idt.o \
+ idt/exception.o idt/interruptgate.o idt/interrupthandler.o \
+ vmm.o \
+ allocator.o \
+ scheduler.o scheduler/task.o
+CXX_OBJ := $(addprefix $(OBJ_DIR)/, $(CXX_OBJ))
+CXX_DEP = $(CXX_OBJ:%.o=%.d)
+CXX_JSON = $(CXX_OBJ:.o=.json)
+
+cpu/irq.h: $(OBJ_DIR)/idt/stubs.o
@echo " GEN $@"
@echo '#pragma once' > $@
@echo 'extern "C" {' >> $@
@@ -20,4 +23,38 @@ src/cpu/irq.h: $(OBJ_DIR)/src/idt/stubs.o
@for x in $^; do $(NM) $$x -g | $(SED) -nr 's/[0-9a-f]{8} T (.+)/void \1();/p'; done >> $@
@echo '}' >> $@
-autogen := $(autogen) src/cpu/irq.h
+autogen := $(autogen) cpu/irq.h
+
+.PHONY: all test clean
+all: $(OBJ_DIR)/kernel.a
+test: $(TEST_CXX_OBJ)
+
+$(AS_OBJ): $(OBJ_DIR)/%.o: %.S
+ @mkdir -p $(@D)
+ @echo " AS $<"
+ @$(AS) -target $(TARGET) $(AS_FLAGS) $(CXX_INCLUDE) -c $^ -o $@
+
+-include $(CXX_DEP)
+$(CXX_OBJ) : $(OBJ_DIR)/%.o : %.cc
+ @mkdir -p $(@D)
+ @echo " CXX $<"
+ @$(CXX) -target $(TARGET) $(CXX_FLAGS) $(CXX_INCLUDE) -MMD -MJ$(subst .o,.json,$@) -c $< -o $@
+
+$(OBJ_DIR)/glitch.elf: $(autogen) $(AS_OBJ) $(CXX_OBJ) linker.ld
+ @echo " LD $@"
+ @$(LD) $(LD_FLAGS) -o $@ $(AS_OBJ) $(CXX_OBJ) -lk -ld
+
+# constexpr tests
+-include $(TEST_CXX_DEP)
+$(TEST_CXX_OBJ): $(OBJ_DIR)/%.o : %.cc
+ @mkdir -p $(@D)
+ @echo " TEST $<"
+ @$(TEST_CXX) -target $(TARGET) $(TEST_CXX_FLAGS) $(CXX_INCLUDE) -MMD -c $< -o $@
+
+compile_commands.json: $(CXX_JSON)
+ @echo [ > $@
+ @cat $(CXX_JSON) >> $@
+ @echo ] >> $@
+
+clean:
+ @rm -f $(AS_OBJ) $(CXX_OBJ) $(CXX_TEST_OBJ) $(OBJ_DIR)/glitch.elf