diff --git a/README.md b/README.md index cdd0465..adb331b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ A monolithic hobbyist kernel written in C and Assembly for the RISC-V 64-bit architecture. ## Project Overview -The Gemini Kernel is a from-scratch operating system project designed to explore low-level systems programming, memory management, and hardware-software interfacing. +The Squidge Kernel is a from-scratch operating system project designed to explore low-level systems programming, memory management, and hardware-software interfacing. ### Target Architecture * **Architecture**: RISC-V (RV64GC) diff --git a/src/drivers/uart.c b/src/drivers/uart.c index 8fa287a..e31409d 100644 --- a/src/drivers/uart.c +++ b/src/drivers/uart.c @@ -130,62 +130,66 @@ void kputs(const char *str) knewline(); } +void kprintf_internal(const char *format, va_list args) +{ + for (const char *p = format; *p != '\0'; p++) + { + if (*p == '%') + { + p++; + switch (*p) + { + case 'c': + { + char c = (char)va_arg(args, int); + kputchar(c); + break; + } + case 's': + { + char *s = va_arg(args, char *); + kprint(s); + break; + } + case 'd': + { + int d = va_arg(args, int); + kprint_int(d); + break; + } + case 'f': + { + double f = va_arg(args, double); + kprint_float((float)f); + break; + } + case 'x': // Hex + case 'p': // Pointer + { + uint64_t x = va_arg(args, uint64_t); + kprint_hex(x); + break; + } + case '%': + kputchar('%'); + break; + default: + kputchar('%'); + kputchar(*p); + } + } + else + { + kputchar(*p); + } + } + knewline(); +} + void kprintf(const char *format, ...) { - va_list args; - va_start(args, format); - - for (const char *p = format; *p != '\0'; p++) - { - if (*p == '%') - { - p++; - switch (*p) - { - case 'c': - { - char c = (char)va_arg(args, int); - kputchar(c); - break; - } - case 's': - { - char *s = va_arg(args, char *); - kprint(s); - break; - } - case 'd': - { - int d = va_arg(args, int); - kprint_int(d); - break; - } - case 'f': - { - double f = va_arg(args, double); - kprint_float((float)f); - break; - } - case 'x': // Hex - case 'p': // Pointer - { - uint64_t x = va_arg(args, uint64_t); - kprint_hex(x); - break; - } - case '%': - kputchar('%'); - break; - default: - kputchar('%'); - kputchar(*p); - } - } - else - { - kputchar(*p); - } - } - va_end(args); - knewline(); + va_list args; + va_start(args, format); + kprintf_internal(format, args); + va_end(args); } \ No newline at end of file diff --git a/src/drivers/uart.h b/src/drivers/uart.h index e6b22ea..ec721ee 100644 --- a/src/drivers/uart.h +++ b/src/drivers/uart.h @@ -1,6 +1,7 @@ +#include + #ifndef UART_H #define UART_H - #define UART_RBR (volatile uint8_t *)(UART_ADDRESS + 0) #define UART_LSR (volatile uint8_t *)(UART_ADDRESS + 5) #define UART_ADDRESS 0x10000000 @@ -13,6 +14,7 @@ void uart_handle_interrupt(); int kputchar(int ch); void kprint_hex(uint64_t val); void kprint_int(int num); +void kprintf_internal(const char *format, va_list args); void kprintf(const char *format, ...); void kprint_float(float num); void knewline(); diff --git a/src/kernel/interrupts.c b/src/kernel/interrupts.c index c0aefb3..5473585 100644 --- a/src/kernel/interrupts.c +++ b/src/kernel/interrupts.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -21,11 +22,14 @@ void interrupt_init() kputs("OK"); } -void kpanic(const char *reason) +void kpanic(const char *reason, ...) { + va_list args; + va_start(args, reason); kputs("\n!!! PANIC !!!\n"); - kputs(reason); + kprintf_internal(reason, args); kputs("\n!!! PANIC !!!\n"); + va_end(args); poweroff(); } @@ -80,7 +84,7 @@ void handle_trap() kpanic("Reason: Illegal Instruction\n"); break; case 3: - kpanic("Reason: Breakpoint (ebreak)\n"); + kpanic("Reason: Breakpoint (ebreak) %s\n", "woo!"); break; case 4: kpanic("Reason: Load Address Misaligned\n"); @@ -96,7 +100,7 @@ void handle_trap() break; default: break; - // kpanic("Reason: Unknown Exception Code %d\n", cause); + kpanic("Reason: Unknown Exception Code %d\n", cause); } kprintf("Faulting Address (if applicable): %x\n", mtval); } diff --git a/src/kernel/interrupts.h b/src/kernel/interrupts.h index 9ad91ff..e0db2e4 100644 --- a/src/kernel/interrupts.h +++ b/src/kernel/interrupts.h @@ -2,7 +2,7 @@ #define PANIC_H void interrupt_init(); -void kpanic(const char *); +void kpanic(const char *, ...); void kpanic_force(); void handle_interrupt(unsigned long code); diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 32ca547..06c3c87 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -16,4 +16,6 @@ void kmain() uart_init(); page_init(); interrupt_init(); + + kpanic_force(); }