From: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
To: Jason Wessel <jason.wessel@windriver.com>
Cc: linux-kernel@vger.kernel.org,
kgdb-bugreport@lists.sourceforge.net, tim.bird@am.sony.com
Subject: Re: [PATCH 2/2] kgdb,debug_core,kgdbts: End DEBUG_RODATA limitation using kprobe breakpoints
Date: Thu, 22 Mar 2012 11:53:56 +0900 [thread overview]
Message-ID: <4F6A9444.4050603@hitachi.com> (raw)
In-Reply-To: <1332352536-29186-3-git-send-email-jason.wessel@windriver.com>
(2012/03/22 2:55), Jason Wessel wrote:
> There has long been a limitation using software breakpoints with a
> kernel compiled with CONFIG_DEBUG_RODATA. The kprobe breakpoint code
> has its own text_poke() function which accommodates writing a
> breakpoint into a read-only page. The debug_core can make use of the
> text_poke() capabilities by using the kprobes API, specifically
> arch_arm_kprobe() and arch_disarm_kprobe(). For now it is safe to use
> a single statically allocated kprobe structure to call the kprobes API
> because the debug_core breakpoint API is only used when the kernel is
> in the debug state.
You might misunderstand it. arch_*_kprobe() are not open APIs.
Those are kprobes internal APIs (which means that those functions
should be used only by kprobes).
> The debug_core will first attempt to use the traditional
> probe_kernel_write(), and next try using a kprobe breakpoint. The
> kgdb test suite was updated to run all the software breakpoint tests
> when using a kernel with built with CONFIG_DEBUG_RODATA.
>
> Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Nak.
[...]
> @@ -165,17 +173,48 @@ int __weak kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt)
> {
> int err;
>
> + bpt->type = BP_BREAKPOINT;
> err = probe_kernel_read(bpt->saved_instr, (char *)bpt->bpt_addr,
> BREAK_INSTR_SIZE);
> if (err)
> return err;
> err = probe_kernel_write((char *)bpt->bpt_addr,
> arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE);
> +#if defined(CONFIG_KPROBES) && defined(CONFIG_DEBUG_RODATA)
> + if (!err)
> + return err;
> + probe_write_tmp.addr = (kprobe_opcode_t *)bpt->bpt_addr;
> + arch_arm_kprobe(&probe_write_tmp);
No, please don't use kprobes internal function this way, because
you can't ensure that the arch_arm_kprobe() has no side-effect.
Why don't you use text_poke()? I see that the text_poke()
is only for x86, but you already have arch/x86/kernel/kgdb.c for
making your own wrapper function.
> + err = probe_kernel_read(&probe_write_tmp.opcode, (char *)bpt->bpt_addr,
> + BREAK_INSTR_SIZE);
> + if (err)
> + return err;
> + if (memcmp(&probe_write_tmp.opcode, arch_kgdb_ops.gdb_bpt_instr,
> + BREAK_INSTR_SIZE))
> + return -EINVAL;
> + bpt->type = BP_KPROBE_BREAKPOINT;
> +#endif /* CONFIG_KPROBES && CONFIG_DEBUG_RODATA */
> return err;
> }
>
> int __weak kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt)
> {
> +#if defined(CONFIG_KPROBES) && defined(CONFIG_DEBUG_RODATA)
> + int err;
> +
> + if (bpt->type != BP_KPROBE_BREAKPOINT)
> + goto knl_write;
> + probe_write_tmp.addr = (kprobe_opcode_t *)bpt->bpt_addr;
> + memcpy(&probe_write_tmp.opcode, bpt->saved_instr, BREAK_INSTR_SIZE);
> + arch_disarm_kprobe(&probe_write_tmp);
Ditto.
> + err = probe_kernel_read(&probe_write_tmp.opcode, (char *)bpt->bpt_addr,
> + BREAK_INSTR_SIZE);
> + if (err ||
> + memcmp(&probe_write_tmp.opcode, bpt->saved_instr, BREAK_INSTR_SIZE))
> + goto knl_write;
> + return err;
> +knl_write:
> +#endif /* CONFIG_KPROBES && CONFIG_DEBUG_RODATA */
> return probe_kernel_write((char *)bpt->bpt_addr,
> (char *)bpt->saved_instr, BREAK_INSTR_SIZE);
> }
> @@ -294,7 +333,6 @@ int dbg_set_sw_break(unsigned long addr)
> return -E2BIG;
>
> kgdb_break[breakno].state = BP_SET;
> - kgdb_break[breakno].type = BP_BREAKPOINT;
> kgdb_break[breakno].bpt_addr = addr;
>
> return 0;
Thank you,
--
Masami HIRAMATSU
Software Platform Research Dept. Linux Technology Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@hitachi.com
next prev parent reply other threads:[~2012-03-22 2:54 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-21 17:55 [PATCH 0/2] Fix KGDB to work with CONFIG_DEBUG_RODATA using kprobe API Jason Wessel
2012-03-21 17:55 ` [PATCH 1/2] kgdb,debug_core: pass the breakpoint struct instead of address and memory Jason Wessel
2012-03-21 17:55 ` [PATCH 2/2] kgdb,debug_core,kgdbts: End DEBUG_RODATA limitation using kprobe breakpoints Jason Wessel
2012-03-22 2:53 ` Masami Hiramatsu [this message]
2012-03-22 11:57 ` Jason Wessel
2012-03-23 14:08 ` Masami Hiramatsu
2012-03-23 14:38 ` Jason Wessel
2012-03-26 9:46 ` Masami Hiramatsu
2012-03-26 16:39 ` Jason Wessel
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=4F6A9444.4050603@hitachi.com \
--to=masami.hiramatsu.pt@hitachi.com \
--cc=jason.wessel@windriver.com \
--cc=kgdb-bugreport@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
--cc=tim.bird@am.sony.com \
/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.