|
From: Benjamin C. <ben...@si...> - 2006-03-28 13:11:55
|
Thanks Tom, I will give that a try.
Currently, though, the crash comes from the fact that syscall 14 (mknod)
is not implemented :(
Ben
Tom Hughes wrote:
> In message <442...@si...>
> Benjamin Collar <ben...@si...> wrote:
>
>
>>I know this is a bit of an old mail, but I'm using MV CGE 3.1 and 4.0
>>for powerpc's 440 and 970. Cross compiling valgrind is certainly
>>possible. I'm building on a pentium4 and running on the two different
>>PPC's. (but then after a bit I get a crash, doh! anyway...)
>
>
> Try the attached patch - it is against the current SVN revision and
> implements sigsuspend for x86 and ppc32. It is completely untested on
> both platforms - I don't have a ppc box to try it on anyway.
>
> Tom
>
>
>
> ------------------------------------------------------------------------
>
> Index: coregrind/m_syswrap/syswrap-generic.c
> ===================================================================
> --- coregrind/m_syswrap/syswrap-generic.c (revision 5796)
> +++ coregrind/m_syswrap/syswrap-generic.c (working copy)
> @@ -5290,24 +5290,6 @@
> 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)
> {
> Index: coregrind/m_syswrap/priv_syswrap-generic.h
> ===================================================================
> --- coregrind/m_syswrap/priv_syswrap-generic.h (revision 5796)
> +++ coregrind/m_syswrap/priv_syswrap-generic.h (working copy)
> @@ -170,7 +170,6 @@
>
> // 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?
> Index: coregrind/m_syswrap/syswrap-x86-linux.c
> ===================================================================
> --- coregrind/m_syswrap/syswrap-x86-linux.c (revision 5796)
> +++ coregrind/m_syswrap/syswrap-x86-linux.c (working copy)
> @@ -772,6 +772,7 @@
> 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);
> @@ -1694,6 +1695,24 @@
> 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);
> @@ -1863,7 +1882,7 @@
> //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
> Index: coregrind/m_syswrap/syswrap-ppc32-linux.c
> ===================================================================
> --- coregrind/m_syswrap/syswrap-ppc32-linux.c (revision 5796)
> +++ coregrind/m_syswrap/syswrap-ppc32-linux.c (working copy)
> @@ -392,6 +392,7 @@
> 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)
> {
> @@ -1424,7 +1425,21 @@
> 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
>
> @@ -1531,7 +1546,7 @@
> //..
> //.. 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 */*
> //..
|