From da1c639f9f36e65248704a06ac8c98296185f251 Mon Sep 17 00:00:00 2001 From: notsomeidiot123 Date: Wed, 2 Apr 2025 12:47:55 -0400 Subject: [PATCH] Added shared/kstdlib.c:mlog and adjacent definitions --- makefile | 3 ++- src/bootloader/main.s | 3 ++- src/kernel/arch_i386/memory.c | 7 ++++--- src/kernel/drivers/serial.c | 22 ++++++++++++++++------ src/kernel/drivers/serial.h | 4 +++- src/kernel/kmain.c | 9 +++++---- src/kernel/shared/kstdlib.c | 20 ++++++++++++++++++++ src/kernel/shared/kstdlib.h | 8 ++++++++ 8 files changed, 60 insertions(+), 16 deletions(-) create mode 100644 src/kernel/shared/kstdlib.c diff --git a/makefile b/makefile index 8e8cf48..d1b8d24 100644 --- a/makefile +++ b/makefile @@ -1,6 +1,7 @@ CC := gcc AS := nasm CFLAGS:=-g -c -m32 -fno-pie -mno-sse -O3 -D __bits__=32 -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast -Wno-incompatible-pointer-types -Wno-address-of-packed-member -Wno-discarded-qualifiers -fno-stack-protector -mno-red-zone -mno-sse -mno-sse2 -ffreestanding -nostdlib -mno-mmx +CFLAGS_MODULE:=-g -c -m32 -mno-sse -O3 -D __bits__=32 -Wno-int-to-pointer-cast -Wno-pointer-to-int-cast -Wno-incompatible-pointer-types -Wno-address-of-packed-member -Wno-discarded-qualifiers -fno-stack-protector -mno-red-zone -mno-sse -mno-sse2 -ffreestanding -nostdlib -mno-mmx BL_ASFLAGS := -f bin SRCS := $(wildcard src/kernel/*/*.c) OBJS := $(patsubst src/kernel/%.c, bin/kernel/%.o, $(SRCS)) @@ -21,7 +22,7 @@ bootloader: # kernel: $(OBJS) kernel: nasm src/kernel/entry.s -o bin/kernel/entry.o -f elf32 - gcc src/kmodules/disk_driver.c $(CFLAGS) -o bin/modules/disk_driver.o -m32 + gcc src/kmodules/disk_driver.c $(CFLAGS_MODULE) -o bin/modules/disk_driver.o -m32 sh c_build_helper.sh nasm src/kernel/arch_i386/idt.s -o bin/kernel/idt.o -felf32 # ld -T linker.ld bin/kernel/entry.o bin/kernel/*.o -melf_i386 diff --git a/src/bootloader/main.s b/src/bootloader/main.s index 57be830..0744cc8 100644 --- a/src/bootloader/main.s +++ b/src/bootloader/main.s @@ -353,12 +353,13 @@ part_2: call open_file cmp eax, -1 je .start32_no_fs + mov [fs_module_struct.size], edx mov eax, esi and edx, 0xfffffc00 add edx, 0x1000 add [kload_paddr], edx - mov edi, edx + mov edi, [kload_paddr] mov [fs_module_struct.ptr], edi call read_file diff --git a/src/kernel/arch_i386/memory.c b/src/kernel/arch_i386/memory.c index 42922f8..8486e0f 100644 --- a/src/kernel/arch_i386/memory.c +++ b/src/kernel/arch_i386/memory.c @@ -36,6 +36,7 @@ int pm_init(kernel_info_t *kernel_info){ for(uint32_t i = 0; i < mmap_count; i++){ pm_map[i] = 0xff; } + mlog("KERNEL(MEMORY)", " BASE | LENGTH | TYPE\n", MLOG_PRINT); for(uint32_t i = 0; i < kernel_info->mmap_entry_count; i++){ for(uint32_t j = 0; j < (mmap[i].entry_length >> 12); j++){ if(mmap[i].entry_base + (j << 12) <= mmap[i-1].entry_base + mmap[i-1].entry_length){ @@ -54,9 +55,9 @@ int pm_init(kernel_info_t *kernel_info){ // printf("%d, %x, %d\n", j >> 3, pm_map[(mmap[i].entry_base >> 12 ) + (j >> 3)], mmap[i].type); // } } - printf("|%x|", mmap[i].entry_base); - printf("%x", mmap[i].entry_length); - printf("|%d |\n", mmap[i].type); + mlog("KERNEL(MEMORY)", " %x|%x|%d\n", MLOG_PRINT, (uint32_t)mmap[i].entry_base, (uint32_t)mmap[i].entry_length, mmap[i].type); + // printf("%x", mmap[i].entry_length); + // printf("|%d |\n", mmap[i].type); } for(uint32_t i = 0; i < 512; i++){ pm_reserve(i * 4096); diff --git a/src/kernel/drivers/serial.c b/src/kernel/drivers/serial.c index 6cddafe..64eb49d 100644 --- a/src/kernel/drivers/serial.c +++ b/src/kernel/drivers/serial.c @@ -43,30 +43,40 @@ void debug_puts(char *string){ outb(com_ports[0], *string++); } } - -void printf(char *string, ...){ +void printf(char *str, ...){ va_list vars; - va_start(vars, string); + va_start(vars, str); + vprintf(str, vars); + va_end(vars); +} + +void vprintf(char *string, va_list vars){ while(*string){ if(*string == '%'){ + string++; int32_t num = 0; + char *ptr = 0; char numb[12]; - switch(*(string + 1)){ + switch(*string){ case 'd': - string += 2; + string++; num = va_arg(vars, int32_t); itoa(num, numb, 10); debug_puts(numb); continue; case 'x': // debug_puts(":3"); - string += 2; + string++; num = va_arg(vars, int32_t); // char hnumb[12]; itoa(num, numb, 16); strpad(numb, '0', 8); debug_puts(numb); continue; + case 's': + string++; + ptr = va_arg(vars, char *); + printf(ptr); } } outb(com_ports[0], *string); diff --git a/src/kernel/drivers/serial.h b/src/kernel/drivers/serial.h index 4a62e0c..e3e7c0d 100644 --- a/src/kernel/drivers/serial.h +++ b/src/kernel/drivers/serial.h @@ -1,9 +1,11 @@ #pragma once #include +#include void init_serial(); void serial_writeb(uint8_t port, uint8_t data); void serial_writereg(uint8_t port, uint8_t reg, uint8_t data); uint8_t serial_readreg(uint8_t port, uint8_t reg); uint8_t serial_readb(uint8_t port); void debug_puts(char *string); -void printf(char *string, ...); \ No newline at end of file +void printf(char *string, ...); +void vprintf(char *string, va_list vars); \ No newline at end of file diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index e6dcc95..3d38cba 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -10,6 +10,10 @@ void pid0(){ for(;;); } +void sysinit(){ + + for(;;); +} extern void kmain(kernel_info_t *kernel_info){ init_serial(); pm_init(kernel_info); @@ -19,12 +23,9 @@ extern void kmain(kernel_info_t *kernel_info){ pic_setmask(0xfe, PIC1_DATA); //TODO: Map and load filesystem and disk modules //TODO: Start Initial Process - - printf("%x\n", *(uint32_t *)kernel_info->loaded_modules->ptr); - printf("%x", kernel_info->loaded_modules->size); - init_scheduler(); thread_start(pid0); + thread_start(sysinit); enable_interrupts(); for(;;); return; diff --git a/src/kernel/shared/kstdlib.c b/src/kernel/shared/kstdlib.c new file mode 100644 index 0000000..148659e --- /dev/null +++ b/src/kernel/shared/kstdlib.c @@ -0,0 +1,20 @@ +#include "kstdlib.h" +#include + +char* log_info_types[] = { + "", + ":DEBUG", + "", + ":WARNING", + ":ERROR" +}; + +void mlog(char *module, char *str, uint32_t type, ...){ + va_list vars; + va_start(vars, type); + if(!type || type > 4){ + return; + } + printf("[ %s %s]", module, log_info_types[type]); + vprintf(str, vars); +} \ No newline at end of file diff --git a/src/kernel/shared/kstdlib.h b/src/kernel/shared/kstdlib.h index 08c08fb..c30dd4b 100644 --- a/src/kernel/shared/kstdlib.h +++ b/src/kernel/shared/kstdlib.h @@ -1,8 +1,14 @@ #pragma once // #include "memory.h" +#include "stdint.h" #include "../drivers/serial.h" #include "interrupts.h" +#define MLOG_DEBUG 1 +#define MLOG_PRINT 2 +#define MLOG_WARN 3 +#define MLOG_ERR 4 + typedef struct module_linked_list{ void *ptr; uint32_t size; @@ -22,6 +28,8 @@ typedef struct kernel_info{ // uint32_t loaded_module_count; }__attribute__((packed)) kernel_info_t; +void mlog(char *module, char *str, uint32_t type, ...); + #define MODULE_TYPE_DISK 1 #define MODULE_TYPE_FS 2