From 9d3030763b002989135b4595a143ae9c2af793d5 Mon Sep 17 00:00:00 2001 From: apio Date: Mon, 19 Sep 2022 20:54:05 +0200 Subject: [PATCH] We can fetch a symbol's name from its address!! --- kernel/include/trace/Resolve.h | 4 ++++ kernel/src/trace/Resolve.cpp | 38 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 kernel/include/trace/Resolve.h create mode 100644 kernel/src/trace/Resolve.cpp diff --git a/kernel/include/trace/Resolve.h b/kernel/include/trace/Resolve.h new file mode 100644 index 00000000..3cb35921 --- /dev/null +++ b/kernel/include/trace/Resolve.h @@ -0,0 +1,4 @@ +#pragma once +#include + +void get_symbol_name(uintptr_t address, char* buffer); \ No newline at end of file diff --git a/kernel/src/trace/Resolve.cpp b/kernel/src/trace/Resolve.cpp new file mode 100644 index 00000000..23e1f0cb --- /dev/null +++ b/kernel/src/trace/Resolve.cpp @@ -0,0 +1,38 @@ +#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, 0}; + +static size_t symbol_strlen(const char* symbol) +{ + const char* i = symbol; + for (; *i != '\n'; ++i) + ; + return (i - symbol); +} + +void get_symbol_name(uintptr_t address, char* buffer) +{ + if (!symbol_map.addr) { symbol_map = InitRD::open("sys/moon.sym"); } + 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--; + } +} \ No newline at end of file