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