Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

parisc: add CALLER_ADDR{0-6} macros

Signed-off-by: Helge Deller <deller@gmx.de>
Signed-off-by: Kyle McMartin <kyle@mcmartin.ca>

authored by

Helge Deller and committed by
Kyle McMartin
11e17809 b29f9037

+41
+14
arch/parisc/include/asm/ftrace.h
··· 20 20 * Defined in entry.S 21 21 */ 22 22 extern void return_to_handler(void); 23 + 24 + 25 + extern unsigned long return_address(unsigned int); 26 + 27 + #define HAVE_ARCH_CALLER_ADDR 28 + 29 + #define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) 30 + #define CALLER_ADDR1 return_address(1) 31 + #define CALLER_ADDR2 return_address(2) 32 + #define CALLER_ADDR3 return_address(3) 33 + #define CALLER_ADDR4 return_address(4) 34 + #define CALLER_ADDR5 return_address(5) 35 + #define CALLER_ADDR6 return_address(6) 36 + 23 37 #endif /* __ASSEMBLY__ */ 24 38 25 39 #endif /* _ASM_PARISC_FTRACE_H */
+27
arch/parisc/kernel/unwind.c
··· 417 417 418 418 return ret; 419 419 } 420 + 421 + unsigned long return_address(unsigned int level) 422 + { 423 + struct unwind_frame_info info; 424 + struct pt_regs r; 425 + unsigned long sp; 426 + 427 + /* initialize unwind info */ 428 + asm volatile ("copy %%r30, %0" : "=r"(sp)); 429 + memset(&r, 0, sizeof(struct pt_regs)); 430 + r.iaoq[0] = (unsigned long) current_text_addr(); 431 + r.gr[2] = (unsigned long) __builtin_return_address(0); 432 + r.gr[30] = sp; 433 + unwind_frame_init(&info, current, &r); 434 + 435 + /* unwind stack */ 436 + ++level; 437 + do { 438 + if (unwind_once(&info) < 0 || info.ip == 0) 439 + return 0; 440 + if (!__kernel_text_address(info.ip)) { 441 + return 0; 442 + } 443 + } while (info.ip && level--); 444 + 445 + return info.ip; 446 + }