All of lore.kernel.org
 help / color / mirror / Atom feed
From: "K.Prasad" <prasad@linux.vnet.ibm.com>
To: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>, LKML <linux-kernel@vger.kernel.org>,
	Michael Stefaniuc <mstefani@redhat.com>,
	Alan Stern <stern@rowland.harvard.edu>,
	Maneesh Soni <maneesh@linux.vnet.ibm.com>,
	Alexandre Julliard <julliard@winehq.org>,
	"Rafael J . Wysocki" <rjw@sisk.pl>,
	Maciej Rutecki <maciej.rutecki@gmail.com>,
	Roland McGrath <roland@redhat.com>
Subject: Re: [PATCH 2/2] hw-breakpoint: Keep track of dr7 local enable bits
Date: Fri, 19 Feb 2010 14:15:23 +0530	[thread overview]
Message-ID: <20100219084523.GA3525@in.ibm.com> (raw)
In-Reply-To: <1266516001-7753-3-git-send-regression-fweisbec@gmail.com>

On Thu, Feb 18, 2010 at 07:00:01PM +0100, Frederic Weisbecker wrote:
> When the user enables breakpoints through dr7, he can choose
> between "local" or "global" enable bits but given how linux is
> implemented, both have the same effect.
> 
> That said we don't keep track how the user enabled the breakpoints
> so when the user requests the dr7 value, we only translate the
> "enabled" status using the global enabled bits. It means that if
> the user enabled a breakpoint using the local enabled bit, reading
> back dr7 will set the global bit and clear the local one.
> 
> Apps like Wine expect a full dr7 POKEUSER/PEEKUSER match for emulated
> softwares that implement old reverse engineering protection schemes.
> 
> We fix that by keeping track of the whole dr7 value given by the user
> in the thread structure to drop this bug. We'll think about
> something more proper later.
> 
> This fixes a 2.6.32 - 2.6.33-x ptrace regression.
> 
> Reported-by: Michael Stefaniuc <mstefani@redhat.com>
> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
> Cc: K.Prasad <prasad@linux.vnet.ibm.com>
> Cc: Alan Stern <stern@rowland.harvard.edu>
> Cc: Maneesh Soni <maneesh@linux.vnet.ibm.com>
> Cc: Alexandre Julliard <julliard@winehq.org>
> Cc: Rafael J. Wysocki <rjw@sisk.pl>
> Cc: Maciej Rutecki <maciej.rutecki@gmail.com>
> ---
>  arch/x86/include/asm/processor.h |    2 ++
>  arch/x86/kernel/ptrace.c         |    7 +++++--
>  2 files changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
> index fc801ba..b753ea5 100644
> --- a/arch/x86/include/asm/processor.h
> +++ b/arch/x86/include/asm/processor.h
> @@ -450,6 +450,8 @@ struct thread_struct {
>  	struct perf_event	*ptrace_bps[HBP_NUM];
>  	/* Debug status used for traps, single steps, etc... */
>  	unsigned long           debugreg6;
> +	/* Keep track of the exact dr7 value set by the user */
> +	unsigned long           ptrace_dr7;
>  	/* Fault info: */
>  	unsigned long		cr2;
>  	unsigned long		trap_no;
> diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
> index 017d937..0c1033d 100644
> --- a/arch/x86/kernel/ptrace.c
> +++ b/arch/x86/kernel/ptrace.c
> @@ -702,7 +702,7 @@ static unsigned long ptrace_get_debugreg(struct task_struct *tsk, int n)
>  	} else if (n == 6) {
>  		val = thread->debugreg6;
>  	 } else if (n == 7) {
> -		val = ptrace_get_dr7(thread->ptrace_bps);
> +		val = thread->ptrace_dr7;
>  	}
>  	return val;
>  }
> @@ -778,8 +778,11 @@ int ptrace_set_debugreg(struct task_struct *tsk, int n, unsigned long val)
>  			return rc;
>  	}
>  	/* All that's left is DR7 */
> -	if (n == 7)
> +	if (n == 7) {
>  		rc = ptrace_write_dr7(tsk, val);
> +		if (!rc)
> +			thread->ptrace_dr7 = val;
> +	}
> 
>  ret_path:
>  	return rc;


