mirror of
https://github.com/RGBCube/serenity
synced 2025-07-24 20:27:35 +00:00
Kernel: Include the current instruction pointer in profile samples
We were missing the innermost instruction pointer when sampling. This makes the instruction-level profile info a lot cooler! :^)
This commit is contained in:
parent
c106451daf
commit
b7ff3b5ad1
4 changed files with 7 additions and 6 deletions
|
@ -66,11 +66,12 @@ KResult PerformanceEventBuffer::append(int type, FlatPtr arg1, FlatPtr arg2)
|
||||||
FlatPtr ebp;
|
FlatPtr ebp;
|
||||||
asm volatile("movl %%ebp, %%eax"
|
asm volatile("movl %%ebp, %%eax"
|
||||||
: "=a"(ebp));
|
: "=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<FlatPtr> backtrace;
|
Vector<FlatPtr> backtrace;
|
||||||
{
|
{
|
||||||
SmapDisabler disabler;
|
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<size_t>(backtrace.size()));
|
event.stack_size = min(sizeof(event.stack) / sizeof(FlatPtr), static_cast<size_t>(backtrace.size()));
|
||||||
memcpy(event.stack, backtrace.data(), event.stack_size * sizeof(FlatPtr));
|
memcpy(event.stack, backtrace.data(), event.stack_size * sizeof(FlatPtr));
|
||||||
|
|
|
@ -603,7 +603,7 @@ void Scheduler::timer_tick(const RegisterState& regs)
|
||||||
|
|
||||||
if (Process::current->is_profiling()) {
|
if (Process::current->is_profiling()) {
|
||||||
SmapDisabler disabler;
|
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();
|
auto& sample = Profiling::next_sample_slot();
|
||||||
sample.pid = Process::current->pid();
|
sample.pid = Process::current->pid();
|
||||||
sample.tid = Thread::current->tid();
|
sample.tid = Thread::current->tid();
|
||||||
|
|
|
@ -846,13 +846,13 @@ String Thread::backtrace_impl() const
|
||||||
return builder.to_string();
|
return builder.to_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<FlatPtr> Thread::raw_backtrace(FlatPtr ebp) const
|
Vector<FlatPtr> Thread::raw_backtrace(FlatPtr ebp, FlatPtr eip) const
|
||||||
{
|
{
|
||||||
InterruptDisabler disabler;
|
InterruptDisabler disabler;
|
||||||
auto& process = const_cast<Process&>(this->process());
|
auto& process = const_cast<Process&>(this->process());
|
||||||
ProcessPagingScope paging_scope(process);
|
ProcessPagingScope paging_scope(process);
|
||||||
Vector<FlatPtr, Profiling::max_stack_frame_count> backtrace;
|
Vector<FlatPtr, Profiling::max_stack_frame_count> 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) {
|
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];
|
FlatPtr retaddr = stack_ptr[1];
|
||||||
backtrace.append(retaddr);
|
backtrace.append(retaddr);
|
||||||
|
|
|
@ -97,7 +97,7 @@ public:
|
||||||
const Process& process() const { return m_process; }
|
const Process& process() const { return m_process; }
|
||||||
|
|
||||||
String backtrace(ProcessInspectionHandle&) const;
|
String backtrace(ProcessInspectionHandle&) const;
|
||||||
Vector<FlatPtr> raw_backtrace(FlatPtr ebp) const;
|
Vector<FlatPtr> raw_backtrace(FlatPtr ebp, FlatPtr eip) const;
|
||||||
|
|
||||||
const String& name() const { return m_name; }
|
const String& name() const { return m_name; }
|
||||||
void set_name(const StringView& s) { m_name = s; }
|
void set_name(const StringView& s) { m_name = s; }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue