diff --git a/src/kernel/boot/debug.c b/src/kernel/boot/debug.c deleted file mode 100644 index de826db..0000000 --- a/src/kernel/boot/debug.c +++ /dev/null @@ -1,124 +0,0 @@ -#include -#include -#include -#include - -void num2str(char *buf, uint64_t num, uint64_t base) -{ - if(num == 0) - { - buf[0] = '0'; - buf[1] = '\0'; - return; - } - uint64_t i=0, j=0; - char chars[] = "0123456789ABCDEF"; - while(num > 0) - { - buf[i++] = chars[num%base]; - num /= base; - } - i--; - while(j= '0' && *fmt <='9') - { - padwidth *= 10; - padwidth += (int)(*fmt++ - '0'); - } - uint64_t base = 0; - switch(*fmt) - { - case 'b': - base = 2; - break; - case 'o': - base = 8; - break; - case 'd': - base = 10; - break; - case 'x': - base = 16; - break; - case 'c': - debug_putch((char)va_arg(args, uint64_t)); - break; - case 's': - debug_puts(va_arg(args, char*)); - break; - default: - debug_putch('%'); - fmt--; - } - - if(base) - { - uintmax_t number = va_arg(args, uintmax_t); - char buf[128]; - num2str(buf, number, base); - if(padwidth > strlen(buf)) - for(size_t i = 0; i < (padwidth - strlen(buf)); i++) - debug_putch(padchar); - debug_puts(buf); - } - - fmt++; - debug_vprintf(fmt, args); -} - -void debug_printf(char *fmt, ...) -{ - va_list args; - va_start(args, fmt); - debug_vprintf(fmt, args); - va_end(args); -} \ No newline at end of file diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index b427b7c..010ae1c 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -6,6 +6,8 @@ #include #include #include +#include + struct kernel_boot_data_st kernel_boot_data; diff --git a/src/kernel/drivers/terminal/terminal.c b/src/kernel/drivers/terminal/terminal.c index 1bc00d5..cc3f000 100644 --- a/src/kernel/drivers/terminal/terminal.c +++ b/src/kernel/drivers/terminal/terminal.c @@ -1,6 +1,9 @@ #include #include +#include #include +#include +#include #define FRAMEBUFFER 0x1 #define EGA_TEXT 0x2 @@ -15,23 +18,6 @@ uint8_t format = 0x7; static int terminal_type; -void terminal_init(){ - struct fbinfo *fbinfo = kernel_boot_data.fbinfo; - terminal_type = fbinfo->framebuffer_type; - - switch(terminal_type) - { - case FRAMEBUFFER: - framebuffer_init(fbinfo); - fbterm_init(&kernel_fb); - break; - case EGA_TEXT: - vga_init(fbinfo); - break; - } -} - - static void scroll() { while(cursor >= VGA_SIZE) @@ -42,7 +28,7 @@ static void scroll() } } -void terminal_write(char c) +static void terminal_write(char c) { int doflush = 0; switch(c) @@ -68,4 +54,62 @@ void terminal_write(char c) vga_movecursor(cursor); break; } +} + +static void terminal_putsn(char *s, size_t n) +{ + while(n--) + terminal_write(*s++); +} + +long k_ioctl(long fd, long cmd, long arg3, long, long, long) +{ + if(fd == 1 && cmd == 0x5413) { + struct { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xp; + unsigned short ws_yp; + } *wsz = (void *)arg3; + wsz->ws_row = 24; + wsz->ws_col = 80; + return 0; + } + long retval = -1; + PANIC("Unknown IOCTL request: fd: %d, command: %x\n", fd, cmd); + return retval; +} + +long k_writev(long fd, long iov, long iovcnt, long, long, long) +{ + if(fd == 1) + { + size_t len = 0; + struct iovec *v = (void *) iov; + for(int i = 0; i < iovcnt; i++) + { + terminal_putsn(v[i].iov_base, v[i].iov_len); + len += v[i].iov_len; + } + return len; + } + long retval = 0; + PANIC("Unknown writev request: fd: %d\n", fd); + return retval; +} + +void terminal_init(){ + struct fbinfo *fbinfo = kernel_boot_data.fbinfo; + terminal_type = fbinfo->framebuffer_type; + + switch(terminal_type) + { + case FRAMEBUFFER: + framebuffer_init(fbinfo); + fbterm_init(&kernel_fb); + break; + case EGA_TEXT: + vga_init(fbinfo); + break; + } } \ No newline at end of file diff --git a/src/kernel/include/debug.h b/src/kernel/include/debug.h index 38f7d4b..1915aab 100644 --- a/src/kernel/include/debug.h +++ b/src/kernel/include/debug.h @@ -1,8 +1,9 @@ #pragma once #include +#include #ifndef NDEBUG -#define debug(...) debug_printf(__VA_ARGS__) +#define debug(...) printf(__VA_ARGS__) #define debug_info(...) \ do{debug("[INFO] "); debug(__VA_ARGS__);}while(0) #define debug_ok(...) \ @@ -25,18 +26,13 @@ #define PANIC(...) \ do { \ - debug_printf("\n\nKERNEL PANIC!\n%s:%d\n", __FILE__, __LINE__); \ - debug_printf(__VA_ARGS__); \ - debug_printf("\n"); \ + debug("\n\nKERNEL PANIC!\n%s:%d\n", __FILE__, __LINE__); \ + debug(__VA_ARGS__); \ + debug("\n"); \ volatile int _override = 0; \ while(1) { \ __asm__("panic_breakpoint_" S__LINE__ ":"); \ if(_override) break; \ } \ }while(0) - -// boot/debug.c -void debug_printf(char *fmt, ...); -void debug_puts(char *s); -void debug_putsn(char *s, size_t n); -void debug_putsh(char c); \ No newline at end of file + \ No newline at end of file diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index e8f4c37..6ac0472 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -40,9 +40,6 @@ uint64_t pmm_alloc(); uint64_t pmm_calloc(); - // memory/kbrk.c - long kbrk(long brk, long, long, long, long, long); - // Link.ld extern int kernel_start, kernel_end; diff --git a/src/kernel/include/musl-glue.h b/src/kernel/include/musl-glue.h index 573caab..128e5e6 100644 --- a/src/kernel/include/musl-glue.h +++ b/src/kernel/include/musl-glue.h @@ -1,8 +1,17 @@ #pragma once #define SYSCALL_BRK 12 +#define SYSCALL_IOCTL 16 +#define SYSCALL_WRITEV 20 typedef long (*syscall_handler)(long, long, long, long, long, long); // lib/musl-glue.c -syscall_handler set_syscall_handler(long num, syscall_handler handler); \ No newline at end of file +syscall_handler set_syscall_handler(long num, syscall_handler handler); + +// drivers/terminal/terminal.c +long k_ioctl(long fd, long cmd, long arg3, long, long, long); +long k_writev(long fd, long iov, long iovcnt, long, long, long); + +// memory/kbrk.c +long k_brk(long brk, long, long, long, long, long); \ No newline at end of file diff --git a/src/kernel/include/terminal.h b/src/kernel/include/terminal.h index 7f3e586..f6ab817 100644 --- a/src/kernel/include/terminal.h +++ b/src/kernel/include/terminal.h @@ -14,7 +14,6 @@ struct vga_cell { // drivers/terminal/terminal.c void terminal_init(); -void terminal_write(char c); // drivers/terminal/vga.c void vga_init(); diff --git a/src/kernel/lib/musl-glue.c b/src/kernel/lib/musl-glue.c index a5a9f46..b845831 100644 --- a/src/kernel/lib/musl-glue.c +++ b/src/kernel/lib/musl-glue.c @@ -1,7 +1,11 @@ #include #include -syscall_handler syscall_handlers[440]; +syscall_handler syscall_handlers[440] = { + [SYSCALL_BRK] = &k_brk, + [SYSCALL_IOCTL] = &k_ioctl, + [SYSCALL_WRITEV] = &k_writev, +}; syscall_handler set_syscall_handler(long num, syscall_handler handler) { diff --git a/src/kernel/memory/kbrk.c b/src/kernel/memory/kbrk.c index da0b193..3ab1c65 100644 --- a/src/kernel/memory/kbrk.c +++ b/src/kernel/memory/kbrk.c @@ -3,7 +3,7 @@ static long _brk = KERNEL_BRK0; -long kbrk(long brk, long, long, long, long, long) +long k_brk(long brk, long, long, long, long, long) { if(brk) { diff --git a/src/kernel/memory/memory.c b/src/kernel/memory/memory.c index 2f3e519..5e15ac4 100644 --- a/src/kernel/memory/memory.c +++ b/src/kernel/memory/memory.c @@ -38,6 +38,4 @@ void memory_init() pmm_free(p); } } - - set_syscall_handler(SYSCALL_BRK, &kbrk); } \ No newline at end of file