Adding gem5 source to svn.
git-svn-id: https://www4.informatik.uni-erlangen.de/i4svn/danceos/trunk/devel/fail@1819 8c4709b5-6ec9-48aa-a5cd-a96041d1645a
This commit is contained in:
92
simulators/gem5/src/kern/linux/events.cc
Normal file
92
simulators/gem5/src/kern/linux/events.cc
Normal file
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* Copyright (c) 2011 ARM Limited
|
||||
* All rights reserved
|
||||
*
|
||||
* The license below extends only to copyright in the software and shall
|
||||
* not be construed as granting a license to any other intellectual
|
||||
* property including but not limited to intellectual property relating
|
||||
* to a hardware implementation of the functionality of the software
|
||||
* licensed hereunder. You may use the software subject to the license
|
||||
* terms below provided that you ensure that this notice is replicated
|
||||
* unmodified and in its entirety in all distributions of the software,
|
||||
* modified or unmodified, in source code or in binary form.
|
||||
*
|
||||
* Copyright (c) 2004-2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Nathan Binkert
|
||||
* Ali Saidi
|
||||
*/
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include "arch/utility.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "debug/DebugPrintf.hh"
|
||||
#include "kern/linux/events.hh"
|
||||
#include "kern/linux/printk.hh"
|
||||
#include "kern/system_events.hh"
|
||||
#include "sim/arguments.hh"
|
||||
#include "sim/pseudo_inst.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
namespace Linux {
|
||||
|
||||
void
|
||||
DebugPrintkEvent::process(ThreadContext *tc)
|
||||
{
|
||||
if (DTRACE(DebugPrintf)) {
|
||||
std::stringstream ss;
|
||||
Arguments args(tc);
|
||||
Printk(ss, args);
|
||||
StringWrap name(tc->getSystemPtr()->name() + ".dprintk");
|
||||
DPRINTFN("%s", ss.str());
|
||||
}
|
||||
SkipFuncEvent::process(tc);
|
||||
}
|
||||
|
||||
void
|
||||
UDelayEvent::process(ThreadContext *tc)
|
||||
{
|
||||
int arg_num = 0;
|
||||
|
||||
// Get the time in native size
|
||||
uint64_t time = TheISA::getArgument(tc, arg_num, (uint16_t)-1, false);
|
||||
|
||||
// convert parameter to ns
|
||||
if (argDivToNs)
|
||||
time /= argDivToNs;
|
||||
|
||||
time *= argMultToNs;
|
||||
|
||||
SkipFuncEvent::process(tc);
|
||||
|
||||
PseudoInst::quiesceNs(tc, time);
|
||||
}
|
||||
|
||||
|
||||
} // namespace linux
|
||||
76
simulators/gem5/src/kern/linux/events.hh
Normal file
76
simulators/gem5/src/kern/linux/events.hh
Normal file
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2006 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Nathan Binkert
|
||||
* Ali Saidi
|
||||
*/
|
||||
|
||||
#ifndef __KERN_LINUX_EVENTS_HH__
|
||||
#define __KERN_LINUX_EVENTS_HH__
|
||||
|
||||
#include "kern/system_events.hh"
|
||||
|
||||
namespace Linux {
|
||||
|
||||
class DebugPrintkEvent : public SkipFuncEvent
|
||||
{
|
||||
public:
|
||||
DebugPrintkEvent(PCEventQueue *q, const std::string &desc, Addr addr)
|
||||
: SkipFuncEvent(q, desc, addr) {}
|
||||
virtual void process(ThreadContext *xc);
|
||||
};
|
||||
|
||||
/** A class to skip udelay() and related calls in the kernel.
|
||||
* This class has two additional parameters that take the argument to udelay and
|
||||
* manipulated it to come up with ns and eventually ticks to quiesce for.
|
||||
* See descriptions of argDivToNs and argMultToNs below.
|
||||
*/
|
||||
class UDelayEvent : public SkipFuncEvent
|
||||
{
|
||||
private:
|
||||
/** value to divide arg by to create ns. This is present beacues the linux
|
||||
* kernel code sometime precomputes the first multiply that is done in
|
||||
* udelay() if the parameter is a constant. We need to undo it so here is
|
||||
* how. */
|
||||
uint64_t argDivToNs;
|
||||
|
||||
/** value to multiple arg by to create ns. Nominally, this is 1000 to
|
||||
* convert us to ns, but since linux can do some preprocessing of constant
|
||||
* values something else might be required. */
|
||||
uint64_t argMultToNs;
|
||||
|
||||
public:
|
||||
UDelayEvent(PCEventQueue *q, const std::string &desc, Addr addr,
|
||||
uint64_t mult, uint64_t div)
|
||||
: SkipFuncEvent(q, desc, addr), argDivToNs(div), argMultToNs(mult) {}
|
||||
virtual void process(ThreadContext *xc);
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
67
simulators/gem5/src/kern/linux/linux.cc
Normal file
67
simulators/gem5/src/kern/linux/linux.cc
Normal file
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (c) 2009 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Ali Saidi
|
||||
*/
|
||||
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "debug/SyscallVerbose.hh"
|
||||
#include "kern/linux/linux.hh"
|
||||
#include "sim/process.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
int
|
||||
Linux::openSpecialFile(std::string path, LiveProcess *process, ThreadContext *tc)
|
||||
{
|
||||
DPRINTF(SyscallVerbose, "Opening special file: %s\n", path.c_str());
|
||||
if (path.compare(0, 13, "/proc/meminfo") == 0) {
|
||||
std::string data = Linux::procMeminfo(process, tc);
|
||||
FILE *f = tmpfile();
|
||||
int fd = fileno(f);
|
||||
size_t ret M5_VAR_USED = fwrite(data.c_str(), 1, data.size(), f);
|
||||
assert(ret == data.size());
|
||||
rewind(f);
|
||||
return fd;
|
||||
}
|
||||
|
||||
warn("Attempting to open special file: %s. Ignorning. Simulation may"
|
||||
" take un-expected code path or be non-deterministic until proper"
|
||||
" handling is implemented.\n", path.c_str());
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::string
|
||||
Linux::procMeminfo(LiveProcess *process, ThreadContext *tc)
|
||||
{
|
||||
return csprintf("MemTotal:%12d kB\nMemFree: %12d kB\n",
|
||||
process->system->memSize() >> 10,
|
||||
process->system->freeMemSize() >> 10);
|
||||
}
|
||||
|
||||
176
simulators/gem5/src/kern/linux/linux.hh
Normal file
176
simulators/gem5/src/kern/linux/linux.hh
Normal file
@ -0,0 +1,176 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2009 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Ali Saidi
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_HH__
|
||||
#define __LINUX_HH__
|
||||
|
||||
#include "base/types.hh"
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "kern/operatingsystem.hh"
|
||||
|
||||
class ThreadContext;
|
||||
class LiveProcess;
|
||||
|
||||
///
|
||||
/// This class encapsulates the types, structures, constants,
|
||||
/// functions, and syscall-number mappings specific to the Alpha Linux
|
||||
/// syscall interface.
|
||||
///
|
||||
class Linux : public OperatingSystem
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
//@{
|
||||
/// Basic Linux types.
|
||||
typedef uint64_t size_t;
|
||||
typedef uint64_t off_t;
|
||||
typedef int64_t time_t;
|
||||
typedef int64_t clock_t;
|
||||
typedef uint32_t uid_t;
|
||||
typedef uint32_t gid_t;
|
||||
//@}
|
||||
|
||||
/// Stat buffer. Note that we can't call it 'stat' since that
|
||||
/// gets #defined to something else on some systems. This type
|
||||
/// can be specialized by architecture specific "Linux" classes
|
||||
typedef struct {
|
||||
uint32_t st_dev; //!< device
|
||||
uint32_t st_ino; //!< inode
|
||||
uint32_t st_mode; //!< mode
|
||||
uint32_t st_nlink; //!< link count
|
||||
uint32_t st_uid; //!< owner's user ID
|
||||
uint32_t st_gid; //!< owner's group ID
|
||||
uint32_t st_rdev; //!< device number
|
||||
int32_t _pad1; //!< for alignment
|
||||
int64_t st_size; //!< file size in bytes
|
||||
uint64_t st_atimeX; //!< time of last access
|
||||
uint64_t st_mtimeX; //!< time of last modification
|
||||
uint64_t st_ctimeX; //!< time of last status change
|
||||
uint32_t st_blksize; //!< optimal I/O block size
|
||||
int32_t st_blocks; //!< number of blocks allocated
|
||||
uint32_t st_flags; //!< flags
|
||||
uint32_t st_gen; //!< unknown
|
||||
} tgt_stat;
|
||||
|
||||
// same for stat64
|
||||
typedef struct {
|
||||
uint64_t st_dev;
|
||||
uint64_t st_ino;
|
||||
uint64_t st_rdev;
|
||||
int64_t st_size;
|
||||
uint64_t st_blocks;
|
||||
|
||||
uint32_t st_mode;
|
||||
uint32_t st_uid;
|
||||
uint32_t st_gid;
|
||||
uint32_t st_blksize;
|
||||
uint32_t st_nlink;
|
||||
uint32_t __pad0;
|
||||
|
||||
uint64_t st_atimeX;
|
||||
uint64_t st_atime_nsec;
|
||||
uint64_t st_mtimeX;
|
||||
uint64_t st_mtime_nsec;
|
||||
uint64_t st_ctimeX;
|
||||
uint64_t st_ctime_nsec;
|
||||
int64_t ___unused[3];
|
||||
} tgt_stat64;
|
||||
|
||||
/// Length of strings in struct utsname (plus 1 for null char).
|
||||
static const int _SYS_NMLN = 65;
|
||||
|
||||
/// Interface struct for uname().
|
||||
struct utsname {
|
||||
char sysname[_SYS_NMLN]; //!< System name.
|
||||
char nodename[_SYS_NMLN]; //!< Node name.
|
||||
char release[_SYS_NMLN]; //!< OS release.
|
||||
char version[_SYS_NMLN]; //!< OS version.
|
||||
char machine[_SYS_NMLN]; //!< Machine type.
|
||||
};
|
||||
|
||||
/// Limit struct for getrlimit/setrlimit.
|
||||
struct rlimit {
|
||||
uint64_t rlim_cur; //!< soft limit
|
||||
uint64_t rlim_max; //!< hard limit
|
||||
};
|
||||
|
||||
/// For gettimeofday().
|
||||
struct timeval {
|
||||
int64_t tv_sec; //!< seconds
|
||||
int64_t tv_usec; //!< microseconds
|
||||
};
|
||||
|
||||
/// Clock ticks per second, for times().
|
||||
static const int M5_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 *
|
||||
uint64_t iov_len;
|
||||
};
|
||||
|
||||
|
||||
/// For getrusage().
|
||||
struct rusage {
|
||||
struct timeval ru_utime; //!< user time used
|
||||
struct timeval ru_stime; //!< system time used
|
||||
int64_t ru_maxrss; //!< max rss
|
||||
int64_t ru_ixrss; //!< integral shared memory size
|
||||
int64_t ru_idrss; //!< integral unshared data "
|
||||
int64_t ru_isrss; //!< integral unshared stack "
|
||||
int64_t ru_minflt; //!< page reclaims - total vmfaults
|
||||
int64_t ru_majflt; //!< page faults
|
||||
int64_t ru_nswap; //!< swaps
|
||||
int64_t ru_inblock; //!< block input operations
|
||||
int64_t ru_oublock; //!< block output operations
|
||||
int64_t ru_msgsnd; //!< messages sent
|
||||
int64_t ru_msgrcv; //!< messages received
|
||||
int64_t ru_nsignals; //!< signals received
|
||||
int64_t ru_nvcsw; //!< voluntary context switches
|
||||
int64_t ru_nivcsw; //!< involuntary "
|
||||
};
|
||||
|
||||
static int openSpecialFile(std::string path, LiveProcess *process, ThreadContext *tc);
|
||||
static std::string procMeminfo(LiveProcess *process, ThreadContext *tc);
|
||||
|
||||
}; // class Linux
|
||||
|
||||
#endif // __LINUX_HH__
|
||||
376
simulators/gem5/src/kern/linux/linux_syscalls.cc
Normal file
376
simulators/gem5/src/kern/linux/linux_syscalls.cc
Normal file
@ -0,0 +1,376 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Ali Saidi
|
||||
*/
|
||||
|
||||
#include "kern/linux/linux_syscalls.hh"
|
||||
|
||||
namespace {
|
||||
const char *
|
||||
standard_strings[SystemCalls<Linux>::Number] = {
|
||||
|
||||
|
||||
"llseek", //0
|
||||
"newselect", //1
|
||||
"sysctl", //2
|
||||
"access", //3
|
||||
"acct", //4
|
||||
"adjtimex", //5
|
||||
"afs_syscall", //6
|
||||
"alarm", //7
|
||||
"bdflush", //8
|
||||
"break", //9
|
||||
|
||||
|
||||
"brk", //10
|
||||
"capget", //11
|
||||
"capset", //12
|
||||
"chdir", //13
|
||||
"chmod", //14
|
||||
"chown", //15
|
||||
"chown32", //16
|
||||
"chroot", //17
|
||||
"clock_getres", //18
|
||||
"clock_gettime", //19
|
||||
|
||||
|
||||
"clock_nanosleep", //20
|
||||
"clock_settime", //21
|
||||
"clone", //22
|
||||
"close", //23
|
||||
"creat", //24
|
||||
"create_module", //25
|
||||
"delete_module", //26
|
||||
"dup", //27
|
||||
"dup2", //28
|
||||
"epoll_create", //29
|
||||
|
||||
|
||||
"epoll_ctl", //30
|
||||
"epoll_wait", //31
|
||||
"execve", //32
|
||||
"exit", //33
|
||||
"exit_group", //34
|
||||
"fadvise64", //35
|
||||
"fadvise64_64", //36
|
||||
"fchdir", //37
|
||||
"fchmod", //38
|
||||
"fchown", //39
|
||||
|
||||
|
||||
"fchown32", //40
|
||||
"fcntl", //41
|
||||
"fcntl64", //42
|
||||
"fdatasync", //43
|
||||
"fgetxattr", //44
|
||||
"flistxattr", //45
|
||||
"flock", //46
|
||||
"fork", //47
|
||||
"fremovexattr", //48
|
||||
"fsetxattr", //49
|
||||
|
||||
|
||||
"fstat", //50
|
||||
"fstat64", //51
|
||||
"fstatfs", //52
|
||||
"fstatfs64", //53
|
||||
"fsync", //54
|
||||
"ftime", //55
|
||||
"ftruncate", //56
|
||||
"ftruncate64", //57
|
||||
"futex", //58
|
||||
"get_kernel_syms", //59
|
||||
|
||||
|
||||
"get_thread_area", //60
|
||||
"getcwd", //61
|
||||
"getdents", //62
|
||||
"getdents64", //63
|
||||
"getegid", //64
|
||||
"getegid32", //65
|
||||
"geteuid", //66
|
||||
"geteuid32", //67
|
||||
"getgid", //68
|
||||
"getgid32", //69
|
||||
|
||||
|
||||
"getgroups", //70
|
||||
"getgroups32", //71
|
||||
"getitimer", //72
|
||||
"getpgid", //73
|
||||
"getpgrp", //74
|
||||
"getpid", //75
|
||||
"getpmsg", //76
|
||||
"getppid", //77
|
||||
"getpriority", //78
|
||||
"getresgid", //79
|
||||
|
||||
|
||||
"getresgid32", //80
|
||||
"getresuid", //81
|
||||
"getresuid32", //82
|
||||
"getrlimit", //83
|
||||
"getrusage", //84
|
||||
"getsid", //85
|
||||
"gettid", //86
|
||||
"gettimeofday", //87
|
||||
"getuid", //88
|
||||
"getuid32", //89
|
||||
|
||||
|
||||
"getxattr", //90
|
||||
"gtty", //91
|
||||
"idle", //92
|
||||
"init_module", //93
|
||||
"io_cancel", //94
|
||||
"io_destroy", //95
|
||||
"io_getevents", //96
|
||||
"io_setup", //97
|
||||
"io_submit", //98
|
||||
"ioctl", //99
|
||||
|
||||
|
||||
"ioperm", //100
|
||||
"iopl", //101
|
||||
"ipc", //102
|
||||
"kill", //103
|
||||
"lchown", //104
|
||||
"lchown32", //105
|
||||
"lgetxattr", //106
|
||||
"link", //107
|
||||
"listxattr", //108
|
||||
"llistxattr", //109
|
||||
|
||||
|
||||
"lock", //110
|
||||
"lookup_dcookie", //111
|
||||
"lremovexattr", //112
|
||||
"lseek", //113
|
||||
"lsetxattr", //114
|
||||
"lstat", //115
|
||||
"lstat64", //116
|
||||
"madvise", //117
|
||||
"madvise1", //118
|
||||
"mincore", //119
|
||||
|
||||
|
||||
"mkdir", //120
|
||||
"mknod", //121
|
||||
"mlock", //122
|
||||
"mlockall", //123
|
||||
"mmap", //124
|
||||
"mmap2", //125
|
||||
"modify_ldt", //126
|
||||
"mount", //127
|
||||
"mprotect", //128
|
||||
"mpx", //129
|
||||
|
||||
|
||||
"mremap", //130
|
||||
"msync", //131
|
||||
"munlock", //132
|
||||
"munlockall", //133
|
||||
"munmap", //134
|
||||
"nanosleep", //135
|
||||
"nfsservctl", //136
|
||||
"nice", //137
|
||||
"oldfstat", //138
|
||||
"oldlstat", //139
|
||||
|
||||
|
||||
"oldolduname", //140
|
||||
"oldstat", //141
|
||||
"olduname", //142
|
||||
"open", //143
|
||||
"pause", //144
|
||||
"personality", //145
|
||||
"pipe", //146
|
||||
"pivot_root", //147
|
||||
"poll", //148
|
||||
"prctl", //149
|
||||
|
||||
|
||||
"pread64", //150
|
||||
"prof", //151
|
||||
"profil", //152
|
||||
"ptrace", //153
|
||||
"putpmsg", //154
|
||||
"pwrite64", //155
|
||||
"query_module", //156
|
||||
"quotactl", //157
|
||||
"read", //158
|
||||
"readahead", //159
|
||||
|
||||
|
||||
"readdir", //160
|
||||
"readlink", //161
|
||||
"readv", //162
|
||||
"reboot", //163
|
||||
"remap_file_pages", //164
|
||||
"removexattr", //165
|
||||
"rename", //166
|
||||
"restart_syscall", //167
|
||||
"rmdir", //168
|
||||
"rt_sigaction", //169
|
||||
|
||||
|
||||
"rt_sigpending", //170
|
||||
"rt_sigprocmask", //171
|
||||
"rt_sigqueueinfo", //172
|
||||
"rt_sigreturn", //173
|
||||
"rt_sigsuspend", //174
|
||||
"rt_sigtimedwait", //175
|
||||
"sched_get_priority_max", //176
|
||||
"sched_get_priority_min", //177
|
||||
"sched_getaffinity", //178
|
||||
"sched_getparam", //179
|
||||
|
||||
|
||||
"sched_getscheduler", //180
|
||||
"sched_rr_get_interval", //181
|
||||
"sched_setaffinity", //182
|
||||
"sched_setparam", //183
|
||||
"sched_setscheduler", //184
|
||||
"sched_yield", //185
|
||||
"select", //186
|
||||
"sendfile", //187
|
||||
"sendfile64", //188
|
||||
"set_thread_area", //189
|
||||
|
||||
|
||||
"set_tid_address", //190
|
||||
"setdomainname", //191
|
||||
"setfsgid", //192
|
||||
"setfsgid32", //193
|
||||
"setfsuid", //194
|
||||
"setfsuid32", //195
|
||||
"setgid", //196
|
||||
"setgid32", //197
|
||||
"setgroups", //198
|
||||
"setgroups32", //199
|
||||
|
||||
|
||||
"sethostname", //200
|
||||
"setitimer", //201
|
||||
"setpgid", //202
|
||||
"setpriority", //203
|
||||
"setregid", //204
|
||||
"setregid32", //205
|
||||
"setresgid", //206
|
||||
"setresgid32", //207
|
||||
"setresuid", //208
|
||||
"setresuid32", //209
|
||||
|
||||
|
||||
"setreuid", //210
|
||||
"setreuid32", //211
|
||||
"setrlimit", //212
|
||||
"setsid", //213
|
||||
"settimeofday", //214
|
||||
"setuid", //215
|
||||
"setuid32", //216
|
||||
"setxattr", //217
|
||||
"sgetmask", //218
|
||||
"sigaction", //219
|
||||
|
||||
|
||||
"sigaltstack", //220
|
||||
"signal", //221
|
||||
"sigpending", //222
|
||||
"sigprocmask", //223
|
||||
"sigreturn", //224
|
||||
"sigsuspend", //225
|
||||
"socketcall", //226
|
||||
"ssetmask", //227
|
||||
"stat", //228
|
||||
"stat64", //229
|
||||
|
||||
|
||||
"statfs", //230
|
||||
"statfs64", //231
|
||||
"stime", //232
|
||||
"stty", //233
|
||||
"swapoff", //234
|
||||
"swapon", //235
|
||||
"symlink", //236
|
||||
"sync", //237
|
||||
"sysfs", //238
|
||||
"sysinfo", //239
|
||||
|
||||
|
||||
"syslog", //240
|
||||
"tgkill", //241
|
||||
"time", //242
|
||||
"timer_create", //243
|
||||
"timer_delete", //244
|
||||
"timer_getoverrun", //245
|
||||
"timer_gettime", //246
|
||||
"timer_settime", //247
|
||||
"times", //248
|
||||
"tkill", //249
|
||||
|
||||
|
||||
"truncate", //250
|
||||
"truncate64", //251
|
||||
"ugetrlimit", //252
|
||||
"ulimit", //253
|
||||
"umask", //254
|
||||
"umount", //255
|
||||
"umount2", //256
|
||||
"uname", //257
|
||||
"unlink", //258
|
||||
"uselib", //259
|
||||
|
||||
|
||||
"ustat", //260
|
||||
"utime", //261
|
||||
"utimes", //262
|
||||
"vfork", //263
|
||||
"vhangup", //264
|
||||
"vm86", //265
|
||||
"vm86old", //266
|
||||
"vserver", //267
|
||||
"wait4", //268
|
||||
"waitpid", //269
|
||||
|
||||
|
||||
"write", //270
|
||||
"writev", //271
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
const char *
|
||||
SystemCalls<Linux>::name(int num)
|
||||
{
|
||||
if ((num >= 0) && (num < Number))
|
||||
return standard_strings[num];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
328
simulators/gem5/src/kern/linux/linux_syscalls.hh
Normal file
328
simulators/gem5/src/kern/linux/linux_syscalls.hh
Normal file
@ -0,0 +1,328 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Ali Saidi
|
||||
*/
|
||||
|
||||
#ifndef __KERN_LINUX_LINUX_SYSCALLS_HH__
|
||||
#define __KERN_LINUX_LINUX_SYSCALLS_HH__
|
||||
|
||||
#include "kern/linux/linux.hh"
|
||||
|
||||
template <class OS>
|
||||
class SystemCalls;
|
||||
|
||||
template <>
|
||||
class SystemCalls<Linux>
|
||||
{
|
||||
public:
|
||||
enum {
|
||||
syscall = 0,
|
||||
llseek = 1,
|
||||
newselect = 2,
|
||||
sysctl = 3,
|
||||
access = 4,
|
||||
acct = 5,
|
||||
adjtimex = 6,
|
||||
afs_syscall = 7,
|
||||
alarm = 8,
|
||||
bdflush = 9,
|
||||
_break = 10, /*renamed from break*/
|
||||
brk = 11,
|
||||
capget = 12,
|
||||
capset = 13,
|
||||
chdir = 14,
|
||||
chmod = 15,
|
||||
chown = 16,
|
||||
chown32 = 17,
|
||||
chroot = 18,
|
||||
clock_getres = 19,
|
||||
clock_gettime = 20,
|
||||
clock_nanosleep = 21,
|
||||
clock_settime = 22,
|
||||
clone = 23,
|
||||
close = 24,
|
||||
creat = 25,
|
||||
create_module = 26,
|
||||
delete_module = 27,
|
||||
dup = 28,
|
||||
dup2 = 29,
|
||||
epoll_create = 30,
|
||||
epoll_ctl = 31,
|
||||
epoll_wait = 32,
|
||||
execve = 33,
|
||||
exit = 34,
|
||||
exit_group = 35,
|
||||
fadvise64 = 36,
|
||||
fadvise64_64 = 37,
|
||||
fchdir = 38,
|
||||
fchmod = 39,
|
||||
fchown = 40,
|
||||
fchown32 = 41,
|
||||
fcntl = 42,
|
||||
fcntl64 = 43,
|
||||
fdatasync = 44,
|
||||
fgetxattr = 45,
|
||||
flistxattr = 46,
|
||||
flock = 47,
|
||||
fork = 48,
|
||||
fremovexattr = 49,
|
||||
fsetxattr = 50,
|
||||
fstat = 51,
|
||||
fstat64 = 52,
|
||||
fstatfs = 53,
|
||||
fstatfs64 = 54,
|
||||
fsync = 55,
|
||||
ftime = 56,
|
||||
ftruncate = 57,
|
||||
ftruncate64 = 58,
|
||||
futex = 59,
|
||||
get_kernel_syms = 60,
|
||||
get_thread_area = 61,
|
||||
getcwd = 62,
|
||||
getdents = 63,
|
||||
getdents64 = 64,
|
||||
getegid = 65,
|
||||
getegid32 = 66,
|
||||
geteuid = 67,
|
||||
geteuid32 = 68,
|
||||
getgid = 69,
|
||||
getgid32 = 70,
|
||||
getgroups = 71,
|
||||
getgroups32 = 72,
|
||||
getitimer = 73,
|
||||
getpgid = 74,
|
||||
getpgrp = 75,
|
||||
getpid = 76,
|
||||
getpmsg = 77,
|
||||
getppid = 78,
|
||||
getpriority = 79,
|
||||
getresgid = 80,
|
||||
getresgid32 = 81,
|
||||
getresuid = 82,
|
||||
getresuid32 = 83,
|
||||
getrlimit = 84,
|
||||
getrusage = 85,
|
||||
getsid = 86,
|
||||
gettid = 87,
|
||||
gettimeofday = 88,
|
||||
getuid = 89,
|
||||
getuid32 = 90,
|
||||
getxattr = 91,
|
||||
gtty = 92,
|
||||
idle = 93,
|
||||
init_module = 94,
|
||||
io_cancel = 95,
|
||||
io_destroy = 96,
|
||||
io_getevents = 97,
|
||||
io_setup = 98,
|
||||
io_submit = 99,
|
||||
ioctl = 100,
|
||||
ioperm = 101,
|
||||
iopl = 102,
|
||||
ipc = 103,
|
||||
kill = 104,
|
||||
lchown = 105,
|
||||
lchown32 = 106,
|
||||
lgetxattr = 107,
|
||||
link = 108,
|
||||
listxattr = 109,
|
||||
llistxattr = 110,
|
||||
lock = 111,
|
||||
lookup_dcookie = 112,
|
||||
lremovexattr = 113,
|
||||
lseek = 114,
|
||||
lsetxattr = 115,
|
||||
lstat = 116,
|
||||
lstat64 = 117,
|
||||
madvise = 118,
|
||||
madvise1 = 119,
|
||||
mincore = 120,
|
||||
mkdir = 121,
|
||||
mknod = 122,
|
||||
mlock = 123,
|
||||
mlockall = 124,
|
||||
mmap = 125,
|
||||
mmap2 = 126,
|
||||
modify_ldt = 127,
|
||||
mount = 128,
|
||||
mprotect = 129,
|
||||
mpx = 130,
|
||||
mremap = 131,
|
||||
msync = 132,
|
||||
munlock = 133,
|
||||
munlockall = 134,
|
||||
munmap = 135,
|
||||
nanosleep = 136,
|
||||
nfsservctl = 137,
|
||||
nice = 138,
|
||||
oldfstat = 139,
|
||||
oldlstat = 140,
|
||||
oldolduname = 141,
|
||||
oldstat = 142,
|
||||
olduname = 143,
|
||||
open = 144,
|
||||
pause = 145,
|
||||
personality = 146,
|
||||
pipe = 147,
|
||||
pivot_root = 148,
|
||||
poll = 149,
|
||||
prctl = 150,
|
||||
pread64 = 151,
|
||||
prof = 152,
|
||||
profil = 153,
|
||||
ptrace = 154,
|
||||
putpmsg = 155,
|
||||
pwrite64 = 156,
|
||||
query_module = 157,
|
||||
quotactl = 158,
|
||||
read = 159,
|
||||
readahead = 160,
|
||||
readdir = 161,
|
||||
readlink = 162,
|
||||
readv = 163,
|
||||
reboot = 164,
|
||||
remap_file_pages = 165,
|
||||
removexattr = 166,
|
||||
rename = 167,
|
||||
restart_syscall = 168,
|
||||
rmdir = 169,
|
||||
rt_sigaction = 170,
|
||||
rt_sigpending = 171,
|
||||
rt_sigprocmask = 172,
|
||||
rt_sigqueueinfo = 173,
|
||||
rt_sigreturn = 174,
|
||||
rt_sigsuspend = 175,
|
||||
rt_sigtimedwait = 176,
|
||||
sched_get_priority_max = 177,
|
||||
sched_get_priority_min = 178,
|
||||
sched_getaffinity = 179,
|
||||
sched_getparam = 180,
|
||||
sched_getscheduler = 181,
|
||||
sched_rr_get_interval = 182,
|
||||
sched_setaffinity = 183,
|
||||
sched_setparam = 184,
|
||||
sched_setscheduler = 185,
|
||||
sched_yield = 186,
|
||||
select = 187,
|
||||
sendfile = 188,
|
||||
sendfile64 = 189,
|
||||
set_thread_area = 190,
|
||||
set_tid_address = 191,
|
||||
setdomainname = 192,
|
||||
setfsgid = 193,
|
||||
setfsgid32 = 194,
|
||||
setfsuid = 195,
|
||||
setfsuid32 = 196,
|
||||
setgid = 197,
|
||||
setgid32 = 198,
|
||||
setgroups = 199,
|
||||
setgroups32 = 200,
|
||||
sethostname = 201,
|
||||
setitimer = 202,
|
||||
setpgid = 203,
|
||||
setpriority = 204,
|
||||
setregid = 205,
|
||||
setregid32 = 206,
|
||||
setresgid = 207,
|
||||
setresgid32 = 208,
|
||||
setresuid = 209,
|
||||
setresuid32 = 210,
|
||||
setreuid = 211,
|
||||
setreuid32 = 212,
|
||||
setrlimit = 213,
|
||||
setsid = 214,
|
||||
settimeofday = 215,
|
||||
setuid = 216,
|
||||
setuid32 = 217,
|
||||
setxattr = 218,
|
||||
sgetmask = 219,
|
||||
sigaction = 220,
|
||||
sigaltstack = 221,
|
||||
signal = 222,
|
||||
sigpending = 223,
|
||||
sigprocmask = 224,
|
||||
sigreturn = 225,
|
||||
sigsuspend = 226,
|
||||
socketcall = 227,
|
||||
ssetmask = 228,
|
||||
stat = 229,
|
||||
stat64 = 230,
|
||||
statfs = 231,
|
||||
statfs64 = 232,
|
||||
stime = 233,
|
||||
stty = 234,
|
||||
swapoff = 235,
|
||||
swapon = 236,
|
||||
symlink = 237,
|
||||
sync = 238,
|
||||
sysfs = 239,
|
||||
sysinfo = 240,
|
||||
syslog = 241,
|
||||
tgkill = 242,
|
||||
time = 243,
|
||||
timer_create = 244,
|
||||
timer_delete = 245,
|
||||
timer_getoverrun = 246,
|
||||
timer_gettime = 247,
|
||||
timer_settime = 248,
|
||||
times = 249,
|
||||
tkill = 250,
|
||||
truncate = 251,
|
||||
truncate64 = 252,
|
||||
ugetrlimit = 253,
|
||||
ulimit = 254,
|
||||
umask = 255,
|
||||
umount = 256,
|
||||
umount2 = 257,
|
||||
uname = 258,
|
||||
unlink = 259,
|
||||
uselib = 260,
|
||||
ustat = 261,
|
||||
utime = 262,
|
||||
utimes = 263,
|
||||
vfork = 264,
|
||||
vhangup = 265,
|
||||
vm86 = 266,
|
||||
vm86old = 267,
|
||||
vserver = 268,
|
||||
wait4 = 269,
|
||||
waitpid = 270,
|
||||
write = 271,
|
||||
writev = 272,
|
||||
Number
|
||||
};
|
||||
|
||||
static const char *name(int num);
|
||||
|
||||
static bool validSyscallNumber(int num) {
|
||||
return num < Number;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
#endif // __KERN_LINUX_LINUX_SYSCALLS_HH__
|
||||
259
simulators/gem5/src/kern/linux/printk.cc
Normal file
259
simulators/gem5/src/kern/linux/printk.cc
Normal file
@ -0,0 +1,259 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Nathan Binkert
|
||||
* Ali Saidi
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "base/trace.hh"
|
||||
#include "kern/linux/printk.hh"
|
||||
#include "sim/arguments.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
void
|
||||
Printk(stringstream &out, Arguments args)
|
||||
{
|
||||
char *p = (char *)args++;
|
||||
|
||||
while (*p) {
|
||||
switch (*p) {
|
||||
case '%': {
|
||||
bool more = true;
|
||||
bool islong = false;
|
||||
bool leftjustify = false;
|
||||
bool format = false;
|
||||
bool zero = false;
|
||||
int width = 0;
|
||||
while (more && *++p) {
|
||||
switch (*p) {
|
||||
case 'l':
|
||||
case 'L':
|
||||
islong = true;
|
||||
break;
|
||||
case '-':
|
||||
leftjustify = true;
|
||||
break;
|
||||
case '#':
|
||||
format = true;
|
||||
break;
|
||||
case '0':
|
||||
if (width)
|
||||
width *= 10;
|
||||
else
|
||||
zero = true;
|
||||
break;
|
||||
default:
|
||||
if (*p >= '1' && *p <= '9')
|
||||
width = 10 * width + *p - '0';
|
||||
else
|
||||
more = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool hexnum = false;
|
||||
bool octal = false;
|
||||
bool sign = false;
|
||||
switch (*p) {
|
||||
case 'X':
|
||||
case 'x':
|
||||
hexnum = true;
|
||||
break;
|
||||
case 'O':
|
||||
case 'o':
|
||||
octal = true;
|
||||
break;
|
||||
case 'D':
|
||||
case 'd':
|
||||
sign = true;
|
||||
break;
|
||||
case 'P':
|
||||
format = true;
|
||||
case 'p':
|
||||
hexnum = true;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (*p) {
|
||||
case 'D':
|
||||
case 'd':
|
||||
case 'U':
|
||||
case 'u':
|
||||
case 'X':
|
||||
case 'x':
|
||||
case 'O':
|
||||
case 'o':
|
||||
case 'P':
|
||||
case 'p': {
|
||||
if (hexnum)
|
||||
out << hex;
|
||||
|
||||
if (octal)
|
||||
out << oct;
|
||||
|
||||
if (format) {
|
||||
if (!zero)
|
||||
out.setf(ios::showbase);
|
||||
else {
|
||||
if (hexnum) {
|
||||
out << "0x";
|
||||
width -= 2;
|
||||
} else if (octal) {
|
||||
out << "0";
|
||||
width -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (zero)
|
||||
out.fill('0');
|
||||
|
||||
if (width > 0)
|
||||
out.width(width);
|
||||
|
||||
if (leftjustify && !zero)
|
||||
out.setf(ios::left);
|
||||
|
||||
if (sign) {
|
||||
if (islong)
|
||||
out << (int64_t)args;
|
||||
else
|
||||
out << (int32_t)args;
|
||||
} else {
|
||||
if (islong)
|
||||
out << (uint64_t)args;
|
||||
else
|
||||
out << (uint32_t)args;
|
||||
}
|
||||
|
||||
if (zero)
|
||||
out.fill(' ');
|
||||
|
||||
if (width > 0)
|
||||
out.width(0);
|
||||
|
||||
out << dec;
|
||||
|
||||
++args;
|
||||
}
|
||||
break;
|
||||
|
||||
case 's': {
|
||||
const char *s = (char *)args;
|
||||
if (!s)
|
||||
s = "<NULL>";
|
||||
|
||||
if (width > 0)
|
||||
out.width(width);
|
||||
if (leftjustify)
|
||||
out.setf(ios::left);
|
||||
|
||||
out << s;
|
||||
++args;
|
||||
}
|
||||
break;
|
||||
case 'C':
|
||||
case 'c': {
|
||||
uint64_t mask = (*p == 'C') ? 0xffL : 0x7fL;
|
||||
uint64_t num;
|
||||
int width;
|
||||
|
||||
if (islong) {
|
||||
num = (uint64_t)args;
|
||||
width = sizeof(uint64_t);
|
||||
} else {
|
||||
num = (uint32_t)args;
|
||||
width = sizeof(uint32_t);
|
||||
}
|
||||
|
||||
while (width-- > 0) {
|
||||
char c = (char)(num & mask);
|
||||
if (c)
|
||||
out << c;
|
||||
num >>= 8;
|
||||
}
|
||||
|
||||
++args;
|
||||
}
|
||||
break;
|
||||
case 'b': {
|
||||
uint64_t n = (uint64_t)args++;
|
||||
char *s = (char *)args++;
|
||||
out << s << ": " << n;
|
||||
}
|
||||
break;
|
||||
case 'n':
|
||||
case 'N': {
|
||||
args += 2;
|
||||
#if 0
|
||||
uint64_t n = (uint64_t)args++;
|
||||
struct reg_values *rv = (struct reg_values *)args++;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case 'r':
|
||||
case 'R': {
|
||||
args += 2;
|
||||
#if 0
|
||||
uint64_t n = (uint64_t)args++;
|
||||
struct reg_desc *rd = (struct reg_desc *)args++;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case '%':
|
||||
out << '%';
|
||||
break;
|
||||
}
|
||||
++p;
|
||||
}
|
||||
break;
|
||||
case '\n':
|
||||
out << endl;
|
||||
++p;
|
||||
break;
|
||||
case '\r':
|
||||
++p;
|
||||
if (*p != '\n')
|
||||
out << endl;
|
||||
break;
|
||||
|
||||
default: {
|
||||
size_t len = strcspn(p, "%\n\r\0");
|
||||
out.write(p, len);
|
||||
p += len;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
41
simulators/gem5/src/kern/linux/printk.hh
Normal file
41
simulators/gem5/src/kern/linux/printk.hh
Normal file
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Regents of The University of Michigan
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met: redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer;
|
||||
* redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution;
|
||||
* neither the name of the copyright holders nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Nathan Binkert
|
||||
* Ali Saidi
|
||||
*/
|
||||
|
||||
#ifndef __PRINTK_HH__
|
||||
#define __PRINTK_HH__
|
||||
|
||||
#include <sstream>
|
||||
|
||||
class Arguments;
|
||||
|
||||
void Printk(std::stringstream &out, Arguments args);
|
||||
|
||||
#endif // __PRINTK_HH__
|
||||
Reference in New Issue
Block a user