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.
This commit is contained in:
parent
c05fa16729
commit
75d6910607
3 changed files with 29 additions and 12 deletions
|
@ -91,6 +91,7 @@ DebugFlag('Interrupt')
|
||||||
DebugFlag('Loader')
|
DebugFlag('Loader')
|
||||||
DebugFlag('PseudoInst')
|
DebugFlag('PseudoInst')
|
||||||
DebugFlag('Stack')
|
DebugFlag('Stack')
|
||||||
|
DebugFlag('SyscallBase')
|
||||||
DebugFlag('SyscallVerbose')
|
DebugFlag('SyscallVerbose')
|
||||||
DebugFlag('TimeSync')
|
DebugFlag('TimeSync')
|
||||||
DebugFlag('Thread')
|
DebugFlag('Thread')
|
||||||
|
@ -100,3 +101,5 @@ DebugFlag('WorkItems')
|
||||||
DebugFlag('ClockDomain')
|
DebugFlag('ClockDomain')
|
||||||
DebugFlag('VoltageDomain')
|
DebugFlag('VoltageDomain')
|
||||||
DebugFlag('DVFS')
|
DebugFlag('DVFS')
|
||||||
|
|
||||||
|
CompoundFlag('SyscallAll', [ 'SyscallBase', 'SyscallVerbose'])
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include "config/the_isa.hh"
|
#include "config/the_isa.hh"
|
||||||
#include "cpu/base.hh"
|
#include "cpu/base.hh"
|
||||||
#include "cpu/thread_context.hh"
|
#include "cpu/thread_context.hh"
|
||||||
|
#include "debug/SyscallBase.hh"
|
||||||
#include "debug/SyscallVerbose.hh"
|
#include "debug/SyscallVerbose.hh"
|
||||||
#include "mem/page_table.hh"
|
#include "mem/page_table.hh"
|
||||||
#include "sim/process.hh"
|
#include "sim/process.hh"
|
||||||
|
@ -55,28 +56,31 @@ using namespace TheISA;
|
||||||
void
|
void
|
||||||
SyscallDesc::doSyscall(int callnum, LiveProcess *process, ThreadContext *tc)
|
SyscallDesc::doSyscall(int callnum, LiveProcess *process, ThreadContext *tc)
|
||||||
{
|
{
|
||||||
if (DTRACE(SyscallVerbose)) {
|
if (DTRACE(SyscallBase)) {
|
||||||
int index = 0;
|
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
|
// we can't just put the calls to getSyscallArg() in the
|
||||||
// DPRINTF arg list, because C++ doesn't guarantee their order
|
// 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);
|
arg[i] = process->getSyscallArg(tc, index);
|
||||||
|
|
||||||
DPRINTFNR("%d: %s: syscall %s called w/arguments %d,%d,%d,%d\n",
|
// Linux supports up to six system call arguments through registers
|
||||||
curTick(), tc->getCpuPtr()->name(), name,
|
// so we want to print all six. Check to the relevant man page to
|
||||||
arg[0], arg[1], arg[2], arg[3]);
|
// 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);
|
SyscallReturn retval = (*funcPtr)(this, callnum, process, tc);
|
||||||
|
|
||||||
if (retval.needsRetry()) {
|
if (retval.needsRetry()) {
|
||||||
DPRINTFS(SyscallVerbose, tc->getCpuPtr(), "syscall %s needs retry\n",
|
DPRINTF_SYSCALL(Base, "%s needs retry\n", name);
|
||||||
name);
|
|
||||||
} else {
|
} else {
|
||||||
DPRINTFS(SyscallVerbose, tc->getCpuPtr(), "syscall %s returns %d\n",
|
DPRINTF_SYSCALL(Base, "%s returns %d\n", name,
|
||||||
name, retval.encodedValue());
|
retval.encodedValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(flags & SyscallDesc::SuppressReturnValue) && !retval.needsRetry())
|
if (!(flags & SyscallDesc::SuppressReturnValue) && !retval.needsRetry())
|
||||||
|
@ -201,7 +205,8 @@ brkFunc(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc)
|
||||||
}
|
}
|
||||||
|
|
||||||
p->brk_point = new_brk;
|
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;
|
return p->brk_point;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,7 @@
|
||||||
#include "config/the_isa.hh"
|
#include "config/the_isa.hh"
|
||||||
#include "cpu/base.hh"
|
#include "cpu/base.hh"
|
||||||
#include "cpu/thread_context.hh"
|
#include "cpu/thread_context.hh"
|
||||||
|
#include "debug/SyscallBase.hh"
|
||||||
#include "debug/SyscallVerbose.hh"
|
#include "debug/SyscallVerbose.hh"
|
||||||
#include "mem/page_table.hh"
|
#include "mem/page_table.hh"
|
||||||
#include "sim/byteswap.hh"
|
#include "sim/byteswap.hh"
|
||||||
|
@ -83,6 +84,14 @@
|
||||||
#include "sim/syscallreturn.hh"
|
#include "sim/syscallreturn.hh"
|
||||||
#include "sim/system.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.
|
/// System call descriptor.
|
||||||
///
|
///
|
||||||
|
@ -1100,7 +1109,7 @@ fstatFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
|
||||||
int tgt_fd = process->getSyscallArg(tc, index);
|
int tgt_fd = process->getSyscallArg(tc, index);
|
||||||
Addr bufPtr = 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);
|
int sim_fd = process->getSimFD(tgt_fd);
|
||||||
if (sim_fd < 0)
|
if (sim_fd < 0)
|
||||||
|
|
Loading…
Reference in a new issue