Hi Jan,
Looks like the following patch from Oleg has not been checked in ptrace
testsuite yet.
Thanks,
CAI Qian
----- "Oleg Nesterov" <o...@redhat.com> wrote:
> On 12/09, Oleg Nesterov wrote:
> >
> > Cai, Ananth, thank you.
> >
> > So. I think we can forget about the possible kernel problems (and
> > in any case we can rule out utrace).
> >
> > The test-case just wrong and should be fixed. The tracee can't execute
> > the function descriptor in data section, that is why it gets SIGSEGV.
> >
> > > while the '.func_name' is the text address.
> >
> > tried to change the code to
> >
> > REGS_ACCESS (regs, nip) = (unsigned long) .raise_sigusr2
> >
> > but gcc doesn't like this ;)
> >
> > > (See
> > > handle_rt_signal64 in arch/powerpc/kernel/signal_64.c and
> > > kprobe_lookup_name in arch/powerpc/include/asm/kprobes.h.
> >
> > Thanks... looking at handle_rt_signal64(), looks like we should
> > also set regs->gpr[2] = funct_desc_ptr->toc if we change regs->nip
> >
> >
> > I hope someone who understand powerpc could fix the test-case ;)
>
> Yes, I verified the patch below fixes step-jump-cont.c on
> ibm-js20-02.lab.bos.redhat.com.
>
> Oleg.
>
> --- step-jump-cont.c~ 2009-12-09 12:17:04.367733643 -0500
> +++ step-jump-cont.c 2009-12-09 13:12:50.708535770 -0500
> @@ -153,12 +153,19 @@ raise_sigusr2 (void)
> assert (0);
> }
>
> +typedef struct {
> + unsigned long entry;
> + unsigned long toc;
> + unsigned long env;
> +} func_descr_t;
> +
> int main (void)
> {
> long l;
> int status;
> pid_t pid;
> REGS_TYPE (regs);
> + func_descr_t *fp;
>
> setbuf (stdout, NULL);
> atexit (cleanup);
> @@ -214,7 +221,12 @@ int main (void)
> #elif defined __x86_64__
> REGS_ACCESS (regs, rip) = (unsigned long) raise_sigusr2;
> #elif defined __powerpc__
> - REGS_ACCESS (regs, nip) = (unsigned long) raise_sigusr2;
> +
> + fp = (void*)raise_sigusr2;
> +
> + REGS_ACCESS(regs, nip) = fp->entry;
> + REGS_ACCESS(regs, gpr[2]) = fp->toc;
> +
> #else
> # error "Check outer #ifdef"
> #endif