From 78c1891d87c4880289bf76fba82fa8ca0bf6a478 Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Tue, 29 Apr 2025 21:27:17 -0400 Subject: update makefiles --- Makefile | 106 ++++++++++++------------------------------- config.mk | 20 ++++++++ config/gdbinit | 2 +- config/grub.cfg | 2 +- font/default8x16.psfu | Bin 4969 -> 0 bytes kernel/Makefile | 39 ++++++++++++++++ kernel/cpu/idt.c | 3 +- kernel/font.S | 7 --- kernel/font/default8x16.psfu | Bin 0 -> 4969 bytes kernel/font/font.S | 7 +++ kernel/user.c | 14 +++--- user/Makefile | 58 +++++++++++------------ user/include/incbin.h | 1 - 13 files changed, 131 insertions(+), 128 deletions(-) create mode 100644 config.mk delete mode 100644 font/default8x16.psfu create mode 100644 kernel/Makefile delete mode 100644 kernel/font.S create mode 100644 kernel/font/default8x16.psfu create mode 100644 kernel/font/font.S diff --git a/Makefile b/Makefile index 5dc3e03..f5d6020 100644 --- a/Makefile +++ b/Makefile @@ -1,109 +1,59 @@ ### Copyright (c) 2025 Freya Murphy -.PHONY: build fmt clean qemu +.PHONY: build clean fmt qemu qemu-kvm qemu-gdb gdb .SILENT: -AS ?= as -CC ?= cc -LD ?= ld -CPP ?= cpp - -CPPFLAGS += -Ikernel/include - -CFLAGS += -O2 -CFLAGS += -std=c11 -CFLAGS += -Wall -Wextra -pedantic -CFLAGS += -fno-pie -fno-stack-protector -CFLAGS += -fno-omit-frame-pointer -ffreestanding -CFLAGS += -nostdlib -fno-builtin -mno-red-zone -CFLAGS += -D DEBUG -g -CFLAGS += $(CPPFLAGS) - -LDFLAGS += -nmagic -nostdlib -LDFLAGS += -z noexecstack - -SRC=kernel BIN=bin -KERNEL=kernel.bin ISO=os.iso -IMAGE=disk.img -IMAGE_SIZE=4G - -H_SRC = $(shell find $(SRC) -type f -name "*.h") -A_SRC = $(shell find $(SRC) -type f -name "*.S") -A_OBJ = $(patsubst %.S,$(BIN)/%.S.o,$(A_SRC)) -C_SRC = $(shell find $(SRC) -type f -name "*.c") -C_OBJ = $(patsubst %.c,$(BIN)/%.o,$(C_SRC)) - -UNAME := $(shell uname) -QEMU = qemu-system-x86_64 -QEMUOPTS = -cdrom $(BIN)/$(ISO) \ - -no-reboot \ - -drive format=raw,file=$(BIN)/user/apple\ - -serial mon:stdio \ - -m 4G \ - -name kern +QEMU ?= qemu-system-x86_64 +GRUB ?= grub-mkrescue -GRUB = grub-mkrescue +QEMUOPTS += -cdrom $(BIN)/$(ISO) \ + -no-reboot \ + -drive format=raw,file=user/bin/apple \ + -serial mon:stdio \ + -m 4G \ + -name kern ifdef UEFI QEMU = qemu-system-x86_64-uefi GRUB = grub-mkrescue-uefi endif -qemu: $(BIN)/$(ISO) $(BIN)/$(IMAGE) +ifndef DISPLAY +QEMUOPTS += -nographic +endif + +qemu: $(BIN)/$(ISO) $(QEMU) $(QEMUOPTS) -qemu-kvm: $(BIN)/$(ISO) $(BIN)/$(IMAGE) +qemu-kvm: $(BIN)/$(ISO) $(QEMU) $(QEMUOPTS) -cpu host --enable-kvm -qemu-kvm-nox: $(BIN)/$(ISO) $(BIN)/$(IMAGE) - $(QEMU) $(QEMUOPTS) -cpu host --enable-kvm -nographic - -qemu-nox: $(BIN)/$(ISO) $(BIN)/$(IMAGE) - $(QEMU) $(QEMUOPTS) -nographic - -qemu-gdb: $(BIN)/$(ISO) $(BIN)/$(IMAGE) +qemu-gdb: $(BIN)/$(ISO) $(QEMU) $(QEMUOPTS) -S -gdb tcp::1337 -qemu-gdb-nox: $(BIN)/$(ISO) $(BIN)/$(IMAGE) - $(QEMU) $(QEMUOPTS) -nographic -S -gdb tcp::1337 - gdb: gdb -q -n -x config/gdbinit -clean: - rm -fr $(BIN) - -build: $(BIN)/$(KERNEL) +build: + make -s -C kernel make -s -C user -$(A_OBJ): $(BIN)/%.S.o : %.S $(H_SRC) - mkdir -p $(@D) - printf "\033[33m AS \033[0m%s\n" $< - $(CPP) $(CPPFLAGS) -o $@.cpp $< - $(AS) -o $@ $@.cpp - -$(C_OBJ): $(BIN)/%.o : %.c $(H_SRC) - mkdir -p $(@D) - printf "\033[34m CC \033[0m%s\n" $< - $(CC) -c $(CFLAGS) -o $@ $< +clean: + rm -fr $(BIN) + make -s -C kernel clean + make -s -C user clean -$(BIN)/$(KERNEL): $(C_OBJ) $(A_OBJ) - mkdir -p $(@D) - printf "\033[32m LD \033[0m%s\n" $@ - $(LD) $(LDFLAGS) -T config/kernel.ld -o $(BIN)/$(KERNEL) $(A_OBJ) $(C_OBJ) +fmt: + clang-format -i $(shell find -type f -name "*.[ch]" -and -not -path "./kernel/old/*") + sed -i 's/[ \t]*$$//' $(shell find -type f -name "*.[chS]" -and -not -path "./kernel/old/*") -$(BIN)/$(ISO): $(BIN)/$(KERNEL) +$(BIN)/$(ISO): build config/grub.cfg + printf "\033[35m ISO \033[0m%s\n" $@ mkdir -p $(BIN)/iso/boot/grub cp config/grub.cfg $(BIN)/iso/boot/grub - cp $(BIN)/$(KERNEL) $(BIN)/iso/boot + cp kernel/bin/kernel $(BIN)/iso/boot $(GRUB) -o $(BIN)/$(ISO) bin/iso 2>/dev/null -$(BIN)/$(IMAGE): build - qemu-img create $(BIN)/$(IMAGE) $(IMAGE_SIZE) - -fmt: - clang-format -i $(shell find -type f -name "*.[ch]" -and -not -path "./kernel/old/*") - sed -i 's/[ \t]*$$//' $(shell find -type f -name "*.[chS]" -and -not -path "./kernel/old/*") diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..c9cc9df --- /dev/null +++ b/config.mk @@ -0,0 +1,20 @@ + +AS ?= as +AR ?= ar +CC ?= cc +LD ?= ld +CPP ?= cpp + +CPPFLAGS += -Iinclude + +CFLAGS += -O2 +CFLAGS += -std=c11 +CFLAGS += -Wall -Wextra -pedantic +CFLAGS += -no-pie -fno-stack-protector +CFLAGS += -fno-omit-frame-pointer -ffreestanding +CFLAGS += -nostdlib -fno-builtin -mno-red-zone +CFLAGS += -D DEBUG -g +CFLAGS += $(CPPFLAGS) + +LDFLAGS += -nmagic -nostdlib +LDFLAGS += -z noexecstack diff --git a/config/gdbinit b/config/gdbinit index 30497c6..e253379 100644 --- a/config/gdbinit +++ b/config/gdbinit @@ -1,4 +1,4 @@ set architecture i386:x86-64 target remote localhost:1337 -symbol-file bin/kernel.bin +symbol-file kernel/bin/kernel display/i $pc diff --git a/config/grub.cfg b/config/grub.cfg index 76e28f3..62c9792 100644 --- a/config/grub.cfg +++ b/config/grub.cfg @@ -3,6 +3,6 @@ set default=0 insmod all_video menuentry "kern" { - multiboot2 /boot/kernel.bin + multiboot2 /boot/kernel boot } diff --git a/font/default8x16.psfu b/font/default8x16.psfu deleted file mode 100644 index e789b77..0000000 Binary files a/font/default8x16.psfu and /dev/null differ diff --git a/kernel/Makefile b/kernel/Makefile new file mode 100644 index 0000000..19051b9 --- /dev/null +++ b/kernel/Makefile @@ -0,0 +1,39 @@ +### Copyright (c) 2025 Freya Murphy + +include ../config.mk + +.PHONY: build fmt clean qemu +.SILENT: + +SRC=* +BIN=bin +KERNEL=kernel +LINKER=../config/kernel.ld +CONFIG=../config.mk + +H_SRC = $(shell find $(SRC) -type f -name "*.h") +A_SRC = $(shell find $(SRC) -type f -name "*.S") +A_OBJ = $(patsubst %.S,$(BIN)/%.S.o,$(A_SRC)) +C_SRC = $(shell find $(SRC) -type f -name "*.c") +C_OBJ = $(patsubst %.c,$(BIN)/%.o,$(C_SRC)) + +build: $(BIN)/$(KERNEL) + +clean: + rm -fr $(BIN) + +$(A_OBJ): $(BIN)/%.S.o : %.S $(H_SRC) $(CONFIG) + mkdir -p $(@D) + printf "\033[33m AS \033[0m%s\n" $< + $(CPP) $(CPPFLAGS) -o $@.cpp $< + $(AS) -o $@ $@.cpp + +$(C_OBJ): $(BIN)/%.o : %.c $(H_SRC) $(CONFIG) + mkdir -p $(@D) + printf "\033[34m CC \033[0m%s\n" $< + $(CC) -c $(CFLAGS) -o $@ $< + +$(BIN)/$(KERNEL): $(A_OBJ) $(C_OBJ) $(LINKER) + mkdir -p $(@D) + printf "\033[32m LD \033[0m%s\n" $@ + $(LD) $(LDFLAGS) -T $(LINKER) -o $(BIN)/$(KERNEL) $(A_OBJ) $(C_OBJ) diff --git a/kernel/cpu/idt.c b/kernel/cpu/idt.c index 2eab7ec..7cbbb65 100644 --- a/kernel/cpu/idt.c +++ b/kernel/cpu/idt.c @@ -156,7 +156,8 @@ __attribute__((noreturn)) void idt_exception_handler(uint64_t exception, void isr_save(struct cpu_regs *regs) { // make sure were in the kernel memory context - mem_ctx_switch(kernel_mem_ctx); + if (kernel_mem_ctx) + mem_ctx_switch(kernel_mem_ctx); // save pointer to registers state = regs; diff --git a/kernel/font.S b/kernel/font.S deleted file mode 100644 index 571876b..0000000 --- a/kernel/font.S +++ /dev/null @@ -1,7 +0,0 @@ - .globl en_font - - .section .rodata - - .align 8 -en_font: - .incbin "font/default8x16.psfu" diff --git a/kernel/font/default8x16.psfu b/kernel/font/default8x16.psfu new file mode 100644 index 0000000..e789b77 Binary files /dev/null and b/kernel/font/default8x16.psfu differ diff --git a/kernel/font/font.S b/kernel/font/font.S new file mode 100644 index 0000000..571876b --- /dev/null +++ b/kernel/font/font.S @@ -0,0 +1,7 @@ + .globl en_font + + .section .rodata + + .align 8 +en_font: + .incbin "font/default8x16.psfu" diff --git a/kernel/user.c b/kernel/user.c index f9b541c..e22248a 100644 --- a/kernel/user.c +++ b/kernel/user.c @@ -107,37 +107,37 @@ static int validate_elf_hdr(struct pcb *pcb) Elf64_Ehdr *ehdr = &pcb->elf_header; if (strncmp((const char *)ehdr->e_ident, ELFMAG, SELFMAG)) { - WARN("Invalid ELF File.\n"); + WARN("Invalid ELF File."); return 1; } if (ehdr->e_ident[EI_CLASS] != ELFCLASS64) { - WARN("Unsupported ELF Class.\n"); + WARN("Unsupported ELF Class."); return 1; } if (ehdr->e_ident[EI_DATA] != ELFDATA2LSB) { - ERROR("Unsupported ELF File byte order.\n"); + ERROR("Unsupported ELF File byte order."); return 1; } if (ehdr->e_machine != EM_X86_64) { - WARN("Unsupported ELF File target.\n"); + WARN("Unsupported ELF File target."); return 1; } if (ehdr->e_ident[EI_VERSION] != EV_CURRENT) { - WARN("Unsupported ELF File version.\n"); + WARN("Unsupported ELF File version."); return 1; } if (ehdr->e_phnum > N_ELF_SEGMENTS) { - WARN("Too many ELF segments.\n"); + WARN("Too many ELF segments."); return 1; } if (ehdr->e_type != ET_EXEC) { - ERROR("Unsupported ELF File type.\n"); + ERROR("Unsupported ELF File type."); return 1; } diff --git a/user/Makefile b/user/Makefile index 2e57dc8..20afb9d 100644 --- a/user/Makefile +++ b/user/Makefile @@ -1,31 +1,18 @@ ### Copyright (c) 2025 Freya Murphy +include ../config.mk + .PHONY: build clean .SILENT: -AS ?= as -AR ?= ar -CC ?= cc -LD ?= ld -CPP ?= cpp - -CPPFLAGS += -Iinclude - -CFLAGS += -O2 -CFLAGS += -std=c11 -CFLAGS += -Wall -Wextra -pedantic -CFLAGS += -no-pie -fPIC -fno-stack-protector -CFLAGS += -fno-omit-frame-pointer -ffreestanding -CFLAGS += -fno-builtin -mcmodel=large -CFLAGS += -D DEBUG -g -CFLAGS += $(CPPFLAGS) - -LDFLAGS += -nmagic -nostdlib -LDFLAGS += -z noexecstack +CFLAGS += -fPIC -mcmodel=large USER=* LIB=lib -BIN=../bin/user +BIN=bin +LINKER=../config/user.ld +CONFIG=../config.mk +TAR=initrd.tar H_SRC = $(shell find include -type f -name "*.h") LIBA_SRC = $(shell find $(LIB) -type f -name "*.S") @@ -34,35 +21,42 @@ LIBC_SRC = $(shell find $(LIB) -type f -name "*.c") LIBC_OBJ = $(patsubst %.c,$(BIN)/%.o,$(LIBC_SRC)) USER_SRC = $(shell find $(USER) -maxdepth 0 -type f -name "*.c") USER_OBJ = $(patsubst %.c,$(BIN)/%.o,$(USER_SRC)) -USER_PROJ = $(patsubst %.o,%,$(USER_OBJ)) +USER_PROG = $(patsubst %.o,%,$(USER_OBJ)) -build: $(USER_PROJ) +build: $(BIN)/$(TAR) clean: rm -fr $(BIN) -$(LIBA_OBJ): $(BIN)/%.S.o : %.S $(H_SRC) +$(BIN)/$(TAR): $(USER_PROG) + printf "\033[35m TAR \033[0m%s\n" $@ + mkdir -p $(BIN)/initrd/bin + cp $(USER_PROG) $(BIN)/initrd/bin + tar cHf ustar $(BIN)/$(TAR) -C $(BIN)/initrd bin + rm -fr $(BIN)/initrd + +$(LIBA_OBJ): $(BIN)/%.S.o : %.S $(H_SRC) $(CONFIG) mkdir -p $(@D) - printf "\033[33m AS \033[0m%s\n" user/$< + printf "\033[33m AS \033[0m%s\n" $< $(CPP) $(CPPFLAGS) -o $@.cpp $< $(AS) -o $@ $@.cpp -$(LIBC_OBJ): $(BIN)/%.o : %.c $(H_SRC) +$(LIBC_OBJ): $(BIN)/%.o : %.c $(H_SRC) $(CONFIG) mkdir -p $(@D) - printf "\033[34m CC \033[0m%s\n" user/$< + printf "\033[34m CC \033[0m%s\n" $< $(CC) -c $(CFLAGS) -o $@ $< $(BIN)/libc.a: $(LIBA_OBJ) $(LIBC_OBJ) @mkdir -p $(@D) - printf "\033[35m AR \033[0m%s\n" $(shell echo $@ | cut -c 4-) + printf "\033[35m AR \033[0m%s\n" $@ $(AR) rcs $@ $(LIBA_OBJ) $(LIBC_OBJ) -$(USER_OBJ): $(BIN)/%.o : %.c $(H_SRC) +$(USER_OBJ): $(BIN)/%.o : %.c $(H_SRC) $(CONFIG) mkdir -p $(@D) - printf "\033[34m CC \033[0m%s\n" user/$< + printf "\033[34m CC \033[0m%s\n" $< $(CC) -c $(CFLAGS) -o $@ $< -$(USER_PROJ): % : %.o $(BIN)/libc.a +$(USER_PROG): % : $(BIN)/libc.a %.o $(LINKER) mkdir -p $(@D) - printf "\033[32m LD \033[0m%s\n" $(shell echo $@ | cut -c 4-) - $(LD) $(LDFLAGS) -T ../config/user.ld -o $@ $< $(BIN)/libc.a + printf "\033[32m LD \033[0m%s\n" $@ + $(LD) $(LDFLAGS) -T $(LINKER) -o $@ $@.o $(BIN)/libc.a diff --git a/user/include/incbin.h b/user/include/incbin.h index 5a72345..700504e 100644 --- a/user/include/incbin.h +++ b/user/include/incbin.h @@ -8,7 +8,6 @@ */ #ifndef INCBIN_HDR #define INCBIN_HDR -#include #if defined(__AVX512BW__) || defined(__AVX512CD__) || defined(__AVX512DQ__) || \ defined(__AVX512ER__) || defined(__AVX512PF__) || defined(__AVX512VL__) || \ defined(__AVX512F__) -- cgit v1.2.3-freya