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_system();
|
||||||
uint64_t get_usable();
|
uint64_t get_usable();
|
||||||
|
|
||||||
|
bool is_user_address(uintptr_t address);
|
||||||
|
bool is_kernel_address(uintptr_t address);
|
||||||
}
|
}
|
@ -42,3 +42,13 @@ uint64_t Memory::get_usable()
|
|||||||
|
|
||||||
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;
|
||||||
|
}
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user