From 7b2a259bea2f635e923169b4a955f397ce57636b Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 19 May 2009 06:50:37 +0000 Subject: [PATCH] DARWIN sync: pread64 and pwrite64 wrappers. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@9971 --- coregrind/m_syswrap/priv_syswrap-generic.h | 6 +- coregrind/m_syswrap/syswrap-amd64-linux.c | 4 +- coregrind/m_syswrap/syswrap-generic.c | 71 +++++++--------------- coregrind/m_syswrap/syswrap-ppc32-linux.c | 4 +- coregrind/m_syswrap/syswrap-ppc64-linux.c | 2 +- coregrind/m_syswrap/syswrap-x86-linux.c | 4 +- 6 files changed, 32 insertions(+), 59 deletions(-) diff --git a/coregrind/m_syswrap/priv_syswrap-generic.h b/coregrind/m_syswrap/priv_syswrap-generic.h index 4bb4634e8..29a66e0df 100644 --- a/coregrind/m_syswrap/priv_syswrap-generic.h +++ b/coregrind/m_syswrap/priv_syswrap-generic.h @@ -186,10 +186,8 @@ DECL_TEMPLATE(generic, sys_fstatfs); // * L? DECL_TEMPLATE(generic, sys_iopl); // (x86/amd64) L DECL_TEMPLATE(generic, sys_ipc); // (x86) L DECL_TEMPLATE(generic, sys_newuname); // * P -DECL_TEMPLATE(generic, sys_pread64_on32bitplat); // * (Unix98?) -DECL_TEMPLATE(generic, sys_pread64_on64bitplat); // * (Unix98?) -DECL_TEMPLATE(generic, sys_pwrite64_on32bitplat); // * (Unix98?) -DECL_TEMPLATE(generic, sys_pwrite64_on64bitplat); // * (Unix98?) +DECL_TEMPLATE(generic, sys_pread64); // * (Unix98?) +DECL_TEMPLATE(generic, sys_pwrite64); // * (Unix98?) DECL_TEMPLATE(generic, sys_sigaltstack); // (x86) (XPG4-UNIX) DECL_TEMPLATE(generic, sys_getpmsg); // (?) (?) DECL_TEMPLATE(generic, sys_putpmsg); // (?) (?) diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index 27e158bc9..d11dc2fdc 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -1035,8 +1035,8 @@ const SyscallTableEntry ML_(syscall_table)[] = { PLAX_(__NR_rt_sigreturn, sys_rt_sigreturn), // 15 LINXY(__NR_ioctl, sys_ioctl), // 16 - GENXY(__NR_pread64, sys_pread64_on64bitplat), // 17 - GENX_(__NR_pwrite64, sys_pwrite64_on64bitplat), // 18 + GENXY(__NR_pread64, sys_pread64), // 17 + GENX_(__NR_pwrite64, sys_pwrite64), // 18 GENXY(__NR_readv, sys_readv), // 19 GENX_(__NR_writev, sys_writev), // 20 diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index 5871bc366..66f004a80 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -2232,32 +2232,24 @@ PRE(sys_getpriority) PRE_REG_READ2(long, "getpriority", int, which, int, who); } -PRE(sys_pwrite64_on64bitplat) +PRE(sys_pwrite64) { - vg_assert(sizeof(UWord) == 8); - *flags |= SfMayBlock; - PRINT("sys_pwrite64 ( %ld, %#lx, %llu, %ld )", - ARG1, ARG2, (ULong)ARG3, ARG4); - PRE_REG_READ4(ssize_t, "pwrite64", - unsigned int, fd, const char *, buf, - vki_size_t, count, vki_loff_t, offset); - PRE_MEM_READ( "pwrite64(buf)", ARG2, ARG3 ); -} - -// The actual kernel definition of this routine takes a -// single 64 bit offset argument. This version is for 32 bit -// platforms only and treats the offset as two values - the -// kernel relies on stack based argument passing conventions -// to merge the two together. -PRE(sys_pwrite64_on32bitplat) -{ - vg_assert(sizeof(UWord) == 4); *flags |= SfMayBlock; +#if VG_WORDSIZE == 4 PRINT("sys_pwrite64 ( %ld, %#lx, %llu, %lld )", ARG1, ARG2, (ULong)ARG3, LOHI64(ARG4,ARG5)); PRE_REG_READ5(ssize_t, "pwrite64", unsigned int, fd, const char *, buf, vki_size_t, count, vki_u32, offset_low32, vki_u32, offset_high32); +#elif VG_WORDSIZE == 8 + PRINT("sys_pwrite64 ( %ld, %#lx, %llu, %lld )", + ARG1, ARG2, (ULong)ARG3, (Long)ARG4); + PRE_REG_READ4(ssize_t, "pwrite64", + unsigned int, fd, const char *, buf, vki_size_t, count, + Word, offset); +#else +# error Unexpected word size +#endif PRE_MEM_READ( "pwrite64(buf)", ARG2, ARG3 ); } @@ -2299,45 +2291,28 @@ PRE(sys_getsid) PRE_REG_READ1(long, "getsid", vki_pid_t, pid); } -PRE(sys_pread64_on64bitplat) +PRE(sys_pread64) { - vg_assert(sizeof(UWord) == 8); - *flags |= SfMayBlock; - PRINT("sys_pread64 ( %ld, %#lx, %llu, %ld )", - ARG1, ARG2, (ULong)ARG3, ARG4); - PRE_REG_READ4(ssize_t, "pread64", - unsigned int, fd, char *, buf, - vki_size_t, count, vki_loff_t, offset); - PRE_MEM_WRITE( "pread64(buf)", ARG2, ARG3 ); -} -POST(sys_pread64_on64bitplat) -{ - vg_assert(sizeof(UWord) == 8); - vg_assert(SUCCESS); - if (RES > 0) { - POST_MEM_WRITE( ARG2, RES ); - } -} - -// The actual kernel definition of this routine takes a -// single 64 bit offset argument. This version is for 32 bit -// platforms only and treats the offset as two values - the -// kernel relies on stack based argument passing conventions -// to merge the two together. -PRE(sys_pread64_on32bitplat) -{ - vg_assert(sizeof(UWord) == 4); *flags |= SfMayBlock; +#if VG_WORDSIZE == 4 PRINT("sys_pread64 ( %ld, %#lx, %llu, %lld )", ARG1, ARG2, (ULong)ARG3, LOHI64(ARG4,ARG5)); PRE_REG_READ5(ssize_t, "pread64", unsigned int, fd, char *, buf, vki_size_t, count, vki_u32, offset_low32, vki_u32, offset_high32); +#elif VG_WORDSIZE == 8 + PRINT("sys_pread64 ( %ld, %#lx, %llu, %lld )", + ARG1, ARG2, (ULong)ARG3, (Long)ARG4); + PRE_REG_READ4(ssize_t, "pread64", + unsigned int, fd, char *, buf, vki_size_t, count, + Word, offset); +#else +# error Unexpected word size +#endif PRE_MEM_WRITE( "pread64(buf)", ARG2, ARG3 ); } -POST(sys_pread64_on32bitplat) +POST(sys_pread64) { - vg_assert(sizeof(UWord) == 4); vg_assert(SUCCESS); if (RES > 0) { POST_MEM_WRITE( ARG2, RES ); diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index c2bd8e41b..2575159eb 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -1710,8 +1710,8 @@ const SyscallTableEntry ML_(syscall_table)[] = { LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 177 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178 - GENXY(__NR_pread64, sys_pread64_on32bitplat), // 179 - GENX_(__NR_pwrite64, sys_pwrite64_on32bitplat), // 180 + GENXY(__NR_pread64, sys_pread64), // 179 + GENX_(__NR_pwrite64, sys_pwrite64), // 180 GENX_(__NR_chown, sys_chown), // 181 GENXY(__NR_getcwd, sys_getcwd), // 182 LINXY(__NR_capget, sys_capget), // 183 diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c index dc82f4ac1..dbf113b63 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c @@ -1354,7 +1354,7 @@ const SyscallTableEntry ML_(syscall_table)[] = { LINXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait), // 176 // _____(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo), // 177 // _____(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 178 - GENXY(__NR_pread64, sys_pread64_on64bitplat), // 179 + GENXY(__NR_pread64, sys_pread64), // 179 // _____(__NR_pwrite64, sys_pwrite64), // 180 GENX_(__NR_chown, sys_chown), // 181 diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index d72892ba5..e16b84488 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -2055,8 +2055,8 @@ const SyscallTableEntry ML_(syscall_table)[] = { LINXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 178 LINX_(__NR_rt_sigsuspend, sys_rt_sigsuspend), // 179 - GENXY(__NR_pread64, sys_pread64_on32bitplat), // 180 - GENX_(__NR_pwrite64, sys_pwrite64_on32bitplat), // 181 + GENXY(__NR_pread64, sys_pread64), // 180 + GENX_(__NR_pwrite64, sys_pwrite64), // 181 LINX_(__NR_chown, sys_chown16), // 182 GENXY(__NR_getcwd, sys_getcwd), // 183 LINXY(__NR_capget, sys_capget), // 184