linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: madvenka@linux.microsoft.com
To: jpoimboe@redhat.com, peterz@infradead.org,
	chenzhongjin@huawei.com, mark.rutland@arm.com,
	broonie@kernel.org, nobuta.keiya@fujitsu.com,
	sjitindarsingh@gmail.com, catalin.marinas@arm.com,
	will@kernel.org, jamorris@linux.microsoft.com,
	linux-arm-kernel@lists.infradead.org,
	live-patching@vger.kernel.org, linux-kernel@vger.kernel.org,
	madvenka@linux.microsoft.com
Subject: [RFC PATCH v2 10/20] objtool: arm64: Compute destinations for call and jump instructions
Date: Mon, 23 May 2022 19:16:27 -0500	[thread overview]
Message-ID: <20220524001637.1707472-11-madvenka@linux.microsoft.com> (raw)
In-Reply-To: <20220524001637.1707472-1-madvenka@linux.microsoft.com>

From: "Madhavan T. Venkataraman" <madvenka@linux.microsoft.com>

Compute the destination address of each call and jump instruction after
decoding all the instructions.

Signed-off-by: Madhavan T. Venkataraman <madvenka@linux.microsoft.com>
---
 tools/objtool/arch/arm64/decode.c | 12 ++++++++
 tools/objtool/fpv.c               | 47 ++++++++++++++++++++++++++++++-
 2 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/tools/objtool/arch/arm64/decode.c b/tools/objtool/arch/arm64/decode.c
index 8a9ff030085d..f9df8b321659 100644
--- a/tools/objtool/arch/arm64/decode.c
+++ b/tools/objtool/arch/arm64/decode.c
@@ -33,6 +33,18 @@ struct decode {
 				s64 *imm, struct list_head *stack_ops);
 };
 
