diff mbox

[1/2] powerpc/hw_brk: Fix setting of length for exact mode breakpoints

Message ID 1372052843-19109-1-git-send-email-mikey@neuling.org (mailing list archive)
State Accepted, archived
Commit b0b0aa9c7faf94e92320eabd8a1786c7747e40a8
Headers show

Commit Message

Michael Neuling June 24, 2013, 5:47 a.m. UTC
The smallest match region for both the DABR and DAWR is 8 bytes, so the
kernel needs to filter matches when users want to look at regions smaller than
this.

Currently we set the length of PPC_BREAKPOINT_MODE_EXACT breakpoints to 8.
This is wrong as in exact mode we should only match on 1 address, hence the
length should be 1.

This ensures that the kernel will filter out any exact mode hardware breakpoint
matches on any addresses other than the requested one.

Signed-off-by: Michael Neuling <mikey@neuling.org>
Reported-by: Edjunior Barbosa Machado <emachado@linux.vnet.ibm.com>
Cc: stable@vger.kernel.org
---
 arch/powerpc/kernel/ptrace.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Anshuman Khandual June 25, 2013, 8:48 a.m. UTC | #1
On 06/24/2013 11:17 AM, Michael Neuling wrote:
> The smallest match region for both the DABR and DAWR is 8 bytes, so the
> kernel needs to filter matches when users want to look at regions smaller than
> this.
> 
> Currently we set the length of PPC_BREAKPOINT_MODE_EXACT breakpoints to 8.
> This is wrong as in exact mode we should only match on 1 address, hence the
> length should be 1.
> 
> This ensures that the kernel will filter out any exact mode hardware breakpoint
> matches on any addresses other than the requested one.
> 
> Signed-off-by: Michael Neuling <mikey@neuling.org>

Reviewed-by: Anshuman Khandual <khandual@linux.vnet.ibm.com>
diff mbox

Patch

diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index 98c2fc1..64f7bd5 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -1449,7 +1449,9 @@  static long ppc_set_hwdebug(struct task_struct *child,
 	 */
 	if (bp_info->addr_mode == PPC_BREAKPOINT_MODE_RANGE_INCLUSIVE) {
 		len = bp_info->addr2 - bp_info->addr;
-	} else if (bp_info->addr_mode != PPC_BREAKPOINT_MODE_EXACT) {
+	} else if (bp_info->addr_mode == PPC_BREAKPOINT_MODE_EXACT)
+		len = 1;
+	else {
 		ptrace_put_breakpoints(child);
 		return -EINVAL;
 	}