From 75d691060742d59894c147ad1abde4c6c9803346 Mon Sep 17 00:00:00 2001 From: Alexandru Dutu Date: Thu, 17 Mar 2016 10:22:39 -0700 Subject: [PATCH] syscall_emul: add extra debug support for syscalls Breaks the debug output from system calls into two levels: Base and Verbose. A macro is added specifically for system calls which allows developers to easily add new debug messages in a consistent manner. The macro also contains a field to print thread IDs along with the CPU ID. --- src/sim/SConscript | 3 +++ src/sim/syscall_emul.cc | 27 ++++++++++++++++----------- src/sim/syscall_emul.hh | 11 ++++++++++- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/sim/SConscript b/src/sim/SConscript index 93fc30fbc..94d0560ca 100644 --- a/src/sim/SConscript +++ b/src/sim/SConscript @@ -91,6 +91,7 @@ DebugFlag('Interrupt') DebugFlag('Loader') DebugFlag('PseudoInst') DebugFlag('Stack') +DebugFlag('SyscallBase') DebugFlag('SyscallVerbose') DebugFlag('TimeSync') DebugFlag('Thread') @@ -100,3 +101,5 @@ DebugFlag('WorkItems') DebugFlag('ClockDomain') DebugFlag('VoltageDomain') DebugFlag('DVFS') + +CompoundFlag('SyscallAll', [ 'SyscallBase', 'SyscallVerbose']) diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc index a3acae19d..517580d79 100644 --- a/src/sim/syscall_emul.cc +++ b/src/sim/syscall_emul.cc @@ -42,6 +42,7 @@ #include "config/the_isa.hh" #include "cpu/base.hh" #include "cpu/thread_context.hh" +#include "debug/SyscallBase.hh" #include "debug/SyscallVerbose.hh" #include "mem/page_table.hh" #include "sim/process.hh" @@ -55,28 +56,31 @@ using namespace TheISA; void SyscallDesc::doSyscall(int callnum, LiveProcess *process, ThreadContext *tc) { - if (DTRACE(SyscallVerbose)) { + if (DTRACE(SyscallBase)) { int index = 0; - IntReg arg[4] M5_VAR_USED; + IntReg arg[6] M5_VAR_USED; // we can't just put the calls to getSyscallArg() in the // DPRINTF arg list, because C++ doesn't guarantee their order - for (int i = 0; i < 4; ++i) + for (int i = 0; i < 6; ++i) arg[i] = process->getSyscallArg(tc, index); - DPRINTFNR("%d: %s: syscall %s called w/arguments %d,%d,%d,%d\n", - curTick(), tc->getCpuPtr()->name(), name, - arg[0], arg[1], arg[2], arg[3]); + // Linux supports up to six system call arguments through registers + // so we want to print all six. Check to the relevant man page to + // verify how many are actually used by a given system call. + DPRINTF_SYSCALL(Base, + "%s called w/arguments %d, %d, %d, %d, %d, %d\n", + name, arg[0], arg[1], arg[2], arg[3], arg[4], + arg[5]); } SyscallReturn retval = (*funcPtr)(this, callnum, process, tc); if (retval.needsRetry()) { - DPRINTFS(SyscallVerbose, tc->getCpuPtr(), "syscall %s needs retry\n", - name); + DPRINTF_SYSCALL(Base, "%s needs retry\n", name); } else { - DPRINTFS(SyscallVerbose, tc->getCpuPtr(), "syscall %s returns %d\n", - name, retval.encodedValue()); + DPRINTF_SYSCALL(Base, "%s returns %d\n", name, + retval.encodedValue()); } if (!(flags & SyscallDesc::SuppressReturnValue) && !retval.needsRetry()) @@ -201,7 +205,8 @@ brkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc) } p->brk_point = new_brk; - DPRINTF(SyscallVerbose, "Break Point changed to: %#X\n", p->brk_point); + DPRINTF_SYSCALL(Verbose, "brk: break point changed to: %#X\n", + p->brk_point); return p->brk_point; } diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index 2aa742615..080dcb011 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -74,6 +74,7 @@ #include "config/the_isa.hh" #include "cpu/base.hh" #include "cpu/thread_context.hh" +#include "debug/SyscallBase.hh" #include "debug/SyscallVerbose.hh" #include "mem/page_table.hh" #include "sim/byteswap.hh" @@ -83,6 +84,14 @@ #include "sim/syscallreturn.hh" #include "sim/system.hh" +// This wrapper macro helps out with readability a bit. FLAGEXT specifies +// the verbosity and FMT is the message to be appended to the syscall +// header information. The syscall header information contains the cpuid +// and thread id. +#define DPRINTF_SYSCALL(FLAGEXT, FMT, ...) \ + DPRINTFS(Syscall##FLAGEXT, tc->getCpuPtr(), "T%d : syscall " FMT, \ + tc->threadId(), __VA_ARGS__) + /// /// System call descriptor. /// @@ -1100,7 +1109,7 @@ fstatFunc(SyscallDesc *desc, int callnum, LiveProcess *process, int tgt_fd = process->getSyscallArg(tc, index); Addr bufPtr = process->getSyscallArg(tc, index); - DPRINTF(SyscallVerbose, "fstat(%d, ...)\n", tgt_fd); + DPRINTF_SYSCALL(Verbose, "fstat(%d, ...)\n", tgt_fd); int sim_fd = process->getSimFD(tgt_fd); if (sim_fd < 0) -- 2.30.2