#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, 0}; 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, size_t max) { if (symbol_map.addr == (void*)-1) { symbol_map = InitRD::open("sys/moon.sym"); } if (!symbol_map.addr) { strlcpy(buffer, "(no symbols loaded)", max); } 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); size_t copylen = (max - 1) < symlen ? (max - 1) : symlen; memcpy(buffer, symbol, copylen); buffer[copylen] = 0; return; } address--; } strlcpy(buffer, "(no symbol)", max); }