65 lines
1.9 KiB
C
65 lines
1.9 KiB
C
// ke_debug.c - debugging utilities
|
|
#include <stdarg.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <hal_api.h>
|
|
#include <ke_spinlock.h>
|
|
#include <printf.h>
|
|
int _fltused; // fuckass
|
|
|
|
int gDebugEnabled = 0;
|
|
void (*PrintChar)(char, uint32_t, uint32_t);
|
|
|
|
void kernel_putchar(char c) {
|
|
PrintChar(c, 0x00FF00, 0x000000);
|
|
}
|
|
|
|
void KeInitDebug(void (*PrintPtr)(char, uint32_t, uint32_t), int v) {
|
|
gDebugEnabled = v;
|
|
PrintChar = PrintPtr;
|
|
printf_set_putchar(kernel_putchar);
|
|
}
|
|
|
|
__declspec(dllexport) void DbgPrint(const char* fmt, ...) {
|
|
if (!gDebugEnabled) return;
|
|
|
|
static SPINLOCK sl = {0};
|
|
uintptr_t flags = KeAcquireSpinlock(&sl);
|
|
va_list va;
|
|
va_start(va, fmt);
|
|
vprintf(fmt, va);
|
|
va_end(va);
|
|
KeReleaseSpinlock(&sl, flags);
|
|
}
|
|
|
|
// KePanic - Forces output even if debug was compiled out, then the macro halts.
|
|
__declspec(dllexport) _Noreturn void KePanic(const char *fmt, ...) {
|
|
// We are done, go away
|
|
_disable();
|
|
|
|
// Print a bright-red banner so the framebuffer is unmistakable.
|
|
// We call PrintChar directly so we can set a red foreground.
|
|
// (DbgPrint uses green; we want this visually distinct.)
|
|
static const char banner[] = "\n*** KERNEL PANIC ***\n";
|
|
for (const char *p = banner; *p; p++)
|
|
PrintChar(*p, 0xFF2222, 0x000000);
|
|
|
|
// Now print the caller's message through the normal vprintf path.
|
|
va_list va;
|
|
va_start(va, fmt);
|
|
vprintf(fmt, va);
|
|
va_end(va);
|
|
|
|
// Halt it!
|
|
while (true) __halt();
|
|
}
|
|
|
|
// KePrintConsole - write user-visible console text in white-on-black.
|
|
// Used by SYS_WRITE_CONSOLE so user programs get a distinct colour from
|
|
// kernel debug output (green) and panic output (red).
|
|
__declspec(dllexport) void KePrintConsole(const char* buf, size_t len) {
|
|
if (!buf || !PrintChar) return;
|
|
for (size_t i = 0; i < len; i++)
|
|
PrintChar(buf[i], 0xFFFFFF, 0x000000);
|
|
}
|