Преглед на файлове

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! :^)
Andreas Kling преди 5 години
родител
ревизия
b7ff3b5ad1
променени са 4 файла, в които са добавени 7 реда и са изтрити 6 реда
  1. 3 2
      Kernel/PerformanceEventBuffer.cpp
  2. 1 1
      Kernel/Scheduler.cpp
  3. 2 2
      Kernel/Thread.cpp
  4. 1 1
      Kernel/Thread.h

+ 3 - 2
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<FlatPtr> 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<size_t>(backtrace.size()));
     memcpy(event.stack, backtrace.data(), event.stack_size * sizeof(FlatPtr));

+ 1 - 1
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();

+ 2 - 2
Kernel/Thread.cpp

@@ -846,13 +846,13 @@ String Thread::backtrace_impl() const
     return builder.to_string();
 }
 
-Vector<FlatPtr> Thread::raw_backtrace(FlatPtr ebp) const
+Vector<FlatPtr> Thread::raw_backtrace(FlatPtr ebp, FlatPtr eip) const
 {
     InterruptDisabler disabler;
     auto& process = const_cast<Process&>(this->process());
     ProcessPagingScope paging_scope(process);
     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) {
         FlatPtr retaddr = stack_ptr[1];
         backtrace.append(retaddr);

+ 1 - 1
Kernel/Thread.h

@@ -97,7 +97,7 @@ public:
     const Process& process() const { return m_process; }
 
     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; }
     void set_name(const StringView& s) { m_name = s; }