Stack trace with double linking to get symbol names

This commit is contained in:
2026-02-21 19:28:17 +01:00
parent 4cf4fb0dda
commit 9470dedb61
9 changed files with 875 additions and 23 deletions

View File

@@ -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

View File

@@ -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`

23
src/debug/panic.c Normal file
View File

@@ -0,0 +1,23 @@
#include <stddef.h>
#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();
}

75
src/debug/stacktrace.c Normal file
View File

@@ -0,0 +1,75 @@
#include <stdint.h>
#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<max_frames && rbp != NULL; frame++)
{
// Return address, 1 word above saved rbp
uintptr_t rip = rbp[1];
uintptr_t offset = 0;
const char* name = debug_find_symbol(rip, &offset);
DEBUG("[%u] <0x%p> (%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";
}

View File

@@ -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

View File

@@ -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);

547
symbols.S Normal file
View File

@@ -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

180
symbols.map Normal file
View File

@@ -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

33
symbols.py Normal file
View File

@@ -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!")