]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add support for prlimit64 on x86 and amd64.
authorTom Hughes <tom@compton.nu>
Wed, 8 Jun 2011 09:55:54 +0000 (09:55 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 8 Jun 2011 09:55:54 +0000 (09:55 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11806

coregrind/m_syswrap/priv_syswrap-linux.h
coregrind/m_syswrap/syswrap-amd64-linux.c
coregrind/m_syswrap/syswrap-linux.c
coregrind/m_syswrap/syswrap-x86-linux.c
include/vki/vki-linux.h

index 28b6911e5827be2c1807a471f98e586cb1480787..b1e0bdd7ac0d8690e57fe229063a02b941199108 100644 (file)
@@ -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);
index b58c17189f3efc1d4fc2c0a95e06a0a682636e17..c90af60754e37dc072fd1a3781cbb5b1fc9243bd 100644 (file)
@@ -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 )
index f4f75532efe0c9baf385229664ca678e414676f2..ece6c7d621babee6e51709f882d3ef59349cd93c 100644 (file)
@@ -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
    ------------------------------------------------------------------ */
index ecd2e13393dc321c0fa2d9df921202b5b9ab1580..6aca6a8f75135b01f7d02724eff3f34203882ed3 100644 (file)
@@ -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 )
index e3e1d939569fc380d79b1cd9c0c365c6a6ffbab9..13f1ffcb4fa7f5a6488fa2c33af5e836d7bcd75c 100644 (file)
@@ -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
 //----------------------------------------------------------------------