Kernel: Add SMP message StackTrace

This event is sent when user presses ctrl+{F1-F12} and it will dump the
corresponding processor's stack trace. This is really helpful for
detecting deadlocks in the system
This commit is contained in:
Bananymous 2025-06-02 11:22:57 +03:00
parent c5b0d0235f
commit 7a645b8555
3 changed files with 37 additions and 1 deletions

View File

@ -33,6 +33,7 @@ namespace Kernel
FlushTLB, FlushTLB,
NewThread, NewThread,
UnblockThread, UnblockThread,
StackTrace,
}; };
SMPMessage* next { nullptr }; SMPMessage* next { nullptr };
Type type; Type type;
@ -45,6 +46,7 @@ namespace Kernel
} flush_tlb; } flush_tlb;
SchedulerQueue::Node* new_thread; SchedulerQueue::Node* new_thread;
SchedulerQueue::Node* unblock_thread; SchedulerQueue::Node* unblock_thread;
bool dummy;
}; };
}; };

View File

@ -114,8 +114,38 @@ namespace Kernel
auto& key_event = event.as<const LibInput::RawKeyEvent>(); auto& key_event = event.as<const LibInput::RawKeyEvent>();
if (key_event.modifier & LibInput::KeyEvent::Modifier::Pressed) if (key_event.modifier & LibInput::KeyEvent::Modifier::Pressed)
{ {
if (key_event.modifier & LibInput::KeyEvent::Modifier::LCtrl)
{
const auto processor_count = Processor::count();
switch (key_event.keycode) switch (key_event.keycode)
{ {
#define DUMP_CPU_STACK_TRACE(idx) \
case LibInput::keycode_function(idx + 1): \
if (idx >= processor_count) \
break; \
Processor::send_smp_message(Processor::id_from_index(idx), { \
.type = Processor::SMPMessage::Type::StackTrace, \
.dummy = false, \
}); \
break
// F1-F12
DUMP_CPU_STACK_TRACE(0);
DUMP_CPU_STACK_TRACE(1);
DUMP_CPU_STACK_TRACE(2);
DUMP_CPU_STACK_TRACE(3);
DUMP_CPU_STACK_TRACE(4);
DUMP_CPU_STACK_TRACE(5);
DUMP_CPU_STACK_TRACE(6);
DUMP_CPU_STACK_TRACE(7);
DUMP_CPU_STACK_TRACE(8);
DUMP_CPU_STACK_TRACE(9);
DUMP_CPU_STACK_TRACE(10);
DUMP_CPU_STACK_TRACE(11);
#undef DUMP_CPU_STACK_TRACE
}
}
else switch (key_event.keycode)
{
case LibInput::keycode_function(1): case LibInput::keycode_function(1):
Processor::toggle_should_print_cpu_load(); Processor::toggle_should_print_cpu_load();
break; break;

View File

@ -244,6 +244,10 @@ namespace Kernel
case SMPMessage::Type::UnblockThread: case SMPMessage::Type::UnblockThread:
processor.m_scheduler->unblock_thread(message->unblock_thread); processor.m_scheduler->unblock_thread(message->unblock_thread);
break; break;
case SMPMessage::Type::StackTrace:
dwarnln("Stack trace of CPU {}", current_id().as_u32());
Debug::dump_stack_trace();
break;
} }
last_handled = message; last_handled = message;