diff --git a/BAN/include/BAN/Errors.h b/BAN/include/BAN/Errors.h index c5a9bb8ad..02225d98d 100644 --- a/BAN/include/BAN/Errors.h +++ b/BAN/include/BAN/Errors.h @@ -5,8 +5,8 @@ #include #if defined(__is_kernel) - #include - #define MUST(error) ({ auto e = error; if (e.IsError()) Kernel::panic("{}", e.GetError()); e.Value(); }) + #include + #define MUST(error) ({ auto e = error; if (e.IsError()) Kernel::Panic("{}", e.GetError()); e.Value(); }) #else #error "NOT IMPLEMENTED" #endif diff --git a/kernel/Makefile b/kernel/Makefile index 22cd222f6..cd8862f50 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -32,6 +32,7 @@ BUILDDIR=$(abspath build) KERNEL_OBJS= \ $(KERNEL_ARCH_OBJS) \ kernel/build_libc.o \ +kernel/font.o \ kernel/Input.o \ kernel/kernel.o \ kernel/kmalloc.o \ @@ -41,6 +42,7 @@ kernel/RTC.o \ kernel/Serial.o \ kernel/Shell.o \ kernel/SSP.o \ +kernel/TTY.o \ icxxabi.o \ OBJS= \ @@ -81,7 +83,7 @@ $(ARCHDIR)/crtbegin.o $(ARCHDIR)/crtend.o: $(CC) -MD -c $< -o $(BUILDDIR)/$@ $(CFLAGS) always: - mkdir -p $(BUILDDIR)/arch/i386 + mkdir -p $(BUILDDIR)/$(ARCHDIR) mkdir -p $(BUILDDIR)/kernel clean: diff --git a/kernel/arch/i386/APIC.cpp b/kernel/arch/i386/APIC.cpp index 4ff7cb4c8..4dca75a4f 100644 --- a/kernel/arch/i386/APIC.cpp +++ b/kernel/arch/i386/APIC.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include diff --git a/kernel/arch/i386/IDT.cpp b/kernel/arch/i386/IDT.cpp index 4b093ee49..f9d1f94e2 100644 --- a/kernel/arch/i386/IDT.cpp +++ b/kernel/arch/i386/IDT.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include @@ -54,7 +54,7 @@ static void (*s_irq_handlers[0xFF])() { nullptr }; kprintln("eax=0x{8H}, ebx=0x{8H}, ecx=0x{8H}, edx=0x{8H}", eax, ebx, ecx, edx); \ kprintln("esp=0x{8H}, ebp=0x{8H}", esp, ebp); \ kprintln("CR0=0x{8H} CR2=0x{8H} CR3=0x{8H} CR4=0x{8H}", cr0, cr2, cr3, cr4); \ - Kernel::panic(msg); \ + Kernel::Panic(msg); \ } #define INTERRUPT_HANDLER_ERR(i, msg) \ @@ -76,7 +76,7 @@ static void (*s_irq_handlers[0xFF])() { nullptr }; kprintln("eax=0x{8H}, ebx=0x{8H}, ecx=0x{8H}, edx=0x{8H}", eax, ebx, ecx, edx); \ kprintln("esp=0x{8H}, ebp=0x{8H}", esp, ebp); \ kprintln("CR0=0x{8H} CR2=0x{8H} CR3=0x{8H} CR4=0x{8H}", cr0, cr2, cr3, cr4); \ - Kernel::panic(msg " (error code: 0x{8H})", error_code); \ + Kernel::Panic(msg " (error code: 0x{8H})", error_code); \ } INTERRUPT_HANDLER____(0x00, "Division Error") @@ -142,7 +142,7 @@ found: if (s_irq_handlers[irq]) s_irq_handlers[irq](); else - Kernel::panic("no handler for irq 0x{2H}\n", irq); + Kernel::Panic("no handler for irq 0x{2H}\n", irq); APIC::EOI(irq); } @@ -176,7 +176,7 @@ namespace IDT static void unimplemented_trap() { - Kernel::panic("Unhandeled IRQ"); + Kernel::Panic("Unhandeled IRQ"); } static void register_interrupt_handler(uint8_t index, void (*f)()) diff --git a/kernel/arch/i386/Paging.cpp b/kernel/arch/i386/Paging.cpp index 7bd0a7580..5382b60f8 100644 --- a/kernel/arch/i386/Paging.cpp +++ b/kernel/arch/i386/Paging.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include @@ -58,8 +58,6 @@ namespace Paging :: "r" (s_page_directory_pointer_table) : "eax" ); - - dprintln("Paging enabled"); } void MapPage(uintptr_t address) diff --git a/kernel/arch/i386/VESA.cpp b/kernel/arch/i386/VESA.cpp index 65165858b..163bc9986 100644 --- a/kernel/arch/i386/VESA.cpp +++ b/kernel/arch/i386/VESA.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include @@ -26,6 +26,7 @@ namespace VESA static uint32_t s_width = 0; static uint32_t s_height = 0; static uint8_t s_mode = 0; + static bool s_initialized = false; static uint32_t s_terminal_width = 0; static uint32_t s_terminal_height = 0; @@ -82,6 +83,11 @@ namespace VESA return s_terminal_height; } + bool IsInitialized() + { + return s_initialized; + } + bool Initialize() { if (!(s_multiboot_info->flags & MULTIBOOT_FLAGS_FRAMEBUFFER)) @@ -132,6 +138,7 @@ namespace VESA SetCursorPositionImpl(0, 0, Color::BRIGHT_WHITE); ClearImpl(Color::BLACK); + s_initialized = true; return true; } diff --git a/kernel/arch/i386/make.config b/kernel/arch/i386/make.config index 602250af9..c1e51d961 100644 --- a/kernel/arch/i386/make.config +++ b/kernel/arch/i386/make.config @@ -7,9 +7,7 @@ KERNEL_ARCH_OBJS= \ $(ARCHDIR)/APIC.o \ $(ARCHDIR)/boot.o \ $(ARCHDIR)/CPUID.o \ -$(ARCHDIR)/font.o \ $(ARCHDIR)/GDT.o \ $(ARCHDIR)/IDT.o \ $(ARCHDIR)/Paging.o \ -$(ARCHDIR)/TTY.o \ $(ARCHDIR)/VESA.o \ diff --git a/kernel/include/kernel/Panic.h b/kernel/include/kernel/Panic.h new file mode 100644 index 000000000..100912009 --- /dev/null +++ b/kernel/include/kernel/Panic.h @@ -0,0 +1,31 @@ +#pragma once + +#include +#include +#include + +#define Panic(...) PanicImpl(__FILE__, __LINE__, __VA_ARGS__) + +namespace Kernel +{ + + template + __attribute__((__noreturn__)) + static void PanicImpl(const char* file, int line, const char* message, Args... args) + { + if (VESA::IsInitialized()) + { + kprint("\e[31mKernel panic at {}:{}\n", file, line); + kprint(message, args...); + kprint("\e[m\n"); + } + else + { + derrorln("Kernel panic at {}:{}", file, line); + derrorln(message, args...); + } + asm volatile("cli; hlt"); + __builtin_unreachable(); + } + +} \ No newline at end of file diff --git a/kernel/include/kernel/VESA.h b/kernel/include/kernel/VESA.h index 32ae48688..f6d13744f 100644 --- a/kernel/include/kernel/VESA.h +++ b/kernel/include/kernel/VESA.h @@ -26,6 +26,7 @@ namespace VESA }; bool Initialize(); + bool IsInitialized(); void PutBitmapAt(const uint8_t*, uint32_t, uint32_t, Color); void PutBitmapAt(const uint8_t*, uint32_t, uint32_t, Color, Color); void PutCharAt(uint16_t, uint32_t, uint32_t, Color, Color); diff --git a/kernel/include/kernel/kprint.h b/kernel/include/kernel/kprint.h index c6727036a..eb91f865c 100644 --- a/kernel/include/kernel/kprint.h +++ b/kernel/include/kernel/kprint.h @@ -3,5 +3,5 @@ #include #include -#define kprint(...) BAN::Formatter::print(TTY::PutCharCurrent, __VA_ARGS__) +#define kprint(...) BAN::Formatter::print(TTY::PutCharCurrent, __VA_ARGS__) #define kprintln(...) BAN::Formatter::println(TTY::PutCharCurrent, __VA_ARGS__) diff --git a/kernel/include/kernel/panic.h b/kernel/include/kernel/panic.h deleted file mode 100644 index b74e872c3..000000000 --- a/kernel/include/kernel/panic.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include - -namespace Kernel -{ - - template - __attribute__((__noreturn__)) - static void panic(const char* message, Args... args) - { - kprint("\e[31mKernel panic: "); - kprint(message, args...); - kprint("\e[m\n"); - asm volatile("cli; hlt"); - __builtin_unreachable(); - } - -} \ No newline at end of file diff --git a/kernel/kernel/Input.cpp b/kernel/kernel/Input.cpp index fccf1b63b..2383dc23a 100644 --- a/kernel/kernel/Input.cpp +++ b/kernel/kernel/Input.cpp @@ -307,7 +307,7 @@ namespace Input } else { - Kernel::panic("Unknown target"); + Kernel::Panic("Unknown target"); } } @@ -317,20 +317,20 @@ namespace Input { auto& command = s_command_queue.Front(); if (command.target != TARGET_KEYBOARD && command.target != TARGET_MOUSE) - Kernel::panic("Undefined target for command 0x{2H}", command.command); + Kernel::Panic("Undefined target for command 0x{2H}", command.command); if (command._sent == 0 && command._ack == 0) { command._sent++; if (!i8042_command(command.target, command.command)) - Kernel::panic("PS/2 command oof {}, 0x{2H}", command.target, command.command); + Kernel::Panic("PS/2 command oof {}, 0x{2H}", command.target, command.command); } if (command._sent == 1 && command._ack == 1 && command.has_data) { command._sent++; if (!i8042_command(command.target, command.data)) - Kernel::panic("PS/2 data oof {}, 0x{2H}", command.target, command.data); + Kernel::Panic("PS/2 data oof {}, 0x{2H}", command.target, command.data); } if (command._sent > 0 && PIT::ms_since_boot() > s_command_sent + 1000) @@ -349,14 +349,14 @@ namespace Input { case I8042_KB_RESET: if (s_command_response[0] != I8042_KB_SELF_TEST_PASS) - Kernel::panic("PS/2 Keyboard self test failed"); + Kernel::Panic("PS/2 Keyboard self test failed"); break; case I8042_KB_SET_SCAN_CODE_SET: break; case I8042_KB_SET_LEDS: break; default: - Kernel::panic("PS/2 Keyboard unhandled command"); + Kernel::Panic("PS/2 Keyboard unhandled command"); } } else if (command.target == TARGET_MOUSE) @@ -365,16 +365,16 @@ namespace Input { case I8042_MOUSE_RESET: if (s_command_response[0] != I8042_MOUSE_SELF_TEST_PASS) - Kernel::panic("PS/2 Mouse self test failed"); + Kernel::Panic("PS/2 Mouse self test failed"); if (s_command_response[1] != 0x00) - Kernel::panic("PS/2 Mouse invalid byte sent after self test"); + Kernel::Panic("PS/2 Mouse invalid byte sent after self test"); break; case I8042_MOUSE_ENABLE: break; case I8042_MOUSE_DISABLE: break; default: - Kernel::panic("PS/2 Mouse unhandled command"); + Kernel::Panic("PS/2 Mouse unhandled command"); } } diff --git a/kernel/kernel/SSP.cpp b/kernel/kernel/SSP.cpp index 8c5bef374..6d1bc8b34 100644 --- a/kernel/kernel/SSP.cpp +++ b/kernel/kernel/SSP.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -16,7 +16,7 @@ __BEGIN_DECLS __attribute__((noreturn)) void __stack_chk_fail(void) { - Kernel::panic("Stack smashing detected"); + Kernel::Panic("Stack smashing detected"); abort(); } diff --git a/kernel/arch/i386/TTY.cpp b/kernel/kernel/TTY.cpp similarity index 99% rename from kernel/arch/i386/TTY.cpp rename to kernel/kernel/TTY.cpp index 3cfc9c72c..afb90c938 100644 --- a/kernel/arch/i386/TTY.cpp +++ b/kernel/kernel/TTY.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include @@ -242,7 +242,7 @@ void TTY::HandleAnsiEscape(uint16_t ch) void TTY::RenderFromBuffer(uint32_t x, uint32_t y) { if (x >= m_width || y >= m_height) - Kernel::panic("invalid render from buffer, {} {}", x, y); + Kernel::Panic("invalid render from buffer, {} {}", x, y); const auto& cell = m_buffer[y * m_width + x]; VESA::PutCharAt(cell.character, x, y, cell.foreground, cell.background); } diff --git a/kernel/arch/i386/font.c b/kernel/kernel/font.c similarity index 100% rename from kernel/arch/i386/font.c rename to kernel/kernel/font.c diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index a02de45ab..3628d1151 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -2,12 +2,10 @@ #include #include #include -#include #include #include #include #include -#include #include #include #include @@ -62,8 +60,15 @@ extern "C" void kernel_main(multiboot_info_t* mbi, uint32_t magic) return; } + + dprintln("hello from 64 bit protected mode!"); + Paging::Initialize(); + dprintln("paging enabled"); + + return; + s_multiboot_info = mbi; if (!VESA::Initialize()) diff --git a/kernel/kernel/kmalloc.cpp b/kernel/kernel/kmalloc.cpp index 7d61fc240..c2d5d4a0e 100644 --- a/kernel/kernel/kmalloc.cpp +++ b/kernel/kernel/kmalloc.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include @@ -48,7 +48,7 @@ static bool s_initialized = false; void kmalloc_initialize() { if (!(s_multiboot_info->flags & (1 << 6))) - Kernel::panic("Kmalloc: Bootloader didn't provide a memory map"); + Kernel::Panic("Kmalloc: Bootloader didn't provide a memory map"); // Validate kmalloc memory bool valid = false; @@ -70,7 +70,7 @@ void kmalloc_initialize() } if (!valid) - Kernel::panic("Kmalloc: Could not find {} MB of memory", (double)(s_kmalloc_eternal_end - s_kmalloc_node_base)); + Kernel::Panic("Kmalloc: Could not find {} MB of memory", (double)(s_kmalloc_eternal_end - s_kmalloc_node_base)); s_kmalloc_node_count = 1; s_kmalloc_node_head = (kmalloc_node*)s_kmalloc_node_base; @@ -90,7 +90,9 @@ void kmalloc_initialize() void kmalloc_dump_nodes() { - if (!s_initialized) Kernel::panic("kmalloc not initialized!"); + if (!s_initialized) + Kernel::Panic("kmalloc not initialized!"); + dprintln("Kmalloc memory available {} MB", (float)s_kmalloc_available / MB); dprintln("Kmalloc memory allocated {} MB", (float)s_kmalloc_allocated / MB); dprintln("Using {}/{} nodes", s_kmalloc_node_count, s_kmalloc_max_nodes); @@ -103,13 +105,14 @@ void kmalloc_dump_nodes() void* kmalloc_eternal(size_t size) { - if (!s_initialized) Kernel::panic("kmalloc not initialized!"); + if (!s_initialized) + Kernel::Panic("kmalloc not initialized!"); if (size % ALIGN) size += ALIGN - (size % ALIGN); if (s_kmalloc_eternal_ptr % ALIGN) - Kernel::panic("Unaligned ptr in kmalloc_eternal"); + Kernel::Panic("Unaligned ptr in kmalloc_eternal"); if (s_kmalloc_eternal_ptr + size > s_kmalloc_eternal_end) { @@ -124,7 +127,8 @@ void* kmalloc_eternal(size_t size) void* kmalloc(size_t size) { - if (!s_initialized) Kernel::panic("kmalloc not initialized!"); + if (!s_initialized) + Kernel::Panic("kmalloc not initialized!"); if (size % ALIGN) size += ALIGN - (size % ALIGN); @@ -155,7 +159,7 @@ void* kmalloc(size_t size) { valid_node.free = false; if (valid_node.addr % ALIGN) - Kernel::panic("Unaligned ptr in kmalloc"); + Kernel::Panic("Unaligned ptr in kmalloc"); return (void*)valid_node.addr; } @@ -184,13 +188,13 @@ void* kmalloc(size_t size) s_kmalloc_available -= size; if (valid_node.addr % ALIGN) - Kernel::panic("Unaligned ptr in kmalloc"); + Kernel::Panic("Unaligned ptr in kmalloc"); return (void*)valid_node.addr; } void kfree(void* addr) { - if (!s_initialized) Kernel::panic("kmalloc not initialized!"); + if (!s_initialized) Kernel::Panic("kmalloc not initialized!"); if (addr == nullptr) return; diff --git a/libc/stdio/putchar.cpp b/libc/stdio/putchar.cpp index e1e82c5db..80b4632fd 100644 --- a/libc/stdio/putchar.cpp +++ b/libc/stdio/putchar.cpp @@ -1,7 +1,7 @@ #include #if defined(__is_libk) - #include + #include #else #include #endif @@ -9,7 +9,7 @@ int putchar(int c) { #if defined(__is_libk) - Kernel::panic("Please use kprint() instead of stdio"); + Kernel::Panic("Please use kprint() instead of stdio"); #else abort(); #endif diff --git a/libc/stdlib/abort.cpp b/libc/stdlib/abort.cpp index 72ef6d50c..5f30c6107 100644 --- a/libc/stdlib/abort.cpp +++ b/libc/stdlib/abort.cpp @@ -2,14 +2,14 @@ #include #if defined(__is_libk) -#include +#include #endif __attribute__((__noreturn__)) void abort(void) { #if defined(__is_libk) - Kernel::panic("abort()"); + Kernel::Panic("abort()"); #else printf("abort()\n"); #endif