#include "trace/Resolve.h" #include "init/InitRD.h" #include "std/stdlib.h" #include "std/string.h" #include extern int kernel_start; extern int kernel_end; static InitRD::File symbol_map = {"", 0, 0, (void*)-1}; static size_t symbol_strlen(const char* symbol) { const char* i = symbol; for (; *i != '\n' && *i; ++i) ; return (i - symbol); } void get_symbol_name(uintptr_t address, char* buffer) { if (symbol_map.addr == (void*)-1) { symbol_map = InitRD::open("sys/moon.sym"); } if (!symbol_map.addr) { strncpy(buffer, "(no symbols loaded)", 20); } while (address >= (uintptr_t)&kernel_start && address <= (uintptr_t)&kernel_end) { char addr_as_str[60]; ultoa(address, addr_as_str, 16); char* symbol = strstr((char*)symbol_map.addr, addr_as_str); if (symbol) { symbol += 19; size_t symlen = symbol_strlen(symbol); memcpy(buffer, symbol, symlen); buffer[symlen] = 0; return; } address--; } strncpy(buffer, "(no symbol)", 12); }