powerpc/watchpoint: Fix length calculation for unaligned target
Watchpoint match range is always doubleword(8 bytes) aligned on
powerpc. If the given range is crossing doubleword boundary, we need
to increase the length such that next doubleword also get
covered. Ex,
address len = 6 bytes
|=========.
|------------v--|------v--------|
| | | | | | | | | | | | | | | | |
|---------------|---------------|
<---8 bytes--->
In such case, current code configures hw as:
start_addr = address & ~HW_BREAKPOINT_ALIGN
len = 8 bytes
And thus read/write in last 4 bytes of the given range is ignored.
Fix this by including next doubleword in the length.
Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20191017093204.7511-3-ravi.bangoria@linux.ibm.com
This commit is contained in:
committed by
Michael Ellerman
parent
b811be615c
commit
b57aeab811
@@ -715,6 +715,8 @@ static void set_debug_reg_defaults(struct thread_struct *thread)
|
||||
{
|
||||
thread->hw_brk.address = 0;
|
||||
thread->hw_brk.type = 0;
|
||||
thread->hw_brk.len = 0;
|
||||
thread->hw_brk.hw_len = 0;
|
||||
if (ppc_breakpoint_available())
|
||||
set_breakpoint(&thread->hw_brk);
|
||||
}
|
||||
@@ -816,6 +818,7 @@ static inline bool hw_brk_match(struct arch_hw_breakpoint *a,
|
||||
return false;
|
||||
if (a->len != b->len)
|
||||
return false;
|
||||
/* no need to check hw_len. it's calculated from address and len */
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user