From 2cc8a36c1165322b66cf8895445bc8cd53b32f31 Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Tue, 1 Dec 2020 03:30:47 +0100 Subject: [PATCH] Improve multiarch support --- .gitignore | 2 +- Makefile | 6 ++++-- kernel/Makefile | 14 ++++++++------ kernel/src/arch/i386/ops.c | 4 +++- kernel/src/arch/x86_64/ops.c | 4 +++- kernel/src/hal/ops.h | 2 ++ kernel/src/main.c | 4 +++- 7 files changed, 24 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 7e54056..eced2d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ kornos.img -kernel/kernel +kernel/kernel* obj/ *.o diff --git a/Makefile b/Makefile index 69fea3d..e14317b 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,14 @@ COMPONENTS = kernel +ARCH ?= x86_64 + KERNEL_HDD = kornos.img .PHONY: clean all $(COMPONENTS) .DEFAULT_GOAL = $(KERNEL_HDD) $(COMPONENTS): - $(MAKE) -C $@ + $(MAKE) -C $@ $@-$(ARCH) disk: $(KERNEL_HDD) run: $(KERNEL_HDD) @@ -26,7 +28,7 @@ $(KERNEL_HDD): ext/limine/limine-install $(COMPONENTS) parted -s $(KERNEL_HDD) mklabel msdos parted -s $(KERNEL_HDD) mkpart primary 1 100% echfs-utils -m -p0 $(KERNEL_HDD) quick-format 32768 > /dev/null # silence UUID - @for f in $(COMPONENTS); do echo "Installing $$f ($$(du -h $$f/$$f | cut -f1))"; echfs-utils -m -p0 $@ import $$f/$$f $$f; done + @for f in $(COMPONENTS); do echo "Installing $$f ($$(du -h $$f/$$f | cut -f1))"; echfs-utils -m -p0 $@ import $$f/$$f-$(ARCH) $$f; done echfs-utils -m -p0 $(KERNEL_HDD) import ext/limine.cfg limine.cfg ext/limine/limine-install ext/limine/limine.bin $(KERNEL_HDD) diff --git a/kernel/Makefile b/kernel/Makefile index 34d83a1..af64cda 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -1,4 +1,6 @@ -ARCH ?= $(shell uname -m) +ARCHES = x86_64 i386 aarch64 + +ARCH ?= x86_64 CC = zig cc -target $(ARCH)-freestanding LD = ld -m elf_$(ARCH) @@ -16,18 +18,18 @@ TARGET := kernel CFILES := $(shell find src -path src/arch -prune -o -type f -name '*.c' -print) ARCHFILES := $(shell find src/arch/$(ARCH) -type f -name '*.c' -print) HFILES := $(shell find src -type f -name '*.h') -OBJ := $(patsubst src/%.c,obj/%.o,$(CFILES) $(ARCHFILES)) +OBJ := $(patsubst src/%.c,obj/$(ARCH)/%.o,$(CFILES) $(ARCHFILES)) .PHONY: all clean obj all: $(TARGET) -$(TARGET): $(OBJ) +$(TARGET)-$(ARCH): $(OBJ) $(LD) $(LDFLAGS) $(OBJ) -o $@ -obj/%.o: src/%.c $(HFILES) - @mkdir -p obj/arch/$(ARCH) +obj/$(ARCH)/%.o: src/%.c $(HFILES) + @mkdir -p obj/$(ARCH)/arch/$(ARCH) $(CC) $(CFLAGS) -c $< -o $@ clean: - rm -rf $(TARGET) obj zig-cache + rm -rf $(TARGET)* obj zig-cache diff --git a/kernel/src/arch/i386/ops.c b/kernel/src/arch/i386/ops.c index 4ebe70f..973b572 100644 --- a/kernel/src/arch/i386/ops.c +++ b/kernel/src/arch/i386/ops.c @@ -1,4 +1,6 @@ void halt_catch_fire() { asm volatile ("cli"); while(1) asm volatile ("hlt"); -} \ No newline at end of file +} + +const char *arch = "i386"; \ No newline at end of file diff --git a/kernel/src/arch/x86_64/ops.c b/kernel/src/arch/x86_64/ops.c index 4ebe70f..da74f84 100644 --- a/kernel/src/arch/x86_64/ops.c +++ b/kernel/src/arch/x86_64/ops.c @@ -1,4 +1,6 @@ void halt_catch_fire() { asm volatile ("cli"); while(1) asm volatile ("hlt"); -} \ No newline at end of file +} + +const char *arch = "x86_64"; \ No newline at end of file diff --git a/kernel/src/hal/ops.h b/kernel/src/hal/ops.h index 138d132..8d5289d 100644 --- a/kernel/src/hal/ops.h +++ b/kernel/src/hal/ops.h @@ -1 +1,3 @@ void halt_catch_fire(); + +extern const char *arch; \ No newline at end of file diff --git a/kernel/src/main.c b/kernel/src/main.c index 2e9d2f4..3b29358 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -2,7 +2,9 @@ #include "hal/ops.h" void kmain(int argc, char **argv) { - vga_puts("Kernel initialized!\n"); + vga_puts("Kernel initialized! Platform: "); + vga_puts(arch); + vga_putc('\n'); vga_puts("Bootloader information:\t"); for(int i = 0; i < argc; i++) { vga_puts(argv[i]);