On Fri, 2010-03-12 at 19:43 +0800, Wu Zhangjin wrote: [...] > Right, then, we can search the JAL or JALR, for kernel, will get it > immediatly, for module, will only several instructions, we can do this > searching in ftrace_make_nop and ftrace_make_call at run-time, but just > found we can use the following function to do it in ftrace_init(), looks > good. > > static inline int is_call_mcount(unsigned int insn) > { > return ((insn & JAL) == JAL) || (insn == JALR_V1); > } > > static inline unsinged long mcount_callsite(unsigned long addr) > { > unsigned int insn; > > insn = *(unsigned int *)addr; /*need safe_load_code*/ > if (is_call_mcount(insn)) > return addr; > > do { > addr += 4; /* what about big endian? */ > insn = *(unsigned int *)addr; /*need safe_load_code*/ > } while (!is_call_mcount(insn)); > This is not possible for modules, for currently, the modules are not loaded yet. Regards, Wu Zhangjin