From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org
Cc: Ingo Molnar <mingo@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Russell King <rmk+kernel@armlinux.org.uk>,
Rabin Vincent <rabin@rab.in>, Stephen Boyd <sboyd@codeaurora.org>
Subject: [for-next][PATCH 01/17] recordmcount: arm: Implement make_nop
Date: Wed, 23 Nov 2016 10:35:13 -0500 [thread overview]
Message-ID: <20161123153527.359958486@goodmis.org> (raw)
In-Reply-To: 20161123153512.923515549@goodmis.org
[-- Attachment #1: 0001-recordmcount-arm-Implement-make_nop.patch --]
[-- Type: text/plain, Size: 3670 bytes --]
From: Stephen Boyd <sboyd@codeaurora.org>
In similar spirit to x86 and arm64 support, add a make_nop_arm()
to replace calls to mcount with a nop in sections that aren't
traced.
Link: http://lkml.kernel.org/r/20161018234200.5804-1-sboyd@codeaurora.org
Acked-by: Russell King <rmk+kernel@armlinux.org.uk>
Acked-by: Rabin Vincent <rabin@rab.in>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
scripts/recordmcount.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 65 insertions(+)
diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c
index 5423a58d1b06..aeb34223167c 100644
--- a/scripts/recordmcount.c
+++ b/scripts/recordmcount.c
@@ -213,6 +213,59 @@ static int make_nop_x86(void *map, size_t const offset)
return 0;
}
+static unsigned char ideal_nop4_arm_le[4] = { 0x00, 0x00, 0xa0, 0xe1 }; /* mov r0, r0 */
+static unsigned char ideal_nop4_arm_be[4] = { 0xe1, 0xa0, 0x00, 0x00 }; /* mov r0, r0 */
+static unsigned char *ideal_nop4_arm;
+
+static unsigned char bl_mcount_arm_le[4] = { 0xfe, 0xff, 0xff, 0xeb }; /* bl */
+static unsigned char bl_mcount_arm_be[4] = { 0xeb, 0xff, 0xff, 0xfe }; /* bl */
+static unsigned char *bl_mcount_arm;
+
+static unsigned char push_arm_le[4] = { 0x04, 0xe0, 0x2d, 0xe5 }; /* push {lr} */
+static unsigned char push_arm_be[4] = { 0xe5, 0x2d, 0xe0, 0x04 }; /* push {lr} */
+static unsigned char *push_arm;
+
+static unsigned char ideal_nop2_thumb_le[2] = { 0x00, 0xbf }; /* nop */
+static unsigned char ideal_nop2_thumb_be[2] = { 0xbf, 0x00 }; /* nop */
+static unsigned char *ideal_nop2_thumb;
+
+static unsigned char push_bl_mcount_thumb_le[6] = { 0x00, 0xb5, 0xff, 0xf7, 0xfe, 0xff }; /* push {lr}, bl */
+static unsigned char push_bl_mcount_thumb_be[6] = { 0xb5, 0x00, 0xf7, 0xff, 0xff, 0xfe }; /* push {lr}, bl */
+static unsigned char *push_bl_mcount_thumb;
+
+static int make_nop_arm(void *map, size_t const offset)
+{
+ char *ptr;
+ int cnt = 1;
+ int nop_size;
+ size_t off = offset;
+
+ ptr = map + offset;
+ if (memcmp(ptr, bl_mcount_arm, 4) == 0) {
+ if (memcmp(ptr - 4, push_arm, 4) == 0) {
+ off -= 4;
+ cnt = 2;
+ }
+ ideal_nop = ideal_nop4_arm;
+ nop_size = 4;
+ } else if (memcmp(ptr - 2, push_bl_mcount_thumb, 6) == 0) {
+ cnt = 3;
+ nop_size = 2;
+ off -= 2;
+ ideal_nop = ideal_nop2_thumb;
+ } else
+ return -1;
+
+ /* Convert to nop */
+ ulseek(fd_map, off, SEEK_SET);
+
+ do {
+ uwrite(fd_map, ideal_nop, nop_size);
+ } while (--cnt > 0);
+
+ return 0;
+}
+
static unsigned char ideal_nop4_arm64[4] = {0x1f, 0x20, 0x03, 0xd5};
static int make_nop_arm64(void *map, size_t const offset)
{
@@ -430,6 +483,11 @@ do_file(char const *const fname)
w2 = w2rev;
w8 = w8rev;
}
+ ideal_nop4_arm = ideal_nop4_arm_le;
+ bl_mcount_arm = bl_mcount_arm_le;
+ push_arm = push_arm_le;
+ ideal_nop2_thumb = ideal_nop2_thumb_le;
+ push_bl_mcount_thumb = push_bl_mcount_thumb_le;
break;
case ELFDATA2MSB:
if (*(unsigned char const *)&endian != 0) {
@@ -438,6 +496,11 @@ do_file(char const *const fname)
w2 = w2rev;
w8 = w8rev;
}
+ ideal_nop4_arm = ideal_nop4_arm_be;
+ bl_mcount_arm = bl_mcount_arm_be;
+ push_arm = push_arm_be;
+ ideal_nop2_thumb = ideal_nop2_thumb_be;
+ push_bl_mcount_thumb = push_bl_mcount_thumb_be;
break;
} /* end switch */
if (memcmp(ELFMAG, ehdr->e_ident, SELFMAG) != 0
@@ -463,6 +526,8 @@ do_file(char const *const fname)
break;
case EM_ARM: reltype = R_ARM_ABS32;
altmcount = "__gnu_mcount_nc";
+ make_nop = make_nop_arm;
+ rel_type_nop = R_ARM_NONE;
break;
case EM_AARCH64:
reltype = R_AARCH64_ABS64;
--
2.10.2
next prev parent reply other threads:[~2016-11-23 15:39 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-23 15:35 [for-next][PATCH 00/17] tracing: Updates for 4.10 Steven Rostedt
2016-11-23 15:35 ` Steven Rostedt [this message]
2016-11-23 15:35 ` [for-next][PATCH 02/17] tracing: Add new trace_marker_raw Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 03/17] selftests: ftrace: Initialize ftrace before each test Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 04/17] selftests: ftrace: Add --quiet option not to show error logs on screen Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 05/17] selftests: ftrace: Check whether snapshot trigger is supported correctly Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 06/17] selftests: ftrace: Fix trigger-mod to run without syscall trace Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 07/17] selftests: ftrace: Hide ftracetest logs from git Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 08/17] selftests: ftrace: Introduce TMPDIR for temporary files Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 09/17] selftests: ftrace: Add a testcase for function filter glob match Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 10/17] selftests: ftrace: Add a testcase for types of kprobe event Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 11/17] tracing: Add hook to function tracing for other subsystems to use Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 12/17] stm class: ftrace: Add ftrace-export-over-stm driver Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 13/17] coresight: Mark stm_generic_packet() with notrace Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 14/17] intel_th: Mark sth_stm_packet() " Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 15/17] stm dummy: Mark dummy_stm_packet() " Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 16/17] stm: Mark the functions of writing STM " Steven Rostedt
2016-11-23 15:35 ` [for-next][PATCH 17/17] tracing: Add error checks to creation of event files Steven Rostedt
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=20161123153527.359958486@goodmis.org \
--to=rostedt@goodmis.org \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=rabin@rab.in \
--cc=rmk+kernel@armlinux.org.uk \
--cc=sboyd@codeaurora.org \
/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