From: Anshuman Khandual <khandual@linux.vnet.ibm.com>
To: linuxppc-dev@ozlabs.org
Cc: dja@axtens.net, mpe@ellerman.id.au, sukadev@linux.vnet.ibm.com,
mikey@neuling.org
Subject: [PATCH V9 09/13] powerpc, lib: Add new branch analysis support functions
Date: Mon, 15 Jun 2015 17:41:04 +0530 [thread overview]
Message-ID: <1434370268-19056-10-git-send-email-khandual@linux.vnet.ibm.com> (raw)
In-Reply-To: <1434370268-19056-1-git-send-email-khandual@linux.vnet.ibm.com>
Generic powerpc branch analysis support added in the code patching
library which will help the subsequent patch on SW based filtering
of branch records in perf.
Signed-off-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
---
arch/powerpc/include/asm/code-patching.h | 15 ++++++++
arch/powerpc/lib/code-patching.c | 60 ++++++++++++++++++++++++++++++++
2 files changed, 75 insertions(+)
diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h
index 840a550..0a6f0d8 100644
--- a/arch/powerpc/include/asm/code-patching.h
+++ b/arch/powerpc/include/asm/code-patching.h
@@ -22,6 +22,16 @@
#define BRANCH_SET_LINK 0x1
#define BRANCH_ABSOLUTE 0x2
+#define XL_FORM_LR 0x4C000020
+#define XL_FORM_CTR 0x4C000420
+#define XL_FORM_TAR 0x4C000460
+
+#define BO_ALWAYS 0x02800000
+#define BO_CTR 0x02000000
+#define BO_CRBI_OFF 0x00800000
+#define BO_CRBI_ON 0x01800000
+#define BO_CRBI_HINT 0x00400000
+
unsigned int create_branch(const unsigned int *addr,
unsigned long target, int flags);
unsigned int create_cond_branch(const unsigned int *addr,
@@ -99,4 +109,9 @@ static inline unsigned long ppc_global_function_entry(void *func)
#endif
}
+bool instr_is_return_branch(unsigned int instr);
+bool instr_is_conditional_branch(unsigned int instr);
+bool instr_is_func_call(unsigned int instr);
+bool instr_is_indirect_func_call(unsigned int instr);
+
#endif /* _ASM_POWERPC_CODE_PATCHING_H */
diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c
index d5edbeb..46fbcca 100644
--- a/arch/powerpc/lib/code-patching.c
+++ b/arch/powerpc/lib/code-patching.c
@@ -87,6 +87,66 @@ static int instr_is_branch_bform(unsigned int instr)
return branch_opcode(instr) == 16;
}
+static bool instr_is_branch_xlform(unsigned int instr)
+{
+ return branch_opcode(instr) == 19;
+}
+
+static bool is_xlform_lr(unsigned int instr)
+{
+ return (instr & XL_FORM_LR) == XL_FORM_LR;
+}
+
+static bool is_bo_always(unsigned int instr)
+{
+ return (instr & BO_ALWAYS) == BO_ALWAYS;
+}
+
+static bool is_branch_link_set(unsigned int instr)
+{
+ return (instr & BRANCH_SET_LINK) == BRANCH_SET_LINK;
+}
+
+bool instr_is_return_branch(unsigned int instr)
+{
+ /*
+ * Conditional and unconditional branch to LR register
+ * without seting the link register.
+ */
+ if (is_xlform_lr(instr) && !is_branch_link_set(instr))
+ return true;
+
+ return false;
+}
+
+bool instr_is_conditional_branch(unsigned int instr)
+{
+ /* I-form instruction - excluded */
+ if (instr_is_branch_iform(instr))
+ return false;
+
+ /* B-form or XL-form instruction */
+ if (instr_is_branch_bform(instr) || instr_is_branch_xlform(instr)) {
+
+ /* Not branch always */
+ if (!is_bo_always(instr))
+ return true;
+ }
+ return false;
+}
+
+bool instr_is_func_call(unsigned int instr)
+{
+ /* LR should be set */
+ return is_branch_link_set(instr);
+}
+
+bool instr_is_indirect_func_call(unsigned int instr)
+{
+ /* XL-form instruction with LR set */
+ return (instr_is_branch_xlform(instr) && is_branch_link_set(instr));
+}
+
int instr_is_relative_branch(unsigned int instr)
{
if (instr & BRANCH_ABSOLUTE)
--
2.1.0
next prev parent reply other threads:[~2015-06-15 12:11 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-15 12:10 [PATCH V9 00/13] powerpc, perf: Enable SW branch filters Anshuman Khandual
2015-06-15 12:10 ` [PATCH V9 01/13] powerpc, perf: Drop the branch sample when 'from' cannot be fetched Anshuman Khandual
2015-06-15 12:10 ` [PATCH V9 02/13] powerpc, perf: Change type of the bhrb_users variable Anshuman Khandual
2015-06-25 5:42 ` Daniel Axtens
2015-06-25 12:51 ` Anshuman Khandual
2015-06-15 12:10 ` [PATCH V9 03/13] powerpc, perf: Replace last usage of get_cpu_var with this_cpu_ptr Anshuman Khandual
2015-06-15 12:10 ` [PATCH V9 04/13] powerpc, perf: Restore privilege level filter support for BHRB Anshuman Khandual
2015-06-25 5:02 ` Daniel Axtens
2015-06-25 12:51 ` Anshuman Khandual
2015-06-15 12:11 ` [PATCH V9 05/13] powerpc, perf: Change name & type of 'pred' in power_pmu_bhrb_read Anshuman Khandual
2015-06-25 5:11 ` Daniel Axtens
2015-06-25 12:52 ` Anshuman Khandual
2015-06-15 12:11 ` [PATCH V9 06/13] powerpc, perf: Re organize BHRB processing Anshuman Khandual
2015-06-25 5:52 ` Daniel Axtens
2015-06-25 12:52 ` Anshuman Khandual
2015-06-15 12:11 ` [PATCH V9 07/13] powerpc, perf: Re organize PMU branch filter processing on POWER8 Anshuman Khandual
2015-06-15 12:11 ` [PATCH V9 08/13] powerpc, perf: Change the name of HW PMU branch filter tracking variable Anshuman Khandual
2015-06-15 12:11 ` Anshuman Khandual [this message]
2015-06-15 12:11 ` [PATCH V9 10/13] powerpc, perf: Enable SW filtering in branch stack sampling framework Anshuman Khandual
2015-06-15 12:11 ` [PATCH V9 11/13] powerpc, perf: Change POWER8 PMU configuration to work with SW filters Anshuman Khandual
2015-06-15 12:11 ` [PATCH V9 12/13] powerpc, perf: Enable privilege mode SW branch filters Anshuman Khandual
2015-06-15 12:11 ` [PATCH V9 13/13] selftests, powerpc: Add test for BHRB branch filters (HW & SW) Anshuman Khandual
2015-06-25 6:18 ` [PATCH V9 00/13] powerpc, perf: Enable SW branch filters Daniel Axtens
2015-06-25 12:50 ` Anshuman Khandual
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1434370268-19056-10-git-send-email-khandual@linux.vnet.ibm.com \
--to=khandual@linux.vnet.ibm.com \
--cc=dja@axtens.net \
--cc=linuxppc-dev@ozlabs.org \
--cc=mikey@neuling.org \
--cc=mpe@ellerman.id.au \
--cc=sukadev@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).