+/* --------------------- arch support functions ------------------------- */
+
+unsigned long arch_dest_reloc_offset(int addend)
+{
+	return addend;
+}
+
+unsigned long arch_jump_destination(struct instruction *insn)
+{
+	return insn->offset + insn->immediate;
+}
+
 /* --------------------- miscellaneous functions --------------------------- */
 
 static void reg_check(unsigned int sp_check, unsigned int fp_check,
diff --git a/tools/objtool/fpv.c b/tools/objtool/fpv.c
index 76f0f2e611a8..92ad0d0aac8e 100644
--- a/tools/objtool/fpv.c
+++ b/tools/objtool/fpv.c
@@ -13,7 +13,52 @@
 #include <objtool/insn.h>
 #include <objtool/warn.h>
 
+/*
+ * Find the destination instructions for all jumps.
+ */
+static void add_jump_destinations(struct objtool_file *file)
+{
+	struct instruction *insn;
+	struct reloc *reloc;
+	struct section *dest_sec;
+	unsigned long dest_off;
+
+	for_each_insn(file, insn) {
+		if (insn->type != INSN_CALL &&
+		    insn->type != INSN_JUMP_CONDITIONAL &&
+		    insn->type != INSN_JUMP_UNCONDITIONAL) {
+			continue;
+		}
+
+		reloc = insn_reloc(file, insn);
+		if (!reloc) {
+			dest_sec = insn->sec;
+			dest_off = arch_jump_destination(insn);
+		} else if (reloc->sym->type == STT_SECTION) {
+			dest_sec = reloc->sym->sec;
+			dest_off = arch_dest_reloc_offset(reloc->addend);
+		} else if (reloc->sym->sec->idx) {
+			dest_sec = reloc->sym->sec;
+			dest_off = reloc->sym->sym.st_value +
+				   arch_dest_reloc_offset(reloc->addend);
+		} else {
+			/* non-func asm code jumping to another file */
+			continue;
+		}
+
+		insn->jump_dest = find_insn(file, dest_sec, dest_off);
+	}
+}
+
 int fpv_decode(struct objtool_file *file)
 {
-	return decode_instructions(file);
+	int ret;
+
+	ret = decode_instructions(file);
+	if (ret)
+		return ret;
+
+	add_jump_destinations(file);
+
+	return 0;
 }
-- 
2.25.1


  parent reply	other threads:[~2022-05-24  0:17 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <e81e773678f88f7c2ff7480e2eb096973ec198db>
2022-05-24  0:16 ` [RFC PATCH v2 00/20] arm64: livepatch: Use ORC for dynamic frame pointer validation madvenka
2022-05-24  0:16   ` [RFC PATCH v2 01/20] objtool: Reorganize CFI code madvenka
2022-05-24  0:16   ` [RFC PATCH v2 02/20] objtool: Reorganize instruction-related code madvenka
2022-05-24  0:16   ` [RFC PATCH v2 03/20] objtool: Move decode_instructions() to a separate file madvenka
2022-05-24  0:16   ` [RFC PATCH v2 04/20] objtool: Reorganize Unwind hint code madvenka
2022-05-24  0:16   ` [RFC PATCH v2 05/20] objtool: Reorganize ORC types madvenka
2022-05-24 14:27     ` Chen Zhongjin
2022-05-29 15:36       ` Madhavan T. Venkataraman
2022-05-24  0:16   ` [RFC PATCH v2 06/20] objtool: Reorganize ORC code madvenka
2022-05-24  0:16   ` [RFC PATCH v2 07/20] objtool: Reorganize ORC kernel code madvenka
2022-05-24  0:16   ` [RFC PATCH v2 08/20] objtool: arm64: Implement decoder for FP validation madvenka
2022-05-24  0:16   ` [RFC PATCH v2 09/20] objtool: arm64: Implement command to invoke the decoder madvenka
2022-05-24 14:09     ` Mark Brown
2022-05-29 14:49       ` Madhavan T. Venkataraman
2022-05-30  7:51         ` Peter Zijlstra
2022-06-01 22:45           ` Madhavan T. Venkataraman
2022-06-07 18:13             ` Madhavan T. Venkataraman
2022-05-24  0:16   ` madvenka [this message]
2022-05-24  0:16   ` [RFC PATCH v2 11/20] objtool: arm64: Walk instructions and compute CFI for each instruction madvenka
2022-05-24 13:45     ` Chen Zhongjin
2022-05-29 15:18       ` Madhavan T. Venkataraman
2022-05-30  1:44         ` Chen Zhongjin
2022-05-24  0:16   ` [RFC PATCH v2 12/20] objtool: arm64: Generate ORC data from CFI for object files madvenka
2022-05-24  0:16   ` [RFC PATCH v2 13/20] objtool: arm64: Dump ORC data present in " madvenka
2022-05-24  0:16   ` [RFC PATCH v2 14/20] objtool: arm64: Add unwind hint support madvenka
2022-05-24  0:16   ` [RFC PATCH v2 15/20] arm64: Add unwind hints to specific points in code madvenka
2022-05-24  0:16   ` [RFC PATCH v2 16/20] arm64: Add kernel and module support for ORC madvenka
2022-05-24  0:16   ` [RFC PATCH v2 17/20] arm64: Build the kernel with ORC information madvenka
2022-05-24  0:16   ` [RFC PATCH v2 18/20] arm64: unwinder: Add a reliability check in the unwinder based on ORC madvenka
2022-05-24  0:16   ` [RFC PATCH v2 19/20] arm64: Miscellaneous changes required for enabling livepatch madvenka
2022-07-01 14:16     ` Miroslav Benes
2022-07-01 19:53       ` Madhavan T. Venkataraman
2022-05-24  0:16   ` [RFC PATCH v2 20/20] arm64: Enable livepatch for ARM64 madvenka
2022-05-24 14:24   ` [RFC PATCH v2 00/20] arm64: livepatch: Use ORC for dynamic frame pointer validation Chen Zhongjin
2022-05-29 15:30     ` Madhavan T. Venkataraman
2022-06-15 12:18   ` Ivan T. Ivanov
2022-06-15 13:37     ` Mark Rutland
2022-06-15 14:18       ` Ivan T. Ivanov
2022-06-15 20:50       ` Madhavan T. Venkataraman
2022-06-15 20:47     ` Madhavan T. Venkataraman

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=20220524001637.1707472-11-madvenka@linux.microsoft.com \
    --to=madvenka@linux.microsoft.com \
    --cc=broonie@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=chenzhongjin@huawei.com \
    --cc=jamorris@linux.microsoft.com \
    --cc=jpoimboe@redhat.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=live-patching@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=nobuta.keiya@fujitsu.com \
    --cc=peterz@infradead.org \
    --cc=sjitindarsingh@gmail.com \
    --cc=will@kernel.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;
as well as URLs for NNTP newsgroup(s).