On Wed, 2009-10-21 at 23:21 +0800, Wu Zhangjin wrote: > > +unsigned long ftrace_get_parent_addr(unsigned long self_addr, > > + unsigned long parent, > > + unsigned long parent_addr, > > + unsigned long fp) > > +{ > > + unsigned long sp, ip, ra; > > + unsigned int code; > > + > > + /* move to the instruction "move ra, at" */ > > + ip = self_addr - 8; > > + > > + /* search the text until finding the "move s8, sp" instruction or > > + * "s{d,w} ra, offset(sp)" instruction */ > > + do { > > + ip -= 4; > > + /* read the text we want to match */ > > + if (probe_kernel_read(&code, (void *)ip, 4)) { > > + WARN_ON(1); > > + panic("read the text failure\n"); > > + } > > + > > + /* if the first instruction above "move at, ra" is "move > > + * s8(fp), sp", means the function is a leaf */ > > + if ((code & MOV_FP_SP) == MOV_FP_SP) > > + return parent_addr; > > + } while (((code & S_RA) != S_RA)); > > + > > + sp = fp + (code & STACK_OFFSET_MASK); > > + ra = *(unsigned long *)sp; > > + > > Seems missed the fault protection here? is there a need? never met fault > in this place and also the following two places, so, are we safe to > remove all of the fault protection? Is that "sp" basically already been check by the above probe_kernel_read? If so, then it should be fine not to do the check again. -- Steve > > Regards > Wu Zhangjin > > > + if (ra == parent) > > + return sp; > > + else > > + panic > > + ("failed on getting stack address of ra\n: addr: 0x%lx, code: 0x%x\n", > > + ip, code); > > +} > > +