diff --git a/Makefile b/Makefile index 95540e3..79bea62 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ GITSHA ?= $(shell git rev-parse --short HEAD) KERNEL_FILENAME:= popcorn.bin KERNEL_FONT := assets/fonts/tamsyn8x16r.psf -MODULES := +MODULES := kutil EFI_DIR := external/gnu-efi @@ -184,7 +184,7 @@ $(BUILD_D)/boot/%.c.o: src/boot/%.c $(INIT_DEP) $(CC) $(BOOT_CFLAGS) -c -o $@ $< $(BUILD_D)/kernel.elf: $(KERN_OBJS) $(MOD_TARGETS) $(ARCH_D)/kernel.ld - $(LD) $(LDFLAGS) -u _header -T $(ARCH_D)/kernel.ld -o $@ $(patsubst %,-l%,$(MODULES)) $(KERN_OBJS) + $(LD) $(LDFLAGS) -u _header -T $(ARCH_D)/kernel.ld -o $@ $(KERN_OBJS) $(patsubst %,-l%,$(MODULES)) $(OBJC) --only-keep-debug $@ $@.sym $(BUILD_D)/kernel.dump: $(BUILD_D)/kernel.elf diff --git a/src/kernel/acpi_tables.h b/src/kernel/acpi_tables.h index d50fa88..3743bae 100644 --- a/src/kernel/acpi_tables.h +++ b/src/kernel/acpi_tables.h @@ -3,7 +3,8 @@ #include #include -#include "util.h" +#include "kutil/coord.h" +#include "kutil/misc.h" struct acpi_table_header { @@ -21,7 +22,7 @@ struct acpi_table_header } __attribute__ ((packed)); #define TABLE_HEADER(signature) \ - static const uint32_t type_id = byteswap(signature); \ + static const uint32_t type_id = kutil::byteswap(signature); \ acpi_table_header header; diff --git a/src/kernel/util.cpp b/src/kernel/assert.cpp similarity index 96% rename from src/kernel/util.cpp rename to src/kernel/assert.cpp index 6f303a5..66ad5ed 100644 --- a/src/kernel/util.cpp +++ b/src/kernel/assert.cpp @@ -1,5 +1,5 @@ +#include "assert.h" #include "console.h" -#include "util.h" [[noreturn]] void __kernel_assert(const char *file, unsigned line, const char *message) diff --git a/src/kernel/assert.h b/src/kernel/assert.h new file mode 100644 index 0000000..1019d28 --- /dev/null +++ b/src/kernel/assert.h @@ -0,0 +1,5 @@ +#pragma once + +[[noreturn]] void __kernel_assert(const char *file, unsigned line, const char *message); + +#define kassert(stmt, message) if(!(stmt)) { __kernel_assert(__FILE__, __LINE__, (message)); } else {} diff --git a/src/kernel/console.h b/src/kernel/console.h index 3f748d8..0efbe9e 100644 --- a/src/kernel/console.h +++ b/src/kernel/console.h @@ -1,8 +1,8 @@ #pragma once +#include "kutil/coord.h" #include "font.h" #include "screen.h" -#include "util.h" struct console_data; @@ -34,8 +34,8 @@ private: font m_font; screen m_screen; - coord m_size; - coord m_pos; + kutil::coord m_size; + kutil::coord m_pos; screen::pixel_t m_fg, m_bg; uint16_t m_attr; diff --git a/src/kernel/device_manager.cpp b/src/kernel/device_manager.cpp index ad9c947..85915e1 100644 --- a/src/kernel/device_manager.cpp +++ b/src/kernel/device_manager.cpp @@ -1,10 +1,11 @@ #include #include +#include "kutil/memory.h" #include "acpi_tables.h" +#include "assert.h" #include "device_manager.h" #include "console.h" -#include "util.h" static const char expected_signature[] = "RSD PTR "; @@ -32,7 +33,8 @@ struct acpi2_rsdp } __attribute__ ((packed)); -uint8_t acpi_checksum(const void *p, size_t len, size_t off = 0) +uint8_t +acpi_checksum(const void *p, size_t len, size_t off = 0) { uint8_t sum = 0; const uint8_t *c = reinterpret_cast(p); @@ -115,9 +117,6 @@ device_manager::load_xsdt(const acpi_xsdt *xsdt) cons->puts("\n"); } -template -T read_from(const uint8_t *p) { return *reinterpret_cast(p); } - void device_manager::load_apic(const acpi_apic *apic) { @@ -143,8 +142,8 @@ device_manager::load_apic(const acpi_apic *apic) break; case 1: // I/O APIC - m_io_apic = reinterpret_cast(read_from(p+4)); - m_global_interrupt_base = read_from(p+8); + m_io_apic = reinterpret_cast(kutil::read_from(p+4)); + m_global_interrupt_base = kutil::read_from(p+8); cons->puts(" "); cons->put_hex((uint64_t)m_io_apic); cons->puts(" "); diff --git a/src/kernel/font.h b/src/kernel/font.h index 1299dca..47fd470 100644 --- a/src/kernel/font.h +++ b/src/kernel/font.h @@ -1,8 +1,8 @@ #pragma once #include +#include "kutil/coord.h" #include "screen.h" -#include "util.h" class font { @@ -28,7 +28,7 @@ private: font(); font(unsigned height, unsigned width, unsigned count, uint8_t const *data); - coord m_size; + kutil::coord m_size; unsigned m_count; uint8_t const *m_data; }; diff --git a/src/kernel/interrupts.cpp b/src/kernel/interrupts.cpp index 48b1e56..ae6442a 100644 --- a/src/kernel/interrupts.cpp +++ b/src/kernel/interrupts.cpp @@ -1,6 +1,7 @@ #include #include +#include "kutil/memory.h" #include "console.h" #include "interrupts.h" @@ -112,10 +113,8 @@ set_idt_entry(uint8_t i, uint64_t addr, uint16_t selector, uint8_t flags) void interrupts_init() { - uint8_t *p; - - p = reinterpret_cast(&g_gdt_table); - for (int i = 0; i < sizeof(g_gdt_table); ++i) p[i] = 0; + kutil::memset(&g_gdt_table, 0, sizeof(g_gdt_table)); + kutil::memset(&g_idt_table, 0, sizeof(g_idt_table)); g_gdtr.limit = sizeof(g_gdt_table) - 1; g_gdtr.base = reinterpret_cast(&g_gdt_table); @@ -129,8 +128,6 @@ interrupts_init() set_gdt_entry(7, 0, 0xfffff, true, gdt_flags::rw | gdt_flags::ex); gdt_write(); - p = reinterpret_cast(&g_idt_table); - for (int i = 0; i < sizeof(g_idt_table); ++i) p[i] = 0; g_idtr.limit = sizeof(g_idt_table) - 1; g_idtr.base = reinterpret_cast(&g_idt_table); diff --git a/src/kernel/screen.h b/src/kernel/screen.h index e1baef0..03bb7ce 100644 --- a/src/kernel/screen.h +++ b/src/kernel/screen.h @@ -2,7 +2,7 @@ #include #include -#include "util.h" +#include "kutil/coord.h" class screen { @@ -36,5 +36,5 @@ private: pixel_t *m_framebuffer; color_masks m_masks; - coord m_resolution; + kutil::coord m_resolution; }; diff --git a/src/kernel/util.h b/src/kernel/util.h deleted file mode 100644 index fa3e959..0000000 --- a/src/kernel/util.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -template -struct coord { - T x, y; - coord() : x(T{}), y(T{}) {} - coord(T x, T y) : x(x), y(y) {} - T size() const { return x * y; } -}; - -[[noreturn]] void __kernel_assert(const char *file, unsigned line, const char *message); - -#define kassert(stmt, message) if(!(stmt)) { __kernel_assert(__FILE__, __LINE__, (message)); } else {} - -constexpr uint32_t byteswap(uint32_t x) -{ - return ((x >> 24) & 0x000000ff) | ((x >> 8) & 0x0000ff00) - | ((x << 8) & 0x00ff0000) | ((x << 24) & 0xff000000); -} diff --git a/src/modules/kutil/coord.h b/src/modules/kutil/coord.h new file mode 100644 index 0000000..32425bf --- /dev/null +++ b/src/modules/kutil/coord.h @@ -0,0 +1,14 @@ +#pragma once + +namespace kutil { + +template +struct coord +{ + T x, y; + coord() : x(T{}), y(T{}) {} + coord(T x, T y) : x(x), y(y) {} + T size() const { return x * y; } +}; + +} // namespace kutil diff --git a/src/modules/kutil/memory.cpp b/src/modules/kutil/memory.cpp new file mode 100644 index 0000000..0cd81d5 --- /dev/null +++ b/src/modules/kutil/memory.cpp @@ -0,0 +1,13 @@ +#include "memory.h" + +namespace kutil { + +void * +memset(void *s, uint8_t v, size_t n) +{ + uint8_t *p = reinterpret_cast(s); + for (int i = 0; i < n; ++i) p[i] = 0; + return s; +} + +} // namespace kutil diff --git a/src/modules/kutil/memory.h b/src/modules/kutil/memory.h new file mode 100644 index 0000000..6af205e --- /dev/null +++ b/src/modules/kutil/memory.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + +namespace kutil { + +void * memset(void *p, uint8_t v, size_t n); + +template +T read_from(const void *p) { return *reinterpret_cast(p); } + +} // namespace kutil diff --git a/src/modules/kutil/misc.h b/src/modules/kutil/misc.h new file mode 100644 index 0000000..01cbf83 --- /dev/null +++ b/src/modules/kutil/misc.h @@ -0,0 +1,12 @@ +#pragma once + +namespace kutil { + +constexpr uint32_t +byteswap(uint32_t x) +{ + return ((x >> 24) & 0x000000ff) | ((x >> 8) & 0x0000ff00) + | ((x << 8) & 0x00ff0000) | ((x << 24) & 0xff000000); +} + +} diff --git a/src/kernel/module.mk b/src/modules/kutil/module.mk similarity index 51% rename from src/kernel/module.mk rename to src/modules/kutil/module.mk index 56bdd2e..f7a0fb7 100644 --- a/src/kernel/module.mk +++ b/src/modules/kutil/module.mk @@ -1,2 +1,2 @@ -MOD_NAME := main +MOD_NAME := kutil include modules.mk