From: Tom Hughes Date: Wed, 8 Jun 2011 09:55:54 +0000 (+0000) Subject: Add support for prlimit64 on x86 and amd64. X-Git-Tag: svn/VALGRIND_3_7_0~431 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=42bc84e8699c12cc39835a9cf130686eab156fea;p=thirdparty%2Fvalgrind.git Add support for prlimit64 on x86 and amd64. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11806 --- diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index 28b6911e58..b1e0bdd7ac 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -101,6 +101,8 @@ DECL_TEMPLATE(linux, sys_eventfd2); DECL_TEMPLATE(linux, sys_fallocate); +DECL_TEMPLATE(linux, sys_prlimit64); + DECL_TEMPLATE(linux, sys_gettid); DECL_TEMPLATE(linux, sys_set_tid_address); DECL_TEMPLATE(linux, sys_tkill); diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index b58c17189f..c90af60754 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -1410,7 +1410,19 @@ static SyscallTableEntry syscall_table[] = { LINXY(__NR_preadv, sys_preadv), // 295 LINX_(__NR_pwritev, sys_pwritev), // 296 LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 297 - LINXY(__NR_perf_event_open, sys_perf_event_open) // 298 + LINXY(__NR_perf_event_open, sys_perf_event_open), // 298 +// LINX_(__NR_recvmmsg, sys_ni_syscall), // 299 + +// LINX_(__NR_fanotify_init, sys_ni_syscall), // 300 +// LINX_(__NR_fanotify_mark, sys_ni_syscall), // 301 + LINXY(__NR_prlimit64, sys_prlimit64) // 302 +// LINX_(__NR_name_to_handle_at, sys_ni_syscall), // 303 +// LINX_(__NR_open_by_handle_at, sys_ni_syscall), // 304 + +// LINX_(__NR_clock_adjtime, sys_ni_syscall), // 305 +// LINX_(__NR_syncfs, sys_ni_syscall), // 306 +// LINX_(__NR_sendmmsg, sys_ni_syscall), // 307 +// LINX_(__NR_setns, sys_ni_syscall), // 308 }; SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index f4f75532ef..ece6c7d621 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -1240,6 +1240,43 @@ PRE(sys_fallocate) SET_STATUS_Failure( VKI_EBADF ); } +PRE(sys_prlimit64) +{ + PRINT("sys_prlimit64 ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4); + PRE_REG_READ4(long, "prlimit64", + vki_pid_t, pid, unsigned int, resource, + const struct rlimit64 *, new_rlim, + struct rlimit64 *, old_rlim); + if (ARG3) + PRE_MEM_READ( "rlimit64(new_rlim)", ARG3, sizeof(struct vki_rlimit64) ); + if (ARG4) + PRE_MEM_WRITE( "rlimit64(old_rlim)", ARG4, sizeof(struct vki_rlimit64) ); +} + +POST(sys_prlimit64) +{ + if (ARG4) { + POST_MEM_WRITE( ARG4, sizeof(struct vki_rlimit64) ); + + switch (ARG2) { + case VKI_RLIMIT_NOFILE: + ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(fd_soft_limit); + ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(fd_hard_limit); + break; + + case VKI_RLIMIT_DATA: + ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(client_rlimit_data).rlim_cur; + ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(client_rlimit_data).rlim_max; + break; + + case VKI_RLIMIT_STACK: + ((struct vki_rlimit64 *)ARG4)->rlim_cur = VG_(client_rlimit_stack).rlim_cur; + ((struct vki_rlimit64 *)ARG4)->rlim_max = VG_(client_rlimit_stack).rlim_max; + break; + } + } +} + /* --------------------------------------------------------------------- tid-related wrappers ------------------------------------------------------------------ */ diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index ecd2e13393..6aca6a8f75 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -2280,7 +2280,19 @@ static SyscallTableEntry syscall_table[] = { LINX_(__NR_pwritev, sys_pwritev), // 334 LINXY(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo),// 335 - LINXY(__NR_perf_event_open, sys_perf_event_open) // 336 + LINXY(__NR_perf_event_open, sys_perf_event_open), // 336 +// LINX_(__NR_recvmmsg, sys_ni_syscall), // 337 +// LINX_(__NR_fanotify_init, sys_ni_syscall), // 338 +// LINX_(__NR_fanotify_mark, sys_ni_syscall), // 339 + + LINXY(__NR_prlimit64, sys_prlimit64) // 340 +// LINX_(__NR_name_to_handle_at, sys_ni_syscall), // 341 +// LINX_(__NR_open_by_handle_at, sys_ni_syscall), // 342 +// LINX_(__NR_clock_adjtime, sys_ni_syscall), // 343 +// LINX_(__NR_syncfs, sys_ni_syscall), // 344 + +// LINX_(__NR_sendmmsg, sys_ni_syscall), // 345 +// LINX_(__NR_setns, sys_ni_syscall), // 346 }; SyscallTableEntry* ML_(get_linux_syscall_entry) ( UInt sysno ) diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index e3e1d93956..13f1ffcb4f 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -931,6 +931,11 @@ struct vki_rlimit { unsigned long rlim_max; }; +struct vki_rlimit64 { + __vki_u64 rlim_cur; + __vki_u64 rlim_max; +}; + //---------------------------------------------------------------------- // From linux-2.6.8.1/include/linux/elfcore.h //----------------------------------------------------------------------