From 458ba375f31faa1a291e8500f7aa182fc14e73ad Mon Sep 17 00:00:00 2001 From: xamidev Date: Sat, 7 Feb 2026 02:18:15 +0100 Subject: [PATCH 1/5] better panic --- debug.gdb | 2 +- src/config.h | 4 +++- src/idt/idt.c | 10 +++------- src/kernel.h | 4 +++- src/kmain.c | 17 +++++++++++++---- src/mem/paging/pmm.c | 7 +++++-- src/sched/process.h | 1 + src/sched/task.S | 7 +++++++ 8 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 src/sched/task.S diff --git a/debug.gdb b/debug.gdb index 616ded2..2b97864 100644 --- a/debug.gdb +++ b/debug.gdb @@ -1,3 +1,3 @@ target remote localhost:1234 set disassembly-flavor intel -display/8i $rip \ No newline at end of file +display/4i $rip diff --git a/src/config.h b/src/config.h index a77d092..1fb3b16 100644 --- a/src/config.h +++ b/src/config.h @@ -16,6 +16,8 @@ /* process */ #define PROCESS_NAME_MAX 64 #define PROCESS_STACK_SIZE 0x10000 // 64kb +#define PROCESS_BASE 0x400000 +#define PROCESS_STACK_BASE 0x1000000 /* sched */ // 1 tick = 1 ms => quantum = 10ms @@ -32,4 +34,4 @@ /* term */ #define TERM_HISTORY_MAX_LINES 256 -#endif \ No newline at end of file +#endif diff --git a/src/idt/idt.c b/src/idt/idt.c index d70e89a..025dedd 100644 --- a/src/idt/idt.c +++ b/src/idt/idt.c @@ -87,11 +87,7 @@ static void page_fault_handler(struct cpu_status_t* ctx) CHECK_BIT(ctx->error_code, 7) ? " SGX_VIOLATION" : "", cr2); - /* if (CHECK_BIT(ctx->error_code, 0)) - { - panic(ctx); - } */ - panic(ctx); + panic(ctx, "page fault"); } static void gp_fault_handler(struct cpu_status_t* ctx) @@ -117,7 +113,7 @@ static void gp_fault_handler(struct cpu_status_t* ctx) index); } - panic(ctx); + panic(ctx, "gp fault"); } struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context) @@ -217,4 +213,4 @@ struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context) } return context; -} \ No newline at end of file +} diff --git a/src/kernel.h b/src/kernel.h index 11f5777..e8fcae1 100644 --- a/src/kernel.h +++ b/src/kernel.h @@ -22,11 +22,13 @@ enum ErrorCodes #define DEBUG(log, ...) fctprintf((void*)&skputc, 0, "debug: [%s]: " log "\r\n", __FILE__, ##__VA_ARGS__) +#define DIE_DEBUG(str) fctprintf((void*)&skputc, 0, str) + #define CHECK_BIT(var,pos) ((var) & (1<<(pos))) // printf("debug: [%s]: " log "\n", __FILE__, ##__VA_ARGS__); -void panic(struct cpu_status_t* ctx); +void panic(struct cpu_status_t* ctx, const char* str); void hcf(); #define assert(check) do { if(!(check)) hcf(); } while(0) diff --git a/src/kmain.c b/src/kmain.c index 7d74dd2..922e7cb 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -37,8 +37,17 @@ void hcf() // Doing nothing (can be interrupted) void idle() {for(;;)asm("hlt");} -void panic(struct cpu_status_t* ctx) +void panic(struct cpu_status_t* ctx, const char* str) { + CLEAR_INTERRUPTS; + if (ctx == NULL) + { + DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m Something went horribly wrong! (no cpu ctx)"); + DIE_DEBUG(str); + skputc('\n'); + DEBUG("\x1b[38;5;231m\x1b[48;5;196mend Kernel panic - halting...\x1b[0m"); + hcf(); + } DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m at rip=%p\nSomething went horribly wrong! vect=0x%.2x errcode=0x%x\n\rrax=%p rbx=%p rcx=%p rdx=%p\n\rrsi=%p rdi=%p r8=%p r9=%p\n\rr10=%p r11=%p r12=%p r13=%p\n\rr14=%p r15=%p\n\n\rflags=%p\n\rstack at rbp=%p\n\rHalting...", ctx->iret_rip, ctx->vector_number, ctx->error_code, ctx->rax, ctx->rbx, ctx->rcx, ctx->rdx, ctx->rsi, ctx->rdi, @@ -59,7 +68,7 @@ extern struct process_t* current_process; void pedicel_main(void* arg) { - + panic(NULL, "we did it!"); } void two_main(void* arg) @@ -104,8 +113,8 @@ void kmain() vmm_init(); struct process_t* pedicel = process_create("pedicel", (void*)pedicel_main, 0); - struct process_t* two = process_create("two", (void*)two_main, 0); - struct process_t* three = process_create("three", (void*)three_main, 0); + //struct process_t* two = process_create("two", (void*)two_main, 0); + //struct process_t* three = process_create("three", (void*)three_main, 0); process_display_list(processes_list); scheduler_init(); diff --git a/src/mem/paging/pmm.c b/src/mem/paging/pmm.c index 6b0d616..2b45699 100644 --- a/src/mem/paging/pmm.c +++ b/src/mem/paging/pmm.c @@ -66,7 +66,10 @@ static uintptr_t g_freelist = 0; uintptr_t pmm_alloc() { - if (!g_freelist) return 0; + if (!g_freelist) + { + panic(NULL, "PMM is out of memory!"); + } uintptr_t addr = g_freelist; g_freelist = *(uintptr_t*) PHYS_TO_VIRT(g_freelist); return addr; @@ -104,4 +107,4 @@ void pmm_init(struct limine_memmap_response* memmap, struct limine_hhdm_response // Now we have biggest USABLE region, // so to populate the free list we just iterate through it pmm_init_freelist(); -} \ No newline at end of file +} diff --git a/src/sched/process.h b/src/sched/process.h index e6dedbc..9b8e572 100644 --- a/src/sched/process.h +++ b/src/sched/process.h @@ -24,6 +24,7 @@ struct process_t status_t status; struct cpu_status_t* context; + void* root_page_table; // Process PML4 (should contain kernel PML4 in higher half [256-511] struct process_t* next; }; diff --git a/src/sched/task.S b/src/sched/task.S new file mode 100644 index 0000000..9aa669b --- /dev/null +++ b/src/sched/task.S @@ -0,0 +1,7 @@ +; Task (process) switching + +bits 64 + +global switch_to_task +switch_to_task: + From ac7216d84a042007dd422ac09ba73c5fb21d0987 Mon Sep 17 00:00:00 2001 From: xamidev Date: Tue, 17 Feb 2026 23:01:32 +0100 Subject: [PATCH 2/5] Setup kernel stack; but process is failing --- DOOM.txt | 24 ++++++++++++++++++++ Makefile | 5 +++-- linker.ld | 2 +- src/config.h | 1 + src/entry.S | 23 +++++++++++++++++++ src/idt/idt.c | 10 ++++++++- src/kernel.h | 1 + src/kmain.c | 17 ++++++-------- src/mem/heap/kheap.c | 2 +- src/mem/paging/paging.c | 2 +- src/mem/paging/paging.h | 3 +++ src/sched/process.c | 49 +++++++++++++++++++++++++++++++++++++++-- src/sched/process.h | 3 +++ src/sched/scheduler.c | 13 +++++++++-- src/sched/scheduler.h | 2 +- 15 files changed, 136 insertions(+), 21 deletions(-) create mode 100644 DOOM.txt create mode 100644 src/entry.S diff --git a/DOOM.txt b/DOOM.txt new file mode 100644 index 0000000..4f1aa83 --- /dev/null +++ b/DOOM.txt @@ -0,0 +1,24 @@ +up to doom: + +- Return from pedicel_main() normally (to idle) + +** Checkpoint: ring0 process working + +- VFS layer (open/read/write/...) with USTar filesystem (for initrd) + +** Checkpoint: files not linked to but accessible by the kernel + +- Ring3 memory mappings +- Ring3 privilege switch + +** Checkpoint: welcome to userland + +- Syscall interface +- Implement syscalls needed for doom + +** Checkpoint: can run simple programs, ring 3, loaded from filesystem + +- Properly handle the keyboard interrupt (keyboard buffer) +- Port DOOMgeneric (few functions with Framebuffer/ticks/etc.) + +** Achievement: It runs doom! diff --git a/Makefile b/Makefile index ce177d1..13cd618 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ 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 limine/limine: @@ -32,11 +33,11 @@ build-iso: limine/limine build ./limine/limine bios-install pepper.iso debug: - qemu-system-x86_64 -drive file=pepper.iso -s -S -d int -no-reboot -no-shutdown & + /usr/bin/qemu-system-x86_64 -drive file=pepper.iso -s -S -d int -no-reboot -no-shutdown & gdb pepperk --command=debug.gdb run: build-iso - qemu-system-x86_64 -cdrom pepper.iso -serial stdio + /usr/bin/qemu-system-x86_64 -cdrom pepper.iso -serial stdio clean: rm -rf *.o pepperk iso_root pepper.iso limine diff --git a/linker.ld b/linker.ld index 1b34478..5e3e8a6 100644 --- a/linker.ld +++ b/linker.ld @@ -1,6 +1,6 @@ OUTPUT_FORMAT(elf64-x86-64) -ENTRY(kmain) +ENTRY(_start) PHDRS { diff --git a/src/config.h b/src/config.h index 1fb3b16..632a1f5 100644 --- a/src/config.h +++ b/src/config.h @@ -27,6 +27,7 @@ #define KERNEL_BASE 0xFFFFFFFF80000000ULL // 2 MB should be enough (as of now, the whole kernel ELF is around 75kb) #define KERNEL_SIZE 0x200000 +#define KERNEL_STACK_SIZE 65536 /* heap */ #define KHEAP_SIZE (16*1024*1024) diff --git a/src/entry.S b/src/entry.S new file mode 100644 index 0000000..73b6de0 --- /dev/null +++ b/src/entry.S @@ -0,0 +1,23 @@ +bits 64 +global _start + +extern kmain +extern kernel_stack + +KERNEL_STACK_SIZE equ 65536 + +section .text + +_start: + cli + + ; load kernel stack + lea rsp, [kernel_stack+KERNEL_STACK_SIZE] + + ; rbp=0 so last frame in stack trace + xor rbp, rbp + + ; 16 byte align + and rsp, -16 + + call kmain \ No newline at end of file diff --git a/src/idt/idt.c b/src/idt/idt.c index 025dedd..61e402c 100644 --- a/src/idt/idt.c +++ b/src/idt/idt.c @@ -13,6 +13,7 @@ #include #include "sched/scheduler.h" #include "config.h" +#include "sched/process.h" struct interrupt_descriptor idt[256]; struct idtr idt_reg; @@ -118,6 +119,11 @@ static void gp_fault_handler(struct cpu_status_t* ctx) struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context) { + if (context == NULL) + { + panic(NULL, "Interrupt dispatch recieved NULL context!"); + } + switch(context->vector_number) { case 0: @@ -140,6 +146,7 @@ struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context) break; case 6: DEBUG("Invalid Opcode!"); + panic(context, "Invalid Opcode!"); break; case 7: DEBUG("Device Not Available!"); @@ -194,7 +201,8 @@ struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context) if (ticks % SCHEDULER_QUANTUM == 0) { CLEAR_INTERRUPTS; - scheduler_schedule(); + struct cpu_status_t* current_ctx = scheduler_schedule(context); + process_switch(current_ctx->iret_rsp, current_ctx->iret_rip); SET_INTERRUPTS; } diff --git a/src/kernel.h b/src/kernel.h index e8fcae1..a6834c1 100644 --- a/src/kernel.h +++ b/src/kernel.h @@ -30,6 +30,7 @@ enum ErrorCodes void panic(struct cpu_status_t* ctx, const char* str); void hcf(); +void idle(); #define assert(check) do { if(!(check)) hcf(); } while(0) struct boot_context diff --git a/src/kmain.c b/src/kmain.c index 922e7cb..856d336 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -37,6 +37,8 @@ void hcf() // Doing nothing (can be interrupted) void idle() {for(;;)asm("hlt");} +uint8_t kernel_stack[KERNEL_STACK_SIZE] __attribute__((aligned(16))); + void panic(struct cpu_status_t* ctx, const char* str) { CLEAR_INTERRUPTS; @@ -68,17 +70,13 @@ extern struct process_t* current_process; void pedicel_main(void* arg) { - panic(NULL, "we did it!"); + printf("Hello, world from a KERNEL PROCESS!"); + //panic(NULL, "WE DID IT! Hello, world from a PROCESS!!!!"); } -void two_main(void* arg) +void idle_main(void* arg) { - -} - -void three_main(void* arg) -{ - + for(;;)asm("hlt"); } // This is our entry point @@ -113,8 +111,7 @@ void kmain() vmm_init(); struct process_t* pedicel = process_create("pedicel", (void*)pedicel_main, 0); - //struct process_t* two = process_create("two", (void*)two_main, 0); - //struct process_t* three = process_create("three", (void*)three_main, 0); + process_display_list(processes_list); scheduler_init(); diff --git a/src/mem/heap/kheap.c b/src/mem/heap/kheap.c index 220471a..d3918f2 100644 --- a/src/mem/heap/kheap.c +++ b/src/mem/heap/kheap.c @@ -142,6 +142,6 @@ void kfree(void* ptr) // Should return a pointer to top of the stack (as stack grows DOWNWARDS) void* kalloc_stack() { - uint8_t* ptr = kmalloc(PROCESS_STACK_SIZE); + uint8_t* ptr = kmalloc(PROCESS_STACK_SIZE); // As it's out of kmalloc, stack is already mapped into kernel space return ptr ? ptr+PROCESS_STACK_SIZE : NULL; } \ No newline at end of file diff --git a/src/mem/paging/paging.c b/src/mem/paging/paging.c index 0597943..c208e53 100644 --- a/src/mem/paging/paging.c +++ b/src/mem/paging/paging.c @@ -24,7 +24,7 @@ If we use 1GB huge pages: PML4 -> PDPT -> 1gb pages 4KB (regular size): PML4 -> PDPT -> PD -> PT -> 4kb pages */ -static inline void load_cr3(uint64_t value) { +void load_cr3(uint64_t value) { asm volatile ("mov %0, %%cr3" :: "r"(value) : "memory"); } diff --git a/src/mem/paging/paging.h b/src/mem/paging/paging.h index 34afeaa..7aa32ba 100644 --- a/src/mem/paging/paging.h +++ b/src/mem/paging/paging.h @@ -16,6 +16,9 @@ void paging_init(); void paging_map_page(uint64_t* root_table, uint64_t virt, uint64_t phys, uint64_t flags); +// To swap root page tables +void load_cr3(uint64_t value); + extern uint64_t hhdm_off; #define PHYS_TO_VIRT(x) ((void*)((uintptr_t)(x) + hhdm_off)) diff --git a/src/sched/process.c b/src/sched/process.c index 9161a37..7566bbf 100644 --- a/src/sched/process.c +++ b/src/sched/process.c @@ -11,10 +11,13 @@ #include "string/string.h" #include "mem/gdt/gdt.h" #include "config.h" +#include "io/serial/serial.h" struct process_t* processes_list; struct process_t* current_process; +extern uint64_t *kernel_pml4; + size_t next_free_pid = 0; void process_init() @@ -52,14 +55,22 @@ struct process_t* process_create(char* name, void(*function)(void*), void* arg) proc->pid = next_free_pid++; proc->status = READY; + uint64_t* stack_top = (uint64_t*)kalloc_stack(); + // push return address to the stack so when "ret" hits we jmp to exit instead of idk what + // stack grows DOWNWARDS!! + *(--stack_top) = (uint64_t)process_exit; + proc->context = ctx; proc->context->iret_ss = KERNEL_DATA_SEGMENT; // process will live in kernel mode - proc->context->iret_rsp = (uint64_t)kalloc_stack(); + proc->context->iret_rsp = (uint64_t)stack_top; proc->context->iret_flags = 0x202; //bit 2 and 9 set (Interrupt Flag) proc->context->iret_cs = KERNEL_CODE_SEGMENT; proc->context->iret_rip = (uint64_t)function; // beginning of executable code proc->context->rdi = (uint64_t)arg; // 1st arg is in rdi (as per x64 calling convention) - proc->context->rbp = 0; + proc->context->rbp = 0; + + // Kernel PML4 as it already maps code/stack (when switching to userland we'll have to change that) + proc->root_page_table = kernel_pml4; proc->next = 0; @@ -126,4 +137,38 @@ struct process_t* process_get_next(struct process_t* process) { if (!process) return NULL; 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() +{ + CLEAR_INTERRUPTS; + if (current_process) + { + current_process->status = DEAD; + } + SET_INTERRUPTS; + + for (;;) + { + asm("hlt"); + } } \ No newline at end of file diff --git a/src/sched/process.h b/src/sched/process.h index 9b8e572..f245728 100644 --- a/src/sched/process.h +++ b/src/sched/process.h @@ -9,6 +9,7 @@ #include #include "config.h" +#include typedef enum { @@ -33,6 +34,8 @@ 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); diff --git a/src/sched/scheduler.c b/src/sched/scheduler.c index 0299ce8..645d845 100644 --- a/src/sched/scheduler.c +++ b/src/sched/scheduler.c @@ -6,6 +6,8 @@ #include "kernel.h" #include "process.h" +#include "mem/paging/paging.h" +#include extern struct process_t* processes_list; extern struct process_t* current_process; @@ -18,7 +20,7 @@ void scheduler_init() struct cpu_status_t* scheduler_schedule(struct cpu_status_t* context) { - current_process->context = context; + //current_process->context = context; current_process->status = READY; for (;;) { @@ -41,6 +43,13 @@ struct cpu_status_t* scheduler_schedule(struct cpu_status_t* context) } } - DEBUG("current_process={pid=%u name='%s'}", current_process->pid, current_process->name); + + // Current_process gets wrong context?? (iret_rip points to other stuff than process function; like putpixel() for example) + DEBUG("current_process={pid=%u, name='%s', root_page_table[virt]=%p}", current_process->pid, current_process->name, current_process->root_page_table); + + load_cr3(VIRT_TO_PHYS((uint64_t)current_process->root_page_table)); + DEBUG("loaded process pml4 into cr3"); + /* process_switch(current_process->context->rbp, current_process->context->iret_rip); + DEBUG("switched to process rip!"); */ return current_process->context; } \ No newline at end of file diff --git a/src/sched/scheduler.h b/src/sched/scheduler.h index b4d7516..9ec712e 100644 --- a/src/sched/scheduler.h +++ b/src/sched/scheduler.h @@ -7,7 +7,7 @@ #ifndef SCHEDULER_H #define SCHEDULER_H -void scheduler_schedule(); +struct cpu_status_t* scheduler_schedule(struct cpu_status_t* context); void scheduler_init(); #endif \ No newline at end of file From 4cf4fb0dda35616eb00b58d4920baa7e6459e053 Mon Sep 17 00:00:00 2001 From: xamidev Date: Fri, 20 Feb 2026 16:01:34 +0100 Subject: [PATCH 3/5] Task switching fix? but doesnt exit process gracefully --- .gitignore | 3 ++- Makefile | 4 ++++ src/idt/idt.c | 12 ++++++------ src/kmain.c | 6 +++++- src/sched/process.c | 2 ++ src/sched/scheduler.c | 6 +++--- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 3e041d8..a3f06dd 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ iso_root *.iso *.gch */*.gch -*/*/*.gch \ No newline at end of file +*/*/*.gch +.gdb_history \ No newline at end of file diff --git a/Makefile b/Makefile index 13cd618..761f074 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,10 @@ debug: /usr/bin/qemu-system-x86_64 -drive file=pepper.iso -s -S -d int -no-reboot -no-shutdown & gdb pepperk --command=debug.gdb +debug2: + /usr/bin/qemu-system-x86_64 -drive file=pepper.iso -s -S -d int -no-reboot -no-shutdown & + pwndbg pepperk --command=debug.gdb + run: build-iso /usr/bin/qemu-system-x86_64 -cdrom pepper.iso -serial stdio diff --git a/src/idt/idt.c b/src/idt/idt.c index 61e402c..7e559f4 100644 --- a/src/idt/idt.c +++ b/src/idt/idt.c @@ -197,17 +197,17 @@ struct cpu_status_t* interrupt_dispatch(struct cpu_status_t* context) case 32: // Timer Interrupt ticks++; + // Send an EOI so that we can continue having interrupts + outb(0x20, 0x20); if (ticks % SCHEDULER_QUANTUM == 0) { - CLEAR_INTERRUPTS; - struct cpu_status_t* current_ctx = scheduler_schedule(context); - process_switch(current_ctx->iret_rsp, current_ctx->iret_rip); - SET_INTERRUPTS; + 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; } - // Send an EOI so that we can continue having interrupts - outb(0x20, 0x20); break; case 33: diff --git a/src/kmain.c b/src/kmain.c index 856d336..d9aac09 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -35,7 +35,7 @@ void hcf() } // Doing nothing (can be interrupted) -void idle() {for(;;)asm("hlt");} +void idle() {SET_INTERRUPTS; for(;;)asm("hlt");} uint8_t kernel_stack[KERNEL_STACK_SIZE] __attribute__((aligned(16))); @@ -110,12 +110,16 @@ void kmain() vmm_init(); + struct process_t* idle_proc = process_create("idle", (void*)idle_main, 0); struct process_t* pedicel = process_create("pedicel", (void*)pedicel_main, 0); process_display_list(processes_list); scheduler_init(); + current_process = idle_proc; + current_process->status = RUNNING; + SET_INTERRUPTS; keyboard_init(FR); diff --git a/src/sched/process.c b/src/sched/process.c index 7566bbf..28945ad 100644 --- a/src/sched/process.c +++ b/src/sched/process.c @@ -160,6 +160,7 @@ void process_switch(uint64_t stack_addr, uint64_t code_addr) // Just mark as DEAD then idle. Scheduler will delete process at next timer interrupt % quantum. void process_exit() { + DEBUG("Exiting from process '%s'", current_process->name); CLEAR_INTERRUPTS; if (current_process) { @@ -167,6 +168,7 @@ void process_exit() } SET_INTERRUPTS; + outb(0x20, 0x20); for (;;) { asm("hlt"); diff --git a/src/sched/scheduler.c b/src/sched/scheduler.c index 645d845..1e2e98d 100644 --- a/src/sched/scheduler.c +++ b/src/sched/scheduler.c @@ -8,6 +8,7 @@ #include "process.h" #include "mem/paging/paging.h" #include +#include "io/serial/serial.h" extern struct process_t* processes_list; extern struct process_t* current_process; @@ -20,7 +21,7 @@ void scheduler_init() struct cpu_status_t* scheduler_schedule(struct cpu_status_t* context) { - //current_process->context = context; + current_process->context = context; current_process->status = READY; for (;;) { @@ -49,7 +50,6 @@ struct cpu_status_t* scheduler_schedule(struct cpu_status_t* context) load_cr3(VIRT_TO_PHYS((uint64_t)current_process->root_page_table)); DEBUG("loaded process pml4 into cr3"); - /* process_switch(current_process->context->rbp, current_process->context->iret_rip); - DEBUG("switched to process rip!"); */ + return current_process->context; } \ No newline at end of file From 9470dedb61528b939ee9fd80e9b0e17ae3a7bef4 Mon Sep 17 00:00:00 2001 From: xamidev Date: Sat, 21 Feb 2026 19:28:17 +0100 Subject: [PATCH 4/5] Stack trace with double linking to get symbol names --- Makefile | 8 +- README.md | 2 +- src/debug/panic.c | 23 ++ src/debug/stacktrace.c | 75 ++++++ src/kernel.h | 4 + src/kmain.c | 26 +- symbols.S | 547 +++++++++++++++++++++++++++++++++++++++++ symbols.map | 180 ++++++++++++++ symbols.py | 33 +++ 9 files changed, 875 insertions(+), 23 deletions(-) create mode 100644 src/debug/panic.c create mode 100644 src/debug/stacktrace.c create mode 100644 symbols.S create mode 100644 symbols.map create mode 100644 symbols.py diff --git a/Makefile b/Makefile index 761f074..1b3d907 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -SOURCES = src/boot/boot.c src/sched/scheduler.c src/sched/process.c src/mem/heap/kheap.c src/mem/paging/vmm.c src/mem/paging/paging.c src/mem/paging/pmm.c src/string/string.c src/io/kbd/ps2.c src/io/serial/serial.c src/io/term/printf.c src/io/term/term.c src/idt/idt.c src/mem/gdt/gdt.c src/mem/misc/utils.c src/time/timer.c src/kmain.c +SOURCES = src/debug/panic.c src/debug/stacktrace.c src/boot/boot.c src/sched/scheduler.c src/sched/process.c src/mem/heap/kheap.c src/mem/paging/vmm.c src/mem/paging/paging.c src/mem/paging/pmm.c src/string/string.c src/io/kbd/ps2.c src/io/serial/serial.c src/io/term/printf.c src/io/term/term.c src/idt/idt.c src/mem/gdt/gdt.c src/mem/misc/utils.c src/time/timer.c src/kmain.c PROBLEMATIC_FLAGS=-Wno-unused-parameter -Wno-unused-variable @@ -9,6 +9,10 @@ build: 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 + nasm -f elf64 symbols.S -o symbols.o + x86_64-elf-ld -o pepperk -T linker.ld *.o limine/limine: rm -rf limine @@ -44,4 +48,4 @@ run: build-iso /usr/bin/qemu-system-x86_64 -cdrom pepper.iso -serial stdio clean: - rm -rf *.o pepperk iso_root pepper.iso limine + rm -rf *.o symbols.map symbols.S pepperk iso_root pepper.iso limine diff --git a/README.md b/README.md index 7b60818..1f5ad34 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Trying the kernel -First install the dependencies: `sudo apt install xorriso make qemu-system` +First install the dependencies: `sudo apt install python3 xorriso make qemu-system` Then, to compile the kernel and make an ISO image file: `make build-iso` To run it with QEMU, `make run` diff --git a/src/debug/panic.c b/src/debug/panic.c new file mode 100644 index 0000000..1a73a3d --- /dev/null +++ b/src/debug/panic.c @@ -0,0 +1,23 @@ +#include +#include "idt/idt.h" +#include "io/serial/serial.h" +#include "kernel.h" + +void panic(struct cpu_status_t* ctx, const char* str) +{ + CLEAR_INTERRUPTS; + if (ctx == NULL) + { + DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m Something went horribly wrong! (no cpu ctx)"); + DIE_DEBUG(str); + skputc('\n'); + DEBUG("\x1b[38;5;231m\x1b[48;5;196mend Kernel panic - halting...\x1b[0m"); + hcf(); + } + DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m at rip=%p\nSomething went horribly wrong! vect=0x%.2x errcode=0x%x\n\rrax=%p rbx=%p rcx=%p rdx=%p\n\rrsi=%p rdi=%p r8=%p r9=%p\n\rr10=%p r11=%p r12=%p r13=%p\n\rr14=%p r15=%p\n\n\rflags=%p\n\rHalting...", + ctx->iret_rip, + ctx->vector_number, ctx->error_code, ctx->rax, ctx->rbx, ctx->rcx, ctx->rdx, ctx->rsi, ctx->rdi, + ctx->r8, ctx->r9, ctx->r10, ctx->r11, ctx->r12, ctx->r13, ctx->r14, ctx->r15, ctx->iret_flags); + debug_stack_trace(100); + hcf(); +} \ No newline at end of file diff --git a/src/debug/stacktrace.c b/src/debug/stacktrace.c new file mode 100644 index 0000000..af7af65 --- /dev/null +++ b/src/debug/stacktrace.c @@ -0,0 +1,75 @@ +#include +#include "kernel.h" + +void debug_stack_trace(unsigned int max_frames) +{ + DEBUG("*** begin stack trace ***"); + // Thanks GCC :) + uintptr_t* rbp = (uintptr_t*)__builtin_frame_address(0); + + for (unsigned int frame=0; frame (%s+0x%x)", frame, (void*)rip, name, offset); + + uintptr_t* next_rbp = (uintptr_t*)rbp[0]; + + // invalid rbp or we're at the end + if (next_rbp <= rbp || next_rbp == NULL) + { + break; + } + + rbp = next_rbp; + } + DEBUG("*** end stack trace ***"); +} + +typedef struct +{ + uint64_t addr; + const char *name; +} __attribute__((packed)) kernel_symbol_t; + +__attribute__((weak)) extern kernel_symbol_t symbol_table[]; +__attribute__((weak)) extern uint64_t symbol_count; + +// binary search +const char* debug_find_symbol(uintptr_t rip, uintptr_t* offset) +{ + if (!symbol_table || symbol_count == 0) + { + if (offset) *offset = 0; + return "???"; + } + + int low = 0, high = (int)symbol_count - 1; + int best = -1; + + while (low <= high) + { + int mid = (low + high) / 2; + if (symbol_table[mid].addr <= rip) + { + best = mid; + low = mid + 1; + } else { + high = mid - 1; + } + } + + if (best != -1) + { + if (offset) + { + *offset = rip - symbol_table[best].addr; + } + return symbol_table[best].name; + } + + if (offset) *offset = 0; + return "unknown"; +} \ No newline at end of file diff --git a/src/kernel.h b/src/kernel.h index a6834c1..7d386f3 100644 --- a/src/kernel.h +++ b/src/kernel.h @@ -31,6 +31,10 @@ enum ErrorCodes void panic(struct cpu_status_t* ctx, const char* str); void hcf(); void idle(); + +void debug_stack_trace(unsigned int max_frames); +const char* debug_find_symbol(uintptr_t rip, uintptr_t* offset); + #define assert(check) do { if(!(check)) hcf(); } while(0) struct boot_context diff --git a/src/kmain.c b/src/kmain.c index d9aac09..e002fca 100644 --- a/src/kmain.c +++ b/src/kmain.c @@ -39,25 +39,6 @@ void idle() {SET_INTERRUPTS; for(;;)asm("hlt");} uint8_t kernel_stack[KERNEL_STACK_SIZE] __attribute__((aligned(16))); -void panic(struct cpu_status_t* ctx, const char* str) -{ - CLEAR_INTERRUPTS; - if (ctx == NULL) - { - DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m Something went horribly wrong! (no cpu ctx)"); - DIE_DEBUG(str); - skputc('\n'); - DEBUG("\x1b[38;5;231m\x1b[48;5;196mend Kernel panic - halting...\x1b[0m"); - hcf(); - } - DEBUG("\x1b[38;5;231m\x1b[48;5;196mKernel panic!!!\x1b[0m at rip=%p\nSomething went horribly wrong! vect=0x%.2x errcode=0x%x\n\rrax=%p rbx=%p rcx=%p rdx=%p\n\rrsi=%p rdi=%p r8=%p r9=%p\n\rr10=%p r11=%p r12=%p r13=%p\n\rr14=%p r15=%p\n\n\rflags=%p\n\rstack at rbp=%p\n\rHalting...", - ctx->iret_rip, - ctx->vector_number, ctx->error_code, ctx->rax, ctx->rbx, ctx->rcx, ctx->rdx, ctx->rsi, ctx->rdi, - ctx->r8, ctx->r9, ctx->r10, ctx->r11, ctx->r12, ctx->r13, ctx->r14, ctx->r15, ctx->iret_flags, - ctx->rbp); - hcf(); -} - struct boot_context boot_ctx; extern volatile struct limine_framebuffer_request framebuffer_request; @@ -71,7 +52,11 @@ extern struct process_t* current_process; void pedicel_main(void* arg) { printf("Hello, world from a KERNEL PROCESS!"); - //panic(NULL, "WE DID IT! Hello, world from a PROCESS!!!!"); +} + +void two_main(void* arg) +{ + printf("...process 2 speaking!!!"); } void idle_main(void* arg) @@ -112,6 +97,7 @@ void kmain() 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); diff --git a/symbols.S b/symbols.S new file mode 100644 index 0000000..72a0fa1 --- /dev/null +++ b/symbols.S @@ -0,0 +1,547 @@ +section .rodata +global symbol_table +global symbol_count +symbol_table: + dq 0xffffffff80000000 + dq sym_name_0 + dq 0xffffffff80000020 + dq sym_name_1 + dq 0xffffffff80000060 + dq sym_name_2 + dq 0xffffffff800000a0 + dq sym_name_3 + dq 0xffffffff800000e0 + dq sym_name_4 + dq 0xffffffff80000110 + dq sym_name_5 + dq 0xffffffff80000130 + dq sym_name_6 + dq 0xffffffff80001000 + dq sym_name_7 + dq 0xffffffff80001015 + dq sym_name_8 + dq 0xffffffff80001023 + dq sym_name_9 + dq 0xffffffff80001044 + dq sym_name_10 + dq 0xffffffff80001143 + dq sym_name_11 + dq 0xffffffff800011ce + dq sym_name_12 + dq 0xffffffff800011f4 + dq sym_name_13 + dq 0xffffffff8000126d + dq sym_name_14 + dq 0xffffffff8000127e + dq sym_name_15 + dq 0xffffffff8000141f + dq sym_name_16 + dq 0xffffffff8000156c + dq sym_name_17 + dq 0xffffffff80001b90 + dq sym_name_18 + dq 0xffffffff80001bd0 + dq sym_name_19 + dq 0xffffffff80001be0 + dq sym_name_20 + dq 0xffffffff80001bf0 + dq sym_name_21 + dq 0xffffffff80001c00 + dq sym_name_22 + dq 0xffffffff80001c10 + dq sym_name_23 + dq 0xffffffff80001c20 + dq sym_name_24 + dq 0xffffffff80001c30 + dq sym_name_25 + dq 0xffffffff80001c40 + dq sym_name_26 + dq 0xffffffff80001c50 + dq sym_name_27 + dq 0xffffffff80001c60 + dq sym_name_28 + dq 0xffffffff80001c70 + dq sym_name_29 + dq 0xffffffff80001c80 + dq sym_name_30 + dq 0xffffffff80001c90 + dq sym_name_31 + dq 0xffffffff80001ca0 + dq sym_name_32 + dq 0xffffffff80001cb0 + dq sym_name_33 + dq 0xffffffff80001cc0 + dq sym_name_34 + dq 0xffffffff80001cd0 + dq sym_name_35 + dq 0xffffffff80001ce0 + dq sym_name_36 + dq 0xffffffff80001cf0 + dq sym_name_37 + dq 0xffffffff80001d00 + dq sym_name_38 + dq 0xffffffff80001d10 + dq sym_name_39 + dq 0xffffffff80001d20 + dq sym_name_40 + dq 0xffffffff80001d30 + dq sym_name_41 + dq 0xffffffff80001d40 + dq sym_name_42 + dq 0xffffffff80001d50 + dq sym_name_43 + dq 0xffffffff80001d60 + dq sym_name_44 + dq 0xffffffff80001d70 + dq sym_name_45 + dq 0xffffffff80001d80 + dq sym_name_46 + dq 0xffffffff80001d90 + dq sym_name_47 + dq 0xffffffff80001da0 + dq sym_name_48 + dq 0xffffffff80001db0 + dq sym_name_49 + dq 0xffffffff80001dc0 + dq sym_name_50 + dq 0xffffffff80001dd0 + dq sym_name_51 + dq 0xffffffff80001de0 + dq sym_name_52 + dq 0xffffffff80001de9 + dq sym_name_53 + dq 0xffffffff80001e3d + dq sym_name_54 + dq 0xffffffff80001e8e + dq sym_name_55 + dq 0xffffffff80001f38 + dq sym_name_56 + dq 0xffffffff800020c2 + dq sym_name_57 + dq 0xffffffff8000216d + dq sym_name_58 + dq 0xffffffff8000219d + dq sym_name_59 + dq 0xffffffff800021a5 + dq sym_name_60 + dq 0xffffffff800021ad + dq sym_name_61 + dq 0xffffffff800021cd + dq sym_name_62 + dq 0xffffffff800021ed + dq sym_name_63 + dq 0xffffffff800021f8 + dq sym_name_64 + dq 0xffffffff80002427 + dq sym_name_65 + dq 0xffffffff80002439 + dq sym_name_66 + dq 0xffffffff8000244b + dq sym_name_67 + dq 0xffffffff800024a4 + dq sym_name_68 + dq 0xffffffff800026e5 + dq sym_name_69 + dq 0xffffffff80002a43 + dq sym_name_70 + dq 0xffffffff80002bf7 + dq sym_name_71 + dq 0xffffffff80002dce + dq sym_name_72 + dq 0xffffffff80002e1f + dq sym_name_73 + dq 0xffffffff80002e50 + dq sym_name_74 + dq 0xffffffff80002f05 + dq sym_name_75 + dq 0xffffffff80002f44 + dq sym_name_76 + dq 0xffffffff80002f77 + dq sym_name_77 + dq 0xffffffff80002f8f + dq sym_name_78 + dq 0xffffffff80002fbc + dq sym_name_79 + dq 0xffffffff80002ff8 + dq sym_name_80 + dq 0xffffffff80003039 + dq sym_name_81 + dq 0xffffffff8000305f + dq sym_name_82 + dq 0xffffffff800030bf + dq sym_name_83 + dq 0xffffffff800031c8 + dq sym_name_84 + dq 0xffffffff800033f3 + dq sym_name_85 + dq 0xffffffff800034fc + dq sym_name_86 + dq 0xffffffff80003605 + dq sym_name_87 + dq 0xffffffff80003b8a + dq sym_name_88 + dq 0xffffffff8000401f + dq sym_name_89 + dq 0xffffffff8000509c + dq sym_name_90 + dq 0xffffffff80005161 + dq sym_name_91 + dq 0xffffffff80005226 + dq sym_name_92 + dq 0xffffffff800052e8 + dq sym_name_93 + dq 0xffffffff80005322 + dq sym_name_94 + dq 0xffffffff8000535e + dq sym_name_95 + dq 0xffffffff8000543f + dq sym_name_96 + dq 0xffffffff8000545c + dq sym_name_97 + dq 0xffffffff800054e8 + dq sym_name_98 + dq 0xffffffff8000565c + dq sym_name_99 + dq 0xffffffff800056cb + dq sym_name_100 + dq 0xffffffff800057a8 + dq sym_name_101 + dq 0xffffffff800057c8 + dq sym_name_102 + dq 0xffffffff800057de + dq sym_name_103 + dq 0xffffffff80005842 + dq sym_name_104 + dq 0xffffffff8000598c + dq sym_name_105 + dq 0xffffffff80005a2d + dq sym_name_106 + dq 0xffffffff80005a42 + dq sym_name_107 + dq 0xffffffff80005b8a + dq sym_name_108 + dq 0xffffffff80005ba1 + dq sym_name_109 + dq 0xffffffff80005bbb + dq sym_name_110 + dq 0xffffffff80005c95 + dq sym_name_111 + dq 0xffffffff80005cab + dq sym_name_112 + dq 0xffffffff80005cdd + dq sym_name_113 + dq 0xffffffff80005d22 + dq sym_name_114 + dq 0xffffffff80005e2b + dq sym_name_115 + dq 0xffffffff80005f35 + dq sym_name_116 + dq 0xffffffff80005f74 + dq sym_name_117 + dq 0xffffffff80005fff + dq sym_name_118 + dq 0xffffffff80006051 + dq sym_name_119 + dq 0xffffffff80006066 + dq sym_name_120 + dq 0xffffffff8000608d + dq sym_name_121 + dq 0xffffffff8000614e + dq sym_name_122 + dq 0xffffffff800061fa + dq sym_name_123 + dq 0xffffffff80006322 + dq sym_name_124 + dq 0xffffffff800063d8 + dq sym_name_125 + dq 0xffffffff8000652f + dq sym_name_126 + dq 0xffffffff800066de + dq sym_name_127 + dq 0xffffffff800066f9 + dq sym_name_128 + dq 0xffffffff80006742 + dq sym_name_129 + dq 0xffffffff800067ff + dq sym_name_130 + dq 0xffffffff8000682b + dq sym_name_131 + dq 0xffffffff80006883 + dq sym_name_132 + dq 0xffffffff800068b1 + dq sym_name_133 + dq 0xffffffff800068fa + dq sym_name_134 + dq 0xffffffff80006954 + dq sym_name_135 + dq 0xffffffff8000699a + dq sym_name_136 + dq 0xffffffff80006a43 + dq sym_name_137 + dq 0xffffffff80006ad1 + dq sym_name_138 + dq 0xffffffff80006d09 + dq sym_name_139 + dq 0xffffffff80006d51 + dq sym_name_140 + dq 0xffffffff80006da3 + dq sym_name_141 + dq 0xffffffff80006e29 + dq sym_name_142 + dq 0xffffffff80007c20 + dq sym_name_143 + dq 0xffffffff80009000 + dq sym_name_144 + dq 0xffffffff80009080 + dq sym_name_145 + dq 0xffffffff80009100 + dq sym_name_146 + dq 0xffffffff80009180 + dq sym_name_147 + dq 0xffffffff80009200 + dq sym_name_148 + dq 0xffffffff80009208 + dq sym_name_149 + dq 0xffffffff80009210 + dq sym_name_150 + dq 0xffffffff8000a6d0 + dq sym_name_151 + dq 0xffffffff8000b000 + dq sym_name_152 + dq 0xffffffff8000b028 + dq sym_name_153 + dq 0xffffffff8000b040 + dq sym_name_154 + dq 0xffffffff8000c040 + dq sym_name_155 + dq 0xffffffff8000c050 + dq sym_name_156 + dq 0xffffffff8000c058 + dq sym_name_157 + dq 0xffffffff8000c060 + dq sym_name_158 + dq 0xffffffff8000c070 + dq sym_name_159 + dq 0xffffffff8001c080 + dq sym_name_160 + dq 0xffffffff8001d000 + dq sym_name_161 + dq 0xffffffff8001d008 + dq sym_name_162 + dq 0xffffffff8001d010 + dq sym_name_163 + dq 0xffffffff8001d018 + dq sym_name_164 + dq 0xffffffff8001d020 + dq sym_name_165 + dq 0xffffffff8001d028 + dq sym_name_166 + dq 0xffffffff8001d030 + dq sym_name_167 + dq 0xffffffff8001d038 + dq sym_name_168 + dq 0xffffffff8001d040 + dq sym_name_169 + dq 0xffffffff8001d048 + dq sym_name_170 + dq 0xffffffff8001d050 + dq sym_name_171 + dq 0xffffffff8001d058 + dq sym_name_172 + dq 0xffffffff8001d060 + dq sym_name_173 + dq 0xffffffff8001d070 + dq sym_name_174 + dq 0xffffffff8001d078 + dq sym_name_175 + dq 0xffffffff8001d080 + dq sym_name_176 + dq 0xffffffff8001d180 + dq sym_name_177 + dq 0xffffffff8001d188 + dq sym_name_178 + dq 0xffffffff8001d190 + dq sym_name_179 + +symbol_count: dq 180 + +sym_name_0: db "limine_requests_start_marker", 0 +sym_name_1: db "framebuffer_request", 0 +sym_name_2: db "memmap_request", 0 +sym_name_3: db "hhdm_request", 0 +sym_name_4: db "kerneladdr_request", 0 +sym_name_5: db "limine_base_revision", 0 +sym_name_6: db "limine_requests_end_marker", 0 +sym_name_7: db "_start", 0 +sym_name_8: db "gdt_load", 0 +sym_name_9: db "gdt_flush", 0 +sym_name_10: db "gdt_init", 0 +sym_name_11: db "idt_set_entry", 0 +sym_name_12: db "idt_load", 0 +sym_name_13: db "idt_init", 0 +sym_name_14: db "read_cr2", 0 +sym_name_15: db "page_fault_handler", 0 +sym_name_16: db "gp_fault_handler", 0 +sym_name_17: db "interrupt_dispatch", 0 +sym_name_18: db "interrupt_stub", 0 +sym_name_19: db "vector_0_handler", 0 +sym_name_20: db "vector_1_handler", 0 +sym_name_21: db "vector_2_handler", 0 +sym_name_22: db "vector_3_handler", 0 +sym_name_23: db "vector_4_handler", 0 +sym_name_24: db "vector_5_handler", 0 +sym_name_25: db "vector_6_handler", 0 +sym_name_26: db "vector_7_handler", 0 +sym_name_27: db "vector_8_handler", 0 +sym_name_28: db "vector_9_handler", 0 +sym_name_29: db "vector_10_handler", 0 +sym_name_30: db "vector_11_handler", 0 +sym_name_31: db "vector_12_handler", 0 +sym_name_32: db "vector_13_handler", 0 +sym_name_33: db "vector_14_handler", 0 +sym_name_34: db "vector_15_handler", 0 +sym_name_35: db "vector_16_handler", 0 +sym_name_36: db "vector_17_handler", 0 +sym_name_37: db "vector_18_handler", 0 +sym_name_38: db "vector_19_handler", 0 +sym_name_39: db "vector_20_handler", 0 +sym_name_40: db "vector_21_handler", 0 +sym_name_41: db "vector_22_handler", 0 +sym_name_42: db "vector_23_handler", 0 +sym_name_43: db "vector_24_handler", 0 +sym_name_44: db "vector_25_handler", 0 +sym_name_45: db "vector_26_handler", 0 +sym_name_46: db "vector_27_handler", 0 +sym_name_47: db "vector_28_handler", 0 +sym_name_48: db "vector_29_handler", 0 +sym_name_49: db "vector_30_handler", 0 +sym_name_50: db "vector_31_handler", 0 +sym_name_51: db "vector_32_handler", 0 +sym_name_52: db "vector_33_handler", 0 +sym_name_53: db "kheap_grow", 0 +sym_name_54: db "kheap_map_page", 0 +sym_name_55: db "kheap_init", 0 +sym_name_56: db "kmalloc", 0 +sym_name_57: db "kfree", 0 +sym_name_58: db "kalloc_stack", 0 +sym_name_59: db "hcf", 0 +sym_name_60: db "idle", 0 +sym_name_61: db "pedicel_main", 0 +sym_name_62: db "two_main", 0 +sym_name_63: db "idle_main", 0 +sym_name_64: db "kmain", 0 +sym_name_65: db "load_cr3", 0 +sym_name_66: db "invlpg", 0 +sym_name_67: db "alloc_page_table", 0 +sym_name_68: db "paging_map_page", 0 +sym_name_69: db "paging_init", 0 +sym_name_70: db "panic", 0 +sym_name_71: db "pmm_find_biggest_usable_region", 0 +sym_name_72: db "pmm_alloc", 0 +sym_name_73: db "pmm_free", 0 +sym_name_74: db "pmm_init_freelist", 0 +sym_name_75: db "pmm_init", 0 +sym_name_76: db "_out_buffer", 0 +sym_name_77: db "_out_null", 0 +sym_name_78: db "_out_char", 0 +sym_name_79: db "_out_fct", 0 +sym_name_80: db "_strnlen_s", 0 +sym_name_81: db "_is_digit", 0 +sym_name_82: db "_atoi", 0 +sym_name_83: db "_out_rev", 0 +sym_name_84: db "_ntoa_format", 0 +sym_name_85: db "_ntoa_long", 0 +sym_name_86: db "_ntoa_long_long", 0 +sym_name_87: db "_ftoa", 0 +sym_name_88: db "_etoa", 0 +sym_name_89: db "_vsnprintf", 0 +sym_name_90: db "printf_", 0 +sym_name_91: db "sprintf_", 0 +sym_name_92: db "snprintf_", 0 +sym_name_93: db "vprintf_", 0 +sym_name_94: db "vsnprintf_", 0 +sym_name_95: db "fctprintf", 0 +sym_name_96: db "process_init", 0 +sym_name_97: db "process_display_list", 0 +sym_name_98: db "process_create", 0 +sym_name_99: db "process_add", 0 +sym_name_100: db "process_delete", 0 +sym_name_101: db "process_get_next", 0 +sym_name_102: db "process_switch", 0 +sym_name_103: db "process_exit", 0 +sym_name_104: db "keyboard_handler", 0 +sym_name_105: db "keyboard_init", 0 +sym_name_106: db "scheduler_init", 0 +sym_name_107: db "scheduler_schedule", 0 +sym_name_108: db "outb", 0 +sym_name_109: db "inb", 0 +sym_name_110: db "serial_init", 0 +sym_name_111: db "is_transmit_empty", 0 +sym_name_112: db "skputc", 0 +sym_name_113: db "skputs", 0 +sym_name_114: db "debug_stack_trace", 0 +sym_name_115: db "debug_find_symbol", 0 +sym_name_116: db "strcpy", 0 +sym_name_117: db "strcat", 0 +sym_name_118: db "strncpy", 0 +sym_name_119: db "term_max_cols", 0 +sym_name_120: db "term_max_lines", 0 +sym_name_121: db "term_init", 0 +sym_name_122: db "putpixel", 0 +sym_name_123: db "draw_char", 0 +sym_name_124: db "erase_char", 0 +sym_name_125: db "term_scroll", 0 +sym_name_126: db "putchar", 0 +sym_name_127: db "_putchar", 0 +sym_name_128: db "kputs", 0 +sym_name_129: db "pic_remap", 0 +sym_name_130: db "pic_enable", 0 +sym_name_131: db "pit_init", 0 +sym_name_132: db "timer_wait", 0 +sym_name_133: db "timer_init", 0 +sym_name_134: db "memcpy", 0 +sym_name_135: db "memset", 0 +sym_name_136: db "memmove", 0 +sym_name_137: db "memcmp", 0 +sym_name_138: db "memmap_display", 0 +sym_name_139: db "hhdm_display", 0 +sym_name_140: db "convert_x86_vm_flags", 0 +sym_name_141: db "vmm_setup_pt_root", 0 +sym_name_142: db "vmm_init", 0 +sym_name_143: db "pow10.0", 0 +sym_name_144: db "kbdus", 0 +sym_name_145: db "kbdus_shifted", 0 +sym_name_146: db "kbdfr", 0 +sym_name_147: db "kbdfr_shifted", 0 +sym_name_148: db "font", 0 +sym_name_149: db "glyphs", 0 +sym_name_150: db "_binary_zap_light16_psf_start", 0 +sym_name_151: db "_binary_zap_light16_psf_end", 0 +sym_name_152: db "gdt_entries", 0 +sym_name_153: db "gdtr", 0 +sym_name_154: db "idt", 0 +sym_name_155: db "idt_reg", 0 +sym_name_156: db "kheap_start", 0 +sym_name_157: db "head", 0 +sym_name_158: db "end", 0 +sym_name_159: db "kernel_stack", 0 +sym_name_160: db "boot_ctx", 0 +sym_name_161: db "kernel_pml4", 0 +sym_name_162: db "kernel_phys_base", 0 +sym_name_163: db "kernel_virt_base", 0 +sym_name_164: db "biggest_entry", 0 +sym_name_165: db "hhdm_off", 0 +sym_name_166: db "g_freelist", 0 +sym_name_167: db "processes_list", 0 +sym_name_168: db "current_process", 0 +sym_name_169: db "next_free_pid", 0 +sym_name_170: db "key_status", 0 +sym_name_171: db "keymap", 0 +sym_name_172: db "keymap_shifted", 0 +sym_name_173: db "cursor", 0 +sym_name_174: db "fb", 0 +sym_name_175: db "framebuffer", 0 +sym_name_176: db "lines_length", 0 +sym_name_177: db "ticks", 0 +sym_name_178: db "vmm_pt_root", 0 +sym_name_179: db "vm_objs", 0 diff --git a/symbols.map b/symbols.map new file mode 100644 index 0000000..efa4070 --- /dev/null +++ b/symbols.map @@ -0,0 +1,180 @@ +ffffffff80000000 limine_requests_start_marker +ffffffff80000020 framebuffer_request +ffffffff80000060 memmap_request +ffffffff800000a0 hhdm_request +ffffffff800000e0 kerneladdr_request +ffffffff80000110 limine_base_revision +ffffffff80000130 limine_requests_end_marker +ffffffff80001000 _start +ffffffff80001015 gdt_load +ffffffff80001023 gdt_flush +ffffffff80001044 gdt_init +ffffffff80001143 idt_set_entry +ffffffff800011ce idt_load +ffffffff800011f4 idt_init +ffffffff8000126d read_cr2 +ffffffff8000127e page_fault_handler +ffffffff8000141f gp_fault_handler +ffffffff8000156c interrupt_dispatch +ffffffff80001b90 interrupt_stub +ffffffff80001bd0 vector_0_handler +ffffffff80001be0 vector_1_handler +ffffffff80001bf0 vector_2_handler +ffffffff80001c00 vector_3_handler +ffffffff80001c10 vector_4_handler +ffffffff80001c20 vector_5_handler +ffffffff80001c30 vector_6_handler +ffffffff80001c40 vector_7_handler +ffffffff80001c50 vector_8_handler +ffffffff80001c60 vector_9_handler +ffffffff80001c70 vector_10_handler +ffffffff80001c80 vector_11_handler +ffffffff80001c90 vector_12_handler +ffffffff80001ca0 vector_13_handler +ffffffff80001cb0 vector_14_handler +ffffffff80001cc0 vector_15_handler +ffffffff80001cd0 vector_16_handler +ffffffff80001ce0 vector_17_handler +ffffffff80001cf0 vector_18_handler +ffffffff80001d00 vector_19_handler +ffffffff80001d10 vector_20_handler +ffffffff80001d20 vector_21_handler +ffffffff80001d30 vector_22_handler +ffffffff80001d40 vector_23_handler +ffffffff80001d50 vector_24_handler +ffffffff80001d60 vector_25_handler +ffffffff80001d70 vector_26_handler +ffffffff80001d80 vector_27_handler +ffffffff80001d90 vector_28_handler +ffffffff80001da0 vector_29_handler +ffffffff80001db0 vector_30_handler +ffffffff80001dc0 vector_31_handler +ffffffff80001dd0 vector_32_handler +ffffffff80001de0 vector_33_handler +ffffffff80001de9 kheap_grow +ffffffff80001e3d kheap_map_page +ffffffff80001e8e kheap_init +ffffffff80001f38 kmalloc +ffffffff800020c2 kfree +ffffffff8000216d kalloc_stack +ffffffff8000219d hcf +ffffffff800021a5 idle +ffffffff800021ad pedicel_main +ffffffff800021cd two_main +ffffffff800021ed idle_main +ffffffff800021f8 kmain +ffffffff80002427 load_cr3 +ffffffff80002439 invlpg +ffffffff8000244b alloc_page_table +ffffffff800024a4 paging_map_page +ffffffff800026e5 paging_init +ffffffff80002a43 panic +ffffffff80002bf7 pmm_find_biggest_usable_region +ffffffff80002dce pmm_alloc +ffffffff80002e1f pmm_free +ffffffff80002e50 pmm_init_freelist +ffffffff80002f05 pmm_init +ffffffff80002f44 _out_buffer +ffffffff80002f77 _out_null +ffffffff80002f8f _out_char +ffffffff80002fbc _out_fct +ffffffff80002ff8 _strnlen_s +ffffffff80003039 _is_digit +ffffffff8000305f _atoi +ffffffff800030bf _out_rev +ffffffff800031c8 _ntoa_format +ffffffff800033f3 _ntoa_long +ffffffff800034fc _ntoa_long_long +ffffffff80003605 _ftoa +ffffffff80003b8a _etoa +ffffffff8000401f _vsnprintf +ffffffff8000509c printf_ +ffffffff80005161 sprintf_ +ffffffff80005226 snprintf_ +ffffffff800052e8 vprintf_ +ffffffff80005322 vsnprintf_ +ffffffff8000535e fctprintf +ffffffff8000543f process_init +ffffffff8000545c process_display_list +ffffffff800054e8 process_create +ffffffff8000565c process_add +ffffffff800056cb process_delete +ffffffff800057a8 process_get_next +ffffffff800057c8 process_switch +ffffffff800057de process_exit +ffffffff80005842 keyboard_handler +ffffffff8000598c keyboard_init +ffffffff80005a2d scheduler_init +ffffffff80005a42 scheduler_schedule +ffffffff80005b8a outb +ffffffff80005ba1 inb +ffffffff80005bbb serial_init +ffffffff80005c95 is_transmit_empty +ffffffff80005cab skputc +ffffffff80005cdd skputs +ffffffff80005d22 debug_stack_trace +ffffffff80005e2b debug_find_symbol +ffffffff80005f35 strcpy +ffffffff80005f74 strcat +ffffffff80005fff strncpy +ffffffff80006051 term_max_cols +ffffffff80006066 term_max_lines +ffffffff8000608d term_init +ffffffff8000614e putpixel +ffffffff800061fa draw_char +ffffffff80006322 erase_char +ffffffff800063d8 term_scroll +ffffffff8000652f putchar +ffffffff800066de _putchar +ffffffff800066f9 kputs +ffffffff80006742 pic_remap +ffffffff800067ff pic_enable +ffffffff8000682b pit_init +ffffffff80006883 timer_wait +ffffffff800068b1 timer_init +ffffffff800068fa memcpy +ffffffff80006954 memset +ffffffff8000699a memmove +ffffffff80006a43 memcmp +ffffffff80006ad1 memmap_display +ffffffff80006d09 hhdm_display +ffffffff80006d51 convert_x86_vm_flags +ffffffff80006da3 vmm_setup_pt_root +ffffffff80006e29 vmm_init +ffffffff80007c20 pow10.0 +ffffffff80009000 kbdus +ffffffff80009080 kbdus_shifted +ffffffff80009100 kbdfr +ffffffff80009180 kbdfr_shifted +ffffffff80009200 font +ffffffff80009208 glyphs +ffffffff80009210 _binary_zap_light16_psf_start +ffffffff8000a6d0 _binary_zap_light16_psf_end +ffffffff8000b000 gdt_entries +ffffffff8000b028 gdtr +ffffffff8000b040 idt +ffffffff8000c040 idt_reg +ffffffff8000c050 kheap_start +ffffffff8000c058 head +ffffffff8000c060 end +ffffffff8000c070 kernel_stack +ffffffff8001c080 boot_ctx +ffffffff8001d000 kernel_pml4 +ffffffff8001d008 kernel_phys_base +ffffffff8001d010 kernel_virt_base +ffffffff8001d018 biggest_entry +ffffffff8001d020 hhdm_off +ffffffff8001d028 g_freelist +ffffffff8001d030 processes_list +ffffffff8001d038 current_process +ffffffff8001d040 next_free_pid +ffffffff8001d048 key_status +ffffffff8001d050 keymap +ffffffff8001d058 keymap_shifted +ffffffff8001d060 cursor +ffffffff8001d070 fb +ffffffff8001d078 framebuffer +ffffffff8001d080 lines_length +ffffffff8001d180 ticks +ffffffff8001d188 vmm_pt_root +ffffffff8001d190 vm_objs diff --git a/symbols.py b/symbols.py new file mode 100644 index 0000000..641fa21 --- /dev/null +++ b/symbols.py @@ -0,0 +1,33 @@ +# Make assembly file from ELF symbols map +# Then link it to kernel so it's aware of symbol names +# then we can use that for the stack trace. + +print("Extracting symbols from map file to assembly...") + +with open("symbols.map", "r") as f: + lines = f.readlines() + + symbols = [] + for line in lines: + parts = line.split() + # output is formed like "address name" + symbols.append((parts[0], parts[1])) + +with open("symbols.S", "w") as f: + f.write("section .rodata\n") + f.write("global symbol_table\n") + f.write("global symbol_count\n") + f.write("symbol_table:\n") + + for i, (addr, name) in enumerate(symbols): + f.write(f" dq 0x{addr}\n") + f.write(f" dq sym_name_{i}\n") + + f.write("\nsymbol_count: dq " + str(len(symbols)) + "\n\n") + + for i, (addr, name) in enumerate(symbols): + # escaping quotes + safe_name = name.replace('"', '\\"') + f.write(f'sym_name_{i}: db "{safe_name}", 0\n') + +print("Done!") \ No newline at end of file From 70f19ab299bf65adc2f66c5f892c5e93e3b7e520 Mon Sep 17 00:00:00 2001 From: xamidev Date: Sat, 21 Feb 2026 19:36:44 +0100 Subject: [PATCH 5/5] symbols build files added to gitignore --- .gitignore | 4 +- src/config.h | 2 +- symbols.S | 547 --------------------------------------------------- symbols.map | 180 ----------------- 4 files changed, 4 insertions(+), 729 deletions(-) delete mode 100644 symbols.S delete mode 100644 symbols.map diff --git a/.gitignore b/.gitignore index a3f06dd..54bb06f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ iso_root *.gch */*.gch */*/*.gch -.gdb_history \ No newline at end of file +.gdb_history +symbols.map +symbols.S \ No newline at end of file diff --git a/src/config.h b/src/config.h index 632a1f5..f403993 100644 --- a/src/config.h +++ b/src/config.h @@ -10,7 +10,7 @@ /* version */ #define PEPPEROS_VERSION_MAJOR "0" #define PEPPEROS_VERSION_MINOR "0" -#define PEPPEROS_VERSION_PATCH "1" +#define PEPPEROS_VERSION_PATCH "58" #define PEPPEROS_SPLASH "pepperOS version "PEPPEROS_VERSION_MAJOR"."PEPPEROS_VERSION_MINOR"."PEPPEROS_VERSION_PATCH"\n" /* process */ diff --git a/symbols.S b/symbols.S deleted file mode 100644 index 72a0fa1..0000000 --- a/symbols.S +++ /dev/null @@ -1,547 +0,0 @@ -section .rodata -global symbol_table -global symbol_count -symbol_table: - dq 0xffffffff80000000 - dq sym_name_0 - dq 0xffffffff80000020 - dq sym_name_1 - dq 0xffffffff80000060 - dq sym_name_2 - dq 0xffffffff800000a0 - dq sym_name_3 - dq 0xffffffff800000e0 - dq sym_name_4 - dq 0xffffffff80000110 - dq sym_name_5 - dq 0xffffffff80000130 - dq sym_name_6 - dq 0xffffffff80001000 - dq sym_name_7 - dq 0xffffffff80001015 - dq sym_name_8 - dq 0xffffffff80001023 - dq sym_name_9 - dq 0xffffffff80001044 - dq sym_name_10 - dq 0xffffffff80001143 - dq sym_name_11 - dq 0xffffffff800011ce - dq sym_name_12 - dq 0xffffffff800011f4 - dq sym_name_13 - dq 0xffffffff8000126d - dq sym_name_14 - dq 0xffffffff8000127e - dq sym_name_15 - dq 0xffffffff8000141f - dq sym_name_16 - dq 0xffffffff8000156c - dq sym_name_17 - dq 0xffffffff80001b90 - dq sym_name_18 - dq 0xffffffff80001bd0 - dq sym_name_19 - dq 0xffffffff80001be0 - dq sym_name_20 - dq 0xffffffff80001bf0 - dq sym_name_21 - dq 0xffffffff80001c00 - dq sym_name_22 - dq 0xffffffff80001c10 - dq sym_name_23 - dq 0xffffffff80001c20 - dq sym_name_24 - dq 0xffffffff80001c30 - dq sym_name_25 - dq 0xffffffff80001c40 - dq sym_name_26 - dq 0xffffffff80001c50 - dq sym_name_27 - dq 0xffffffff80001c60 - dq sym_name_28 - dq 0xffffffff80001c70 - dq sym_name_29 - dq 0xffffffff80001c80 - dq sym_name_30 - dq 0xffffffff80001c90 - dq sym_name_31 - dq 0xffffffff80001ca0 - dq sym_name_32 - dq 0xffffffff80001cb0 - dq sym_name_33 - dq 0xffffffff80001cc0 - dq sym_name_34 - dq 0xffffffff80001cd0 - dq sym_name_35 - dq 0xffffffff80001ce0 - dq sym_name_36 - dq 0xffffffff80001cf0 - dq sym_name_37 - dq 0xffffffff80001d00 - dq sym_name_38 - dq 0xffffffff80001d10 - dq sym_name_39 - dq 0xffffffff80001d20 - dq sym_name_40 - dq 0xffffffff80001d30 - dq sym_name_41 - dq 0xffffffff80001d40 - dq sym_name_42 - dq 0xffffffff80001d50 - dq sym_name_43 - dq 0xffffffff80001d60 - dq sym_name_44 - dq 0xffffffff80001d70 - dq sym_name_45 - dq 0xffffffff80001d80 - dq sym_name_46 - dq 0xffffffff80001d90 - dq sym_name_47 - dq 0xffffffff80001da0 - dq sym_name_48 - dq 0xffffffff80001db0 - dq sym_name_49 - dq 0xffffffff80001dc0 - dq sym_name_50 - dq 0xffffffff80001dd0 - dq sym_name_51 - dq 0xffffffff80001de0 - dq sym_name_52 - dq 0xffffffff80001de9 - dq sym_name_53 - dq 0xffffffff80001e3d - dq sym_name_54 - dq 0xffffffff80001e8e - dq sym_name_55 - dq 0xffffffff80001f38 - dq sym_name_56 - dq 0xffffffff800020c2 - dq sym_name_57 - dq 0xffffffff8000216d - dq sym_name_58 - dq 0xffffffff8000219d - dq sym_name_59 - dq 0xffffffff800021a5 - dq sym_name_60 - dq 0xffffffff800021ad - dq sym_name_61 - dq 0xffffffff800021cd - dq sym_name_62 - dq 0xffffffff800021ed - dq sym_name_63 - dq 0xffffffff800021f8 - dq sym_name_64 - dq 0xffffffff80002427 - dq sym_name_65 - dq 0xffffffff80002439 - dq sym_name_66 - dq 0xffffffff8000244b - dq sym_name_67 - dq 0xffffffff800024a4 - dq sym_name_68 - dq 0xffffffff800026e5 - dq sym_name_69 - dq 0xffffffff80002a43 - dq sym_name_70 - dq 0xffffffff80002bf7 - dq sym_name_71 - dq 0xffffffff80002dce - dq sym_name_72 - dq 0xffffffff80002e1f - dq sym_name_73 - dq 0xffffffff80002e50 - dq sym_name_74 - dq 0xffffffff80002f05 - dq sym_name_75 - dq 0xffffffff80002f44 - dq sym_name_76 - dq 0xffffffff80002f77 - dq sym_name_77 - dq 0xffffffff80002f8f - dq sym_name_78 - dq 0xffffffff80002fbc - dq sym_name_79 - dq 0xffffffff80002ff8 - dq sym_name_80 - dq 0xffffffff80003039 - dq sym_name_81 - dq 0xffffffff8000305f - dq sym_name_82 - dq 0xffffffff800030bf - dq sym_name_83 - dq 0xffffffff800031c8 - dq sym_name_84 - dq 0xffffffff800033f3 - dq sym_name_85 - dq 0xffffffff800034fc - dq sym_name_86 - dq 0xffffffff80003605 - dq sym_name_87 - dq 0xffffffff80003b8a - dq sym_name_88 - dq 0xffffffff8000401f - dq sym_name_89 - dq 0xffffffff8000509c - dq sym_name_90 - dq 0xffffffff80005161 - dq sym_name_91 - dq 0xffffffff80005226 - dq sym_name_92 - dq 0xffffffff800052e8 - dq sym_name_93 - dq 0xffffffff80005322 - dq sym_name_94 - dq 0xffffffff8000535e - dq sym_name_95 - dq 0xffffffff8000543f - dq sym_name_96 - dq 0xffffffff8000545c - dq sym_name_97 - dq 0xffffffff800054e8 - dq sym_name_98 - dq 0xffffffff8000565c - dq sym_name_99 - dq 0xffffffff800056cb - dq sym_name_100 - dq 0xffffffff800057a8 - dq sym_name_101 - dq 0xffffffff800057c8 - dq sym_name_102 - dq 0xffffffff800057de - dq sym_name_103 - dq 0xffffffff80005842 - dq sym_name_104 - dq 0xffffffff8000598c - dq sym_name_105 - dq 0xffffffff80005a2d - dq sym_name_106 - dq 0xffffffff80005a42 - dq sym_name_107 - dq 0xffffffff80005b8a - dq sym_name_108 - dq 0xffffffff80005ba1 - dq sym_name_109 - dq 0xffffffff80005bbb - dq sym_name_110 - dq 0xffffffff80005c95 - dq sym_name_111 - dq 0xffffffff80005cab - dq sym_name_112 - dq 0xffffffff80005cdd - dq sym_name_113 - dq 0xffffffff80005d22 - dq sym_name_114 - dq 0xffffffff80005e2b - dq sym_name_115 - dq 0xffffffff80005f35 - dq sym_name_116 - dq 0xffffffff80005f74 - dq sym_name_117 - dq 0xffffffff80005fff - dq sym_name_118 - dq 0xffffffff80006051 - dq sym_name_119 - dq 0xffffffff80006066 - dq sym_name_120 - dq 0xffffffff8000608d - dq sym_name_121 - dq 0xffffffff8000614e - dq sym_name_122 - dq 0xffffffff800061fa - dq sym_name_123 - dq 0xffffffff80006322 - dq sym_name_124 - dq 0xffffffff800063d8 - dq sym_name_125 - dq 0xffffffff8000652f - dq sym_name_126 - dq 0xffffffff800066de - dq sym_name_127 - dq 0xffffffff800066f9 - dq sym_name_128 - dq 0xffffffff80006742 - dq sym_name_129 - dq 0xffffffff800067ff - dq sym_name_130 - dq 0xffffffff8000682b - dq sym_name_131 - dq 0xffffffff80006883 - dq sym_name_132 - dq 0xffffffff800068b1 - dq sym_name_133 - dq 0xffffffff800068fa - dq sym_name_134 - dq 0xffffffff80006954 - dq sym_name_135 - dq 0xffffffff8000699a - dq sym_name_136 - dq 0xffffffff80006a43 - dq sym_name_137 - dq 0xffffffff80006ad1 - dq sym_name_138 - dq 0xffffffff80006d09 - dq sym_name_139 - dq 0xffffffff80006d51 - dq sym_name_140 - dq 0xffffffff80006da3 - dq sym_name_141 - dq 0xffffffff80006e29 - dq sym_name_142 - dq 0xffffffff80007c20 - dq sym_name_143 - dq 0xffffffff80009000 - dq sym_name_144 - dq 0xffffffff80009080 - dq sym_name_145 - dq 0xffffffff80009100 - dq sym_name_146 - dq 0xffffffff80009180 - dq sym_name_147 - dq 0xffffffff80009200 - dq sym_name_148 - dq 0xffffffff80009208 - dq sym_name_149 - dq 0xffffffff80009210 - dq sym_name_150 - dq 0xffffffff8000a6d0 - dq sym_name_151 - dq 0xffffffff8000b000 - dq sym_name_152 - dq 0xffffffff8000b028 - dq sym_name_153 - dq 0xffffffff8000b040 - dq sym_name_154 - dq 0xffffffff8000c040 - dq sym_name_155 - dq 0xffffffff8000c050 - dq sym_name_156 - dq 0xffffffff8000c058 - dq sym_name_157 - dq 0xffffffff8000c060 - dq sym_name_158 - dq 0xffffffff8000c070 - dq sym_name_159 - dq 0xffffffff8001c080 - dq sym_name_160 - dq 0xffffffff8001d000 - dq sym_name_161 - dq 0xffffffff8001d008 - dq sym_name_162 - dq 0xffffffff8001d010 - dq sym_name_163 - dq 0xffffffff8001d018 - dq sym_name_164 - dq 0xffffffff8001d020 - dq sym_name_165 - dq 0xffffffff8001d028 - dq sym_name_166 - dq 0xffffffff8001d030 - dq sym_name_167 - dq 0xffffffff8001d038 - dq sym_name_168 - dq 0xffffffff8001d040 - dq sym_name_169 - dq 0xffffffff8001d048 - dq sym_name_170 - dq 0xffffffff8001d050 - dq sym_name_171 - dq 0xffffffff8001d058 - dq sym_name_172 - dq 0xffffffff8001d060 - dq sym_name_173 - dq 0xffffffff8001d070 - dq sym_name_174 - dq 0xffffffff8001d078 - dq sym_name_175 - dq 0xffffffff8001d080 - dq sym_name_176 - dq 0xffffffff8001d180 - dq sym_name_177 - dq 0xffffffff8001d188 - dq sym_name_178 - dq 0xffffffff8001d190 - dq sym_name_179 - -symbol_count: dq 180 - -sym_name_0: db "limine_requests_start_marker", 0 -sym_name_1: db "framebuffer_request", 0 -sym_name_2: db "memmap_request", 0 -sym_name_3: db "hhdm_request", 0 -sym_name_4: db "kerneladdr_request", 0 -sym_name_5: db "limine_base_revision", 0 -sym_name_6: db "limine_requests_end_marker", 0 -sym_name_7: db "_start", 0 -sym_name_8: db "gdt_load", 0 -sym_name_9: db "gdt_flush", 0 -sym_name_10: db "gdt_init", 0 -sym_name_11: db "idt_set_entry", 0 -sym_name_12: db "idt_load", 0 -sym_name_13: db "idt_init", 0 -sym_name_14: db "read_cr2", 0 -sym_name_15: db "page_fault_handler", 0 -sym_name_16: db "gp_fault_handler", 0 -sym_name_17: db "interrupt_dispatch", 0 -sym_name_18: db "interrupt_stub", 0 -sym_name_19: db "vector_0_handler", 0 -sym_name_20: db "vector_1_handler", 0 -sym_name_21: db "vector_2_handler", 0 -sym_name_22: db "vector_3_handler", 0 -sym_name_23: db "vector_4_handler", 0 -sym_name_24: db "vector_5_handler", 0 -sym_name_25: db "vector_6_handler", 0 -sym_name_26: db "vector_7_handler", 0 -sym_name_27: db "vector_8_handler", 0 -sym_name_28: db "vector_9_handler", 0 -sym_name_29: db "vector_10_handler", 0 -sym_name_30: db "vector_11_handler", 0 -sym_name_31: db "vector_12_handler", 0 -sym_name_32: db "vector_13_handler", 0 -sym_name_33: db "vector_14_handler", 0 -sym_name_34: db "vector_15_handler", 0 -sym_name_35: db "vector_16_handler", 0 -sym_name_36: db "vector_17_handler", 0 -sym_name_37: db "vector_18_handler", 0 -sym_name_38: db "vector_19_handler", 0 -sym_name_39: db "vector_20_handler", 0 -sym_name_40: db "vector_21_handler", 0 -sym_name_41: db "vector_22_handler", 0 -sym_name_42: db "vector_23_handler", 0 -sym_name_43: db "vector_24_handler", 0 -sym_name_44: db "vector_25_handler", 0 -sym_name_45: db "vector_26_handler", 0 -sym_name_46: db "vector_27_handler", 0 -sym_name_47: db "vector_28_handler", 0 -sym_name_48: db "vector_29_handler", 0 -sym_name_49: db "vector_30_handler", 0 -sym_name_50: db "vector_31_handler", 0 -sym_name_51: db "vector_32_handler", 0 -sym_name_52: db "vector_33_handler", 0 -sym_name_53: db "kheap_grow", 0 -sym_name_54: db "kheap_map_page", 0 -sym_name_55: db "kheap_init", 0 -sym_name_56: db "kmalloc", 0 -sym_name_57: db "kfree", 0 -sym_name_58: db "kalloc_stack", 0 -sym_name_59: db "hcf", 0 -sym_name_60: db "idle", 0 -sym_name_61: db "pedicel_main", 0 -sym_name_62: db "two_main", 0 -sym_name_63: db "idle_main", 0 -sym_name_64: db "kmain", 0 -sym_name_65: db "load_cr3", 0 -sym_name_66: db "invlpg", 0 -sym_name_67: db "alloc_page_table", 0 -sym_name_68: db "paging_map_page", 0 -sym_name_69: db "paging_init", 0 -sym_name_70: db "panic", 0 -sym_name_71: db "pmm_find_biggest_usable_region", 0 -sym_name_72: db "pmm_alloc", 0 -sym_name_73: db "pmm_free", 0 -sym_name_74: db "pmm_init_freelist", 0 -sym_name_75: db "pmm_init", 0 -sym_name_76: db "_out_buffer", 0 -sym_name_77: db "_out_null", 0 -sym_name_78: db "_out_char", 0 -sym_name_79: db "_out_fct", 0 -sym_name_80: db "_strnlen_s", 0 -sym_name_81: db "_is_digit", 0 -sym_name_82: db "_atoi", 0 -sym_name_83: db "_out_rev", 0 -sym_name_84: db "_ntoa_format", 0 -sym_name_85: db "_ntoa_long", 0 -sym_name_86: db "_ntoa_long_long", 0 -sym_name_87: db "_ftoa", 0 -sym_name_88: db "_etoa", 0 -sym_name_89: db "_vsnprintf", 0 -sym_name_90: db "printf_", 0 -sym_name_91: db "sprintf_", 0 -sym_name_92: db "snprintf_", 0 -sym_name_93: db "vprintf_", 0 -sym_name_94: db "vsnprintf_", 0 -sym_name_95: db "fctprintf", 0 -sym_name_96: db "process_init", 0 -sym_name_97: db "process_display_list", 0 -sym_name_98: db "process_create", 0 -sym_name_99: db "process_add", 0 -sym_name_100: db "process_delete", 0 -sym_name_101: db "process_get_next", 0 -sym_name_102: db "process_switch", 0 -sym_name_103: db "process_exit", 0 -sym_name_104: db "keyboard_handler", 0 -sym_name_105: db "keyboard_init", 0 -sym_name_106: db "scheduler_init", 0 -sym_name_107: db "scheduler_schedule", 0 -sym_name_108: db "outb", 0 -sym_name_109: db "inb", 0 -sym_name_110: db "serial_init", 0 -sym_name_111: db "is_transmit_empty", 0 -sym_name_112: db "skputc", 0 -sym_name_113: db "skputs", 0 -sym_name_114: db "debug_stack_trace", 0 -sym_name_115: db "debug_find_symbol", 0 -sym_name_116: db "strcpy", 0 -sym_name_117: db "strcat", 0 -sym_name_118: db "strncpy", 0 -sym_name_119: db "term_max_cols", 0 -sym_name_120: db "term_max_lines", 0 -sym_name_121: db "term_init", 0 -sym_name_122: db "putpixel", 0 -sym_name_123: db "draw_char", 0 -sym_name_124: db "erase_char", 0 -sym_name_125: db "term_scroll", 0 -sym_name_126: db "putchar", 0 -sym_name_127: db "_putchar", 0 -sym_name_128: db "kputs", 0 -sym_name_129: db "pic_remap", 0 -sym_name_130: db "pic_enable", 0 -sym_name_131: db "pit_init", 0 -sym_name_132: db "timer_wait", 0 -sym_name_133: db "timer_init", 0 -sym_name_134: db "memcpy", 0 -sym_name_135: db "memset", 0 -sym_name_136: db "memmove", 0 -sym_name_137: db "memcmp", 0 -sym_name_138: db "memmap_display", 0 -sym_name_139: db "hhdm_display", 0 -sym_name_140: db "convert_x86_vm_flags", 0 -sym_name_141: db "vmm_setup_pt_root", 0 -sym_name_142: db "vmm_init", 0 -sym_name_143: db "pow10.0", 0 -sym_name_144: db "kbdus", 0 -sym_name_145: db "kbdus_shifted", 0 -sym_name_146: db "kbdfr", 0 -sym_name_147: db "kbdfr_shifted", 0 -sym_name_148: db "font", 0 -sym_name_149: db "glyphs", 0 -sym_name_150: db "_binary_zap_light16_psf_start", 0 -sym_name_151: db "_binary_zap_light16_psf_end", 0 -sym_name_152: db "gdt_entries", 0 -sym_name_153: db "gdtr", 0 -sym_name_154: db "idt", 0 -sym_name_155: db "idt_reg", 0 -sym_name_156: db "kheap_start", 0 -sym_name_157: db "head", 0 -sym_name_158: db "end", 0 -sym_name_159: db "kernel_stack", 0 -sym_name_160: db "boot_ctx", 0 -sym_name_161: db "kernel_pml4", 0 -sym_name_162: db "kernel_phys_base", 0 -sym_name_163: db "kernel_virt_base", 0 -sym_name_164: db "biggest_entry", 0 -sym_name_165: db "hhdm_off", 0 -sym_name_166: db "g_freelist", 0 -sym_name_167: db "processes_list", 0 -sym_name_168: db "current_process", 0 -sym_name_169: db "next_free_pid", 0 -sym_name_170: db "key_status", 0 -sym_name_171: db "keymap", 0 -sym_name_172: db "keymap_shifted", 0 -sym_name_173: db "cursor", 0 -sym_name_174: db "fb", 0 -sym_name_175: db "framebuffer", 0 -sym_name_176: db "lines_length", 0 -sym_name_177: db "ticks", 0 -sym_name_178: db "vmm_pt_root", 0 -sym_name_179: db "vm_objs", 0 diff --git a/symbols.map b/symbols.map deleted file mode 100644 index efa4070..0000000 --- a/symbols.map +++ /dev/null @@ -1,180 +0,0 @@ -ffffffff80000000 limine_requests_start_marker -ffffffff80000020 framebuffer_request -ffffffff80000060 memmap_request -ffffffff800000a0 hhdm_request -ffffffff800000e0 kerneladdr_request -ffffffff80000110 limine_base_revision -ffffffff80000130 limine_requests_end_marker -ffffffff80001000 _start -ffffffff80001015 gdt_load -ffffffff80001023 gdt_flush -ffffffff80001044 gdt_init -ffffffff80001143 idt_set_entry -ffffffff800011ce idt_load -ffffffff800011f4 idt_init -ffffffff8000126d read_cr2 -ffffffff8000127e page_fault_handler -ffffffff8000141f gp_fault_handler -ffffffff8000156c interrupt_dispatch -ffffffff80001b90 interrupt_stub -ffffffff80001bd0 vector_0_handler -ffffffff80001be0 vector_1_handler -ffffffff80001bf0 vector_2_handler -ffffffff80001c00 vector_3_handler -ffffffff80001c10 vector_4_handler -ffffffff80001c20 vector_5_handler -ffffffff80001c30 vector_6_handler -ffffffff80001c40 vector_7_handler -ffffffff80001c50 vector_8_handler -ffffffff80001c60 vector_9_handler -ffffffff80001c70 vector_10_handler -ffffffff80001c80 vector_11_handler -ffffffff80001c90 vector_12_handler -ffffffff80001ca0 vector_13_handler -ffffffff80001cb0 vector_14_handler -ffffffff80001cc0 vector_15_handler -ffffffff80001cd0 vector_16_handler -ffffffff80001ce0 vector_17_handler -ffffffff80001cf0 vector_18_handler -ffffffff80001d00 vector_19_handler -ffffffff80001d10 vector_20_handler -ffffffff80001d20 vector_21_handler -ffffffff80001d30 vector_22_handler -ffffffff80001d40 vector_23_handler -ffffffff80001d50 vector_24_handler -ffffffff80001d60 vector_25_handler -ffffffff80001d70 vector_26_handler -ffffffff80001d80 vector_27_handler -ffffffff80001d90 vector_28_handler -ffffffff80001da0 vector_29_handler -ffffffff80001db0 vector_30_handler -ffffffff80001dc0 vector_31_handler -ffffffff80001dd0 vector_32_handler -ffffffff80001de0 vector_33_handler -ffffffff80001de9 kheap_grow -ffffffff80001e3d kheap_map_page -ffffffff80001e8e kheap_init -ffffffff80001f38 kmalloc -ffffffff800020c2 kfree -ffffffff8000216d kalloc_stack -ffffffff8000219d hcf -ffffffff800021a5 idle -ffffffff800021ad pedicel_main -ffffffff800021cd two_main -ffffffff800021ed idle_main -ffffffff800021f8 kmain -ffffffff80002427 load_cr3 -ffffffff80002439 invlpg -ffffffff8000244b alloc_page_table -ffffffff800024a4 paging_map_page -ffffffff800026e5 paging_init -ffffffff80002a43 panic -ffffffff80002bf7 pmm_find_biggest_usable_region -ffffffff80002dce pmm_alloc -ffffffff80002e1f pmm_free -ffffffff80002e50 pmm_init_freelist -ffffffff80002f05 pmm_init -ffffffff80002f44 _out_buffer -ffffffff80002f77 _out_null -ffffffff80002f8f _out_char -ffffffff80002fbc _out_fct -ffffffff80002ff8 _strnlen_s -ffffffff80003039 _is_digit -ffffffff8000305f _atoi -ffffffff800030bf _out_rev -ffffffff800031c8 _ntoa_format -ffffffff800033f3 _ntoa_long -ffffffff800034fc _ntoa_long_long -ffffffff80003605 _ftoa -ffffffff80003b8a _etoa -ffffffff8000401f _vsnprintf -ffffffff8000509c printf_ -ffffffff80005161 sprintf_ -ffffffff80005226 snprintf_ -ffffffff800052e8 vprintf_ -ffffffff80005322 vsnprintf_ -ffffffff8000535e fctprintf -ffffffff8000543f process_init -ffffffff8000545c process_display_list -ffffffff800054e8 process_create -ffffffff8000565c process_add -ffffffff800056cb process_delete -ffffffff800057a8 process_get_next -ffffffff800057c8 process_switch -ffffffff800057de process_exit -ffffffff80005842 keyboard_handler -ffffffff8000598c keyboard_init -ffffffff80005a2d scheduler_init -ffffffff80005a42 scheduler_schedule -ffffffff80005b8a outb -ffffffff80005ba1 inb -ffffffff80005bbb serial_init -ffffffff80005c95 is_transmit_empty -ffffffff80005cab skputc -ffffffff80005cdd skputs -ffffffff80005d22 debug_stack_trace -ffffffff80005e2b debug_find_symbol -ffffffff80005f35 strcpy -ffffffff80005f74 strcat -ffffffff80005fff strncpy -ffffffff80006051 term_max_cols -ffffffff80006066 term_max_lines -ffffffff8000608d term_init -ffffffff8000614e putpixel -ffffffff800061fa draw_char -ffffffff80006322 erase_char -ffffffff800063d8 term_scroll -ffffffff8000652f putchar -ffffffff800066de _putchar -ffffffff800066f9 kputs -ffffffff80006742 pic_remap -ffffffff800067ff pic_enable -ffffffff8000682b pit_init -ffffffff80006883 timer_wait -ffffffff800068b1 timer_init -ffffffff800068fa memcpy -ffffffff80006954 memset -ffffffff8000699a memmove -ffffffff80006a43 memcmp -ffffffff80006ad1 memmap_display -ffffffff80006d09 hhdm_display -ffffffff80006d51 convert_x86_vm_flags -ffffffff80006da3 vmm_setup_pt_root -ffffffff80006e29 vmm_init -ffffffff80007c20 pow10.0 -ffffffff80009000 kbdus -ffffffff80009080 kbdus_shifted -ffffffff80009100 kbdfr -ffffffff80009180 kbdfr_shifted -ffffffff80009200 font -ffffffff80009208 glyphs -ffffffff80009210 _binary_zap_light16_psf_start -ffffffff8000a6d0 _binary_zap_light16_psf_end -ffffffff8000b000 gdt_entries -ffffffff8000b028 gdtr -ffffffff8000b040 idt -ffffffff8000c040 idt_reg -ffffffff8000c050 kheap_start -ffffffff8000c058 head -ffffffff8000c060 end -ffffffff8000c070 kernel_stack -ffffffff8001c080 boot_ctx -ffffffff8001d000 kernel_pml4 -ffffffff8001d008 kernel_phys_base -ffffffff8001d010 kernel_virt_base -ffffffff8001d018 biggest_entry -ffffffff8001d020 hhdm_off -ffffffff8001d028 g_freelist -ffffffff8001d030 processes_list -ffffffff8001d038 current_process -ffffffff8001d040 next_free_pid -ffffffff8001d048 key_status -ffffffff8001d050 keymap -ffffffff8001d058 keymap_shifted -ffffffff8001d060 cursor -ffffffff8001d070 fb -ffffffff8001d078 framebuffer -ffffffff8001d080 lines_length -ffffffff8001d180 ticks -ffffffff8001d188 vmm_pt_root -ffffffff8001d190 vm_objs