Add new kassert macro.
This commit is contained in:
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
const char digits[] = "0123456789abcdef";
|
const char digits[] = "0123456789abcdef";
|
||||||
|
|
||||||
|
console *console::default_console = nullptr;
|
||||||
|
|
||||||
console::console(const font &f, const screen &s, void *scratch, size_t len) :
|
console::console(const font &f, const screen &s, void *scratch, size_t len) :
|
||||||
m_font(f),
|
m_font(f),
|
||||||
m_screen(s),
|
m_screen(s),
|
||||||
@@ -73,6 +75,9 @@ console::console(const font &f, const screen &s, void *scratch, size_t len) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
repaint();
|
repaint();
|
||||||
|
|
||||||
|
if (default_console == nullptr)
|
||||||
|
default_console = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
|
|||||||
@@ -22,7 +22,10 @@ public:
|
|||||||
template <typename T>
|
template <typename T>
|
||||||
void put_hex(T x);
|
void put_hex(T x);
|
||||||
|
|
||||||
void put_dec(uint32_t x);
|
template <typename T>
|
||||||
|
void put_dec(T x);
|
||||||
|
|
||||||
|
static console * get() { return default_console; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char * line_pointer(unsigned line);
|
char * line_pointer(unsigned line);
|
||||||
@@ -42,6 +45,8 @@ private:
|
|||||||
char *m_data;
|
char *m_data;
|
||||||
uint16_t *m_attrs;
|
uint16_t *m_attrs;
|
||||||
screen::pixel_t *m_palette;
|
screen::pixel_t *m_palette;
|
||||||
|
|
||||||
|
static console *default_console;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const char digits[];
|
extern const char digits[];
|
||||||
@@ -57,3 +62,17 @@ void console::put_hex(T x)
|
|||||||
message[chars] = 0;
|
message[chars] = 0;
|
||||||
puts(message);
|
puts(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|||||||
29
src/modules/main/util.cpp
Normal file
29
src/modules/main/util.cpp
Normal file
@@ -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);
|
||||||
|
}
|
||||||
@@ -7,3 +7,7 @@ struct coord {
|
|||||||
coord(T x, T y) : x(x), y(y) {}
|
coord(T x, T y) : x(x), y(y) {}
|
||||||
T size() const { return x * 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 {}
|
||||||
|
|||||||
Reference in New Issue
Block a user