summaryrefslogtreecommitdiff
path: root/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/Makefile1
-rw-r--r--Kernel/Process.cpp5
-rw-r--r--Kernel/Thread.cpp8
3 files changed, 13 insertions, 1 deletions
diff --git a/Kernel/Makefile b/Kernel/Makefile
index 62f8b1276b..c302147db7 100644
--- a/Kernel/Makefile
+++ b/Kernel/Makefile
@@ -105,6 +105,7 @@ CXXFLAGS += -nostdlib -nostdinc -nostdinc++
CXXFLAGS += -I../Toolchain/Local/i686-pc-serenity/include/c++/8.3.0/
CXXFLAGS += -I../Toolchain/Local/i686-pc-serenity/include/c++/8.3.0/i686-pc-serenity/
DEFINES += -DKERNEL
+DEFINES += -DEXPENSIVE_USERSPACE_STACKS
LDFLAGS += -Ttext 0x10000 -Wl,-T linker.ld -nostdlib
all: $(KERNEL) kernel.map
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp
index 3e65b7b0b3..34439560eb 100644
--- a/Kernel/Process.cpp
+++ b/Kernel/Process.cpp
@@ -350,6 +350,11 @@ int Process::do_exec(String path, Vector<String> arguments, Vector<String> envir
bool success = region->page_in();
ASSERT(success);
}
+
+#ifdef EXPENSIVE_USERSPACE_STACKS
+ region->page_in();
+#endif
+
OwnPtr<ELFLoader> loader;
{
// Okay, here comes the sleight of hand, pay close attention..
diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp
index 71194807c1..e2370135e0 100644
--- a/Kernel/Thread.cpp
+++ b/Kernel/Thread.cpp
@@ -1,3 +1,4 @@
+#include <AK/ELF/ELFLoader.h>
#include <AK/StringBuilder.h>
#include <Kernel/FileSystem/FileDescription.h>
#include <Kernel/Process.h>
@@ -570,7 +571,12 @@ String Thread::backtrace(ProcessInspectionHandle&) const
if (!symbol.address)
break;
if (!symbol.ksym) {
- builder.appendf("%p\n", symbol.address);
+#ifdef EXPENSIVE_USERSPACE_STACKS
+ if (!Scheduler::is_active() && process.elf_loader() && process.elf_loader()->has_symbols())
+ builder.appendf("%p %s\n", symbol.address, process.elf_loader()->symbolicate(symbol.address).characters());
+ else
+#endif
+ builder.appendf("%p\n", symbol.address);
continue;
}
unsigned offset = symbol.address - symbol.ksym->address;