From: Masami Hiramatsu <mhiramat@kernel.org>
To: linux-kernel@vger.kernel.org, Peter Zijlstra <peterz@infradead.org>
Cc: Eddy Wu <Eddy_Wu@trendmicro.com>,
x86@kernel.org, "David S . Miller" <davem@davemloft.net>,
Steven Rostedt <rostedt@goodmis.org>,
Ingo Molnar <mingo@redhat.com>,
"Naveen N . Rao" <naveen.n.rao@linux.ibm.com>,
Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>,
linux-arch@vger.kernel.org
Subject: [PATCH v2 04/15] arm64: kprobes: Use generic kretprobe trampoline handler
Date: Thu, 27 Aug 2020 20:35:58 +0900 [thread overview]
Message-ID: <159852815852.707944.5762596519409476309.stgit@devnote2> (raw)
In-Reply-To: <159852811819.707944.12798182250041968537.stgit@devnote2>
Use the generic kretprobe trampoline handler, and use the
kernel_stack_pointer(regs) for framepointer verification.
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
arch/arm64/kernel/probes/kprobes.c | 79 ++----------------------------------
1 file changed, 4 insertions(+), 75 deletions(-)
diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c
index 5290f17a4d80..1e4768001039 100644
--- a/arch/arm64/kernel/probes/kprobes.c
+++ b/arch/arm64/kernel/probes/kprobes.c
@@ -464,87 +464,16 @@ int __init arch_populate_kprobe_blacklist(void)
void __kprobes __used *trampoline_probe_handler(struct pt_regs *regs)
{
- struct kretprobe_instance *ri = NULL;
- struct hlist_head *head, empty_rp;
- struct hlist_node *tmp;
- unsigned long flags, orig_ret_address = 0;
- unsigned long trampoline_address =
- (unsigned long)&kretprobe_trampoline;
- kprobe_opcode_t *correct_ret_addr = NULL;
-
- INIT_HLIST_HEAD(&empty_rp);
- kretprobe_hash_lock(current, &head, &flags);
-
- /*
- * It is possible to have multiple instances associated with a given
- * task either because multiple functions in the call path have
- * return probes installed on them, and/or more than one
- * return probe was registered for a target function.
- *
- * We can handle this because:
- * - instances are always pushed into the head of the list
- * - when multiple return probes are registered for the same
- * function, the (chronologically) first instance's ret_addr
- * will be the real return address, and all the rest will
- * point to kretprobe_trampoline.
- */
- hlist_for_each_entry_safe(ri, tmp, head, hlist) {
- if (ri->task != current)
- /* another task is sharing our hash bucket */
- continue;
-
- orig_ret_address = (unsigned long)ri->ret_addr;
-
- if (orig_ret_address != trampoline_address)
- /*
- * This is the real return address. Any other
- * instances associated with this task are for
- * other calls deeper on the call stack
- */
- break;
- }
-
- kretprobe_assert(ri, orig_ret_address, trampoline_address);
-
- correct_ret_addr = ri->ret_addr;
- hlist_for_each_entry_safe(ri, tmp, head, hlist) {
- if (ri->task != current)
- /* another task is sharing our hash bucket */
- continue;
-
- orig_ret_address = (unsigned long)ri->ret_addr;
- if (ri->rp && ri->rp->handler) {
- __this_cpu_write(current_kprobe, &ri->rp->kp);
- get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
- ri->ret_addr = correct_ret_addr;
- ri->rp->handler(ri, regs);
- __this_cpu_write(current_kprobe, NULL);
- }
-
- recycle_rp_inst(ri, &empty_rp);
-
- if (orig_ret_address != trampoline_address)
- /*
- * This is the real return address. Any other
- * instances associated with this task are for
- * other calls deeper on the call stack
- */
- break;
- }
-
- kretprobe_hash_unlock(current, &flags);
-
- hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
- hlist_del(&ri->hlist);
- kfree(ri);
- }
- return (void *)orig_ret_address;
+ return (void *)kretprobe_trampoline_handler(regs,
+ (unsigned long)&kretprobe_trampoline,
+ (void *)kernel_stack_pointer(regs));
}
void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
struct pt_regs *regs)
{
ri->ret_addr = (kprobe_opcode_t *)regs->regs[30];
+ ri->fp = (void *)kernel_stack_pointer(regs);
/* replace return addr (x30) with trampoline */
regs->regs[30] = (long)&kretprobe_trampoline;
next prev parent reply other threads:[~2020-08-27 11:39 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-27 11:35 [PATCH v2 00/15] kprobes: Unify kretprobe trampoline handlers Masami Hiramatsu
2020-08-27 11:35 ` [PATCH v2 01/15] kprobes: Add generic kretprobe trampoline handler Masami Hiramatsu
2020-08-27 11:35 ` [PATCH v2 02/15] x86/kprobes: Use " Masami Hiramatsu
2020-08-27 11:35 ` [PATCH v2 03/15] arm: kprobes: " Masami Hiramatsu
2020-08-27 11:35 ` Masami Hiramatsu [this message]
2020-08-27 11:36 ` [PATCH v2 05/15] arc: " Masami Hiramatsu
2020-08-27 11:36 ` [PATCH v2 06/15] csky: " Masami Hiramatsu
2020-08-27 11:36 ` [PATCH v2 07/15] ia64: " Masami Hiramatsu
2020-08-27 11:36 ` [PATCH v2 08/15] mips: " Masami Hiramatsu
2020-08-27 11:36 ` [PATCH v2 09/15] parisc: " Masami Hiramatsu
2020-08-27 11:36 ` [PATCH v2 10/15] powerpc: " Masami Hiramatsu
2020-08-27 11:37 ` [PATCH v2 11/15] s390: " Masami Hiramatsu
2020-08-27 11:37 ` [PATCH v2 12/15] sh: " Masami Hiramatsu
2020-08-27 11:37 ` [PATCH v2 13/15] sparc: " Masami Hiramatsu
2020-08-27 11:37 ` [PATCH v2 14/15] kprobes: Remove NMI context check Masami Hiramatsu
2020-08-27 11:37 ` [PATCH v2 15/15] kprobes: Free kretprobe_instance with rcu callback Masami Hiramatsu
2020-08-27 11:48 ` peterz
2020-08-27 11:50 ` Masami Hiramatsu
2020-08-27 11:49 ` peterz
2020-08-27 13:02 ` Masami Hiramatsu
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=159852815852.707944.5762596519409476309.stgit@devnote2 \
--to=mhiramat@kernel.org \
--cc=Eddy_Wu@trendmicro.com \
--cc=anil.s.keshavamurthy@intel.com \
--cc=davem@davemloft.net \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=naveen.n.rao@linux.ibm.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=x86@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.