From 7cef6b9befea7e4cc4138eb1b01d45dd777bd72f Mon Sep 17 00:00:00 2001 From: Marc Orr Date: Mon, 6 Aug 2012 19:52:56 -0700 Subject: [PATCH] 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. --- src/arch/alpha/linux/linux.hh | 27 +++++---------------------- src/arch/arm/linux/linux.hh | 22 ---------------------- src/arch/arm/linux/process.cc | 2 +- src/arch/mips/linux/linux.hh | 29 ++++++----------------------- src/arch/sparc/linux/linux.hh | 3 +++ src/arch/x86/linux/syscalls.cc | 8 ++++---- 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 @@ -83,13 +83,6 @@ class AlphaLinux : public Linux static const unsigned GSI_IEEE_FP_CONTROL = 45; //@} - //@{ - /// 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), /* 77 */ SyscallDesc("getrusage", getrusageFunc), /* 78 */ SyscallDesc("gettimeofday", gettimeofdayFunc), /* 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 @@ -78,13 +78,6 @@ class MipsLinux : public Linux static const unsigned GSI_CLK_TCK = 42; //!< clock freq in Hz //@} - //@{ - /// 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), + /* 98 */ SyscallDesc("getrusage", getrusageFunc), /* 99 */ SyscallDesc("sysinfo", sysinfoFunc), /* 100 */ SyscallDesc("times", timesFunc), /* 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), + /* 77 */ SyscallDesc("getrusage", getrusageFunc), /* 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 -- 2.30.2