diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/Makefile | 39 | ||||
-rw-r--r-- | kernel/cpu/idt.c | 3 | ||||
-rw-r--r-- | kernel/font/default8x16.psfu | bin | 0 -> 4969 bytes | |||
-rw-r--r-- | kernel/font/font.S (renamed from kernel/font.S) | 0 | ||||
-rw-r--r-- | kernel/user.c | 14 |
5 files changed, 48 insertions, 8 deletions
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/kernel/font/default8x16.psfu b/kernel/font/default8x16.psfu Binary files differnew file mode 100644 index 0000000..e789b77 --- /dev/null +++ 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; } |