Add is_user_address and is_kernel_address functions

This commit is contained in:
apio 2022-09-29 19:30:42 +02:00
parent 9716891eff
commit 522d74b65d
3 changed files with 21 additions and 2 deletions

View File

@ -5,4 +5,7 @@ namespace Memory
{ {
uint64_t get_system(); uint64_t get_system();
uint64_t get_usable(); uint64_t get_usable();
bool is_user_address(uintptr_t address);
bool is_kernel_address(uintptr_t address);
} }

View File

@ -41,4 +41,14 @@ uint64_t Memory::get_usable()
cached = true; cached = true;
return result; return result;
}
bool Memory::is_kernel_address(uintptr_t address)
{
return address > 0xfffffffff8000000;
}
bool Memory::is_user_address(uintptr_t address)
{
return address && address < 0xfffffffff8000000;
} }

View File

@ -1,4 +1,5 @@
#include "trace/StackTracer.h" #include "trace/StackTracer.h"
#include "memory/Memory.h"
#include "std/stdio.h" #include "std/stdio.h"
#include "trace/Resolve.h" #include "trace/Resolve.h"
@ -20,7 +21,7 @@ typedef struct stackframe
void StackTracer::trace() void StackTracer::trace()
{ {
stackframe* frame = (stackframe*)m_base_pointer; stackframe* frame = (stackframe*)m_base_pointer;
while (frame && (uint64_t)frame > 0xfffffffff8000000) while (Memory::is_kernel_address((uintptr_t)frame))
{ {
char symbol_name[512]; char symbol_name[512];
get_symbol_name(frame->instruction, symbol_name); get_symbol_name(frame->instruction, symbol_name);
@ -31,6 +32,11 @@ void StackTracer::trace()
void StackTracer::trace_with_ip(uintptr_t ip) void StackTracer::trace_with_ip(uintptr_t ip)
{ {
if (!Memory::is_kernel_address(ip))
{
printf("(user stack)");
return;
}
char symbol_name[512]; char symbol_name[512];
get_symbol_name(ip, symbol_name); get_symbol_name(ip, symbol_name);
printf("%lx: %s\n", ip, symbol_name); printf("%lx: %s\n", ip, symbol_name);
@ -42,7 +48,7 @@ bool stack_trace_contains(uintptr_t address)
uintptr_t base_pointer; uintptr_t base_pointer;
asm volatile("mov %%rbp, %0" : "=r"(base_pointer)); asm volatile("mov %%rbp, %0" : "=r"(base_pointer));
stackframe* frame = (stackframe*)base_pointer; stackframe* frame = (stackframe*)base_pointer;
while (frame && (uint64_t)frame > 0xfffffffff8000000) while (Memory::is_kernel_address((uintptr_t)frame))
{ {
if (frame->instruction == address) return true; if (frame->instruction == address) return true;
frame = frame->next; frame = frame->next;