aboutsummaryrefslogtreecommitdiff
path: root/kernel/l0/sys.c
diff options
context:
space:
mode:
authorAlex Auvolat <alex.auvolat@ens.fr>2014-11-30 19:58:32 +0100
committerAlex Auvolat <alex.auvolat@ens.fr>2014-11-30 19:58:32 +0100
commit54e7efbbd0e0c88d99bb6bddb82e9fc8d90eae50 (patch)
tree178f0d423d1708cbddf89c0e4c510a2022fa7eda /kernel/l0/sys.c
parentbee97e0b630976b96798246a3ef4eea8964099cf (diff)
downloadkogata-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.c44
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);
+}