diff --git a/Kernel/PerformanceEventBuffer.cpp b/Kernel/PerformanceEventBuffer.cpp index 851d3098dac587..ec61c1ee271531 100644 --- a/Kernel/PerformanceEventBuffer.cpp +++ b/Kernel/PerformanceEventBuffer.cpp @@ -39,6 +39,16 @@ PerformanceEventBuffer::PerformanceEventBuffer() } KResult PerformanceEventBuffer::append(int type, FlatPtr arg1, FlatPtr arg2) +{ + FlatPtr ebp; + asm volatile("movl %%ebp, %%eax" + : "=a"(ebp)); + auto current_thread = Thread::current(); + auto eip = current_thread->get_register_dump_from_stack().eip; + return append_with_eip_and_ebp(eip, ebp, type, arg1, arg2); +} + +KResult PerformanceEventBuffer::append_with_eip_and_ebp(u32 eip, u32 ebp, int type, FlatPtr arg1, FlatPtr arg2) { if (count() >= capacity()) return KResult(-ENOBUFS); @@ -60,11 +70,7 @@ KResult PerformanceEventBuffer::append(int type, FlatPtr arg1, FlatPtr arg2) return KResult(-EINVAL); } - FlatPtr ebp; - asm volatile("movl %%ebp, %%eax" - : "=a"(ebp)); auto current_thread = Thread::current(); - auto eip = current_thread->get_register_dump_from_stack().eip; Vector backtrace; { SmapDisabler disabler; diff --git a/Kernel/PerformanceEventBuffer.h b/Kernel/PerformanceEventBuffer.h index 19844b71030c95..c1cb429266b4d3 100644 --- a/Kernel/PerformanceEventBuffer.h +++ b/Kernel/PerformanceEventBuffer.h @@ -61,6 +61,7 @@ class PerformanceEventBuffer { PerformanceEventBuffer(); KResult append(int type, FlatPtr arg1, FlatPtr arg2); + KResult append_with_eip_and_ebp(u32 eip, u32 ebp, int type, FlatPtr arg1, FlatPtr arg2); void clear() { diff --git a/Kernel/Scheduler.cpp b/Kernel/Scheduler.cpp index 44f65f06de1bdb..a55e6af3f93381 100644 --- a/Kernel/Scheduler.cpp +++ b/Kernel/Scheduler.cpp @@ -495,7 +495,7 @@ void Scheduler::timer_tick(const RegisterState& regs) if (current_thread->process().is_profiling()) { ASSERT(current_thread->process().perf_events()); auto& perf_events = *current_thread->process().perf_events(); - [[maybe_unused]] auto rc = perf_events.append(PERF_EVENT_SAMPLE, 0, 0); + [[maybe_unused]] auto rc = perf_events.append_with_eip_and_ebp(regs.eip, regs.ebp, PERF_EVENT_SAMPLE, 0, 0); } if (current_thread->tick((regs.cs & 3) == 0))