aboutsummaryrefslogtreecommitdiff
path: root/coregrind/m_syswrap/syswrap-darwin.c
diff options
context:
space:
mode:
authornjn <njn@a5019735-40e9-0310-863c-91ae7b9d1cf9>2009-06-10 23:26:13 +0000
committernjn <njn@a5019735-40e9-0310-863c-91ae7b9d1cf9>2009-06-10 23:26:13 +0000
commit631b819596d389e9ad8ea0a0b5926f6107d7b1e0 (patch)
tree81bfa172a839e7409dad0cda5d22f06948a4dfa9 /coregrind/m_syswrap/syswrap-darwin.c
parent2c7e5ca3d43afda2060c4f3a1ad43d945c05ff71 (diff)
downloadvalgrind-631b819596d389e9ad8ea0a0b5926f6107d7b1e0.tar.gz
Add wrappers for shmat() and shmdt() on Darwin. Fixes bug 191271.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10297 a5019735-40e9-0310-863c-91ae7b9d1cf9
Diffstat (limited to 'coregrind/m_syswrap/syswrap-darwin.c')
-rw-r--r--coregrind/m_syswrap/syswrap-darwin.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/coregrind/m_syswrap/syswrap-darwin.c b/coregrind/m_syswrap/syswrap-darwin.c
index b1289b5c6..6189ce05f 100644
--- a/coregrind/m_syswrap/syswrap-darwin.c
+++ b/coregrind/m_syswrap/syswrap-darwin.c
@@ -1780,10 +1780,22 @@ POST(flistxattr)
POST_MEM_WRITE( ARG2, (vki_ssize_t)RES );
}
-PRE(shmget)
+
+PRE(shmat)
{
- PRINT("shmget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
- PRE_REG_READ3(long, "shmget", vki_key_t, key, vki_size_t, size, int, shmflg);
+ UWord arg2tmp;
+ PRINT("shmat ( %ld, %#lx, %ld )",ARG1,ARG2,ARG3);
+ PRE_REG_READ3(long, "shmat",
+ int, shmid, const void *, shmaddr, int, shmflg);
+ arg2tmp = ML_(generic_PRE_sys_shmat)(tid, ARG1,ARG2,ARG3);
+ if (arg2tmp == 0)
+ SET_STATUS_Failure( VKI_EINVAL );
+ else
+ ARG2 = arg2tmp; // used in POST
+}
+POST(shmat)
+{
+ ML_(generic_POST_sys_shmat)(tid, RES,ARG1,ARG2,ARG3);
}
PRE(shmctl)
@@ -1798,6 +1810,24 @@ POST(shmctl)
ML_(generic_POST_sys_shmctl)(tid, RES,ARG1,ARG2,ARG3);
}
+PRE(shmdt)
+{
+ PRINT("shmdt ( %#lx )",ARG1);
+ PRE_REG_READ1(long, "shmdt", const void *, shmaddr);
+ if (!ML_(generic_PRE_sys_shmdt)(tid, ARG1))
+ SET_STATUS_Failure( VKI_EINVAL );
+}
+POST(shmdt)
+{
+ ML_(generic_POST_sys_shmdt)(tid, RES,ARG1);
+}
+
+PRE(shmget)
+{
+ PRINT("shmget ( %ld, %ld, %ld )",ARG1,ARG2,ARG3);
+ PRE_REG_READ3(long, "shmget", vki_key_t, key, vki_size_t, size, int, shmflg);
+}
+
PRE(shm_open)
{
PRINT("shm_open(%#lx(%s), %ld, %ld)", ARG1, (char *)ARG1, ARG2, ARG3);
@@ -7216,9 +7246,9 @@ const SyscallTableEntry ML_(syscall_table)[] = {
// _____(__NR_msgget),
// _____(__NR_msgsnd), // 260
// _____(__NR_msgrcv),
-// _____(__NR_shmat),
+ MACXY(__NR_shmat, shmat),
MACXY(__NR_shmctl, shmctl),
-// _____(__NR_shmdt),
+ MACXY(__NR_shmdt, shmdt),
MACX_(__NR_shmget, shmget),
MACXY(__NR_shm_open, shm_open),
// _____(__NR_shm_unlink),