diff options
author | Marc Orr <marc.orr@gmail.com> | 2012-08-06 19:52:56 -0700 |
---|---|---|
committer | Marc Orr <marc.orr@gmail.com> | 2012-08-06 19:52:56 -0700 |
commit | 7cef6b9befea7e4cc4138eb1b01d45dd777bd72f (patch) | |
tree | 0423fbf850dfb629b1f4d52fa56365bd136a55b8 | |
parent | f4b424cd539eed26de18e81fd9d433cd6ae6295b (diff) | |
download | gem5-7cef6b9befea7e4cc4138eb1b01d45dd777bd72f.tar.xz |
syscall emulation: Enabled getrlimit and getrusage for x86.
Added/moved rlimit constants to base linux header file.
This patch is a revised version of Vince Weaver's earlier patch.
-rw-r--r-- | src/arch/alpha/linux/linux.hh | 27 | ||||
-rw-r--r-- | src/arch/arm/linux/linux.hh | 22 | ||||
-rw-r--r-- | src/arch/arm/linux/process.cc | 2 | ||||
-rw-r--r-- | src/arch/mips/linux/linux.hh | 29 | ||||
-rw-r--r-- | src/arch/sparc/linux/linux.hh | 3 | ||||
-rw-r--r-- | src/arch/x86/linux/syscalls.cc | 8 | ||||
-rw-r--r-- | src/kern/linux/linux.hh | 23 |
7 files changed, 42 insertions, 72 deletions
diff --git a/src/arch/alpha/linux/linux.hh b/src/arch/alpha/linux/linux.hh index 443f70d81..115508405 100644 --- a/src/arch/alpha/linux/linux.hh +++ b/src/arch/alpha/linux/linux.hh @@ -84,13 +84,6 @@ class AlphaLinux : public Linux //@} //@{ - /// For getrusage(). - static const int TGT_RUSAGE_SELF = 0; - static const int TGT_RUSAGE_CHILDREN = -1; - static const int TGT_RUSAGE_BOTH = -2; - //@} - - //@{ /// For setsysinfo(). static const unsigned SSI_IEEE_FP_CONTROL = 14; //!< ieee_set_fp_control() //@} @@ -129,21 +122,11 @@ class AlphaLinux : public Linux /// For table(). static const int TBL_SYSINFO = 12; - /// Resource enumeration for getrlimit(). - enum rlimit_resources { - TGT_RLIMIT_CPU = 0, - TGT_RLIMIT_FSIZE = 1, - TGT_RLIMIT_DATA = 2, - TGT_RLIMIT_STACK = 3, - TGT_RLIMIT_CORE = 4, - TGT_RLIMIT_RSS = 5, - TGT_RLIMIT_NOFILE = 6, - TGT_RLIMIT_AS = 7, - TGT_RLIMIT_VMEM = 7, - TGT_RLIMIT_NPROC = 8, - TGT_RLIMIT_MEMLOCK = 9, - TGT_RLIMIT_LOCKS = 10 - }; + /// Resource constants for getrlimit() (overide some generics). + static const unsigned TGT_RLIMIT_NPROC = 8; + static const unsigned TGT_RLIMIT_AS = 7; + static const unsigned TGT_RLIMIT_NOFILE = 6; + static const unsigned TGT_RLIMIT_MEMLOCK = 9; typedef struct { int64_t uptime; /* Seconds since boot */ diff --git a/src/arch/arm/linux/linux.hh b/src/arch/arm/linux/linux.hh index 55af574d3..5a3e68a78 100644 --- a/src/arch/arm/linux/linux.hh +++ b/src/arch/arm/linux/linux.hh @@ -93,31 +93,9 @@ class ArmLinux : public Linux static const unsigned TGT_MAP_ANONYMOUS = 0x20; static const unsigned TGT_MAP_FIXED = 0x10; - //@{ - /// For getrusage(). - static const int TGT_RUSAGE_SELF = 0; - static const int TGT_RUSAGE_CHILDREN = -1; - static const int TGT_RUSAGE_BOTH = -2; - //@} - /// For table(). static const int TBL_SYSINFO = 12; - /// Resource enumeration for getrlimit(). - enum rlimit_resources { - TGT_RLIMIT_CPU = 0, - TGT_RLIMIT_FSIZE = 1, - TGT_RLIMIT_DATA = 2, - TGT_RLIMIT_STACK = 3, - TGT_RLIMIT_CORE = 4, - TGT_RLIMIT_RSS = 5, - TGT_RLIMIT_NPROC = 6, - TGT_RLIMIT_NOFILE = 7, - TGT_RLIMIT_MEMLOCK = 8, - TGT_RLIMIT_AS = 9, - TGT_RLIMIT_LOCKS = 10 - }; - /// Limit struct for getrlimit/setrlimit. struct rlimit { uint32_t rlim_cur; //!< soft limit diff --git a/src/arch/arm/linux/process.cc b/src/arch/arm/linux/process.cc index a30b1f440..088f9907e 100644 --- a/src/arch/arm/linux/process.cc +++ b/src/arch/arm/linux/process.cc @@ -151,7 +151,7 @@ SyscallDesc ArmLinuxProcess::syscallDescs[] = { /* 73 */ SyscallDesc("sigpending", unimplementedFunc), /* 74 */ SyscallDesc("sethostname", ignoreFunc), /* 75 */ SyscallDesc("setrlimit", ignoreFunc), - /* 76 */ SyscallDesc("getrlimit", unimplementedFunc), + /* 76 */ SyscallDesc("getrlimit", getrlimitFunc<ArmLinux>), /* 77 */ SyscallDesc("getrusage", getrusageFunc<ArmLinux>), /* 78 */ SyscallDesc("gettimeofday", gettimeofdayFunc<ArmLinux>), /* 79 */ SyscallDesc("settimeofday", unimplementedFunc), diff --git a/src/arch/mips/linux/linux.hh b/src/arch/mips/linux/linux.hh index 85a647e3d..6ae5b1717 100644 --- a/src/arch/mips/linux/linux.hh +++ b/src/arch/mips/linux/linux.hh @@ -79,13 +79,6 @@ class MipsLinux : public Linux //@} //@{ - /// For getrusage(). - static const int TGT_RUSAGE_SELF = 0; - static const int TGT_RUSAGE_CHILDREN = -1; - static const int TGT_RUSAGE_BOTH = -2; - //@} - - //@{ /// For setsysinfo(). static const unsigned SSI_IEEE_FP_CONTROL = 14; //!< ieee_set_fp_control() //@} @@ -121,22 +114,12 @@ class MipsLinux : public Linux /// For table(). static const int TBL_SYSINFO = 12; - /// Resource enumeration for getrlimit()/setrlimit(). - enum rlimit_resources { - TGT_RLIMIT_CPU = 0, - TGT_RLIMIT_FSIZE = 1, - TGT_RLIMIT_DATA = 2, - TGT_RLIMIT_STACK = 3, - TGT_RLIMIT_CORE = 4, - TGT_RLIMIT_NOFILE = 5, - TGT_RLIMIT_AS = 6, - TGT_RLIMIT_RSS = 7, - TGT_RLIMIT_VMEM = 7, - TGT_RLIMIT_NPROC = 8, - TGT_RLIMIT_MEMLOCK = 9, - TGT_RLIMIT_LOCKS = 10, - NUM_RLIMIT_RESOURCES - }; + /// Resource constants for getrlimit() (overide some generics). + static const unsigned TGT_RLIMIT_NPROC = 8; + static const unsigned TGT_RLIMIT_AS = 6; + static const unsigned RLIMIT_RSS = 7; + static const unsigned TGT_RLIMIT_NOFILE = 5; + static const unsigned TGT_RLIMIT_MEMLOCK = 9; /// Offset used to make sure that processes don't /// assign themselves to process IDs reserved for diff --git a/src/arch/sparc/linux/linux.hh b/src/arch/sparc/linux/linux.hh index 7b708cbcb..bb7063edf 100644 --- a/src/arch/sparc/linux/linux.hh +++ b/src/arch/sparc/linux/linux.hh @@ -167,6 +167,9 @@ class Sparc32Linux : public SparcLinux uint32_t mem_unit; /* Memory unit size in bytes */ } tgt_sysinfo; + /// Resource constants for getrlimit() (overide some generics). + static const unsigned TGT_RLIMIT_NPROC = 7; + static const unsigned TGT_RLIMIT_NOFILE = 6; }; #endif diff --git a/src/arch/x86/linux/syscalls.cc b/src/arch/x86/linux/syscalls.cc index 322868ee1..4319ff9a8 100644 --- a/src/arch/x86/linux/syscalls.cc +++ b/src/arch/x86/linux/syscalls.cc @@ -310,8 +310,8 @@ SyscallDesc X86_64LinuxProcess::syscallDescs[] = { /* 94 */ SyscallDesc("lchown", unimplementedFunc), /* 95 */ SyscallDesc("umask", unimplementedFunc), /* 96 */ SyscallDesc("gettimeofday", unimplementedFunc), - /* 97 */ SyscallDesc("getrlimit", unimplementedFunc), - /* 98 */ SyscallDesc("getrusage", unimplementedFunc), + /* 97 */ SyscallDesc("getrlimit", getrlimitFunc<X86Linux64>), + /* 98 */ SyscallDesc("getrusage", getrusageFunc<X86Linux64>), /* 99 */ SyscallDesc("sysinfo", sysinfoFunc<X86Linux64>), /* 100 */ SyscallDesc("times", timesFunc<X86Linux64>), /* 101 */ SyscallDesc("ptrace", unimplementedFunc), @@ -568,8 +568,8 @@ SyscallDesc I386LinuxProcess::syscallDescs[] = { /* 73 */ SyscallDesc("sigpending", unimplementedFunc), /* 74 */ SyscallDesc("sethostname", unimplementedFunc), /* 75 */ SyscallDesc("setrlimit", ignoreFunc), - /* 76 */ SyscallDesc("getrlimit", unimplementedFunc), - /* 77 */ SyscallDesc("getrusage", unimplementedFunc), + /* 76 */ SyscallDesc("getrlimit", getrlimitFunc<X86Linux32>), + /* 77 */ SyscallDesc("getrusage", getrusageFunc<X86Linux32>), /* 78 */ SyscallDesc("gettimeofday", unimplementedFunc), /* 79 */ SyscallDesc("settimeofday", unimplementedFunc), /* 80 */ SyscallDesc("getgroups", unimplementedFunc), diff --git a/src/kern/linux/linux.hh b/src/kern/linux/linux.hh index bc3da60e4..1d52ff323 100644 --- a/src/kern/linux/linux.hh +++ b/src/kern/linux/linux.hh @@ -174,7 +174,30 @@ class Linux : public OperatingSystem } + /// Resource constants for getrlimit(). + static const unsigned TGT_RLIMIT_CPU = 0; + static const unsigned TGT_RLIMIT_FSIZE = 1; + static const unsigned TGT_RLIMIT_DATA = 2; + static const unsigned TGT_RLIMIT_STACK = 3; + static const unsigned TGT_RLIMIT_CORE = 4; + static const unsigned TGT_RLIMIT_RSS = 5; + static const unsigned TGT_RLIMIT_NPROC = 6; + static const unsigned TGT_RLIMIT_NOFILE = 7; + static const unsigned TGT_RLIMIT_MEMLOCK = 8; + static const unsigned TGT_RLIMIT_AS = 9; + static const unsigned TGT_RLIMIT_LOCKS = 10; + static const unsigned TGT_RLIMIT_SIGPENDING = 11; + static const unsigned TGT_RLIMIT_MSGQUEUE = 12; + static const unsigned TGT_RLIMIT_NICE = 13; + static const unsigned TGT_RLIMIT_RTPRIO = 14; + static const unsigned TGT_RLIMIT_RTTIME = 15; + static const unsigned TGT_RLIM_NLIMITS = 16; + /// For getrusage(). + static const int TGT_RUSAGE_SELF = 0; + static const int TGT_RUSAGE_CHILDREN = -1; + static const int TGT_RUSAGE_BOTH = -2; + struct rusage { struct timeval ru_utime; //!< user time used struct timeval ru_stime; //!< system time used |