From c47e29f9ede6bb32e23f2aee4a28ef4dac15da2d Mon Sep 17 00:00:00 2001 From: xamidev Date: Fri, 9 Aug 2024 14:36:01 +0200 Subject: [PATCH] Add: serial printf --- com1.out | Bin 229 -> 227 bytes iso/boot/kernel.elf | Bin 30808 -> 30876 bytes src/drivers/serial.c | 216 +++++++++++++++++++++++++++++++++++++++++ src/drivers/serial.h | 2 +- src/kernel/kmain.c | 18 ++-- src/libc/stdio.h | 2 + src/programs/sysinfo.c | 40 +++++--- 7 files changed, 255 insertions(+), 23 deletions(-) diff --git a/com1.out b/com1.out index 66b510031c253d5531b6e03c041e1bea62b56084..10c4e1d7383e1041f28ad6a13f8547fed8f32526 100644 GIT binary patch delta 108 zcmaFL_?U5m+Qd4siMHGm>%^H{LVzT5a8U8YIw^lHhGg^a|!l$_KeT#B+&E0gjQi&7Bk0EHVPY5)KL delta 66 zcmaFN_>^&i8Y9ER1hI)W+#p(<*(C%>NrBlcL4n0!xi!3CHA2~`l}Y)DMJWm?MVV!( IMGRaF0BOMzr2qf` diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index 4430a0ebf871ff4225e785dabb25db8303d594de..8e5c86cab238ada0cbd3bf2c0c940666680dad14 100755 GIT binary patch delta 8092 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 diff --git a/src/drivers/serial.c b/src/drivers/serial.c index 8e5861b..b4c28bb 100644 --- a/src/drivers/serial.c +++ b/src/drivers/serial.c @@ -1,5 +1,6 @@ #include "../kernel/io.h" #include "serial.h" +#include "../libc/stdio.h" int init_serial() { @@ -61,5 +62,220 @@ void log(const char* str, const int errlevel) break; } serial_puts(str); +} + +const char serial_charset[] = "0123456789abcdef"; + +int* serial_printf_number(int* argp, int length, bool sign, int radix) +{ + char buffer[32]; + unsigned long long number; + int number_sign = 1; + int pos = 0; + + switch(length) + { + case PRINTF_LENGTH_SHORT_SHORT: + case PRINTF_LENGTH_SHORT: + case PRINTF_LENGTH_START: + if (sign) + { + int n = *argp; + if (n < 0) + { + n = -n; + number_sign = -1; + } + number = (unsigned long long) n; + } + else { + number = *(unsigned int*) argp; + } + argp++; + break; + case PRINTF_LENGTH_LONG: + if (sign) + { + long int n = *(long int*)argp; + if (n < 0) + { + n = -n; + number_sign = -1; + } + number = (unsigned long long) n; + } + else { + number = *(unsigned long int*) argp; + } + argp += 2; + break; + case PRINTF_LENGTH_LONG_LONG: + if (sign) + { + long long int n = *(long long int*)argp; + if (n < 0) + { + n = -n; + number_sign = -1; + } + number = (unsigned long long) n; + } + else { + number = *(unsigned long long int*) argp; + } + argp += 4; + break; + } + + do { + uint32_t rem; + x86_div64_32(number, radix, &number, &rem); + buffer[pos++] = serial_charset[rem]; + } while (number > 0); + + if (sign && number_sign < 0) + { + buffer[pos++] = '-'; + } + + while (--pos >= 0) + { + write_serial(buffer[pos]); + } + + return argp; +} +void serial_printf(int errlevel, const char* fmt, ...) +{ + switch (errlevel) + { + case 0: + serial_puts("[ERROR] "); + break; + case 1: + serial_puts("[WARNING] "); + break; + case 2: + serial_puts("[INFO] "); + break; + case 3: + serial_puts("[DEBUG] "); + break; + } + + int* argp = (int*) &fmt; + int state = PRINTF_STATE_START; + int length = PRINTF_LENGTH_START; + int radix = 10; + bool sign = false; + + argp++; + while (*fmt) + { + switch(state) { + case PRINTF_STATE_START: + if (*fmt == '%') + { + state = PRINTF_STATE_LENGTH; + } + else { + write_serial(*fmt); + } + break; + case PRINTF_STATE_LENGTH: + if (*fmt == 'h') + { + length = PRINTF_LENGTH_SHORT; + state = PRINTF_STATE_SHORT; + } + else if (*fmt == 'l') + { + length = PRINTF_LENGTH_LONG; + state = PRINTF_STATE_LONG; + } + else { + goto PRINTF_STATE_SPEC_; + } + break; + case PRINTF_STATE_SHORT: + if (*fmt == 'h') + { + length = PRINTF_LENGTH_SHORT_SHORT; + state = PRINTF_STATE_SPEC; + } + else { + goto PRINTF_STATE_SPEC_; + } + break; + case PRINTF_STATE_LONG: + if (*fmt == 'l') + { + length = PRINTF_LENGTH_LONG_LONG; + state = PRINTF_STATE_SPEC; + } + else { + goto PRINTF_STATE_SPEC_; + } + break; + case PRINTF_STATE_SPEC: + PRINTF_STATE_SPEC_: + switch(*fmt) + { + case 'c': + serial_puts(*(const char **)argp); + argp++; + break; + case 's': + serial_puts(*(const char **)argp); + argp++; + break; + case '%': + putc('%'); + break; + case 'd': + case 'i': + radix = 10; + sign = true; + argp = serial_printf_number(argp, length, sign, radix); + break; + case 'u': + radix = 10; + sign = false; + argp = serial_printf_number(argp, length, sign, radix); + break; + case 'X': + case 'x': + case 'p': + radix = 16; + sign = false; + argp = serial_printf_number(argp, length, sign, radix); + break; + case 'o': + radix = 8; + sign = false; + argp = serial_printf_number(argp, length, sign, radix); + break; + case 'f': { + // Handle floating-point numbers + double* dargp = (double*)argp; + double d = *(double*)dargp; + char buffer[64]; + dtostrf(d, buffer, 6); // Default precision: 6 + serial_puts(buffer); + argp += 2; // Incrementing by 2 to move past the double argument + break; + } + default: + break; + } + state = PRINTF_STATE_START; + length = PRINTF_LENGTH_START; + radix = 10; + sign = false; + break; + } + fmt++; + } serial_puts("\n"); } + diff --git a/src/drivers/serial.h b/src/drivers/serial.h index 447024f..52cc4b4 100644 --- a/src/drivers/serial.h +++ b/src/drivers/serial.h @@ -8,5 +8,5 @@ int is_transmit_empty(); void write_serial(const char a); void serial_puts(const char* str); void log(const char* str, const int errlevel); - +void serial_printf(int errlevel, const char* fmt, ...); #endif diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index 0a9e5be..c2f8806 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -21,25 +21,25 @@ void kmain(unsigned int multiboot_info_address) g_multiboot_info_address = multiboot_info_address; init_serial(); - log("serial connection established", 3); + log("serial connection established\n", 3); gdt_install(); - log("initialized GDT entries", 2); + log("initialized GDT entries\n", 2); idt_install(); - log("initialized IDT", 2); + log("initialized IDT\n", 2); isr_install(); - log("initialized ISRs", 2); + log("initialized ISRs\n", 2); irq_install(); __asm__ __volatile__("sti"); - log("initialized IRQs", 2), + log("initialized IRQs\n", 2), clear(); colorputs(ascii_title, 10); colorputs(" by @xamidev - star the repo for a cookie!\n\n", 14); timer_install(); - log("initialized timer handler", 2); - keyboard_install(); - log("initialized keyboard driver", 2); + serial_printf(2, "%d\tinitialized timer handler", global_ticks); + keyboard_install(); + serial_printf(2, "%d\tinitialized keyboard handler", global_ticks); shell_install(); - log("started system shell", 2); + serial_printf(2, "%d\tstarted system shell", global_ticks); } diff --git a/src/libc/stdio.h b/src/libc/stdio.h index 7337340..e7882fb 100644 --- a/src/libc/stdio.h +++ b/src/libc/stdio.h @@ -40,4 +40,6 @@ int* printf_number(int* argp, int length, bool sign, int radix); int getch(); void get_input(char *buffer, int size); +void dtostrf(double val, char *buffer, int precision); + #endif diff --git a/src/programs/sysinfo.c b/src/programs/sysinfo.c index 3ef7b45..778b67f 100644 --- a/src/programs/sysinfo.c +++ b/src/programs/sysinfo.c @@ -2,6 +2,7 @@ #include "../kernel/sysinfo.h" #include "../libc/stdio.h" #include "../kernel/system.h" +#include "../libc/string.h" extern unsigned int multiboot_info_address; @@ -35,7 +36,7 @@ void get_cpuid() printf("CPU information\n\tvendor: %s\n\tfamily: %u\n\tmodel: %u\n\tfeatures: 0x%x\n", vendor, family, model, edx); } -void get_meminfo(unsigned int multiboot_info_address) +void get_meminfo(unsigned int multiboot_info_address, int verbose) { // RAM @@ -44,21 +45,34 @@ void get_meminfo(unsigned int multiboot_info_address) printf("RAM information\n\tLower memory: %u KB\n\tUpper memory: %u KB\n", mem_lower, mem_upper); - multiboot_memory_map_t* mmap = (multiboot_memory_map_t*)*((unsigned int*)(multiboot_info_address + 44)); - printf("\tMemory map:\n"); - - while ((unsigned int)mmap < multiboot_info_address + *((unsigned int*)(multiboot_info_address + 40))) + if (verbose) { - printf("\t\tBase addr: 0x%x%x\n\t\tLength: 0x%x%x\n\t\tType: %u\n", - mmap->base_addr_high, mmap->base_addr_low, - mmap->length_high, mmap->length_low, - mmap->type); - mmap = (multiboot_memory_map_t*)((unsigned int)mmap + mmap->size + sizeof(unsigned int)); + multiboot_memory_map_t* mmap = (multiboot_memory_map_t*)*((unsigned int*)(multiboot_info_address + 44)); + printf("Memory map:\nBase addr | Length | Type\n----------------------------------------------------\n"); + + while ((unsigned int)mmap < multiboot_info_address + *((unsigned int*)(multiboot_info_address + 40))) + { + if (mmap->length_high != 0 && mmap->length_low != 0) + { + printf("0x%x%x | 0x%x%x | %u\n", + mmap->base_addr_high, mmap->base_addr_low, + mmap->length_high, mmap->length_low, + mmap->type); + } + mmap = (multiboot_memory_map_t*)((unsigned int)mmap + mmap->size + sizeof(unsigned int)); + } } } -void program_sysinfo() +void program_sysinfo(int argc, char* argv[]) { - get_cpuid(); - get_meminfo(g_multiboot_info_address); + if (argc == 1) + { + get_cpuid(); + get_meminfo(g_multiboot_info_address, 0); + } else if (argc == 2 && strcmp(argv[1], "-v") == 0) + { + get_cpuid(); + get_meminfo(g_multiboot_info_address, 1); + } }