// For the remainder, not really sure yet
DECL_TEMPLATE(generic, sys_ptrace); // (x86?) (almost-P)
-DECL_TEMPLATE(generic, sys_sigsuspend); // POSIX, but L (proto varies across archs)
DECL_TEMPLATE(generic, sys_setrlimit); // SVr4, 4.3BSD
DECL_TEMPLATE(generic, sys_ioctl); // x86? (various)
DECL_TEMPLATE(generic, sys_old_getrlimit); // SVr4, 4.3BSD L?
PRE_REG_READ0(long, "pause");
}
-//zz // XXX: x86-specific
-//zz PRE(sys_sigsuspend, SfMayBlock)
-//zz {
-//zz /* The C library interface to sigsuspend just takes a pointer to
-//zz a signal mask but this system call has three arguments - the first
-//zz two don't appear to be used by the kernel and are always passed as
-//zz zero by glibc and the third is the first word of the signal mask
-//zz so only 32 signals are supported.
-//zz
-//zz In fact glibc normally uses rt_sigsuspend if it is available as
-//zz that takes a pointer to the signal mask so supports more signals.
-//zz */
-//zz PRINT("sys_sigsuspend ( %d, %d, %d )", ARG1,ARG2,ARG3 );
-//zz PRE_REG_READ3(int, "sigsuspend",
-//zz int, history0, int, history1,
-//zz vki_old_sigset_t, mask);
-//zz }
-
// XXX: x86-specific
PRE(sys_sigaltstack)
{
DECL_TEMPLATE(ppc32_linux, sys_sigreturn);
DECL_TEMPLATE(ppc32_linux, sys_rt_sigreturn);
DECL_TEMPLATE(ppc32_linux, sys_sigaction);
+DECL_TEMPLATE(ppc32_linux, sys_sigsuspend);
PRE(sys_socketcall)
{
POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
}
+PRE(sys_sigsuspend)
+{
+ /* The C library interface to sigsuspend just takes a pointer to
+ a signal mask but this system call only takes the first word of
+ the signal mask as an argument so only 32 signals are supported.
+
+ In fact glibc normally uses rt_sigsuspend if it is available as
+ that takes a pointer to the signal mask so supports more signals.
+ */
+ *flags |= SfMayBlock;
+ PRINT("sys_sigsuspend ( %d )", ARG1 );
+ PRE_REG_READ1(int, "sigsuspend", vki_old_sigset_t, mask);
+}
+
#undef PRE
#undef POST
GENX_(__NR_execve, sys_execve), // 11
GENX_(__NR_chdir, sys_chdir), // 12
GENXY(__NR_time, sys_time), // 13
-//.. GENX_(__NR_mknod, sys_mknod), // 14
+ GENX_(__NR_mknod, sys_mknod), // 14
//..
GENX_(__NR_chmod, sys_chmod), // 15
//.. LINX_(__NR_lchown, sys_lchown16), // 16 ## P
//..
//.. LINX_(__NR_setreuid, sys_setreuid16), // 70
//.. LINX_(__NR_setregid, sys_setregid16), // 71
-//.. GENX_(__NR_sigsuspend, sys_sigsuspend), // 72
+ PLAX_(__NR_sigsuspend, sys_sigsuspend), // 72
//.. LINXY(__NR_sigpending, sys_sigpending), // 73
//.. // (__NR_sethostname, sys_sethostname), // 74 */*
//..
DECL_TEMPLATE(x86_linux, sys_get_thread_area);
DECL_TEMPLATE(x86_linux, sys_ptrace);
DECL_TEMPLATE(x86_linux, sys_sigaction);
+DECL_TEMPLATE(x86_linux, sys_sigsuspend);
DECL_TEMPLATE(x86_linux, old_select);
DECL_TEMPLATE(x86_linux, sys_vm86old);
DECL_TEMPLATE(x86_linux, sys_vm86);
POST_MEM_WRITE( ARG3, sizeof(struct vki_old_sigaction));
}
+PRE(sys_sigsuspend)
+{
+ /* The C library interface to sigsuspend just takes a pointer to
+ a signal mask but this system call has three arguments - the first
+ two don't appear to be used by the kernel and are always passed as
+ zero by glibc and the third is the first word of the signal mask
+ so only 32 signals are supported.
+
+ In fact glibc normally uses rt_sigsuspend if it is available as
+ that takes a pointer to the signal mask so supports more signals.
+ */
+ *flags |= SfMayBlock;
+ PRINT("sys_sigsuspend ( %d, %d, %d )", ARG1,ARG2,ARG3 );
+ PRE_REG_READ3(int, "sigsuspend",
+ int, history0, int, history1,
+ vki_old_sigset_t, mask);
+}
+
PRE(sys_vm86old)
{
PRINT("sys_vm86old ( %p )", ARG1);
//zz
LINX_(__NR_setreuid, sys_setreuid16), // 70
LINX_(__NR_setregid, sys_setregid16), // 71
-//zz GENX_(__NR_sigsuspend, sys_sigsuspend), // 72
+ PLAX_(__NR_sigsuspend, sys_sigsuspend), // 72
LINXY(__NR_sigpending, sys_sigpending), // 73
//zz // (__NR_sethostname, sys_sethostname), // 74 */*
//zz