diff --git a/Kernel/PerformanceEventBuffer.cpp b/Kernel/PerformanceEventBuffer.cpp index b3fb92336b..93e4f019b6 100644 --- a/Kernel/PerformanceEventBuffer.cpp +++ b/Kernel/PerformanceEventBuffer.cpp @@ -66,11 +66,12 @@ KResult PerformanceEventBuffer::append(int type, FlatPtr arg1, FlatPtr arg2) FlatPtr ebp; asm volatile("movl %%ebp, %%eax" : "=a"(ebp)); - //copy_from_user(&ebp, (FlatPtr*)current->get_register_dump_from_stack().ebp); + FlatPtr eip; + copy_from_user(&eip, (FlatPtr*)&Thread::current->get_register_dump_from_stack().eip); Vector backtrace; { SmapDisabler disabler; - backtrace = Thread::current->raw_backtrace(ebp); + backtrace = Thread::current->raw_backtrace(ebp, eip); } event.stack_size = min(sizeof(event.stack) / sizeof(FlatPtr), static_cast(backtrace.size())); memcpy(event.stack, backtrace.data(), event.stack_size * sizeof(FlatPtr)); diff --git a/Kernel/Scheduler.cpp b/Kernel/Scheduler.cpp index 163705025d..6563effc3f 100644 --- a/Kernel/Scheduler.cpp +++ b/Kernel/Scheduler.cpp @@ -603,7 +603,7 @@ void Scheduler::timer_tick(const RegisterState& regs) if (Process::current->is_profiling()) { SmapDisabler disabler; - auto backtrace = Thread::current->raw_backtrace(regs.ebp); + auto backtrace = Thread::current->raw_backtrace(regs.ebp, regs.eip); auto& sample = Profiling::next_sample_slot(); sample.pid = Process::current->pid(); sample.tid = Thread::current->tid(); diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index d126cde5ed..745667e987 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -846,13 +846,13 @@ String Thread::backtrace_impl() const return builder.to_string(); } -Vector Thread::raw_backtrace(FlatPtr ebp) const +Vector Thread::raw_backtrace(FlatPtr ebp, FlatPtr eip) const { InterruptDisabler disabler; auto& process = const_cast(this->process()); ProcessPagingScope paging_scope(process); Vector backtrace; - backtrace.append(ebp); + backtrace.append(eip); for (FlatPtr* stack_ptr = (FlatPtr*)ebp; process.validate_read_from_kernel(VirtualAddress(stack_ptr), sizeof(FlatPtr) * 2) && MM.can_read_without_faulting(process, VirtualAddress(stack_ptr), sizeof(FlatPtr) * 2); stack_ptr = (FlatPtr*)*stack_ptr) { FlatPtr retaddr = stack_ptr[1]; backtrace.append(retaddr); diff --git a/Kernel/Thread.h b/Kernel/Thread.h index c3abbed6fd..fcc016f4cf 100644 --- a/Kernel/Thread.h +++ b/Kernel/Thread.h @@ -97,7 +97,7 @@ public: const Process& process() const { return m_process; } String backtrace(ProcessInspectionHandle&) const; - Vector raw_backtrace(FlatPtr ebp) const; + Vector raw_backtrace(FlatPtr ebp, FlatPtr eip) const; const String& name() const { return m_name; } void set_name(const StringView& s) { m_name = s; }