Kernel: Add debugging macro to dump syscalls that take a long time

This commit is contained in:
Bananymous 2025-06-06 04:00:57 +03:00
parent eecdad50a6
commit 5eefd98e1b
1 changed files with 19 additions and 2 deletions

View File

@ -4,10 +4,12 @@
#include <kernel/Process.h>
#include <kernel/Scheduler.h>
#include <kernel/Syscall.h>
#include <kernel/Timer/Timer.h>
#include <termios.h>
#define DUMP_ALL_SYSCALLS 0
#define DUMP_LONG_SYSCALLS 0
namespace Kernel
{
@ -40,7 +42,7 @@ namespace Kernel
{
ASSERT(GDT::is_user_segment(interrupt_stack->cs));
asm volatile("sti");
Processor::set_interrupt_state(InterruptState::Enabled);
BAN::ErrorOr<long> ret = BAN::Error::from_errno(ENOSYS);
@ -50,6 +52,10 @@ namespace Kernel
dprintln("{} pid {}: {}", process_path, Process::current().pid(), s_syscall_names[syscall]);
#endif
#if DUMP_LONG_SYSCALLS
const uint64_t start_ns = SystemTimer::get().ns_since_boot();
#endif
if (syscall < 0 || syscall >= __SYSCALL_COUNT)
dwarnln("No syscall {}", syscall);
else if (syscall == SYS_FORK)
@ -62,7 +68,7 @@ namespace Kernel
ret = (Process::current().*s_syscall_handlers[syscall])(arg1, arg2, arg3, arg4, arg5);
#pragma GCC diagnostic pop
asm volatile("cli");
Processor::set_interrupt_state(InterruptState::Disabled);
#if DUMP_ALL_SYSCALLS
if (ret.is_error())
@ -74,6 +80,17 @@ namespace Kernel
dwarnln("{} pid {}: {}: ENOTSUP", process_path, Process::current().pid(), s_syscall_names[syscall]);
#endif
#if DUMP_LONG_SYSCALLS
const uint64_t end_ns = SystemTimer::get().ns_since_boot();
const uint64_t duration_us = (end_ns - start_ns) / 1000;
if (duration_us > 1'000)
dwarnln("{} {} took {}.{3} ms",
Process::current().name(),
s_syscall_names[syscall],
duration_us / 1000, duration_us % 1000
);
#endif
if (ret.is_error() && ret.error().is_kernel_error())
Kernel::panic("Kernel error while returning to userspace {}", ret.error());