Loading arch/parisc/include/asm/ftrace.h +14 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,20 @@ struct ftrace_ret_stack { * Defined in entry.S */ extern void return_to_handler(void); extern unsigned long return_address(unsigned int); #define HAVE_ARCH_CALLER_ADDR #define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) #define CALLER_ADDR1 return_address(1) #define CALLER_ADDR2 return_address(2) #define CALLER_ADDR3 return_address(3) #define CALLER_ADDR4 return_address(4) #define CALLER_ADDR5 return_address(5) #define CALLER_ADDR6 return_address(6) #endif /* __ASSEMBLY__ */ #endif /* _ASM_PARISC_FTRACE_H */ arch/parisc/kernel/unwind.c +27 −0 Original line number Diff line number Diff line Loading @@ -417,3 +417,30 @@ int unwind_to_user(struct unwind_frame_info *info) return ret; } unsigned long return_address(unsigned int level) { struct unwind_frame_info info; struct pt_regs r; unsigned long sp; /* initialize unwind info */ asm volatile ("copy %%r30, %0" : "=r"(sp)); memset(&r, 0, sizeof(struct pt_regs)); r.iaoq[0] = (unsigned long) current_text_addr(); r.gr[2] = (unsigned long) __builtin_return_address(0); r.gr[30] = sp; unwind_frame_init(&info, current, &r); /* unwind stack */ ++level; do { if (unwind_once(&info) < 0 || info.ip == 0) return 0; if (!__kernel_text_address(info.ip)) { return 0; } } while (info.ip && level--); return info.ip; } Loading
arch/parisc/include/asm/ftrace.h +14 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,20 @@ struct ftrace_ret_stack { * Defined in entry.S */ extern void return_to_handler(void); extern unsigned long return_address(unsigned int); #define HAVE_ARCH_CALLER_ADDR #define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) #define CALLER_ADDR1 return_address(1) #define CALLER_ADDR2 return_address(2) #define CALLER_ADDR3 return_address(3) #define CALLER_ADDR4 return_address(4) #define CALLER_ADDR5 return_address(5) #define CALLER_ADDR6 return_address(6) #endif /* __ASSEMBLY__ */ #endif /* _ASM_PARISC_FTRACE_H */
arch/parisc/kernel/unwind.c +27 −0 Original line number Diff line number Diff line Loading @@ -417,3 +417,30 @@ int unwind_to_user(struct unwind_frame_info *info) return ret; } unsigned long return_address(unsigned int level) { struct unwind_frame_info info; struct pt_regs r; unsigned long sp; /* initialize unwind info */ asm volatile ("copy %%r30, %0" : "=r"(sp)); memset(&r, 0, sizeof(struct pt_regs)); r.iaoq[0] = (unsigned long) current_text_addr(); r.gr[2] = (unsigned long) __builtin_return_address(0); r.gr[30] = sp; unwind_frame_init(&info, current, &r); /* unwind stack */ ++level; do { if (unwind_once(&info) < 0 || info.ip == 0) return 0; if (!__kernel_text_address(info.ip)) { return 0; } } while (info.ip && level--); return info.ip; }