diff mbox series

[v3,4/4] arm64: kprobes: Use arch_populate_kprobe_blacklist()

Message ID 154998628802.21869.4041705065539411318.stgit@devbox (mailing list archive)
State New, archived
Headers show
Series arm64: kprobes: Update blacklist checking on arm64 | expand

Commit Message

Masami Hiramatsu (Google) Feb. 12, 2019, 3:44 p.m. UTC
Use arch_populate_kprobe_blacklist() instead of
arch_within_kprobe_blacklist() so that we can see the full
blacklisted symbols under the debugfs.

Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
---
  Changes in v3
   - Do not populate blacklist in __kprobe_text in
     arch_populate_kprobe_blacklist(), since it is already
     populated in populate_kprobe_blacklist().
   - Add exception entry text blacklist since those are rejected
     by in_exception_text().
---
 arch/arm64/kernel/probes/kprobes.c |   45 +++++++++++++++++++++---------------
 1 file changed, 26 insertions(+), 19 deletions(-)

Comments

Will Deacon Feb. 14, 2019, 3:55 p.m. UTC | #1
Hi Masami,

On Wed, Feb 13, 2019 at 12:44:48AM +0900, Masami Hiramatsu wrote:
> Use arch_populate_kprobe_blacklist() instead of
> arch_within_kprobe_blacklist() so that we can see the full
> blacklisted symbols under the debugfs.
> 
> Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> ---
>   Changes in v3
>    - Do not populate blacklist in __kprobe_text in
>      arch_populate_kprobe_blacklist(), since it is already
>      populated in populate_kprobe_blacklist().
>    - Add exception entry text blacklist since those are rejected
>      by in_exception_text().
> ---
>  arch/arm64/kernel/probes/kprobes.c |   45 +++++++++++++++++++++---------------
>  1 file changed, 26 insertions(+), 19 deletions(-)
> 
> diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c
> index 194262fca5cd..37d913f33a89 100644
> --- a/arch/arm64/kernel/probes/kprobes.c
> +++ b/arch/arm64/kernel/probes/kprobes.c
> @@ -465,26 +465,33 @@ kprobe_breakpoint_handler(struct pt_regs *regs, unsigned int esr)
>  	return DBG_HOOK_HANDLED;
>  }
>  
> -bool arch_within_kprobe_blacklist(unsigned long addr)

I think it would be useful to add a comment here so that we remember
why this code is the way it is:

/*
 * Provide a blacklist of symbols identifying ranges which cannot be kprobed.
 * This blacklist is exposed to userspace via debugfs (kprobes/blacklist).
 */

With that, you can have my ack for the series:

Acked-by: Will Deacon <will.deacon@arm.com>

Catalin -- can you pick these up with that comment added, please?

Cheers,

Will
Masami Hiramatsu (Google) Feb. 15, 2019, 3 p.m. UTC | #2
On Thu, 14 Feb 2019 15:55:22 +0000
Will Deacon <will.deacon@arm.com> wrote:

> Hi Masami,
> 
> On Wed, Feb 13, 2019 at 12:44:48AM +0900, Masami Hiramatsu wrote:
> > Use arch_populate_kprobe_blacklist() instead of
> > arch_within_kprobe_blacklist() so that we can see the full
> > blacklisted symbols under the debugfs.
> > 
> > Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
> > ---
> >   Changes in v3
> >    - Do not populate blacklist in __kprobe_text in
> >      arch_populate_kprobe_blacklist(), since it is already
> >      populated in populate_kprobe_blacklist().
> >    - Add exception entry text blacklist since those are rejected
> >      by in_exception_text().
> > ---
> >  arch/arm64/kernel/probes/kprobes.c |   45 +++++++++++++++++++++---------------
> >  1 file changed, 26 insertions(+), 19 deletions(-)
> > 
> > diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c
> > index 194262fca5cd..37d913f33a89 100644
> > --- a/arch/arm64/kernel/probes/kprobes.c
> > +++ b/arch/arm64/kernel/probes/kprobes.c
> > @@ -465,26 +465,33 @@ kprobe_breakpoint_handler(struct pt_regs *regs, unsigned int esr)
> >  	return DBG_HOOK_HANDLED;
> >  }
> >  
> > -bool arch_within_kprobe_blacklist(unsigned long addr)
> 
> I think it would be useful to add a comment here so that we remember
> why this code is the way it is:
> 
> /*
>  * Provide a blacklist of symbols identifying ranges which cannot be kprobed.
>  * This blacklist is exposed to userspace via debugfs (kprobes/blacklist).
>  */

Agreed. This looks good to me too.

> 
> With that, you can have my ack for the series:
> 
> Acked-by: Will Deacon <will.deacon@arm.com>

Thank you!

> 
> Catalin -- can you pick these up with that comment added, please?
> 
> Cheers,
> 
> Will
diff mbox series

Patch

diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c
index 194262fca5cd..37d913f33a89 100644
--- a/arch/arm64/kernel/probes/kprobes.c
+++ b/arch/arm64/kernel/probes/kprobes.c
@@ -465,26 +465,33 @@  kprobe_breakpoint_handler(struct pt_regs *regs, unsigned int esr)
 	return DBG_HOOK_HANDLED;
 }
 
-bool arch_within_kprobe_blacklist(unsigned long addr)
+int __init arch_populate_kprobe_blacklist(void)
 {
-	if ((addr >= (unsigned long)__kprobes_text_start &&
-	    addr < (unsigned long)__kprobes_text_end) ||
-	    (addr >= (unsigned long)__entry_text_start &&
-	    addr < (unsigned long)__entry_text_end) ||
-	    (addr >= (unsigned long)__idmap_text_start &&
-	    addr < (unsigned long)__idmap_text_end) ||
-	    (addr >= (unsigned long)__hyp_text_start &&
-	    addr < (unsigned long)__hyp_text_end) ||
-	    in_exception_text(addr))
-		return true;
-
-	if (!is_kernel_in_hyp_mode()) {
-		if ((addr >= (unsigned long)__hyp_idmap_text_start &&
-		    addr < (unsigned long)__hyp_idmap_text_end))
-			return true;
-	}
-
-	return false;
+	int ret;
+
+	ret = kprobe_add_area_blacklist((unsigned long)__entry_text_start,
+					(unsigned long)__entry_text_end);
+	if (ret)
+		return ret;
+	ret = kprobe_add_area_blacklist((unsigned long)__irqentry_text_start,
+					(unsigned long)__irqentry_text_end);
+	if (ret)
+		return ret;
+	ret = kprobe_add_area_blacklist((unsigned long)__exception_text_start,
+					(unsigned long)__exception_text_end);
+	if (ret)
+		return ret;
+	ret = kprobe_add_area_blacklist((unsigned long)__idmap_text_start,
+					(unsigned long)__idmap_text_end);
+	if (ret)
+		return ret;
+	ret = kprobe_add_area_blacklist((unsigned long)__hyp_text_start,
+					(unsigned long)__hyp_text_end);
+	if (ret || is_kernel_in_hyp_mode())
+		return ret;
+	ret = kprobe_add_area_blacklist((unsigned long)__hyp_idmap_text_start,
+					(unsigned long)__hyp_idmap_text_end);
+	return ret;
 }
 
 void __kprobes __used *trampoline_probe_handler(struct pt_regs *regs)