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