diff --git a/src/boot/entry.S b/src/boot/entry.S index ea94bf8..9c4a550 100644 --- a/src/boot/entry.S +++ b/src/boot/entry.S @@ -4,12 +4,16 @@ _start: la sp, stack_top # Set up the stack pointer la t0, trap_entry # Set up the trap handler csrw mtvec, t0 # Set the trap vector to our trap handler + li t0, 0x00006000 # Load the mask for FS bits. enable float + csrs mstatus, t0 # Set the FS bits to 11 (Dirty/Initial). enable float call kmain # Jump to our C code loop: wfi # Wait for Interrupt (saves CPU) j loop # Infinite loop if C returns .align 4 trap_entry: + csrr a0, mcause # Argument 1: mcause + csrr a1, mepc # Argument 2: mepc j handle_trap .section .bss .align 16 diff --git a/src/drivers/uart.c b/src/drivers/uart.c index c15ee60..f3732b5 100644 --- a/src/drivers/uart.c +++ b/src/drivers/uart.c @@ -38,6 +38,22 @@ void kprint_int(int num) { } } +void kprint_float(float num) { + if (num < 0) { + kputchar('-'); + num = -num; + } + int int_part = (int)num; + float frac_part = num - int_part; + kprint_int(int_part); + kputchar('.'); + for (int i = 0; i < 6; i++) { + frac_part *= 10.0f; + } + int fraction = (int)(frac_part + 0.5f); // Round to nearest + kprint_int(fraction); +} + void kprint_hex(uint64_t val) { char *digits = "0123456789ABCDEF"; char buffer[16]; // 64-bit hex is 16 chars @@ -79,6 +95,11 @@ void kprintf(const char *format, ...) { 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); @@ -97,5 +118,5 @@ void kprintf(const char *format, ...) { kputchar(*p); } } - + knewline(); } \ No newline at end of file diff --git a/src/drivers/uart.h b/src/drivers/uart.h index e500918..08e7af2 100644 --- a/src/drivers/uart.h +++ b/src/drivers/uart.h @@ -7,6 +7,7 @@ int kputchar(int ch); void kprint_hex(uint64_t val); void kprint_int(int num); void kprintf(const char *format, ...); +void kprint_float(float num); void knewline(); void kputs(const char *str); void kprint(const char *str); diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index b67621c..0593fab 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -6,7 +6,7 @@ #include void kmain() { - kputs("Hello, OS World!"); + kprintf("Hello, from %s v%f!" , "SquidgeOS", 0.5); kputs("-------------------"); knewline(); page_init();