diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-02-06 22:12:53 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-02-06 22:12:53 -0500 |
| commit | 518209098b9f6ea5586537c59b1193d65273bf27 (patch) | |
| tree | b125dbeb9320d01f942248efc4a87de88b9b89d5 /kernel | |
| parent | 8628212ff69abf10c94304035efbab97ed9e06f8 (diff) | |
| download | kappa-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.h | 1 | ||||
| -rw-r--r-- | kernel/log.c | 74 |
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; +} |