diff --git a/debug.gdb b/debug.gdb index 2b97864..9712b3f 100644 --- a/debug.gdb +++ b/debug.gdb @@ -1,3 +1,7 @@ target remote localhost:1234 set disassembly-flavor intel display/4i $rip + +# Trying to debug that flanterm page fault + +# b plot_char_unscaled_uncanvas if $rdi == 0 || $rsi == 0 || $rdx == 0 || $r10 == 0 \ No newline at end of file diff --git a/src/config.h b/src/config.h index 153dc4c..d243f93 100644 --- a/src/config.h +++ b/src/config.h @@ -11,7 +11,7 @@ #define PEPPEROS_VERSION_MAJOR "0" #define PEPPEROS_VERSION_MINOR "0" #define PEPPEROS_VERSION_PATCH "58" -#define PEPPEROS_SPLASH "pepperOS version "PEPPEROS_VERSION_MAJOR"."PEPPEROS_VERSION_MINOR"."PEPPEROS_VERSION_PATCH"\n" +#define PEPPEROS_SPLASH "\x1b[38;5;196mPepperOS\x1b[0m version "PEPPEROS_VERSION_MAJOR"."PEPPEROS_VERSION_MINOR"."PEPPEROS_VERSION_PATCH"\n" /* process */ #define PROCESS_NAME_MAX 64 diff --git a/src/debug/panic.c b/src/debug/panic.c index 52690fb..53a50a8 100644 --- a/src/debug/panic.c +++ b/src/debug/panic.c @@ -9,7 +9,9 @@ void panic(struct cpu_status_t* ctx, const char* str) if (ctx == NULL) { DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m Something went horribly wrong! (no cpu ctx)"); + fctprintf((void*)&skputc, 0, "\x1b[38;5;231m\x1b[48;5;27m"); DIE_DEBUG(str); + fctprintf((void*)&skputc, 0, "\x1b[0m"); skputc('\r'); skputc('\n'); DEBUG("\x1b[38;5;231m\x1b[48;5;196mend Kernel panic - halting...\x1b[0m"); diff --git a/src/io/term/flanterm_backends/fb.c b/src/io/term/flanterm_backends/fb.c index 3fd9f28..5f05b82 100644 --- a/src/io/term/flanterm_backends/fb.c +++ b/src/io/term/flanterm_backends/fb.c @@ -25,6 +25,8 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include + #ifdef __cplusplus #error "Please do not compile Flanterm as C++ code! Flanterm should be compiled as C99 or newer." #endif @@ -662,6 +664,17 @@ static void plot_char_unscaled_canvas(struct flanterm_context *_ctx, struct flan } static void plot_char_unscaled_uncanvas(struct flanterm_context *_ctx, struct flanterm_fb_char *c, size_t x, size_t y) { + + if (_ctx == NULL) + { + panic(NULL, "plot_char_unscaled_uncanvas: _ctx is NULL"); + } + + if (c == NULL) + { + panic(NULL, "plot_char_unscaled_uncanvas: c is NULL"); + } + struct flanterm_fb_context *ctx = (void *)_ctx; if (x >= _ctx->cols || y >= _ctx->rows) { @@ -953,6 +966,12 @@ static void draw_cursor(struct flanterm_context *_ctx) { } static void flanterm_fb_double_buffer_flush(struct flanterm_context *_ctx) { + + if (_ctx == NULL) + { + panic(NULL, "flanterm_fb_double_buffer_flush: _ctx is NULL"); + } + struct flanterm_fb_context *ctx = (void *)_ctx; if (_ctx->cursor_enabled) { diff --git a/src/kmain.c b/src/kmain.c index 225efe2..a5d0fdb 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -55,7 +55,8 @@ extern struct process_t* current_process; void pedicel_main(void* arg) { - //printf("Welcome to PepperOS! Pedicel speaking."); + // FROM THE NEXT LINE ONWARDS, CANNOT WRITE TO FRAMEBUFFER WITHOUT PAGE FAULT! + //printf("\n\nWelcome to PepperOS! Pedicel speaking.\nNothing left to do, halting the system!"); } void idle_main(void* arg) @@ -63,17 +64,21 @@ void idle_main(void* arg) for(;;)asm("hlt"); } -void* flanterm_malloc_wrapper(size_t size) -{ - return kmalloc(size); -} - void flanterm_free_wrapper(void* ptr, size_t size) { (void)size; kfree(ptr); } +void boot_mem_display() +{ + memmap_display(boot_ctx.mmap); + hhdm_display(boot_ctx.hhdm); + DEBUG("kernel: phys_base=0x%p virt_base=0x%p", boot_ctx.kaddr->physical_base, boot_ctx.kaddr->virtual_base); +} + +extern uintptr_t kheap_start; + // This is our entry point void kmain() { @@ -87,6 +92,7 @@ void kmain() boot_ctx.hhdm = hhdm_request.response ? hhdm_request.response : NULL; boot_ctx.kaddr = kerneladdr_request.response ? kerneladdr_request.response : NULL; + boot_mem_display(); pmm_init(boot_ctx.mmap, boot_ctx.hhdm); // Remap kernel , HHDM and framebuffer @@ -95,7 +101,7 @@ void kmain() uint32_t bgColor = 0x252525; ft_ctx = flanterm_fb_init( - flanterm_malloc_wrapper, + kmalloc, flanterm_free_wrapper, boot_ctx.fb->address, boot_ctx.fb->width, boot_ctx.fb->height, boot_ctx.fb->pitch, boot_ctx.fb->red_mask_size, boot_ctx.fb->red_mask_shift, @@ -111,10 +117,6 @@ void kmain() 0 ); - memmap_display(boot_ctx.mmap); - hhdm_display(boot_ctx.hhdm); - DEBUG("kernel: phys_base=0x%p virt_base=0x%p", boot_ctx.kaddr->physical_base, boot_ctx.kaddr->virtual_base); - CLEAR_INTERRUPTS; gdt_init(); idt_init(); @@ -122,10 +124,7 @@ void kmain() timer_init(); vmm_init(); - flanterm_write(ft_ctx, "Hello, world! Hope it won't crash this time. Lorem ipsum dolor sit amet...", sizeof("Hello, world! Hope it won't crash this time. Lorem ipsum dolor sit amet...")); - flanterm_write(ft_ctx, " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sed nulla vel justo semper elementum. Cras tincidunt vestibulum nibh id hendrerit. Duis a maximus leo. Nulla et gravida ligula. Pellentesque egestas, purus eget vestibulum faucibus, elit mi dignissim odio, vitae varius risus nisi eget ante. Mauris dictum ligula quis erat placerat tristique eu id dui. Donec bibendum vestibulum suscipit. Pellentesque tincidunt mollis tortor. Quisque quis orci cursus, pellentesque erat ut, laoreet neque. Sed id porttitor leo. Etiam euismod tincidunt magna sed ultricies. Fusce convallis pharetra urna. Nullam id dui in enim finibus rhoncus. Praesent finibus venenatis erat id vulputate. Curabitur mauris neque, congue at dictum nec, laoreet sit amet orci. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis quis turpis orci. Duis in lorem eleifend, rutrum turpis at, dignissim nunc. In ac tempor ligula, sit amet euismod lorem. Sed sed commodo lorem. Integer ut mi laoreet, consectetur felis sit amet, mollis ex. Quisque sit amet nibh a metus tincidunt facilisis. Nullam massa odio, tempor consequat enim vel, lobortis malesuada dui. Curabitur condimentum velit mi, pellentesque tincidunt magna porttitor in. Cras id libero quis nisl convallis cursus sed vitae est. Nulla ut augue semper, tristique elit nec, aliquam purus. Proin magna urna, tempus a pulvinar et, porttitor nec nisi. Aliquam elit odio, malesuada sed pretium at, consequat nec mi. Proin dignissim, ligula non tempor aliquet, velit sem fringilla nunc, sed gravida leo mi viverra lorem. Mauris sit amet mauris turpis. Mauris sed eros ultricies, sagittis justo ac, congue ligula. Nulla a ultrices velit, ut pulvinar turpis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nulla gravida consequat blandit. Phasellus sollicitudin, ligula at sagittis finibus, libero augue varius mauris, nec lacinia nunc velit at orci. Aliquam nec neque varius nisi maximus venenatis. Nullam urna arcu, elementum quis luctus eu, condimentum ac justo. Integer consectetur lacus ac odio semper tincidunt. Sed lobortis tincidunt lectus eget volutpat. Sed dictum pulvinar velit ut aliquet. Nullam ut eros ut erat pharetra maximus et vel metus. Maecenas eleifend aliquam nibh. Curabitur mollis laoreet lorem vel porttitor. Nulla cursus rutrum mauris sed dictum. Nam pellentesque nisl quis volutpat blandit. Sed sagittis pellentesque quam, nec hendrerit massa porttitor ac. Aliquam sed iaculis tortor. Duis diam metus, feugiat a iaculis non, mollis at nunc. Proin dignissim elementum urna, quis posuere diam sagittis et. Integer ac efficitur risus. Aliquam volutpat dictum metus eu rutrum. Curabitur sit amet arcu mauris. Suspendisse potenti. Aenean vitae semper nunc, ultricies eleifend libero. Pellentesque finibus erat metus, vitae bibendum arcu commodo id. Cras lacinia dolor et faucibus cursus. Nulla facilisi. Ut eu nisl eget ex euismod tempor. Fusce at commodo lectus. ", sizeof(" Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sed nulla vel justo semper elementum. Cras tincidunt vestibulum nibh id hendrerit. Duis a maximus leo. Nulla et gravida ligula. Pellentesque egestas, purus eget vestibulum faucibus, elit mi dignissim odio, vitae varius risus nisi eget ante. Mauris dictum ligula quis erat placerat tristique eu id dui. Donec bibendum vestibulum suscipit. Pellentesque tincidunt mollis tortor. Quisque quis orci cursus, pellentesque erat ut, laoreet neque. Sed id porttitor leo. Etiam euismod tincidunt magna sed ultricies. Fusce convallis pharetra urna. Nullam id dui in enim finibus rhoncus. Praesent finibus venenatis erat id vulputate. Curabitur mauris neque, congue at dictum nec, laoreet sit amet orci. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis quis turpis orci. Duis in lorem eleifend, rutrum turpis at, dignissim nunc. In ac tempor ligula, sit amet euismod lorem. Sed sed commodo lorem. Integer ut mi laoreet, consectetur felis sit amet, mollis ex. Quisque sit amet nibh a metus tincidunt facilisis. Nullam massa odio, tempor consequat enim vel, lobortis malesuada dui. Curabitur condimentum velit mi, pellentesque tincidunt magna porttitor in. Cras id libero quis nisl convallis cursus sed vitae est. Nulla ut augue semper, tristique elit nec, aliquam purus. Proin magna urna, tempus a pulvinar et, porttitor nec nisi. Aliquam elit odio, malesuada sed pretium at, consequat nec mi. Proin dignissim, ligula non tempor aliquet, velit sem fringilla nunc, sed gravida leo mi viverra lorem. Mauris sit amet mauris turpis. Mauris sed eros ultricies, sagittis justo ac, congue ligula. Nulla a ultrices velit, ut pulvinar turpis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nulla gravida consequat blandit. Phasellus sollicitudin, ligula at sagittis finibus, libero augue varius mauris, nec lacinia nunc velit at orci. Aliquam nec neque varius nisi maximus venenatis. Nullam urna arcu, elementum quis luctus eu, condimentum ac justo. Integer consectetur lacus ac odio semper tincidunt. Sed lobortis tincidunt lectus eget volutpat. Sed dictum pulvinar velit ut aliquet. Nullam ut eros ut erat pharetra maximus et vel metus. Maecenas eleifend aliquam nibh. Curabitur mollis laoreet lorem vel porttitor. Nulla cursus rutrum mauris sed dictum. Nam pellentesque nisl quis volutpat blandit. Sed sagittis pellentesque quam, nec hendrerit massa porttitor ac. Aliquam sed iaculis tortor. Duis diam metus, feugiat a iaculis non, mollis at nunc. Proin dignissim elementum urna, quis posuere diam sagittis et. Integer ac efficitur risus. Aliquam volutpat dictum metus eu rutrum. Curabitur sit amet arcu mauris. Suspendisse potenti. Aenean vitae semper nunc, ultricies eleifend libero. Pellentesque finibus erat metus, vitae bibendum arcu commodo id. Cras lacinia dolor et faucibus cursus. Nulla facilisi. Ut eu nisl eget ex euismod tempor. Fusce at commodo lectus. ")); - - // FROM THE NEXT LINE ONWARDS, CANNOT WRITE TO FRAMEBUFFER WITHOUT PAGE FAULT! + process_init(); struct process_t* idle_proc = process_create("idle", (void*)idle_main, 0); struct process_t* pedicel = process_create("pedicel", (void*)pedicel_main, 0); @@ -140,6 +139,6 @@ void kmain() keyboard_init(FR); - + printf(PEPPEROS_SPLASH); idle(); } diff --git a/src/mem/heap/kheap.c b/src/mem/heap/kheap.c index f47d6c7..b97f344 100644 --- a/src/mem/heap/kheap.c +++ b/src/mem/heap/kheap.c @@ -23,40 +23,36 @@ static uintptr_t end; // Kernel root table (level 4) extern uint64_t *kernel_pml4; -static void kheap_grow(size_t size) -{ - size_t pages = ALIGN_UP(size + sizeof(struct heap_block_t), PAGE_SIZE) / PAGE_SIZE; - - if (pages == 0) pages = 1; - - for (size_t i = 0; i < pages; i++) - { - kheap_map_page(); - } -} - -void kheap_map_page() -{ - uintptr_t phys = pmm_alloc(); - paging_map_page(kernel_pml4, end, phys, PTE_PRESENT | PTE_WRITABLE | PTE_NOEXEC); - end += PAGE_SIZE; - //DEBUG("Mapped first kheap page"); -} - void kheap_init() { kheap_start = ALIGN_UP(kernel_virt_base + KERNEL_SIZE, PAGE_SIZE); - end = kheap_start; + + size_t heap_pages = ALIGN_UP(KHEAP_SIZE, PAGE_SIZE) / PAGE_SIZE; + DEBUG("Mapping %d kernel heap pages at 0x%p", heap_pages, kheap_start); - // At least 1 page must be mapped for it to work - kheap_map_page(); + uintptr_t current_addr = kheap_start; + + // Map/alloc enough pages for heap (KHEAP_SIZE) + for (size_t i=0; isize = PAGE_SIZE - sizeof(struct heap_block_t); + head->size = (end-kheap_start) - sizeof(struct heap_block_t); head->free = true; head->next = NULL; - DEBUG("kernel heap initialized, head=0x%p, max_size=%u bytes", head, KHEAP_SIZE); + DEBUG("Kernel heap initialized, head=0x%p, size=%u bytes", head, head->size); } void* kmalloc(size_t size) @@ -73,12 +69,12 @@ void* kmalloc(size_t size) if (curr->free && curr->size >= size) { // We split the block if it is big enough - if (curr->size >= size + BLOCK_MIN_SIZE) + if (curr->size >= size + sizeof(struct heap_block_t) + 16) { //struct heap_block_t* new_block = (struct heap_block_t*)((uintptr_t)curr + sizeof(struct heap_block_t) + size); - struct heap_block_t* split = (struct heap_block_t*)((uintptr_t)curr + sizeof(*curr) + size); + struct heap_block_t* split = (struct heap_block_t*)((uintptr_t)curr + sizeof(struct heap_block_t) + size); - split->size = curr->size - size - sizeof(*curr); + split->size = curr->size - size - sizeof(struct heap_block_t); split->free = true; split->next = curr->next; @@ -94,25 +90,12 @@ void* kmalloc(size_t size) curr = curr->next; } - // If we're here it means we didn't have enough memory - // for the block allocation. So we will allocate more.. - uintptr_t old_end = end; - kheap_grow(size + sizeof(struct heap_block_t)); - - struct heap_block_t* block = (struct heap_block_t*)old_end; - block->size = ALIGN_UP(end - old_end - sizeof(struct heap_block_t), 16); - block->free = true; - block->next = NULL; - - // Put the block at the end of the list - curr = head; - while (curr->next) - { - curr = curr->next; - } - curr->next = block; - - return kmalloc(size); + // No growing. If we're here it means the initial pool + // wasn't sufficient. Too bad. + DEBUG("Kernel heap is OUT OF MEMORY!"); + // if we were terrorists maybe we should panic + // or just wait for others to free stuff? + return NULL; } void kfree(void* ptr) diff --git a/src/mem/heap/kheap.h b/src/mem/heap/kheap.h index 111cf7b..e59b204 100644 --- a/src/mem/heap/kheap.h +++ b/src/mem/heap/kheap.h @@ -14,13 +14,15 @@ #include #include +#include struct heap_block_t { size_t size; - bool free; + bool free; // 1byte + uint8_t reserved[7]; // (7+1 = 8 bytes) struct heap_block_t* next; -}; +} __attribute__((aligned(16))); void kheap_init(); void* kmalloc(size_t size); diff --git a/src/mem/paging/paging.c b/src/mem/paging/paging.c index d4db61a..4128b14 100644 --- a/src/mem/paging/paging.c +++ b/src/mem/paging/paging.c @@ -123,7 +123,7 @@ void paging_init() DEBUG("Kernel lives at virt=0x%p phys=0x%p", kernel_virt_base, kernel_phys_base); kernel_pml4 = alloc_page_table(); - + // for debug uint64_t page_count = 0; diff --git a/src/sched/scheduler.c b/src/sched/scheduler.c index 680ccf7..e1b3299 100644 --- a/src/sched/scheduler.c +++ b/src/sched/scheduler.c @@ -21,6 +21,18 @@ void scheduler_init() struct cpu_status_t* scheduler_schedule(struct cpu_status_t* context) { + if (context == NULL) + { + panic(NULL, "Scheduler called with NULL context"); + } + + if (current_process == NULL) + { + // Wtf happened + current_process = processes_list; + //panic(NULL, "Scheduler called without current process"); + } + current_process->context = context; //current_process->status = READY; diff --git a/src/sched/task.S b/src/sched/task.S deleted file mode 100644 index 9aa669b..0000000 --- a/src/sched/task.S +++ /dev/null @@ -1,7 +0,0 @@ -; Task (process) switching - -bits 64 - -global switch_to_task -switch_to_task: -