From: Tom Hughes Date: Tue, 23 Feb 2010 10:02:55 +0000 (+0000) Subject: Add support for the getcpu system call on x86, ppc32 and ppc64. There X-Git-Tag: svn/VALGRIND_3_6_0~370 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2a70cf0b012792c0b8da23ff3271c6193342325e;p=thirdparty%2Fvalgrind.git 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. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11054 --- diff --git a/coregrind/m_syswrap/priv_syswrap-linux.h b/coregrind/m_syswrap/priv_syswrap-linux.h index dcd39b7996..01e087ec61 100644 --- a/coregrind/m_syswrap/priv_syswrap-linux.h +++ b/coregrind/m_syswrap/priv_syswrap-linux.h @@ -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); diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index eaf3d87976..cc52e1cfa4 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -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 ------------------------------------------------------------------ */ diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index 73fe2d1cc7..a9fb910bd5 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c index 6922c860bd..c844c60959 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c @@ -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 diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index 66bcefbc2b..8459f2f262 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -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 diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index 214d7ca600..7ea6e2adb2 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -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 /*--------------------------------------------------------------------*/