From 7e02ab1dc622081a30e5b8bec3a944bd1fc7fca6 Mon Sep 17 00:00:00 2001 From: Alec Roelke Date: Sat, 28 Oct 2017 11:54:48 -0400 Subject: sim-se: Add prlimit system call Some ISAs (namely RISC-V) implement getrlimit and setrlimit using prlimit. This patch adds an implementation for the prlimit system call. Normally prlimit is supposed to provide the functionality of both getrlimit and setrlimit, but because gem5 does not support setrlimit this implementation of prlimit will simply display a warning and return a failure code if the setrlimit mode is used. The same thing will happen if a pid other than 0 is passed to it. Change-Id: I653af2d5a60e716f4d6286196be7600409efcef8 Reviewed-on: https://gem5-review.googlesource.com/5321 Maintainer: Brandon Potter Reviewed-by: Jason Lowe-Power --- src/sim/syscall_emul.hh | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'src/sim/syscall_emul.hh') diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index fa0959f0e..1b4580bbf 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -1687,6 +1687,48 @@ getrlimitFunc(SyscallDesc *desc, int callnum, Process *process, return 0; } +template +SyscallReturn +prlimitFunc(SyscallDesc *desc, int callnum, Process *process, + ThreadContext *tc) +{ + int index = 0; + if (process->getSyscallArg(tc, index) != 0) + { + warn("prlimit: ignoring rlimits for nonzero pid"); + return -EPERM; + } + int resource = process->getSyscallArg(tc, index); + Addr n = process->getSyscallArg(tc, index); + if (n != 0) + warn("prlimit: ignoring new rlimit"); + Addr o = process->getSyscallArg(tc, index); + if (o != 0) + { + TypedBufferArg rlp( + process->getSyscallArg(tc, index)); + switch (resource) { + case OS::TGT_RLIMIT_STACK: + // max stack size in bytes: make up a number (8MB for now) + rlp->rlim_cur = rlp->rlim_max = 8 * 1024 * 1024; + rlp->rlim_cur = TheISA::htog(rlp->rlim_cur); + rlp->rlim_max = TheISA::htog(rlp->rlim_max); + break; + case OS::TGT_RLIMIT_DATA: + // max data segment size in bytes: make up a number + rlp->rlim_cur = rlp->rlim_max = 256*1024*1024; + rlp->rlim_cur = TheISA::htog(rlp->rlim_cur); + rlp->rlim_max = TheISA::htog(rlp->rlim_max); + default: + warn("prlimit: unimplemented resource %d", resource); + return -EINVAL; + break; + } + rlp.copyOut(tc->getMemProxy()); + } + return 0; +} + /// Target clock_gettime() function. template SyscallReturn -- cgit v1.2.3