diff --git a/orbis-kernel/include/orbis/thread/ProcessOps.hpp b/orbis-kernel/include/orbis/thread/ProcessOps.hpp index 32330fe63..85fa0f17f 100644 --- a/orbis-kernel/include/orbis/thread/ProcessOps.hpp +++ b/orbis-kernel/include/orbis/thread/ProcessOps.hpp @@ -68,5 +68,7 @@ struct ProcessOps { SysResult (*processNeeded)(Thread *thread); SysResult (*registerEhFrames)(Thread *thread); + + void (*where)(Thread *); }; } // namespace orbis diff --git a/orbis-kernel/include/orbis/thread/Thread.hpp b/orbis-kernel/include/orbis/thread/Thread.hpp index 6947e64ba..262417575 100644 --- a/orbis-kernel/include/orbis/thread/Thread.hpp +++ b/orbis-kernel/include/orbis/thread/Thread.hpp @@ -32,6 +32,9 @@ struct Thread { uint64_t evfResultPattern; uint64_t evfIsCancelled; + // Print backtrace + void where(); + // FIXME: implement thread destruction void incRef() {} void decRef() {} diff --git a/orbis-kernel/src/KernelContext.cpp b/orbis-kernel/src/KernelContext.cpp index c88814ad0..7e5a8fd2b 100644 --- a/orbis-kernel/src/KernelContext.cpp +++ b/orbis-kernel/src/KernelContext.cpp @@ -1,5 +1,6 @@ #include "orbis/KernelContext.hpp" #include "orbis/thread/Process.hpp" +#include "orbis/thread/ProcessOps.hpp" #include "orbis/utils/Logs.hpp" #include #include @@ -85,14 +86,14 @@ long KernelContext::getTscFreq() { long timer_data[samples]; long error_data[samples]; - struct timespec ts0; + struct ::timespec ts0; clock_gettime(CLOCK_MONOTONIC, &ts0); long sec_base = ts0.tv_sec; for (int i = 0; i < samples; i++) { usleep(200); error_data[i] = (__builtin_ia32_lfence(), __builtin_ia32_rdtsc()); - struct timespec ts; + struct ::timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); rdtsc_data[i] = (__builtin_ia32_lfence(), __builtin_ia32_rdtsc()); timer_data[i] = ts.tv_nsec + (ts.tv_sec - sec_base) * 1'000'000'000; @@ -190,4 +191,6 @@ void log_class_string::format(std::string &out, const void *arg) { out += get_object(arg); } } // namespace logs + +void Thread::where() { tproc->ops->where(this); } } // namespace orbis diff --git a/rpcsx-os/ops.cpp b/rpcsx-os/ops.cpp index a1124fe70..bfd611057 100644 --- a/rpcsx-os/ops.cpp +++ b/rpcsx-os/ops.cpp @@ -1,5 +1,6 @@ #include "ops.hpp" #include "align.hpp" +#include "backtrace.hpp" #include "io-device.hpp" #include "linker.hpp" #include "orbis/module/ModuleHandle.hpp" @@ -752,6 +753,10 @@ SysResult registerEhFrames(Thread *thread) { return {}; } + +void where(Thread *thread) { + rx::printStackTrace((ucontext_t *)thread->context, thread, 2); +} } // namespace ProcessOps rx::procOpsTable = { @@ -794,4 +799,5 @@ ProcessOps rx::procOpsTable = { .exit = exit, .processNeeded = processNeeded, .registerEhFrames = registerEhFrames, + .where = where, };