]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add support for the getcpu system call on x86, ppc32 and ppc64. There
authorTom Hughes <tom@compton.nu>
Tue, 23 Feb 2010 10:02:55 +0000 (10:02 +0000)
committerTom Hughes <tom@compton.nu>
Tue, 23 Feb 2010 10:02:55 +0000 (10:02 +0000)
is no support for amd64 because there is no getcpu system call on that
platform - it is always done as a vsyscall in user space.

Based on patch from Aleksander Salwa. Closes #223758.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11054

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

index dcd39b79965e14418752647f2ffbac05edcc4ac0..01e087ec6132475401857bd28850063796bed9d7 100644 (file)
@@ -51,6 +51,7 @@ DECL_TEMPLATE(linux, sys_perf_counter_open);
 DECL_TEMPLATE(linux, sys_preadv);
 DECL_TEMPLATE(linux, sys_pwritev);
 DECL_TEMPLATE(linux, sys_dup3);
+DECL_TEMPLATE(linux, sys_getcpu);
 
 // POSIX, but various sub-cases differ between Linux and Darwin.
 DECL_TEMPLATE(linux, sys_fcntl);
index eaf3d879767a161fb2df679ceeebaaf137198f99..cc52e1cfa49474538f4480943d36e91ff87b5d99 100644 (file)
@@ -2588,6 +2588,29 @@ POST(sys_perf_counter_open)
    }
 }
 
+PRE(sys_getcpu)
+{
+   PRINT("sys_getcpu ( %#lx, %#lx, %#lx )" , ARG1,ARG2,ARG3);
+   PRE_REG_READ3(int, "getcpu", 
+                 unsigned *, cpu, unsigned *, node, struct vki_getcpu_cache *, tcache);
+   if (ARG1 != 0)
+      PRE_MEM_WRITE( "getcpu(cpu)", ARG1, sizeof(unsigned) );
+   if (ARG2 != 0)
+      PRE_MEM_WRITE( "getcpu(node)", ARG2, sizeof(unsigned) );
+   if (ARG3 != 0)
+      PRE_MEM_WRITE( "getcpu(tcache)", ARG3, sizeof(struct vki_getcpu_cache) );
+}
+
+POST(sys_getcpu)
+{
+   if (ARG1 != 0)
+      POST_MEM_WRITE( ARG1, sizeof(unsigned) );
+   if (ARG2 != 0)
+      POST_MEM_WRITE( ARG2, sizeof(unsigned) );
+   if (ARG3 != 0)
+      POST_MEM_WRITE( ARG3, sizeof(struct vki_getcpu_cache) );
+}
+
 /* ---------------------------------------------------------------------
    utime wrapper
    ------------------------------------------------------------------ */
index 73fe2d1cc769f5c07f0c4fa95a9246ca1c27b692..a9fb910bd5d1f35f445074ab480c210972ce4fea 100644 (file)
@@ -1870,7 +1870,7 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_set_robust_list,   sys_set_robust_list),   // 299
    LINXY(__NR_get_robust_list,   sys_get_robust_list),   // 300
 //   LINX_(__NR_move_pages,        sys_ni_syscall),        // 301
-//   LINX_(__NR_getcpu,            sys_ni_syscall),        // 302
+   LINXY(__NR_getcpu,            sys_getcpu),            // 302
    LINXY(__NR_epoll_pwait,       sys_epoll_pwait),       // 303
    LINX_(__NR_utimensat,         sys_utimensat),         // 304
    LINXY(__NR_signalfd,          sys_signalfd),          // 305
index 6922c860bd9ffd65222df325c9f062d7109b6aae..c844c60959344ee7f6880d0f736ec1d33b983323 100644 (file)
@@ -1511,7 +1511,7 @@ static SyscallTableEntry syscall_table[] = {
    LINX_(__NR_set_robust_list,   sys_set_robust_list),    // 299
    LINXY(__NR_get_robust_list,   sys_get_robust_list),    // 300
 //   LINX_(__NR_move_pages,        sys_ni_syscall),        // 301
-//   LINX_(__NR_getcpu,            sys_ni_syscall),        // 302
+   LINXY(__NR_getcpu,            sys_getcpu),            // 302
    LINXY(__NR_epoll_pwait,       sys_epoll_pwait),       // 303
    LINX_(__NR_utimensat,         sys_utimensat),         // 304
    LINXY(__NR_signalfd,          sys_signalfd),          // 305
index 66bcefbc2be55f213ae33b78d46362d03d78c570..8459f2f262ff7222a795e98a7da7ca98349b21f9 100644 (file)
@@ -2257,7 +2257,7 @@ static SyscallTableEntry syscall_table[] = {
 //   LINX_(__NR_tee,               sys_ni_syscall),       // 315
 //   LINX_(__NR_vmsplice,          sys_ni_syscall),       // 316
 //   LINX_(__NR_move_pages,        sys_ni_syscall),       // 317
-//   LINX_(__NR_getcpu,            sys_ni_syscall),       // 318
+   LINXY(__NR_getcpu,            sys_getcpu),           // 318
    LINXY(__NR_epoll_pwait,       sys_epoll_pwait),      // 319
 
    LINX_(__NR_utimensat,         sys_utimensat),        // 320
index 214d7ca600fcabaf4efaca5b5c36c8d4b8f68602..7ea6e2adb2e5b849a692a36bbd4ac34a4967bff9 100644 (file)
@@ -2635,6 +2635,14 @@ struct vki_perf_counter_attr {
        __vki_u64                       __reserved_3;
 };
 
+/*--------------------------------------------------------------------*/
+// From linux-2.6.32.4/include/linux/getcpu.h
+/*--------------------------------------------------------------------*/
+
+struct vki_getcpu_cache {
+       unsigned long blob[128 / sizeof(long)];
+};
+
 #endif // __VKI_LINUX_H
 
 /*--------------------------------------------------------------------*/