40 lines
1.1 KiB
C++
40 lines
1.1 KiB
C++
#include "trace/Resolve.h"
|
|
#include "init/InitRD.h"
|
|
#include "std/stdlib.h"
|
|
#include "std/string.h"
|
|
#include <stddef.h>
|
|
|
|
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);
|
|
} |