aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorFranklin Wei <frankhwei536@gmail.com>2015-02-06 22:12:53 -0500
committerFranklin Wei <frankhwei536@gmail.com>2015-02-06 22:12:53 -0500
commit518209098b9f6ea5586537c59b1193d65273bf27 (patch)
treeb125dbeb9320d01f942248efc4a87de88b9b89d5 /kernel
parent8628212ff69abf10c94304035efbab97ed9e06f8 (diff)
downloadkappa-518209098b9f6ea5586537c59b1193d65273bf27.zip
kappa-518209098b9f6ea5586537c59b1193d65273bf27.tar.gz
kappa-518209098b9f6ea5586537c59b1193d65273bf27.tar.bz2
kappa-518209098b9f6ea5586537c59b1193d65273bf27.tar.xz
add a really messy logging module
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/log.h1
-rw-r--r--kernel/log.c74
2 files changed, 75 insertions, 0 deletions
diff --git a/kernel/include/log.h b/kernel/include/log.h
new file mode 100644
index 0000000..73a5545
--- /dev/null
+++ b/kernel/include/log.h
@@ -0,0 +1 @@
+void klog(const char*, ...);
diff --git a/kernel/log.c b/kernel/log.c
new file mode 100644
index 0000000..cfe2922
--- /dev/null
+++ b/kernel/log.c
@@ -0,0 +1,74 @@
+#include "io.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define BOCHS_PUTCHAR(ch) (outb(0xe9, ch))
+
+static int eputchar(int ch)
+{
+ BOCHS_PUTCHAR(ch);
+ return 0;
+}
+
+static int eputs(const char* str)
+{
+ while(*str)
+ putchar(*str++);
+ return 0;
+}
+
+static char ehex_table[16] = { '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+static void eprint_hex(unsigned int n)
+{
+ unsigned mask = 0xF0000000;
+ unsigned shift = 28;
+ while(mask)
+ {
+ eputchar(ehex_table[(n & mask) >> shift]);
+ mask >>= 4;
+ shift -= 4;
+ }
+}
+
+int klog(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ while(*fmt)
+ {
+ char ch = *fmt++;
+ switch(ch)
+ {
+ case '%':
+ {
+ switch(*fmt++)
+ {
+ case 'c':
+ eputchar(va_arg(ap, int));
+ break;
+ case 's':
+ eputs(va_arg(ap, const char*));
+ break;
+ case 'x':
+ eprint_hex(va_arg(ap, unsigned));
+ break;
+ case 'd':
+ eputs(itoa(va_arg(ap, unsigned), 10));
+ break;
+ default:
+ eputs("klog: unknown format\n");
+ break;
+ }
+ break;
+ }
+ default:
+ eputchar(ch);
+ break;
+ }
+ }
+ va_end(ap);
+ return 0;
+}