Kernel: Improve kernel panic message and rename it 'panic'->'Panic'

This commit is contained in:
Bananymous 2023-01-09 14:56:20 +02:00
parent 531f470132
commit efd8638a96
19 changed files with 91 additions and 64 deletions

View File

@ -5,8 +5,8 @@
#include <string.h>
#if defined(__is_kernel)
#include <kernel/panic.h>
#define MUST(error) ({ auto e = error; if (e.IsError()) Kernel::panic("{}", e.GetError()); e.Value(); })
#include <kernel/Panic.h>
#define MUST(error) ({ auto e = error; if (e.IsError()) Kernel::Panic("{}", e.GetError()); e.Value(); })
#else
#error "NOT IMPLEMENTED"
#endif

View File

@ -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:

View File

@ -4,7 +4,7 @@
#include <kernel/IO.h>
#include <kernel/kprint.h>
#include <kernel/Paging.h>
#include <kernel/panic.h>
#include <kernel/Panic.h>
#include <kernel/PIC.h>
#include <kernel/Serial.h>

View File

@ -1,6 +1,6 @@
#include <kernel/APIC.h>
#include <kernel/IDT.h>
#include <kernel/panic.h>
#include <kernel/Panic.h>
#include <kernel/kprint.h>
#include <kernel/Serial.h>
@ -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)())

View File

@ -1,6 +1,6 @@
#include <kernel/CPUID.h>
#include <kernel/Paging.h>
#include <kernel/panic.h>
#include <kernel/Panic.h>
#include <string.h>
@ -58,8 +58,6 @@ namespace Paging
:: "r" (s_page_directory_pointer_table)
: "eax"
);
dprintln("Paging enabled");
}
void MapPage(uintptr_t address)

View File

@ -3,7 +3,7 @@
#include <kernel/kmalloc.h>
#include <kernel/multiboot.h>
#include <kernel/Paging.h>
#include <kernel/panic.h>
#include <kernel/Panic.h>
#include <kernel/Serial.h>
#include <kernel/VESA.h>
@ -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;
}

View File

@ -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 \

View File

@ -0,0 +1,31 @@
#pragma once
#include <kernel/kprint.h>
#include <kernel/Serial.h>
#include <kernel/VESA.h>
#define Panic(...) PanicImpl(__FILE__, __LINE__, __VA_ARGS__)
namespace Kernel
{
template<typename... Args>
__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();
}
}

View File

@ -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);

View File

@ -3,5 +3,5 @@
#include <BAN/Formatter.h>
#include <kernel/TTY.h>
#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__)

View File

@ -1,19 +0,0 @@
#pragma once
#include <kernel/kprint.h>
namespace Kernel
{
template<typename... Args>
__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();
}
}

View File

@ -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");
}
}

View File

@ -1,4 +1,4 @@
#include <kernel/panic.h>
#include <kernel/Panic.h>
#include <stdint.h>
#include <stdlib.h>
@ -16,7 +16,7 @@ __BEGIN_DECLS
__attribute__((noreturn))
void __stack_chk_fail(void)
{
Kernel::panic("Stack smashing detected");
Kernel::Panic("Stack smashing detected");
abort();
}

View File

@ -1,5 +1,5 @@
#include <kernel/kmalloc.h>
#include <kernel/panic.h>
#include <kernel/Panic.h>
#include <kernel/Serial.h>
#include <kernel/TTY.h>
#include <kernel/VESA.h>
@ -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);
}

View File

@ -2,12 +2,10 @@
#include <kernel/GDT.h>
#include <kernel/IDT.h>
#include <kernel/Input.h>
#include <kernel/IO.h>
#include <kernel/kmalloc.h>
#include <kernel/kprint.h>
#include <kernel/multiboot.h>
#include <kernel/Paging.h>
#include <kernel/panic.h>
#include <kernel/PIC.h>
#include <kernel/PIT.h>
#include <kernel/RTC.h>
@ -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())

View File

@ -1,6 +1,6 @@
#include <kernel/multiboot.h>
#include <kernel/kmalloc.h>
#include <kernel/panic.h>
#include <kernel/Panic.h>
#include <kernel/Serial.h>
#include <stdint.h>
@ -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;

View File

@ -1,7 +1,7 @@
#include <stdio.h>
#if defined(__is_libk)
#include <kernel/panic.h>
#include <kernel/Panic.h>
#else
#include <stdlib.h>
#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

View File

@ -2,14 +2,14 @@
#include <stdio.h>
#if defined(__is_libk)
#include <kernel/panic.h>
#include <kernel/Panic.h>
#endif
__attribute__((__noreturn__))
void abort(void)
{
#if defined(__is_libk)
Kernel::panic("abort()");
Kernel::Panic("abort()");
#else
printf("abort()\n");
#endif