diff --git a/src/modules/main/console.cpp b/src/modules/main/console.cpp index a71c6b2..540fae4 100644 --- a/src/modules/main/console.cpp +++ b/src/modules/main/console.cpp @@ -2,6 +2,8 @@ const char digits[] = "0123456789abcdef"; +console *console::default_console = nullptr; + console::console(const font &f, const screen &s, void *scratch, size_t len) : m_font(f), m_screen(s), @@ -73,6 +75,9 @@ console::console(const font &f, const screen &s, void *scratch, size_t len) : } repaint(); + + if (default_console == nullptr) + default_console = this; } char * diff --git a/src/modules/main/console.h b/src/modules/main/console.h index 11fb01a..3f748d8 100644 --- a/src/modules/main/console.h +++ b/src/modules/main/console.h @@ -22,7 +22,10 @@ public: template void put_hex(T x); - void put_dec(uint32_t x); + template + void put_dec(T x); + + static console * get() { return default_console; } private: char * line_pointer(unsigned line); @@ -42,6 +45,8 @@ private: char *m_data; uint16_t *m_attrs; screen::pixel_t *m_palette; + + static console *default_console; }; extern const char digits[]; @@ -57,3 +62,17 @@ void console::put_hex(T x) message[chars] = 0; puts(message); } + +template +void console::put_dec(T x) +{ + static const int chars = sizeof(x) * 3; + char message[chars + 1]; + char *p = message + chars; + *p-- = 0; + do { + *p-- = digits[x % 10]; + x /= 10; + } while (x != 0); + puts(++p); +} diff --git a/src/modules/main/util.cpp b/src/modules/main/util.cpp new file mode 100644 index 0000000..662cc5c --- /dev/null +++ b/src/modules/main/util.cpp @@ -0,0 +1,29 @@ +#include "console.h" +#include "util.h" + +[[noreturn]] void +__kernel_assert(const char *file, unsigned line, const char *message) +{ + console *cons = console::get(); + if (cons) { + cons->set_color(9 , 0); + cons->puts("\n\n ERROR: "); + cons->puts(file); + cons->puts(":"); + cons->put_dec(line); + cons->puts(": "); + cons->puts(message); + } + + __asm__ __volatile__( + "movq %0, %%r8;" + "movq %1, %%r9;" + "movq %2, %%r10;" + "movq $0, %%rdx;" + "divq %%rdx;" + : + : "r"((uint64_t)line), "r"(file), "r"(message) + : "rax", "rdx", "r8", "r9", "r10"); + + while (1); +} diff --git a/src/modules/main/util.h b/src/modules/main/util.h index 6cf2c32..162a045 100644 --- a/src/modules/main/util.h +++ b/src/modules/main/util.h @@ -7,3 +7,7 @@ struct coord { coord(T x, T y) : x(x), y(y) {} T size() const { return x * y; } }; + +[[noreturn]] void __kernel_assert(const char *file, unsigned line, const char *message); + +#define kassert(stmt, message) if(!(stmt)) { __kernel_assert(__FILE__, __LINE__, (message)); } else {}