So, the thread's copy of DR7 (in thread->ptrace_dr7) stores the
requested data even if the 'write' onto DR7 i.e. ptrace_write_dr7()
failed. This can be the other way round i.e. populate the thread's copy
of DR7 only if the write was successful.

I think it will be in consonance with the v2.6.32 behaviour as well. For
instance, in the code snippet from ptrace_set_debugreg() in v2.6.32
below:
                for (i = 0; i < 4; i++)
                        if ((DR7_MASK >> ((data >> (16 + 4*i)) & 0xf)) & 1)
                                return -EIO;
                child->thread.debugreg7 = data;

The thread's copy of DR7 is populated only if the incoming data is
found to be valid.

Thanks,
K.Prasad





  reply	other threads:[~2010-02-19  8:45 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-11 16:33 Regression in ptrace (Wine) starting with 2.6.33-rc1 Michael Stefaniuc
2010-02-11 18:22 ` Frederic Weisbecker
2010-02-11 19:49   ` Michael Stefaniuc
2010-02-12 18:15     ` Frederic Weisbecker
2010-02-13 17:33     ` K.Prasad
2010-02-13 21:29       ` Michael Stefaniuc
2010-02-14 17:15         ` Frederic Weisbecker
2010-02-14 20:13           ` Michael Stefaniuc
2010-02-14 20:41             ` Frederic Weisbecker
2010-02-14 23:05               ` Michael Stefaniuc
2010-02-15 11:57                 ` K.Prasad
2010-02-15 15:57                   ` Alexandre Julliard
2010-02-15 19:37                   ` Michael Stefaniuc
2010-02-15 19:47                     ` Roland McGrath
2010-02-17 16:03                       ` Frederic Weisbecker
2010-02-17 17:06                 ` Frederic Weisbecker
2010-02-18 17:59                 ` Regression in ptrace (Wine) starting with 2.6.33-rc1, fixes Frederic Weisbecker
2010-02-18 19:27                   ` Michael Stefaniuc
2010-02-18 19:41                     ` Alexandre Julliard
2010-02-19 17:19                       ` Frederic Weisbecker
2010-02-19 17:17                     ` Frederic Weisbecker
2010-02-18 18:00                 ` [PATCH 1/2] hw-breakpoints: Accept breakpoints on NULL address Frederic Weisbecker
2010-02-18 21:16                   ` Roland McGrath
2010-02-19 17:38                     ` Frederic Weisbecker
2010-02-19  8:51                   ` K.Prasad
2010-02-18 18:00                 ` [PATCH 2/2] hw-breakpoint: Keep track of dr7 local enable bits Frederic Weisbecker
2010-02-19  8:45                   ` K.Prasad [this message]
2010-02-19 15:34                     ` Frederic Weisbecker
2010-02-19 17:58                       ` K.Prasad
2010-02-19 18:03                         ` Frederic Weisbecker
2010-02-19  8:58                   ` K.Prasad
2010-02-19 15:49                     ` Frederic Weisbecker
2010-02-19 17:41                     ` Frederic Weisbecker
2010-02-19 18:04                       ` K.Prasad
2010-02-19 18:12                         ` [GIT PULL] hw-breakpoint regression fixes Frederic Weisbecker
2010-02-22  9:56                           ` Ingo Molnar
2010-02-19 18:12                         ` [PATCH 1/2] hw-breakpoints: Accept breakpoints on NULL address Frederic Weisbecker
2010-02-19 18:12                         ` [PATCH 2/2] hw-breakpoint: Keep track of dr7 local enable bits Frederic Weisbecker

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=20100219084523.GA3525@in.ibm.com \
    --to=prasad@linux.vnet.ibm.com \
    --cc=fweisbec@gmail.com \
    --cc=julliard@winehq.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maciej.rutecki@gmail.com \
    --cc=maneesh@linux.vnet.ibm.com \
    --cc=mingo@elte.hu \
    --cc=mstefani@redhat.com \
    --cc=rjw@sisk.pl \
    --cc=roland@redhat.com \
    --cc=stern@rowland.harvard.edu \
    /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.