From: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
To: Harvey Harrison <harvey.harrison@gmail.com>
Cc: Masami Hiramatsu <mhiramat@redhat.com>,
Andrew Morton <akpm@linux-foundation.org>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] kprobes: Introduce is_kprobe_fault()
Date: Thu, 3 Jan 2008 12:35:26 +0530 [thread overview]
Message-ID: <20080103070526.GA7690@in.ibm.com> (raw)
In-Reply-To: <1199333115.6323.104.camel@brick>
On Wed, Jan 02, 2008 at 08:05:14PM -0800, Harvey Harrison wrote:
Thanks for the cleanup...
...
> diff --git a/arch/x86/mm/fault_32.c b/arch/x86/mm/fault_32.c
> index a2273d4..f2e909b 100644
> --- a/arch/x86/mm/fault_32.c
> +++ b/arch/x86/mm/fault_32.c
> @@ -33,28 +33,6 @@
>
> extern void die(const char *,struct pt_regs *,long);
>
> -#ifdef CONFIG_KPROBES
> -static inline int notify_page_fault(struct pt_regs *regs)
> -{
> - int ret = 0;
> -
> - /* kprobe_running() needs smp_processor_id() */
> - if (!user_mode_vm(regs)) {
^^^^^^^^^^^
For x86_32, this check is important. See commit
6444541671bd821b950dbaafee70d65188198aa6 (Never allow int3 traps
from V8086 mode to enter the kprobes handler) for precise reason why its
user_mode_vm() and not user_mode() for x86_32.
You'll need to make room for this check in the generic macro below...
> - preempt_disable();
> - if (kprobe_running() && kprobe_fault_handler(regs, 14))
> - ret = 1;
> - preempt_enable();
> - }
> -
> - return ret;
> -}
> -#else
> -static inline int notify_page_fault(struct pt_regs *regs)
> -{
> - return 0;
> -}
> -#endif
> -
> /*
> * Return EIP plus the CS segment base. The segment limit is also
> * adjusted, clamped to the kernel/user address space (whichever is
> @@ -331,7 +309,7 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs,
> if (unlikely(address >= TASK_SIZE)) {
> if (!(error_code & 0x0000000d) && vmalloc_fault(address) >= 0)
> return;
> - if (notify_page_fault(regs))
> + if (is_kprobe_fault(regs, 14))
> return;
> /*
> * Don't take the mm semaphore here. If we fixup a prefetch
> @@ -340,7 +318,7 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs,
> goto bad_area_nosemaphore;
> }
>
> - if (notify_page_fault(regs))
> + if (is_kprobe_fault(regs, 14))
> return;
>
> /* It's safe to allow irq's after cr2 has been saved and the vmalloc
...
> diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h
> index 8189158..65c1ffb 100644
> --- a/include/linux/kprobes.h
> +++ b/include/linux/kprobes.h
> @@ -36,6 +36,7 @@
> #include <linux/spinlock.h>
> #include <linux/rcupdate.h>
> #include <linux/mutex.h>
> +#include <linux/hardirq.h>
>
> #ifdef CONFIG_KPROBES
> #include <asm/kprobes.h>
> @@ -203,6 +204,20 @@ static inline struct kprobe *kprobe_running(void)
> return (__get_cpu_var(current_kprobe));
> }
>
> +/*
> + * If it is a kprobe pagefault we can not be premptible so return before
> + * calling kprobe_running() as it will assert on smp_processor_id if
> + * preemption is enabled.
> + */
> +static inline int is_kprobe_fault(struct pt_regs *regs, int trapnr)
> +{
> + if (!user_mode(regs) && !preemptible() && kprobe_running() &&
> + kprobe_fault_handler(regs, trapnr))
> + return 1;
> + else
> + return 0;
> +}
> +
> static inline void reset_current_kprobe(void)
> {
> __get_cpu_var(current_kprobe) = NULL;
> @@ -237,6 +252,10 @@ static inline struct kprobe *kprobe_running(void)
> {
> return NULL;
> }
> +static inline int is_kprobe_fault(struct pt_regs *regs, int trapnr)
> +{
> + return 0;
> +}
> static inline int register_kprobe(struct kprobe *p)
> {
> return -ENOSYS;
Ananth
next prev parent reply other threads:[~2008-01-03 7:05 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-03 4:05 [PATCH] kprobes: Introduce is_kprobe_fault() Harvey Harrison
2008-01-03 4:49 ` Masami Hiramatsu
2008-01-03 7:05 ` Ananth N Mavinakayanahalli [this message]
2008-01-03 17:36 ` Harvey Harrison
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=20080103070526.GA7690@in.ibm.com \
--to=ananth@in.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=harvey.harrison@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mhiramat@redhat.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.