Kernel: Improve kernel panic message and rename it 'panic'->'Panic'
This commit is contained in:
parent
531f470132
commit
efd8638a96
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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)())
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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__)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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())
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue