From patchwork Sun Oct 25 21:48:36 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Helge Deller X-Patchwork-Id: 55798 X-Patchwork-Delegate: kyle@mcmartin.ca Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n9PLjts5018819 for ; Sun, 25 Oct 2009 21:48:40 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754149AbZJYVsf (ORCPT ); Sun, 25 Oct 2009 17:48:35 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754192AbZJYVsf (ORCPT ); Sun, 25 Oct 2009 17:48:35 -0400 Received: from mail.gmx.net ([213.165.64.20]:60150 "HELO mail.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S1754149AbZJYVse (ORCPT ); Sun, 25 Oct 2009 17:48:34 -0400 Received: (qmail invoked by alias); 25 Oct 2009 21:48:37 -0000 Received: from p4FDB39B5.dip0.t-ipconnect.de (EHLO p100.box) [79.219.57.181] by mail.gmx.net (mp023) with SMTP; 25 Oct 2009 22:48:37 +0100 X-Authenticated: #1045983 X-Provags-ID: V01U2FsdGVkX1/PeAk02EbPoB95R1KyAbXmOj8fcPRnmg4C9aU5BN 2heOEh+JTNI8ug Date: Sun, 25 Oct 2009 22:48:36 +0100 From: Helge Deller To: linux-parisc@vger.kernel.org, Kyle McMartin , Randolph Chung Subject: [PATCH] parisc: add CALLER_ADDR{0-6} macros Message-ID: <20091025214836.GA15038@p100.box> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.19 (2009-01-05) X-Y-GMX-Trusted: 0 X-FuHaFi: 0.5 Sender: linux-parisc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-parisc@vger.kernel.org diff --git a/arch/parisc/include/asm/ftrace.h b/arch/parisc/include/asm/ftrace.h index 2fa05dd..72c0faf 100644 --- a/arch/parisc/include/asm/ftrace.h +++ b/arch/parisc/include/asm/ftrace.h @@ -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 */ diff --git a/arch/parisc/kernel/unwind.c b/arch/parisc/kernel/unwind.c index 69dad5a..6c631bf 100644 --- a/arch/parisc/kernel/unwind.c +++ b/arch/parisc/kernel/unwind.c @@ -417,3 +429,31 @@ 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; +} +