diff --git a/Makefile b/Makefile index afef041..c6a1399 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,6 @@ build: x86_64-elf-gcc -g -c -Isrc $(SOURCES) $(PROBLEMATIC_FLAGS) -Wall -Wextra -std=gnu99 -nostdlib -ffreestanding -fno-stack-protector -fno-omit-frame-pointer -fno-stack-check -fno-PIC -ffunction-sections -fdata-sections -mcmodel=kernel objcopy -O elf64-x86-64 -B i386 -I binary zap-light16.psf zap-light16.o nasm -f elf64 src/idt/idt.S -o idt_stub.o - nasm -f elf64 src/entry.S -o entry.o x86_64-elf-ld -o pepperk -T linker.ld *.o nm -n pepperk | awk '$$2 ~ /[TtDdBbRr]/ {print $$1, $$3}' > symbols.map python3 symbols.py diff --git a/linker.ld b/linker.ld index 5e3e8a6..1b34478 100644 --- a/linker.ld +++ b/linker.ld @@ -1,6 +1,6 @@ OUTPUT_FORMAT(elf64-x86-64) -ENTRY(_start) +ENTRY(kmain) PHDRS { diff --git a/src/config.h b/src/config.h index f403993..153dc4c 100644 --- a/src/config.h +++ b/src/config.h @@ -30,7 +30,7 @@ #define KERNEL_STACK_SIZE 65536 /* heap */ -#define KHEAP_SIZE (16*1024*1024) +#define KHEAP_SIZE (32*1024*1024) /* term */ #define TERM_HISTORY_MAX_LINES 256 diff --git a/src/idt/idt.c b/src/idt/idt.c index 7e559f4..34efe6b 100644 --- a/src/idt/idt.c +++ b/src/idt/idt.c @@ -203,9 +203,6 @@ struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context) if (ticks % SCHEDULER_QUANTUM == 0) { return scheduler_schedule(context); - //struct cpu_status_t* current_ctx = scheduler_schedule(context); - //process_switch(current_ctx->iret_rsp, current_ctx->iret_rip); - //SET_INTERRUPTS; } break; diff --git a/src/io/serial/serial.c b/src/io/serial/serial.c index 9073839..e2b9c57 100644 --- a/src/io/serial/serial.c +++ b/src/io/serial/serial.c @@ -42,7 +42,7 @@ int serial_init() // Set normal operation mode outb(PORT + 4, 0x0F); - DEBUG("serial initialized"); + DEBUG("*** Welcome to PepperOS! ***"); return 0; } diff --git a/src/kmain.c b/src/kmain.c index 02a2644..225efe2 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -41,7 +41,7 @@ void hcf() // Doing nothing (can be interrupted) void idle() {SET_INTERRUPTS; for(;;)asm("hlt");} -uint8_t kernel_stack[KERNEL_STACK_SIZE] __attribute__((aligned(16))); +// uint8_t kernel_stack[KERNEL_STACK_SIZE] __attribute__((aligned(16))); struct boot_context boot_ctx; @@ -55,12 +55,7 @@ extern struct process_t* current_process; void pedicel_main(void* arg) { - //printf("Hello, world from a KERNEL PROCESS!"); -} - -void two_main(void* arg) -{ - //printf("...process 2 speaking!!!"); + //printf("Welcome to PepperOS! Pedicel speaking."); } void idle_main(void* arg) @@ -68,11 +63,24 @@ 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); +} + // This is our entry point void kmain() { if (!LIMINE_BASE_REVISION_SUPPORTED) hcf(); + serial_init(); + // Populate boot context boot_ctx.fb = framebuffer_request.response ? framebuffer_request.response->framebuffers[0] : NULL; boot_ctx.mmap = memmap_request.response ? memmap_request.response : NULL; @@ -83,11 +91,12 @@ void kmain() // Remap kernel , HHDM and framebuffer paging_init(boot_ctx.kaddr, boot_ctx.fb); + kheap_init(); uint32_t bgColor = 0x252525; ft_ctx = flanterm_fb_init( - NULL, - NULL, + flanterm_malloc_wrapper, + 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, boot_ctx.fb->green_mask_size, boot_ctx.fb->green_mask_shift, @@ -102,8 +111,6 @@ void kmain() 0 ); - serial_init(); - 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); @@ -111,16 +118,17 @@ void kmain() CLEAR_INTERRUPTS; gdt_init(); idt_init(); - timer_init(); - - kheap_init(); + 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! struct process_t* idle_proc = process_create("idle", (void*)idle_main, 0); struct process_t* pedicel = process_create("pedicel", (void*)pedicel_main, 0); - struct process_t* two = process_create("two", (void*)two_main, 0); - + process_display_list(processes_list); scheduler_init(); @@ -131,13 +139,7 @@ void kmain() SET_INTERRUPTS; keyboard_init(FR); - //term_init(); - //printf(PEPPEROS_SPLASH); - - //printf("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur eu diam id sem tincidunt vestibulum. Etiam sed congue nisl, vitae aliquet orci. Donec magna turpis, semper sed ipsum eget, semper blandit dolor. Morbi faucibus posuere sapien. Vestibulum aliquet mi vel orci finibus, vestibulum rhoncus tellus sagittis. Vivamus a arcu suscipit sem iaculis volutpat vel nec est. Nulla malesuada, urna vel pretium pretium, enim tortor pulvinar velit, porttitor dictum lectus turpis id tortor. Quisque egestas ultricies lorem, egestas ultrices tellus elementum porta. Fusce consequat nisi in diam placerat fermentum. Suspendisse tempus turpis nec turpis condimentum fringilla. Maecenas nec orci pharetra, feugiat enim vel, viverra neque. Vivamus placerat purus in tincidunt ultricies. Pellentesque vel mi molestie, congue nibh nec, cursus nisl. Cras dapibus lectus mauris, sed interdum risus tristique non. "); - - flanterm_write(ft_ctx, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur eu diam id sem tincidunt vestibulum. Etiam sed congue nisl, vitae aliquet orci. Donec magna turpis, semper sed ipsum eget, semper blandit dolor. Morbi faucibus posuere sapien. Vestibulum aliquet mi vel orci finibus, vestibulum rhoncus tellus sagittis. Vivamus a arcu suscipit sem iaculis volutpat vel nec est. Nulla malesuada, urna vel pretium pretium, enim tortor pulvinar velit, porttitor dictum lectus turpis id tortor. Quisque egestas ultricies lorem, egestas ultrices tellus elementum porta. Fusce consequat nisi in diam placerat fermentum. Suspendisse tempus turpis nec turpis condimentum fringilla. Maecenas nec orci pharetra, feugiat enim vel, viverra neque. Vivamus placerat purus in tincidunt ultricies. Pellentesque vel mi molestie, congue nibh nec, cursus nisl. Cras dapibus lectus mauris, sed interdum risus tristique non.", sizeof("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur eu diam id sem tincidunt vestibulum. Etiam sed congue nisl, vitae aliquet orci. Donec magna turpis, semper sed ipsum eget, semper blandit dolor. Morbi faucibus posuere sapien. Vestibulum aliquet mi vel orci finibus, vestibulum rhoncus tellus sagittis. Vivamus a arcu suscipit sem iaculis volutpat vel nec est. Nulla malesuada, urna vel pretium pretium, enim tortor pulvinar velit, porttitor dictum lectus turpis id tortor. Quisque egestas ultricies lorem, egestas ultrices tellus elementum porta. Fusce consequat nisi in diam placerat fermentum. Suspendisse tempus turpis nec turpis condimentum fringilla. Maecenas nec orci pharetra, feugiat enim vel, viverra neque. Vivamus placerat purus in tincidunt ultricies. Pellentesque vel mi molestie, congue nibh nec, cursus nisl. Cras dapibus lectus mauris, sed interdum risus tristique non. ")); idle(); } diff --git a/src/mem/heap/kheap.c b/src/mem/heap/kheap.c index d3918f2..f47d6c7 100644 --- a/src/mem/heap/kheap.c +++ b/src/mem/heap/kheap.c @@ -56,7 +56,7 @@ void kheap_init() head->size = PAGE_SIZE - sizeof(struct heap_block_t); head->free = true; head->next = NULL; - DEBUG("kheap initialized, head=0x%p, size=%u", head, head->size); + DEBUG("kernel heap initialized, head=0x%p, max_size=%u bytes", head, KHEAP_SIZE); } void* kmalloc(size_t size) diff --git a/src/mem/paging/vmm.c b/src/mem/paging/vmm.c index f7f3256..3e989f9 100644 --- a/src/mem/paging/vmm.c +++ b/src/mem/paging/vmm.c @@ -68,5 +68,6 @@ void vmm_setup_pt_root() void vmm_init() { - vmm_setup_pt_root(); + // NO U + //vmm_setup_pt_root(); } \ No newline at end of file diff --git a/src/sched/process.c b/src/sched/process.c index 28945ad..1c7c243 100644 --- a/src/sched/process.c +++ b/src/sched/process.c @@ -13,6 +13,9 @@ #include "config.h" #include "io/serial/serial.h" +#include "io/term/flanterm.h" +extern struct flanterm_context* ft_ctx; + struct process_t* processes_list; struct process_t* current_process; @@ -139,23 +142,6 @@ struct process_t* process_get_next(struct process_t* process) return process->next; } -// (from gdt) This will switch tasks ONLY in ring 0 -// KERNEL CS = 0x08 -// KERNEL SS = 0x10 -__attribute__((naked, noreturn)) -void process_switch(uint64_t stack_addr, uint64_t code_addr) -{ - asm volatile(" \ - push $0x10 \n\ - push %0 \n\ - push $0x202 \n\ - push $0x08 \n\ - push %1 \n\ - iretq \n\ - " :: "r"(stack_addr), "r"(code_addr)); -} - - // Will be used to clean up resources (if any, when we implement it) // Just mark as DEAD then idle. Scheduler will delete process at next timer interrupt % quantum. void process_exit() diff --git a/src/sched/process.h b/src/sched/process.h index f245728..5209e65 100644 --- a/src/sched/process.h +++ b/src/sched/process.h @@ -34,7 +34,6 @@ struct process_t* process_create(char* name, void(*function)(void*), void* arg); void process_add(struct process_t** processes_list, struct process_t* process); void process_delete(struct process_t** processes_list, struct process_t* process); struct process_t* process_get_next(struct process_t* process); -void process_switch(uint64_t stack_addr, uint64_t code_addr); void process_exit(); void process_display_list(struct process_t* processes_list);