Add is_user_address and is_kernel_address functions
This commit is contained in:
parent
9716891eff
commit
522d74b65d
@ -5,4 +5,7 @@ namespace Memory
|
||||
{
|
||||
uint64_t get_system();
|
||||
uint64_t get_usable();
|
||||
|
||||
bool is_user_address(uintptr_t address);
|
||||
bool is_kernel_address(uintptr_t address);
|
||||
}
|
@ -41,4 +41,14 @@ uint64_t Memory::get_usable()
|
||||
cached = true;
|
||||
|
||||
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;
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
#include "trace/StackTracer.h"
|
||||
#include "memory/Memory.h"
|
||||
#include "std/stdio.h"
|
||||
#include "trace/Resolve.h"
|
||||
|
||||
@ -20,7 +21,7 @@ typedef struct stackframe
|
||||
void StackTracer::trace()
|
||||
{
|
||||
stackframe* frame = (stackframe*)m_base_pointer;
|
||||
while (frame && (uint64_t)frame > 0xfffffffff8000000)
|
||||
while (Memory::is_kernel_address((uintptr_t)frame))
|
||||
{
|
||||
char symbol_name[512];
|
||||
get_symbol_name(frame->instruction, symbol_name);
|
||||
@ -31,6 +32,11 @@ void StackTracer::trace()
|
||||
|
||||
void StackTracer::trace_with_ip(uintptr_t ip)
|
||||
{
|
||||
if (!Memory::is_kernel_address(ip))
|
||||
{
|
||||
printf("(user stack)");
|
||||
return;
|
||||
}
|
||||
char symbol_name[512];
|
||||
get_symbol_name(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;
|
||||
asm volatile("mov %%rbp, %0" : "=r"(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;
|
||||
frame = frame->next;
|
||||
|
Loading…
Reference in New Issue
Block a user