From: Alec Roelke Date: Sat, 28 Oct 2017 15:54:48 +0000 (-0400) Subject: sim-se: Add prlimit system call X-Git-Tag: v19.0.0.0~2584 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7e02ab1dc622081a30e5b8bec3a944bd1fc7fca6;p=gem5.git 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 --- 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