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>
|
#include <string.h>
|
||||||
|
|
||||||
#if defined(__is_kernel)
|
#if defined(__is_kernel)
|
||||||
#include <kernel/panic.h>
|
#include <kernel/Panic.h>
|
||||||
#define MUST(error) ({ auto e = error; if (e.IsError()) Kernel::panic("{}", e.GetError()); e.Value(); })
|
#define MUST(error) ({ auto e = error; if (e.IsError()) Kernel::Panic("{}", e.GetError()); e.Value(); })
|
||||||
#else
|
#else
|
||||||
#error "NOT IMPLEMENTED"
|
#error "NOT IMPLEMENTED"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -32,6 +32,7 @@ BUILDDIR=$(abspath build)
|
||||||
KERNEL_OBJS= \
|
KERNEL_OBJS= \
|
||||||
$(KERNEL_ARCH_OBJS) \
|
$(KERNEL_ARCH_OBJS) \
|
||||||
kernel/build_libc.o \
|
kernel/build_libc.o \
|
||||||
|
kernel/font.o \
|
||||||
kernel/Input.o \
|
kernel/Input.o \
|
||||||
kernel/kernel.o \
|
kernel/kernel.o \
|
||||||
kernel/kmalloc.o \
|
kernel/kmalloc.o \
|
||||||
|
@ -41,6 +42,7 @@ kernel/RTC.o \
|
||||||
kernel/Serial.o \
|
kernel/Serial.o \
|
||||||
kernel/Shell.o \
|
kernel/Shell.o \
|
||||||
kernel/SSP.o \
|
kernel/SSP.o \
|
||||||
|
kernel/TTY.o \
|
||||||
icxxabi.o \
|
icxxabi.o \
|
||||||
|
|
||||||
OBJS= \
|
OBJS= \
|
||||||
|
@ -81,7 +83,7 @@ $(ARCHDIR)/crtbegin.o $(ARCHDIR)/crtend.o:
|
||||||
$(CC) -MD -c $< -o $(BUILDDIR)/$@ $(CFLAGS)
|
$(CC) -MD -c $< -o $(BUILDDIR)/$@ $(CFLAGS)
|
||||||
|
|
||||||
always:
|
always:
|
||||||
mkdir -p $(BUILDDIR)/arch/i386
|
mkdir -p $(BUILDDIR)/$(ARCHDIR)
|
||||||
mkdir -p $(BUILDDIR)/kernel
|
mkdir -p $(BUILDDIR)/kernel
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <kernel/IO.h>
|
#include <kernel/IO.h>
|
||||||
#include <kernel/kprint.h>
|
#include <kernel/kprint.h>
|
||||||
#include <kernel/Paging.h>
|
#include <kernel/Paging.h>
|
||||||
#include <kernel/panic.h>
|
#include <kernel/Panic.h>
|
||||||
#include <kernel/PIC.h>
|
#include <kernel/PIC.h>
|
||||||
#include <kernel/Serial.h>
|
#include <kernel/Serial.h>
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include <kernel/APIC.h>
|
#include <kernel/APIC.h>
|
||||||
#include <kernel/IDT.h>
|
#include <kernel/IDT.h>
|
||||||
#include <kernel/panic.h>
|
#include <kernel/Panic.h>
|
||||||
#include <kernel/kprint.h>
|
#include <kernel/kprint.h>
|
||||||
#include <kernel/Serial.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("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("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); \
|
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) \
|
#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("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("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); \
|
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")
|
INTERRUPT_HANDLER____(0x00, "Division Error")
|
||||||
|
@ -142,7 +142,7 @@ found:
|
||||||
if (s_irq_handlers[irq])
|
if (s_irq_handlers[irq])
|
||||||
s_irq_handlers[irq]();
|
s_irq_handlers[irq]();
|
||||||
else
|
else
|
||||||
Kernel::panic("no handler for irq 0x{2H}\n", irq);
|
Kernel::Panic("no handler for irq 0x{2H}\n", irq);
|
||||||
|
|
||||||
APIC::EOI(irq);
|
APIC::EOI(irq);
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ namespace IDT
|
||||||
|
|
||||||
static void unimplemented_trap()
|
static void unimplemented_trap()
|
||||||
{
|
{
|
||||||
Kernel::panic("Unhandeled IRQ");
|
Kernel::Panic("Unhandeled IRQ");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void register_interrupt_handler(uint8_t index, void (*f)())
|
static void register_interrupt_handler(uint8_t index, void (*f)())
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include <kernel/CPUID.h>
|
#include <kernel/CPUID.h>
|
||||||
#include <kernel/Paging.h>
|
#include <kernel/Paging.h>
|
||||||
#include <kernel/panic.h>
|
#include <kernel/Panic.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -58,8 +58,6 @@ namespace Paging
|
||||||
:: "r" (s_page_directory_pointer_table)
|
:: "r" (s_page_directory_pointer_table)
|
||||||
: "eax"
|
: "eax"
|
||||||
);
|
);
|
||||||
|
|
||||||
dprintln("Paging enabled");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MapPage(uintptr_t address)
|
void MapPage(uintptr_t address)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include <kernel/kmalloc.h>
|
#include <kernel/kmalloc.h>
|
||||||
#include <kernel/multiboot.h>
|
#include <kernel/multiboot.h>
|
||||||
#include <kernel/Paging.h>
|
#include <kernel/Paging.h>
|
||||||
#include <kernel/panic.h>
|
#include <kernel/Panic.h>
|
||||||
#include <kernel/Serial.h>
|
#include <kernel/Serial.h>
|
||||||
#include <kernel/VESA.h>
|
#include <kernel/VESA.h>
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ namespace VESA
|
||||||
static uint32_t s_width = 0;
|
static uint32_t s_width = 0;
|
||||||
static uint32_t s_height = 0;
|
static uint32_t s_height = 0;
|
||||||
static uint8_t s_mode = 0;
|
static uint8_t s_mode = 0;
|
||||||
|
static bool s_initialized = false;
|
||||||
|
|
||||||
static uint32_t s_terminal_width = 0;
|
static uint32_t s_terminal_width = 0;
|
||||||
static uint32_t s_terminal_height = 0;
|
static uint32_t s_terminal_height = 0;
|
||||||
|
@ -82,6 +83,11 @@ namespace VESA
|
||||||
return s_terminal_height;
|
return s_terminal_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsInitialized()
|
||||||
|
{
|
||||||
|
return s_initialized;
|
||||||
|
}
|
||||||
|
|
||||||
bool Initialize()
|
bool Initialize()
|
||||||
{
|
{
|
||||||
if (!(s_multiboot_info->flags & MULTIBOOT_FLAGS_FRAMEBUFFER))
|
if (!(s_multiboot_info->flags & MULTIBOOT_FLAGS_FRAMEBUFFER))
|
||||||
|
@ -132,6 +138,7 @@ namespace VESA
|
||||||
|
|
||||||
SetCursorPositionImpl(0, 0, Color::BRIGHT_WHITE);
|
SetCursorPositionImpl(0, 0, Color::BRIGHT_WHITE);
|
||||||
ClearImpl(Color::BLACK);
|
ClearImpl(Color::BLACK);
|
||||||
|
s_initialized = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,7 @@ KERNEL_ARCH_OBJS= \
|
||||||
$(ARCHDIR)/APIC.o \
|
$(ARCHDIR)/APIC.o \
|
||||||
$(ARCHDIR)/boot.o \
|
$(ARCHDIR)/boot.o \
|
||||||
$(ARCHDIR)/CPUID.o \
|
$(ARCHDIR)/CPUID.o \
|
||||||
$(ARCHDIR)/font.o \
|
|
||||||
$(ARCHDIR)/GDT.o \
|
$(ARCHDIR)/GDT.o \
|
||||||
$(ARCHDIR)/IDT.o \
|
$(ARCHDIR)/IDT.o \
|
||||||
$(ARCHDIR)/Paging.o \
|
$(ARCHDIR)/Paging.o \
|
||||||
$(ARCHDIR)/TTY.o \
|
|
||||||
$(ARCHDIR)/VESA.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 Initialize();
|
||||||
|
bool IsInitialized();
|
||||||
void PutBitmapAt(const uint8_t*, uint32_t, uint32_t, Color);
|
void PutBitmapAt(const uint8_t*, uint32_t, uint32_t, Color);
|
||||||
void PutBitmapAt(const uint8_t*, uint32_t, uint32_t, Color, Color);
|
void PutBitmapAt(const uint8_t*, uint32_t, uint32_t, Color, Color);
|
||||||
void PutCharAt(uint16_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 <BAN/Formatter.h>
|
||||||
#include <kernel/TTY.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__)
|
#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
|
else
|
||||||
{
|
{
|
||||||
Kernel::panic("Unknown target");
|
Kernel::Panic("Unknown target");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -317,20 +317,20 @@ namespace Input
|
||||||
{
|
{
|
||||||
auto& command = s_command_queue.Front();
|
auto& command = s_command_queue.Front();
|
||||||
if (command.target != TARGET_KEYBOARD && command.target != TARGET_MOUSE)
|
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)
|
if (command._sent == 0 && command._ack == 0)
|
||||||
{
|
{
|
||||||
command._sent++;
|
command._sent++;
|
||||||
if (!i8042_command(command.target, command.command))
|
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)
|
if (command._sent == 1 && command._ack == 1 && command.has_data)
|
||||||
{
|
{
|
||||||
command._sent++;
|
command._sent++;
|
||||||
if (!i8042_command(command.target, command.data))
|
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)
|
if (command._sent > 0 && PIT::ms_since_boot() > s_command_sent + 1000)
|
||||||
|
@ -349,14 +349,14 @@ namespace Input
|
||||||
{
|
{
|
||||||
case I8042_KB_RESET:
|
case I8042_KB_RESET:
|
||||||
if (s_command_response[0] != I8042_KB_SELF_TEST_PASS)
|
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;
|
break;
|
||||||
case I8042_KB_SET_SCAN_CODE_SET:
|
case I8042_KB_SET_SCAN_CODE_SET:
|
||||||
break;
|
break;
|
||||||
case I8042_KB_SET_LEDS:
|
case I8042_KB_SET_LEDS:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Kernel::panic("PS/2 Keyboard unhandled command");
|
Kernel::Panic("PS/2 Keyboard unhandled command");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (command.target == TARGET_MOUSE)
|
else if (command.target == TARGET_MOUSE)
|
||||||
|
@ -365,16 +365,16 @@ namespace Input
|
||||||
{
|
{
|
||||||
case I8042_MOUSE_RESET:
|
case I8042_MOUSE_RESET:
|
||||||
if (s_command_response[0] != I8042_MOUSE_SELF_TEST_PASS)
|
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)
|
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;
|
break;
|
||||||
case I8042_MOUSE_ENABLE:
|
case I8042_MOUSE_ENABLE:
|
||||||
break;
|
break;
|
||||||
case I8042_MOUSE_DISABLE:
|
case I8042_MOUSE_DISABLE:
|
||||||
break;
|
break;
|
||||||
default:
|
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 <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -16,7 +16,7 @@ __BEGIN_DECLS
|
||||||
__attribute__((noreturn))
|
__attribute__((noreturn))
|
||||||
void __stack_chk_fail(void)
|
void __stack_chk_fail(void)
|
||||||
{
|
{
|
||||||
Kernel::panic("Stack smashing detected");
|
Kernel::Panic("Stack smashing detected");
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include <kernel/kmalloc.h>
|
#include <kernel/kmalloc.h>
|
||||||
#include <kernel/panic.h>
|
#include <kernel/Panic.h>
|
||||||
#include <kernel/Serial.h>
|
#include <kernel/Serial.h>
|
||||||
#include <kernel/TTY.h>
|
#include <kernel/TTY.h>
|
||||||
#include <kernel/VESA.h>
|
#include <kernel/VESA.h>
|
||||||
|
@ -242,7 +242,7 @@ void TTY::HandleAnsiEscape(uint16_t ch)
|
||||||
void TTY::RenderFromBuffer(uint32_t x, uint32_t y)
|
void TTY::RenderFromBuffer(uint32_t x, uint32_t y)
|
||||||
{
|
{
|
||||||
if (x >= m_width || y >= m_height)
|
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];
|
const auto& cell = m_buffer[y * m_width + x];
|
||||||
VESA::PutCharAt(cell.character, x, y, cell.foreground, cell.background);
|
VESA::PutCharAt(cell.character, x, y, cell.foreground, cell.background);
|
||||||
}
|
}
|
|
@ -2,12 +2,10 @@
|
||||||
#include <kernel/GDT.h>
|
#include <kernel/GDT.h>
|
||||||
#include <kernel/IDT.h>
|
#include <kernel/IDT.h>
|
||||||
#include <kernel/Input.h>
|
#include <kernel/Input.h>
|
||||||
#include <kernel/IO.h>
|
|
||||||
#include <kernel/kmalloc.h>
|
#include <kernel/kmalloc.h>
|
||||||
#include <kernel/kprint.h>
|
#include <kernel/kprint.h>
|
||||||
#include <kernel/multiboot.h>
|
#include <kernel/multiboot.h>
|
||||||
#include <kernel/Paging.h>
|
#include <kernel/Paging.h>
|
||||||
#include <kernel/panic.h>
|
|
||||||
#include <kernel/PIC.h>
|
#include <kernel/PIC.h>
|
||||||
#include <kernel/PIT.h>
|
#include <kernel/PIT.h>
|
||||||
#include <kernel/RTC.h>
|
#include <kernel/RTC.h>
|
||||||
|
@ -62,8 +60,15 @@ extern "C" void kernel_main(multiboot_info_t* mbi, uint32_t magic)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
dprintln("hello from 64 bit protected mode!");
|
||||||
|
|
||||||
Paging::Initialize();
|
Paging::Initialize();
|
||||||
|
|
||||||
|
dprintln("paging enabled");
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
s_multiboot_info = mbi;
|
s_multiboot_info = mbi;
|
||||||
|
|
||||||
if (!VESA::Initialize())
|
if (!VESA::Initialize())
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include <kernel/multiboot.h>
|
#include <kernel/multiboot.h>
|
||||||
#include <kernel/kmalloc.h>
|
#include <kernel/kmalloc.h>
|
||||||
#include <kernel/panic.h>
|
#include <kernel/Panic.h>
|
||||||
#include <kernel/Serial.h>
|
#include <kernel/Serial.h>
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
@ -48,7 +48,7 @@ static bool s_initialized = false;
|
||||||
void kmalloc_initialize()
|
void kmalloc_initialize()
|
||||||
{
|
{
|
||||||
if (!(s_multiboot_info->flags & (1 << 6)))
|
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
|
// Validate kmalloc memory
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
|
@ -70,7 +70,7 @@ void kmalloc_initialize()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!valid)
|
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_count = 1;
|
||||||
s_kmalloc_node_head = (kmalloc_node*)s_kmalloc_node_base;
|
s_kmalloc_node_head = (kmalloc_node*)s_kmalloc_node_base;
|
||||||
|
@ -90,7 +90,9 @@ void kmalloc_initialize()
|
||||||
|
|
||||||
void kmalloc_dump_nodes()
|
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 available {} MB", (float)s_kmalloc_available / MB);
|
||||||
dprintln("Kmalloc memory allocated {} MB", (float)s_kmalloc_allocated / MB);
|
dprintln("Kmalloc memory allocated {} MB", (float)s_kmalloc_allocated / MB);
|
||||||
dprintln("Using {}/{} nodes", s_kmalloc_node_count, s_kmalloc_max_nodes);
|
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)
|
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)
|
if (size % ALIGN)
|
||||||
size += ALIGN - (size % ALIGN);
|
size += ALIGN - (size % ALIGN);
|
||||||
|
|
||||||
if (s_kmalloc_eternal_ptr % 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)
|
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)
|
void* kmalloc(size_t size)
|
||||||
{
|
{
|
||||||
if (!s_initialized) Kernel::panic("kmalloc not initialized!");
|
if (!s_initialized)
|
||||||
|
Kernel::Panic("kmalloc not initialized!");
|
||||||
|
|
||||||
if (size % ALIGN)
|
if (size % ALIGN)
|
||||||
size += ALIGN - (size % ALIGN);
|
size += ALIGN - (size % ALIGN);
|
||||||
|
@ -155,7 +159,7 @@ void* kmalloc(size_t size)
|
||||||
{
|
{
|
||||||
valid_node.free = false;
|
valid_node.free = false;
|
||||||
if (valid_node.addr % ALIGN)
|
if (valid_node.addr % ALIGN)
|
||||||
Kernel::panic("Unaligned ptr in kmalloc");
|
Kernel::Panic("Unaligned ptr in kmalloc");
|
||||||
return (void*)valid_node.addr;
|
return (void*)valid_node.addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,13 +188,13 @@ void* kmalloc(size_t size)
|
||||||
s_kmalloc_available -= size;
|
s_kmalloc_available -= size;
|
||||||
|
|
||||||
if (valid_node.addr % ALIGN)
|
if (valid_node.addr % ALIGN)
|
||||||
Kernel::panic("Unaligned ptr in kmalloc");
|
Kernel::Panic("Unaligned ptr in kmalloc");
|
||||||
return (void*)valid_node.addr;
|
return (void*)valid_node.addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kfree(void* addr)
|
void kfree(void* addr)
|
||||||
{
|
{
|
||||||
if (!s_initialized) Kernel::panic("kmalloc not initialized!");
|
if (!s_initialized) Kernel::Panic("kmalloc not initialized!");
|
||||||
|
|
||||||
if (addr == nullptr)
|
if (addr == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#if defined(__is_libk)
|
#if defined(__is_libk)
|
||||||
#include <kernel/panic.h>
|
#include <kernel/Panic.h>
|
||||||
#else
|
#else
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,7 +9,7 @@
|
||||||
int putchar(int c)
|
int putchar(int c)
|
||||||
{
|
{
|
||||||
#if defined(__is_libk)
|
#if defined(__is_libk)
|
||||||
Kernel::panic("Please use kprint() instead of stdio");
|
Kernel::Panic("Please use kprint() instead of stdio");
|
||||||
#else
|
#else
|
||||||
abort();
|
abort();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,14 +2,14 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#if defined(__is_libk)
|
#if defined(__is_libk)
|
||||||
#include <kernel/panic.h>
|
#include <kernel/Panic.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__attribute__((__noreturn__))
|
__attribute__((__noreturn__))
|
||||||
void abort(void)
|
void abort(void)
|
||||||
{
|
{
|
||||||
#if defined(__is_libk)
|
#if defined(__is_libk)
|
||||||
Kernel::panic("abort()");
|
Kernel::Panic("abort()");
|
||||||
#else
|
#else
|
||||||
printf("abort()\n");
|
printf("abort()\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue