|
From: <sv...@va...> - 2010-02-23 10:03:08
|
Author: tom
Date: 2010-02-23 10:02:55 +0000 (Tue, 23 Feb 2010)
New Revision: 11054
Log:
Add support for the getcpu system call on x86, ppc32 and ppc64. There
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.
Modified:
trunk/coregrind/m_syswrap/priv_syswrap-linux.h
trunk/coregrind/m_syswrap/syswrap-linux.c
trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c
trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c
trunk/coregrind/m_syswrap/syswrap-x86-linux.c
trunk/include/vki/vki-linux.h
Modified: trunk/coregrind/m_syswrap/priv_syswrap-linux.h
===================================================================
--- trunk/coregrind/m_syswrap/priv_syswrap-linux.h 2010-02-22 11:03:10 UTC (rev 11053)
+++ trunk/coregrind/m_syswrap/priv_syswrap-linux.h 2010-02-23 10:02:55 UTC (rev 11054)
@@ -51,6 +51,7 @@
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);
Modified: trunk/coregrind/m_syswrap/syswrap-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-linux.c 2010-02-22 11:03:10 UTC (rev 11053)
+++ trunk/coregrind/m_syswrap/syswrap-linux.c 2010-02-23 10:02:55 UTC (rev 11054)
@@ -2588,6 +2588,29 @@
}
}
+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
------------------------------------------------------------------ */
Modified: trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c 2010-02-22 11:03:10 UTC (rev 11053)
+++ trunk/coregrind/m_syswrap/syswrap-ppc32-linux.c 2010-02-23 10:02:55 UTC (rev 11054)
@@ -1870,7 +1870,7 @@
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
Modified: trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c 2010-02-22 11:03:10 UTC (rev 11053)
+++ trunk/coregrind/m_syswrap/syswrap-ppc64-linux.c 2010-02-23 10:02:55 UTC (rev 11054)
@@ -1511,7 +1511,7 @@
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
Modified: trunk/coregrind/m_syswrap/syswrap-x86-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-x86-linux.c 2010-02-22 11:03:10 UTC (rev 11053)
+++ trunk/coregrind/m_syswrap/syswrap-x86-linux.c 2010-02-23 10:02:55 UTC (rev 11054)
@@ -2257,7 +2257,7 @@
// 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
Modified: trunk/include/vki/vki-linux.h
===================================================================
--- trunk/include/vki/vki-linux.h 2010-02-22 11:03:10 UTC (rev 11053)
+++ trunk/include/vki/vki-linux.h 2010-02-23 10:02:55 UTC (rev 11054)
@@ -2635,6 +2635,14 @@
__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
/*--------------------------------------------------------------------*/
|