diff options
author | Freya Murphy <freya@freyacat.org> | 2025-04-29 21:27:17 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-04-30 11:23:59 -0400 |
commit | 78c1891d87c4880289bf76fba82fa8ca0bf6a478 (patch) | |
tree | 7d2f601cc57ede012e4ebfe45cf4f23c5ddc85f6 | |
parent | update fs headers 2.0 (diff) | |
download | comus-78c1891d87c4880289bf76fba82fa8ca0bf6a478.tar.gz comus-78c1891d87c4880289bf76fba82fa8ca0bf6a478.tar.bz2 comus-78c1891d87c4880289bf76fba82fa8ca0bf6a478.zip |
update makefiles
-rw-r--r-- | Makefile | 106 | ||||
-rw-r--r-- | config.mk | 20 | ||||
-rw-r--r-- | config/gdbinit | 2 | ||||
-rw-r--r-- | config/grub.cfg | 2 | ||||
-rw-r--r-- | kernel/Makefile | 39 | ||||
-rw-r--r-- | kernel/cpu/idt.c | 3 | ||||
-rw-r--r-- | kernel/font/default8x16.psfu (renamed from font/default8x16.psfu) | bin | 4969 -> 4969 bytes | |||
-rw-r--r-- | kernel/font/font.S (renamed from kernel/font.S) | 0 | ||||
-rw-r--r-- | kernel/user.c | 14 | ||||
-rw-r--r-- | user/Makefile | 58 | ||||
-rw-r--r-- | user/include/incbin.h | 1 |
11 files changed, 124 insertions, 121 deletions
@@ -1,109 +1,59 @@ ### Copyright (c) 2025 Freya Murphy <freya@freyacat.org> -.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/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 <freya@freyacat.org> + +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/font/default8x16.psfu b/kernel/font/default8x16.psfu Binary files differindex e789b77..e789b77 100644 --- a/font/default8x16.psfu +++ b/kernel/font/default8x16.psfu diff --git a/kernel/font.S b/kernel/font/font.S index 571876b..571876b 100644 --- a/kernel/font.S +++ b/kernel/font/font.S 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 <freya@freyacat.org> +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 <limits.h> #if defined(__AVX512BW__) || defined(__AVX512CD__) || defined(__AVX512DQ__) || \ defined(__AVX512ER__) || defined(__AVX512PF__) || defined(__AVX512VL__) || \ defined(__AVX512F__) |