syscall: Implementation of the times system call

This commit is contained in:
Timothy M. Jones 2009-10-24 10:53:57 -07:00
parent 56154cff5e
commit 6c60db8ce9
2 changed files with 35 additions and 0 deletions

View file

@ -136,6 +136,17 @@ class Linux : public OperatingSystem
int64_t tv_usec; //!< microseconds
};
/// Clock ticks per second, for times().
static const int _SC_CLK_TCK = 100;
/// For times().
struct tms {
int64_t tms_utime; //!< user time
int64_t tms_stime; //!< system time
int64_t tms_cutime; //!< user time of children
int64_t tms_cstime; //!< system time of children
};
// For writev/readv
struct tgt_iovec {
uint64_t iov_base; // void *

View file

@ -1131,6 +1131,30 @@ getrusageFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
return 0;
}
/// Target times() function.
template <class OS>
SyscallReturn
timesFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
ThreadContext *tc)
{
TypedBufferArg<typename OS::tms> bufp(process->getSyscallArg(tc, 0));
// Fill in the time structure (in clocks)
int64_t clocks = curTick * OS::_SC_CLK_TCK / Clock::Int::s;
bufp->tms_utime = clocks;
bufp->tms_stime = 0;
bufp->tms_cutime = 0;
bufp->tms_cstime = 0;
// Convert to host endianness
bufp->tms_utime = htog(bufp->tms_utime);
// Write back
bufp.copyOut(tc->getMemPort());
// Return clock ticks since system boot
return clocks;
}