On Mon, Jan 25, 2010 at 23:02, <[email protected]> wrote: > Revision 8232 Author adamliyi Date 2010-01-25 23:02:44 -0500 (Mon, 25 Jan > 2010) > > Log Message > > Add CALLER_ADDR macro used by ftrace. > > trunk/arch/blackfin/include/asm/ftrace.h > > +extern inline void *return_address(unsigned int level) > +{ > + unsigned long *endstack, *fp, *ret_addr; > + unsigned int current_level = 0; > + > + ret_addr = (unsigned long *)__builtin_return_address(0); > + fp = (unsigned long *)__builtin_frame_address(0); > + endstack = (unsigned long *)PAGE_ALIGN((unsigned int)&level); > + > + if (level == 0 > + || !(fp && ((unsigned int)fp & 0x3) == 0 && fp < endstack)) > + return ret_addr; > + > + fp = (unsigned long *)*fp; > + while (current_level < level && fp && ((unsigned int)fp & 0x3) == 0 > + && (fp + 1) < endstack) { > + ret_addr = (unsigned long *)*(fp + 1); > + current_level++; > + fp = (unsigned long *)*fp;
what if we declared fp as unsigned long ** ? then we wouldnt need these casts ... > + } > + > + if (current_level < level) > + ret_addr = NULL; > + > + return ret_addr; > +} we have similar code in traps.c:show_stack() ... wonder if we can unify these some how ... > +/* inline function or macro may lead to unexpected result */ > +#define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) > +#define CALLER_ADDR1 ((unsigned long)return_address(1)) > +#define CALLER_ADDR2 ((unsigned long)return_address(2)) > +#define CALLER_ADDR3 ((unsigned long)return_address(3)) > +#define CALLER_ADDR4 ((unsigned long)return_address(4)) > +#define CALLER_ADDR5 ((unsigned long)return_address(5)) > +#define CALLER_ADDR6 ((unsigned long)return_address(6)) be nice if __builtin_return_address() supported these ... -mike _______________________________________________ Linux-kernel-commits mailing list [email protected] https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits
