LINUX_SYSCALL_WRAPPER(sys_epoll_ctl);
LINUX_SYSCALL_WRAPPER(sys_epoll_wait);
+LINUX_SYSCALL_WRAPPER(sys_tgkill);
+
LINUX_SYSCALL_WRAPPER(sys_io_setup);
LINUX_SYSCALL_WRAPPER(sys_io_destroy);
LINUX_SYSCALL_WRAPPER(sys_io_getevents);
POST_MEM_WRITE( ARG2, sizeof(struct epoll_event)*RES ) ;
}
+PRE(sys_tgkill, 0)
+{
+ /* int tgkill(pid_t tgid, pid_t tid, int sig); */
+ PRINT("sys_tgkill ( %d, %d, %d )", ARG1,ARG2,ARG3);
+ PRE_REG_READ3(long, "tgkill", int, tgid, int, tid, int, sig);
+ if (!VG_(client_signal_OK)(ARG3))
+ SET_RESULT( -VKI_EINVAL );
+}
+
+POST(sys_tgkill)
+{
+ if (VG_(clo_trace_signals))
+ VG_(message)(Vg_DebugMsg, "tgkill: sent signal %d to pid %d/%d",
+ ARG3, ARG1, ARG2);
+ // Check to see if this kill gave us a pending signal
+ VG_(poll_signals)(tid);
+}
+
+
// Nb: this wrapper is "Special" because we have to pad/unpad memory around
// the syscall itself, and this allows us to control exactly the code that
// gets run while the padding is in place.
GENXY(__NR_statfs64, sys_statfs64), // 268
GENXY(__NR_fstatfs64, sys_fstatfs64), // 269
- // (__NR_tgkill, sys_tgkill), // 270 */Linux
+ LINXY(__NR_tgkill, sys_tgkill), // 270 */Linux
GENX_(__NR_utimes, sys_utimes), // 271
// (__NR_fadvise64_64, sys_fadvise64_64), // 272 */(Linux?)
GENX_(__NR_vserver, sys_ni_syscall), // 273