From 522d74b65d5fb7ae051acfd49bd9248f1ef0c11a Mon Sep 17 00:00:00 2001 From: apio Date: Thu, 29 Sep 2022 19:30:42 +0200 Subject: [PATCH] Add is_user_address and is_kernel_address functions --- kernel/include/memory/Memory.h | 3 +++ kernel/src/memory/Memory.cpp | 10 ++++++++++ kernel/src/trace/StackTracer.cpp | 10 ++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/kernel/include/memory/Memory.h b/kernel/include/memory/Memory.h index e7663dcd..aa5aebf3 100644 --- a/kernel/include/memory/Memory.h +++ b/kernel/include/memory/Memory.h @@ -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); } \ No newline at end of file diff --git a/kernel/src/memory/Memory.cpp b/kernel/src/memory/Memory.cpp index 81e8b046..705ed483 100644 --- a/kernel/src/memory/Memory.cpp +++ b/kernel/src/memory/Memory.cpp @@ -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; } \ No newline at end of file diff --git a/kernel/src/trace/StackTracer.cpp b/kernel/src/trace/StackTracer.cpp index 18d1fe9b..58cdbeeb 100644 --- a/kernel/src/trace/StackTracer.cpp +++ b/kernel/src/trace/StackTracer.cpp @@ -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;