From eca7c957e2d45f62cc6f7262f423422571cb4e12 Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Sun, 22 Mar 2026 14:55:37 +0100 Subject: [PATCH] Slight cleanup and fixed SSP --- .gitignore | 1 + kernel/include/bitmap.h | 25 --------------------- kernel/include/timer.h | 5 +---- kernel/makefile | 16 +++++++------- kernel/src/bitmap.c | 49 ----------------------------------------- kernel/src/kernel.c | 18 ++++----------- kernel/src/timer.c | 48 ---------------------------------------- 7 files changed, 14 insertions(+), 148 deletions(-) delete mode 100644 kernel/include/bitmap.h delete mode 100644 kernel/src/bitmap.c delete mode 100644 kernel/src/timer.c diff --git a/.gitignore b/.gitignore index a365fd3..e56bec8 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ DS_Store /.clangd /.cache /compile_commands.json +.ssp # Logs *.log diff --git a/kernel/include/bitmap.h b/kernel/include/bitmap.h deleted file mode 100644 index 52d650d..0000000 --- a/kernel/include/bitmap.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _BITMAP_H -#define _BITMAP_H - -#include - -#define BLOCK_SIZE 4096 -#define BMAP_NOT_FOUND ((size_t)-1) - -typedef struct bitmap_t { - void* map; - size_t blocks; // Eqiv. to # of bits - size_t bytes; // ceil(blocks / 8) - size_t used; // # of bits set to 0 - size_t membase; // Used with allocators - int ready; -} bitmap_t; - -void* bmap_ptr(bitmap_t* map, size_t bit); -void bmap_set(bitmap_t* map, size_t bit, int val); -int bmap_get(bitmap_t* map, size_t bit); -void bmap_set_area(bitmap_t* map, size_t base, size_t len, int val); -size_t bmap_get_area(bitmap_t* map, size_t len, int val); -void bmap_set_all(bitmap_t* map, int val); - -#endif diff --git a/kernel/include/timer.h b/kernel/include/timer.h index d21b0ee..1ec9779 100644 --- a/kernel/include/timer.h +++ b/kernel/include/timer.h @@ -14,11 +14,8 @@ int timer_init(void); void timer_wait(size_t ticks); -int pit_init(void); -void pit_phase(uint8_t ch, uint8_t mode, uint32_t hz); -void pit_handler(struct isr_int_frame* iframe); +int hpet_init(void); // TODO: rtc_init(void); -// TODO: hpet_init(void); #endif diff --git a/kernel/makefile b/kernel/makefile index 4ff1369..1fe1d31 100644 --- a/kernel/makefile +++ b/kernel/makefile @@ -9,24 +9,24 @@ OBJS_C = $(patsubst $(SRC)/%.c, $(BIN)/%.c.o, $(SRCS_C)) OBJS_S = $(patsubst $(SRC)/%.s, $(BIN)/%.s.o, $(SRCS_S)) OUT = $(SYSROOT)/boot/kernel.elf LINKER = ./linker.ld - -# Stack Canary -SSP := 0x$(shell openssl rand -hex 8) -CCFLAGS += -DSTACK_CHK_GUARD=$(SSP) +SSP = ./.ssp .PHONY: all clean all: $(OUT) $(OUT): $(OBJS_C) $(OBJS_S) $(LD) $(LDFLAGS) -T$(LINKER) -o $@ $^ -$(BIN)/%.c.o: $(SRC)/%.c +$(BIN)/%.c.o: $(SRC)/%.c $(SSP) @mkdir -p $(dir $@) - $(CC) $(CCFLAGS) -I$(INC) -c -o $@ $^ + $(CC) $(CCFLAGS) -DSTACK_CHK_GUARD=$(shell cat $(SSP)) -I$(INC) -c -o $@ $< $(BIN)/%.s.o: $(SRC)/%.s @mkdir -p $(dir $@) - $(AS) $(ASFLAGS) -o $@ $^ + $(AS) $(ASFLAGS) -o $@ $< + +$(SSP): + echo "0x$$(openssl rand -hex 8)UL" > $(SSP) clean: - rm -fr $(BIN) $(OUT) + rm -fr $(BIN) $(OUT) $(SSP) diff --git a/kernel/src/bitmap.c b/kernel/src/bitmap.c deleted file mode 100644 index 2f438e9..0000000 --- a/kernel/src/bitmap.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include - -#include - -void* bmap_ptr(bitmap_t* map, size_t bit) { - return (void*)(map->membase + bit * BLOCK_SIZE); -} - -void bmap_set(bitmap_t* map, size_t bit, int val) { - uint32_t* p = (uint32_t*)map->map; - if (val) p[bit / 32] |= (1 << (bit % 32)); - else p[bit / 32] &= ~(1 << (bit % 32)); - map->used += (val) ? 1 : -1; -} - -int bmap_get(bitmap_t* map, size_t bit) { - uint32_t* p = (uint32_t*)map->map; - return (p[bit / 32] & (1 << (bit % 32))) ? 1 : 0; -} - -void bmap_set_area(bitmap_t* map, size_t base, size_t len, int val) { - uint32_t align = dceil(base, BLOCK_SIZE); - uint32_t count = dceil(len, BLOCK_SIZE); - - while (count-- > 0) bmap_set(map, align++, val); -} - -size_t bmap_get_area(bitmap_t* map, size_t len, int val) { - if (len == 0) return BMAP_NOT_FOUND; - - uint32_t found = 0; - for (size_t i = 0; i < map->blocks; i++) { - if (bmap_get(map, i) == val) found++; - else found = 0; - - if (found >= len) return i - found + 1; - } - - return BMAP_NOT_FOUND; -} - -void bmap_set_all(bitmap_t* map, int val) { - uint8_t b = (val) ? 0xff : 0; - for (size_t i = 0; i < map->bytes; i++) ((uint8_t*)map->map)[i] = b; - if (val) map->used = map->blocks; - else map->used = 0; -} - diff --git a/kernel/src/kernel.c b/kernel/src/kernel.c index b759d5f..e6feb2f 100644 --- a/kernel/src/kernel.c +++ b/kernel/src/kernel.c @@ -1,15 +1,13 @@ #include -#include -#include #include #include #include #include -#include #include -#include -#include #include +#include + +#include __noreturn void _start(void) { @@ -35,16 +33,8 @@ void _start(void) { // Memory management if (pmm_init() != 0) panic("Failed to initalize Physical Memory Manager."); if (pag_init() != 0) panic("Failed to initalize Paging."); - //if (kmalloc_init() != 0) panic("Failed to initialize kernel heap."); - // Tasking - //if (timer_init() != 0) panic("Failed to initialize timer."); - //if (syscall_init() != 0) panic("Failed to initialize syscalls."); - //if (task_init() != 0) panic("Failed to initialize tasking."); - - // TODO: Load & run /sbin/init - - // We don't want to halt + // Patiently wait for things to do :) while (1); } diff --git a/kernel/src/timer.c b/kernel/src/timer.c deleted file mode 100644 index 8564f32..0000000 --- a/kernel/src/timer.c +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -//#include -#include - -#include - -size_t timer_ticks = 0; - -int timer_init(void) { - // TODO: Check what timer we can use and select the best one - return pit_init(); -} - -void timer_wait(size_t t) { - size_t req = timer_ticks + t; - while (req != timer_ticks); -} - -int pit_init(void) { - isr_register(0, pit_handler); - pit_phase(0, 2, TIMER_FREQ); - return 0; -} - -void pit_phase(uint8_t ch, uint8_t mode, uint32_t hz) { - if (ch > 2 || mode > 7) return; - - cli(); - - outb(PIT_CMD, ((ch << 6) | (3 << 4) | (mode << 1))); - - uint32_t div = PIT_DIV / hz; - outb(PIT_CH0 + ch, div & 0xFF); - outb(PIT_CH0 + ch, div >> 8); - debugf("[pit] Set PIT divisor to %d (%d Hz).\n", div, hz); - - sti(); -} - -void pit_handler(struct isr_int_frame* iframe) { - (void)iframe; // We must take it as an argument even if we don't use it - timer_ticks++; - - // TODO: This assumes the timer is at 1000 Hz - //if (timer_ticks % SCHED_QUANTUM == 0) schedule(); -} -