}
}
-//zz PRE(sys_ftruncate, SfMayBlock)
-//zz {
-//zz PRINT("sys_ftruncate ( %d, %lld )", ARG1,(ULong)ARG2);
-//zz PRE_REG_READ2(long, "ftruncate", unsigned int, fd, unsigned long, length);
-//zz }
-//zz
+PRE(sys_ftruncate)
+{
+ *flags |= SfMayBlock;
+ PRINT("sys_ftruncate ( %d, %lld )", ARG1,(ULong)ARG2);
+ PRE_REG_READ2(long, "ftruncate", unsigned int, fd, unsigned long, length);
+}
+
//zz PRE(sys_truncate, SfMayBlock)
//zz {
//zz PRINT("sys_truncate ( %p(%s), %d )", ARG1,ARG1,ARG2);
//zz {
//zz POST_MEM_WRITE( ARG1, sizeof(vki_sigset_t) ) ;
//zz }
-//zz
-//zz PRE(sys_mq_open, 0)
-//zz {
-//zz PRINT("sys_mq_open( %p(%s), %d, %lld, %p )",
-//zz ARG1,ARG1,ARG2,(ULong)ARG3,ARG4);
-//zz PRE_REG_READ4(long, "mq_open",
-//zz const char *, name, int, oflag, vki_mode_t, mode,
-//zz struct mq_attr *, attr);
-//zz PRE_MEM_RASCIIZ( "mq_open(name)", ARG1 );
-//zz if ((ARG2 & VKI_O_CREAT) != 0 && ARG4 != 0) {
-//zz const struct vki_mq_attr *attr = (struct vki_mq_attr *)ARG4;
-//zz PRE_MEM_READ( "mq_open(attr->mq_maxmsg)",
-//zz (Addr)&attr->mq_maxmsg, sizeof(attr->mq_maxmsg) );
-//zz PRE_MEM_READ( "mq_open(attr->mq_msgsize)",
-//zz (Addr)&attr->mq_msgsize, sizeof(attr->mq_msgsize) );
-//zz }
-//zz }
-//zz
-//zz POST(sys_mq_open)
-//zz {
-//zz if (!VG_(fd_allowed)(RES, "mq_open", tid, True)) {
-//zz VG_(close)(RES);
-//zz SET_STATUS_( -VKI_EMFILE );
-//zz } else {
-//zz if (VG_(clo_track_fds))
-//zz VG_(record_fd_open)(tid, RES, VG_(arena_strdup)(VG_AR_CORE, (Char*)ARG1));
-//zz }
-//zz }
-//zz
-//zz PRE(sys_mq_unlink, 0)
-//zz {
-//zz PRINT("sys_mq_unlink ( %p(%s) )", ARG1,ARG1);
-//zz PRE_REG_READ1(long, "mq_unlink", const char *, name);
-//zz PRE_MEM_RASCIIZ( "mq_unlink(name)", ARG1 );
-//zz }
-//zz
+
+PRE(sys_mq_open)
+{
+ PRINT("sys_mq_open( %p(%s), %d, %lld, %p )",
+ ARG1,ARG1,ARG2,(ULong)ARG3,ARG4);
+ PRE_REG_READ4(long, "mq_open",
+ const char *, name, int, oflag, vki_mode_t, mode,
+ struct mq_attr *, attr);
+ PRE_MEM_RASCIIZ( "mq_open(name)", ARG1 );
+ if ((ARG2 & VKI_O_CREAT) != 0 && ARG4 != 0) {
+ const struct vki_mq_attr *attr = (struct vki_mq_attr *)ARG4;
+ PRE_MEM_READ( "mq_open(attr->mq_maxmsg)",
+ (Addr)&attr->mq_maxmsg, sizeof(attr->mq_maxmsg) );
+ PRE_MEM_READ( "mq_open(attr->mq_msgsize)",
+ (Addr)&attr->mq_msgsize, sizeof(attr->mq_msgsize) );
+ }
+}
+
+POST(sys_mq_open)
+{
+ vg_assert(SUCCESS);
+ if (!VG_(fd_allowed)(RES, "mq_open", tid, True)) {
+ VG_(close)(RES);
+ SET_STATUS_Failure( VKI_EMFILE );
+ } else {
+ if (VG_(clo_track_fds))
+ VG_(record_fd_open)(tid, RES, VG_(arena_strdup)(VG_AR_CORE, (Char*)ARG1));
+ }
+}
+
+PRE(sys_mq_unlink)
+{
+ PRINT("sys_mq_unlink ( %p(%s) )", ARG1,ARG1);
+ PRE_REG_READ1(long, "mq_unlink", const char *, name);
+ PRE_MEM_RASCIIZ( "mq_unlink(name)", ARG1 );
+}
+
//zz PRE(sys_mq_timedsend, SfMayBlock)
//zz {
//zz PRINT("sys_mq_timedsend ( %d, %p, %llu, %d, %p )",
DECL_TEMPLATE(x86_linux, sys_rt_sigreturn);
DECL_TEMPLATE(x86_linux, sys_modify_ldt);
DECL_TEMPLATE(x86_linux, sys_set_thread_area);
+DECL_TEMPLATE(x86_linux, sys_ptrace);
//zz PRE(old_select, MayBlock)
//zz {
//zz POST_MEM_WRITE( ARG1, sizeof(vki_modify_ldt_t) );
//zz }
//zz }
-//zz
-//zz // Parts of this are x86-specific, but the *PEEK* cases are generic.
-//zz // XXX: Why is the memory pointed to by ARG3 never checked?
-//zz PRE(sys_ptrace, 0)
-//zz {
-//zz PRINT("sys_ptrace ( %d, %d, %p, %p )", ARG1,ARG2,ARG3,ARG4);
-//zz PRE_REG_READ4(int, "ptrace",
-//zz long, request, long, pid, long, addr, long, data);
-//zz switch (ARG1) {
-//zz case VKI_PTRACE_PEEKTEXT:
-//zz case VKI_PTRACE_PEEKDATA:
-//zz case VKI_PTRACE_PEEKUSR:
-//zz PRE_MEM_WRITE( "ptrace(peek)", ARG4,
-//zz sizeof (long));
-//zz break;
-//zz case VKI_PTRACE_GETREGS:
-//zz PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
-//zz sizeof (struct vki_user_regs_struct));
-//zz break;
-//zz case VKI_PTRACE_GETFPREGS:
-//zz PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
-//zz sizeof (struct vki_user_i387_struct));
-//zz break;
-//zz case VKI_PTRACE_GETFPXREGS:
-//zz PRE_MEM_WRITE( "ptrace(getfpxregs)", ARG4,
-//zz sizeof(struct vki_user_fxsr_struct) );
-//zz break;
-//zz case VKI_PTRACE_SETREGS:
-//zz PRE_MEM_READ( "ptrace(setregs)", ARG4,
-//zz sizeof (struct vki_user_regs_struct));
-//zz break;
-//zz case VKI_PTRACE_SETFPREGS:
-//zz PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
-//zz sizeof (struct vki_user_i387_struct));
-//zz break;
-//zz case VKI_PTRACE_SETFPXREGS:
-//zz PRE_MEM_READ( "ptrace(setfpxregs)", ARG4,
-//zz sizeof(struct vki_user_fxsr_struct) );
-//zz break;
-//zz default:
-//zz break;
-//zz }
-//zz }
-//zz
-//zz POST(sys_ptrace)
-//zz {
-//zz switch (ARG1) {
-//zz case VKI_PTRACE_PEEKTEXT:
-//zz case VKI_PTRACE_PEEKDATA:
-//zz case VKI_PTRACE_PEEKUSR:
-//zz POST_MEM_WRITE( ARG4, sizeof (long));
-//zz break;
-//zz case VKI_PTRACE_GETREGS:
-//zz POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
-//zz break;
-//zz case VKI_PTRACE_GETFPREGS:
-//zz POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
-//zz break;
-//zz case VKI_PTRACE_GETFPXREGS:
-//zz POST_MEM_WRITE( ARG4, sizeof(struct vki_user_fxsr_struct) );
-//zz break;
-//zz default:
-//zz break;
-//zz }
-//zz }
+
+// Parts of this are x86-specific, but the *PEEK* cases are generic.
+// XXX: Why is the memory pointed to by ARG3 never checked?
+PRE(sys_ptrace)
+{
+ PRINT("sys_ptrace ( %d, %d, %p, %p )", ARG1,ARG2,ARG3,ARG4);
+ PRE_REG_READ4(int, "ptrace",
+ long, request, long, pid, long, addr, long, data);
+ switch (ARG1) {
+ case VKI_PTRACE_PEEKTEXT:
+ case VKI_PTRACE_PEEKDATA:
+ case VKI_PTRACE_PEEKUSR:
+ PRE_MEM_WRITE( "ptrace(peek)", ARG4,
+ sizeof (long));
+ break;
+ case VKI_PTRACE_GETREGS:
+ PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
+ sizeof (struct vki_user_regs_struct));
+ break;
+ case VKI_PTRACE_GETFPREGS:
+ PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
+ sizeof (struct vki_user_i387_struct));
+ break;
+ case VKI_PTRACE_GETFPXREGS:
+ PRE_MEM_WRITE( "ptrace(getfpxregs)", ARG4,
+ sizeof(struct vki_user_fxsr_struct) );
+ break;
+ case VKI_PTRACE_SETREGS:
+ PRE_MEM_READ( "ptrace(setregs)", ARG4,
+ sizeof (struct vki_user_regs_struct));
+ break;
+ case VKI_PTRACE_SETFPREGS:
+ PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
+ sizeof (struct vki_user_i387_struct));
+ break;
+ case VKI_PTRACE_SETFPXREGS:
+ PRE_MEM_READ( "ptrace(setfpxregs)", ARG4,
+ sizeof(struct vki_user_fxsr_struct) );
+ break;
+ default:
+ break;
+ }
+}
+
+POST(sys_ptrace)
+{
+ switch (ARG1) {
+ case VKI_PTRACE_PEEKTEXT:
+ case VKI_PTRACE_PEEKDATA:
+ case VKI_PTRACE_PEEKUSR:
+ POST_MEM_WRITE( ARG4, sizeof (long));
+ break;
+ case VKI_PTRACE_GETREGS:
+ POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
+ break;
+ case VKI_PTRACE_GETFPREGS:
+ POST_MEM_WRITE( ARG4, sizeof (struct vki_user_i387_struct));
+ break;
+ case VKI_PTRACE_GETFPXREGS:
+ POST_MEM_WRITE( ARG4, sizeof(struct vki_user_fxsr_struct) );
+ break;
+ default:
+ break;
+ }
+}
// XXX: this duplicates a function in coregrind/vg_syscalls.c, yuk
static Addr deref_Addr ( ThreadId tid, Addr a, Char* s )
GENX_(__NR_getuid, sys_getuid16), // 24 ## P
//zz
//zz // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
-//zz PLAXY(__NR_ptrace, sys_ptrace), // 26
+ PLAXY(__NR_ptrace, sys_ptrace), // 26
GENX_(__NR_alarm, sys_alarm), // 27
//zz // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
GENX_(__NR_pause, sys_pause), // 29
PLAX_(__NR_mmap, old_mmap), // 90
GENXY(__NR_munmap, sys_munmap), // 91
//zz GENX_(__NR_truncate, sys_truncate), // 92
-//zz GENX_(__NR_ftruncate, sys_ftruncate), // 93
+ GENX_(__NR_ftruncate, sys_ftruncate), // 93
//zz GENX_(__NR_fchmod, sys_fchmod), // 94
//zz
//zz GENX_(__NR_fchown, sys_fchown16), // 95
GENXY(__NR_fcntl64, sys_fcntl64), // 221
GENX_(222, sys_ni_syscall), // 222
GENX_(223, sys_ni_syscall), // 223
-//zz LINX_(__NR_gettid, sys_gettid), // 224
-//zz
+ LINX_(__NR_gettid, sys_gettid), // 224
+
//zz // (__NR_readahead, sys_readahead), // 225 */(Linux?)
//zz GENX_(__NR_setxattr, sys_setxattr), // 226
//zz GENX_(__NR_lsetxattr, sys_lsetxattr), // 227
//zz
//zz // (__NR_get_mempolicy, sys_get_mempolicy), // 275 ?/?
//zz // (__NR_set_mempolicy, sys_set_mempolicy), // 276 ?/?
-//zz GENXY(__NR_mq_open, sys_mq_open), // 277
-//zz GENX_(__NR_mq_unlink, sys_mq_unlink), // (mq_open+1)
+ GENXY(__NR_mq_open, sys_mq_open), // 277
+ GENX_(__NR_mq_unlink, sys_mq_unlink), // (mq_open+1)
//zz GENX_(__NR_mq_timedsend, sys_mq_timedsend), // (mq_open+2)
//zz
//zz GENXY(__NR_mq_timedreceive, sys_mq_timedreceive),// (mq_open+3)