diff options
author | Alex Auvolat <alex.auvolat@ens.fr> | 2014-11-30 19:58:32 +0100 |
---|---|---|
committer | Alex Auvolat <alex.auvolat@ens.fr> | 2014-11-30 19:58:32 +0100 |
commit | 54e7efbbd0e0c88d99bb6bddb82e9fc8d90eae50 (patch) | |
tree | 178f0d423d1708cbddf89c0e4c510a2022fa7eda /kernel/l0/sys.c | |
parent | bee97e0b630976b96798246a3ef4eea8964099cf (diff) | |
download | kogata-54e7efbbd0e0c88d99bb6bddb82e9fc8d90eae50.tar.gz kogata-54e7efbbd0e0c88d99bb6bddb82e9fc8d90eae50.zip |
Add debug output and a few elementary stdlib functions.
Diffstat (limited to 'kernel/l0/sys.c')
-rw-r--r-- | kernel/l0/sys.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/kernel/l0/sys.c b/kernel/l0/sys.c new file mode 100644 index 0000000..f6a9900 --- /dev/null +++ b/kernel/l0/sys.c @@ -0,0 +1,44 @@ +#include <sys.h> +#include <dbglog.h> + + +// C wrappers for inb/outb/inw/outw + +void outb(uint16_t port, uint8_t value) { + asm volatile("outb %1, %0" : : "dN"(port), "a"(value)); +} + +void outw(uint16_t port, uint16_t value) { + asm volatile("outw %1, %0" : : "dN"(port), "a"(value)); +} + +uint8_t inb(uint16_t port) { + uint8_t ret; + asm volatile("inb %1, %0" : "=a"(ret) : "dN"(port)); + return ret; +} + +uint16_t inw(uint16_t port) { + uint16_t ret; + asm volatile("inw %1, %0" : "=a"(ret) : "dN"(port)); + return ret; +} + +// Kernel panic and kernel assert failure + +static void panic_do(const char* type, const char *msg, const char* file, int line) { + asm volatile("cli;"); + dbg_printf("/\n| %s:\t%s\n", type, msg); + dbg_printf("| File: \t%s:%i\n", file, line); + dbg_printf("| System halted -_-'\n"); + dbg_printf("\\---------------------------------------------------------/"); + asm volatile("hlt"); +} + +void panic(const char* message, const char* file, int line) { + panic_do("PANIC", message, file, line); +} + +void panic_assert(const char* assertion, const char* file, int line) { + panic_do("ASSERT FAILED", assertion, file, line); +} |