All of lore.kernel.org
 help / color / mirror / Atom feed
From: takahiro.akashi@linaro.org (AKASHI Takahiro)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] lkdtm: fix irq handler entry for arm64
Date: Tue, 27 Feb 2018 16:20:12 +0900	[thread overview]
Message-ID: <20180227072011.GG6019@linaro.org> (raw)
In-Reply-To: <CAGXu5j+FZ4085UkjPQXnmTDhFMSdmZ7Rk5YXZ+p4OkyEfCOB1w@mail.gmail.com>

Hi Kees,

On Mon, Feb 26, 2018 at 07:57:10PM -0800, Kees Cook wrote:
> On Thu, Feb 1, 2018 at 1:34 AM, AKASHI Takahiro
> <takahiro.akashi@linaro.org> wrote:
> > Arm64 doesn't have "do_IRQ" function, instead *handle_arch_irq, which is
> > initialized by irq chip (gic), is called from exception entry.
> > This patch fixes this problem.
> 
> As in, this symbol is not known a lkdtm setup time? Hm, seems like
> we'd want a more generalized approach here.

Hmm. See my comments below.

> >
> > Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> > ---
> >  drivers/misc/lkdtm_core.c | 20 ++++++++++++++++++--
> >  1 file changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/misc/lkdtm_core.c b/drivers/misc/lkdtm_core.c
> > index ba92291508dc..e20343543053 100644
> > --- a/drivers/misc/lkdtm_core.c
> > +++ b/drivers/misc/lkdtm_core.c
> > @@ -249,13 +249,29 @@ static int lkdtm_register_cpoint(struct crashpoint *crashpoint,
> >         if (lkdtm_kprobe != NULL)
> >                 unregister_kprobe(lkdtm_kprobe);
> >
> > +       if (IS_ENABLED(CONFIG_ARM64) &&
> > +                       !strcmp(crashpoint->name, "INT_HARDWARE_ENTRY")) {
> > +               extern void (*handle_arch_irq)(struct pt_regs *regs);
> 
> I don't like this extern -- can handle_arch_irq be properly exported somewhere?

Define a weak function, get_handle_irq(), in linux/irq.h and
a real one in arch code. Then

        if (!kallsyms_lookup_name(crashpoint->symbol_name)) {
                if (!strcmp(crashpoint->name, "INT_HARDWARE_ENTRY")) {
                        func = get_handle_irq();
                        if (func) {
                                crashpoint->kprobe.addr = func;
                                crashpoint->kprobe.symbol_name = NULL;
                        } else {
                                /* error */
                        }
                } /* anything else? */
        }

Do you like this code better?

> 
> > +               crashpoint->kprobe.addr = (kprobe_opcode_t *)*handle_arch_irq;
> 
> I don't think the * is needed here: it's already a function pointer.

Will check.

> > +               /*
> > +                * Instantiating kprobe.symbol_name here, say
> > +                * with lookup_symbol_name(*handle_arch_irq),
> > +                * would cause register_kprobe() to fail.
> > +                */
> > +               crashpoint->kprobe.symbol_name = NULL;
> 
> Is kprobe.addr sufficient for register_kprobe?

Yes as Masami explained.
Leaving symbol_name ends up failure of register_kprobe().

> > +       }
> >         lkdtm_crashpoint = crashpoint;
> >         lkdtm_crashtype = crashtype;
> >         lkdtm_kprobe = &crashpoint->kprobe;
> >         ret = register_kprobe(lkdtm_kprobe);
> >         if (ret < 0) {
> > -               pr_info("Couldn't register kprobe %s\n",
> > -                       crashpoint->kprobe.symbol_name);
> > +               if (IS_ENABLED(CONFIG_ARM64))
> > +                       pr_info("Couldn't register kprobe 0x%lx\n",
> > +                               (unsigned long)crashpoint->kprobe.addr);
> > +               else
> > +                       pr_info("Couldn't register kprobe %s\n",
> > +                               crashpoint->kprobe.symbol_name);
> >                 lkdtm_kprobe = NULL;
> >                 lkdtm_crashpoint = NULL;
> >                 lkdtm_crashtype = NULL;
> 
> So I can replicate, how did you test this?

All what I did in my arm64 test is
# echo PANIC > /sys/kernel/debug/provoke-crash/INT_HARDWARE_ENTRY

The probe point will hit sooner or later and we will see a panic
(and kdump kicks in).

Thanks,
-Takahiro AKASHI

> 
> -- 
> Kees Cook
> Pixel Security

  parent reply	other threads:[~2018-02-27  7:20 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-01  9:34 [PATCH 0/2] lkdtm: fix irq handler entry for arm64 AKASHI Takahiro
2018-02-01  9:34 ` [PATCH 1/2] arm64: kprobes: Remove unneeded address sanity check AKASHI Takahiro
2018-02-06 14:36   ` Will Deacon
2018-02-07  0:02     ` Masami Hiramatsu
2018-02-15  2:08   ` David Long
2018-02-15  6:47     ` Masami Hiramatsu
2018-02-22  5:19       ` David Long
2018-02-22  5:45         ` Masami Hiramatsu
2018-02-01  9:34 ` [PATCH 2/2] lkdtm: fix irq handler entry for arm64 AKASHI Takahiro
2018-02-27  3:57   ` Kees Cook
2018-02-27  5:07     ` Masami Hiramatsu
2018-02-27  7:20     ` AKASHI Takahiro [this message]
2018-02-27 15:46       ` Kees Cook

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=20180227072011.GG6019@linaro.org \
    --to=takahiro.akashi@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.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.