From: Ravi Bangoria <hidden> Date: 2019-06-18 04:27:52
do_dabr() was renamed with do_break() long ago. But I still see
some comments mentioning do_dabr(). Replace it.
Signed-off-by: Ravi Bangoria <redacted>
---
arch/powerpc/kernel/hw_breakpoint.c | 2 +-
arch/powerpc/kernel/ptrace.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
From: Michael Neuling <hidden> Date: 2019-06-18 06:42:50
Subject: Powerpc/hw-breakpoint: Replace stale do_dabr() with do_break()
Can you add the word "comment" to this subject. Currently it implies there are
code changes here.
Mikey
On Tue, 2019-06-18 at 09:57 +0530, Ravi Bangoria wrote:
quoted hunk
do_dabr() was renamed with do_break() long ago. But I still see
some comments mentioning do_dabr(). Replace it.
Signed-off-by: Ravi Bangoria <redacted>
---
arch/powerpc/kernel/hw_breakpoint.c | 2 +-
arch/powerpc/kernel/ptrace.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/powerpc/kernel/hw_breakpoint.c
b/arch/powerpc/kernel/hw_breakpoint.c
index a293a53b4365..1908e4fcc132 100644
From: Ravi Bangoria <hidden> Date: 2019-06-18 04:27:55
Move feature availability check at the start of the function.
Rearrange comment to it's associated code. Use hw->address and
hw->len in the 512 bytes boundary check(to write if statement
in a single line). Add spacing between code blocks.
Signed-off-by: Ravi Bangoria <redacted>
---
arch/powerpc/kernel/hw_breakpoint.c | 34 +++++++++++++++--------------
1 file changed, 18 insertions(+), 16 deletions(-)
Move feature availability check at the start of the function.
Rearrange comment to it's associated code. Use hw->address and
hw->len in the 512 bytes boundary check(to write if statement
in a single line). Add spacing between code blocks.
Are those cosmetic changes in the boundary check worth it since they
disappear in the final patch ?
Christophe
From: Ravi Bangoria <hidden> Date: 2019-06-18 07:11:07
On 6/18/19 11:51 AM, Christophe Leroy wrote:
Le 18/06/2019 à 06:27, Ravi Bangoria a écrit :
quoted
Move feature availability check at the start of the function.
Rearrange comment to it's associated code. Use hw->address and
hw->len in the 512 bytes boundary check(to write if statement
in a single line). Add spacing between code blocks.
Are those cosmetic changes in the boundary check worth it since they disappear in the final patch ?
Nope.. not necessary. I was just going bit more patch by patch.
I don't mind keeping the code as it is and then change it in
the final patch.
From: Ravi Bangoria <hidden> Date: 2019-06-18 04:27:59
Remove unnecessary comments. Code itself is self explanatory.
And, ISA already talks about MRD field. I Don't think we need
to re-describe it.
Signed-off-by: Ravi Bangoria <redacted>
---
arch/powerpc/kernel/process.c | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
@@ -799,18 +799,11 @@ int set_dawr(struct arch_hw_breakpoint *brk)dawr=brk->address;-dawrx=(brk->type&(HW_BRK_TYPE_READ|HW_BRK_TYPE_WRITE))\-<<(63-58);//* read/write bits */-dawrx|=((brk->type&(HW_BRK_TYPE_TRANSLATE))>>2)\-<<(63-59);//* translate */-dawrx|=(brk->type&(HW_BRK_TYPE_PRIV_ALL))\->>3;//* PRIM bits */-/* dawr length is stored in field MDR bits 48:53. Matches range in-doublewords(64bits)baisedby-1eg.0b000000=1DWand-0b111111=64DW.-brk->lenisinbytes.-Thisalignsuptodoublewordsize,shiftsanddoesthebias.-*/+dawrx=(brk->type&HW_BRK_TYPE_RDWR)<<(63-58);+dawrx|=((brk->type&HW_BRK_TYPE_TRANSLATE)>>2)<<(63-59);+dawrx|=(brk->type&HW_BRK_TYPE_PRIV_ALL)>>3;++/* brk->len is in bytes. */mrd=((brk->len+7)>>3)-1;dawrx|=(mrd&0x3f)<<(63-53);
Remove unnecessary comments. Code itself is self explanatory.
And, ISA already talks about MRD field. I Don't think we need
to re-describe it.
Signed-off-by: Ravi Bangoria <redacted>
---
arch/powerpc/kernel/process.c | 17 +++++------------
1 file changed, 5 insertions(+), 12 deletions(-)
@@ -799,18 +799,11 @@ int set_dawr(struct arch_hw_breakpoint *brk)dawr=brk->address;-dawrx=(brk->type&(HW_BRK_TYPE_READ|HW_BRK_TYPE_WRITE))\-<<(63-58);//* read/write bits */-dawrx|=((brk->type&(HW_BRK_TYPE_TRANSLATE))>>2)\-<<(63-59);//* translate */-dawrx|=(brk->type&(HW_BRK_TYPE_PRIV_ALL))\->>3;//* PRIM bits */-/* dawr length is stored in field MDR bits 48:53. Matches range in-doublewords(64bits)baisedby-1eg.0b000000=1DWand-0b111111=64DW.-brk->lenisinbytes.-Thisalignsuptodoublewordsize,shiftsanddoesthebias.-*/+dawrx=(brk->type&HW_BRK_TYPE_RDWR)<<(63-58);+dawrx|=((brk->type&HW_BRK_TYPE_TRANSLATE)>>2)<<(63-59);+dawrx|=(brk->type&HW_BRK_TYPE_PRIV_ALL)>>3;++/* brk->len is in bytes. */mrd=((brk->len+7)>>3)-1;dawrx|=(mrd&0x3f)<<(63-53);
Remove unnecessary comments. Code itself is self explanatory.
And, ISA already talks about MRD field. I Don't think we need
to re-describe it.
In an RFC patch you may "don't think".
But in the final patch you need to make a decision and write it as such.
Ie, you should write: "We don't need to re-describe it."
@@ -799,18 +799,11 @@ int set_dawr(struct arch_hw_breakpoint *brk)dawr=brk->address;-dawrx=(brk->type&(HW_BRK_TYPE_READ|HW_BRK_TYPE_WRITE))\-<<(63-58);//* read/write bits */-dawrx|=((brk->type&(HW_BRK_TYPE_TRANSLATE))>>2)\-<<(63-59);//* translate */-dawrx|=(brk->type&(HW_BRK_TYPE_PRIV_ALL))\->>3;//* PRIM bits */-/* dawr length is stored in field MDR bits 48:53. Matches range in-doublewords(64bits)baisedby-1eg.0b000000=1DWand-0b111111=64DW.-brk->lenisinbytes.-Thisalignsuptodoublewordsize,shiftsanddoesthebias.-*/+dawrx=(brk->type&HW_BRK_TYPE_RDWR)<<(63-58);+dawrx|=((brk->type&HW_BRK_TYPE_TRANSLATE)>>2)<<(63-59);+dawrx|=(brk->type&HW_BRK_TYPE_PRIV_ALL)>>3;++/* brk->len is in bytes. */mrd=((brk->len+7)>>3)-1;dawrx|=(mrd&0x3f)<<(63-53);
From: Ravi Bangoria <hidden> Date: 2019-06-18 04:28:03
Directly setting dawr and dawrx with 0 should be enough to
disable watchpoint. No need to reset individual bits in
variable and then set in hw.
Signed-off-by: Ravi Bangoria <redacted>
---
arch/powerpc/include/asm/hw_breakpoint.h | 3 ++-
arch/powerpc/kernel/process.c | 12 ++++++++++++
2 files changed, 14 insertions(+), 1 deletion(-)
@@ -19,6 +19,7 @@ struct arch_hw_breakpoint {/* Note: Don't change the the first 6 bits below as they are in the same order*asthedabranddabrx.*/+#define HW_BRK_TYPE_DISABLE 0x00#define HW_BRK_TYPE_READ 0x01#define HW_BRK_TYPE_WRITE 0x02#define HW_BRK_TYPE_TRANSLATE 0x04
Directly setting dawr and dawrx with 0 should be enough to
disable watchpoint. No need to reset individual bits in
variable and then set in hw.
Signed-off-by: Ravi Bangoria <redacted>
---
arch/powerpc/include/asm/hw_breakpoint.h | 3 ++-
arch/powerpc/kernel/process.c | 12 ++++++++++++
2 files changed, 14 insertions(+), 1 deletion(-)
@@ -19,6 +19,7 @@ struct arch_hw_breakpoint {/* Note: Don't change the the first 6 bits below as they are in the same order*asthedabranddabrx.*/+#define HW_BRK_TYPE_DISABLE 0x00
@@ -793,10 +793,22 @@ static inline int set_dabr(struct arch_hw_breakpoint *brk)return__set_dabr(dabr,dabrx);}+staticintdisable_dawr(void)+{+if(ppc_md.set_dawr)+returnppc_md.set_dawr(0,0);++mtspr(SPRN_DAWRX,0);
And SPRN_DAWR ?
The above code looks pretty similar to the one at the end of set_dawr().
You should factorise it, for instance
static int __set_dawr(int dawr, int dawrx)
{
if (ppc_md.set_dawr)
return ppc_md.set_dawr(dawr, dawrx);
mtspr(SPRN_DAWR, dawr);
mtspr(SPRN_DAWRX, dawrx);
return 0;
}
+ return 0;
+}
+
int set_dawr(struct arch_hw_breakpoint *brk)
{
unsigned long dawr, dawrx, mrd;
+ if (brk->type == HW_BRK_TYPE_DISABLE)
+ return disable_dawr();
From: Michael Neuling <hidden> Date: 2019-06-18 06:52:25
On Tue, 2019-06-18 at 09:57 +0530, Ravi Bangoria wrote:
Directly setting dawr and dawrx with 0 should be enough to
disable watchpoint. No need to reset individual bits in
variable and then set in hw.
This seems like a pointless optimisation to me.
I'm all for adding more code/complexity if it buys us some performance, but I
can't imagine this is a fast path (nor have you stated any performance
benefits).
Mikey
@@ -19,6 +19,7 @@ struct arch_hw_breakpoint {/* Note: Don't change the the first 6 bits below as they are in the same
order
* as the dabr and dabrx.
*/
+#define HW_BRK_TYPE_DISABLE 0x00
#define HW_BRK_TYPE_READ 0x01
#define HW_BRK_TYPE_WRITE 0x02
#define HW_BRK_TYPE_TRANSLATE 0x04
From: Ravi Bangoria <hidden> Date: 2019-06-19 06:02:48
On 6/18/19 11:45 AM, Michael Neuling wrote:
On Tue, 2019-06-18 at 09:57 +0530, Ravi Bangoria wrote:
quoted
Directly setting dawr and dawrx with 0 should be enough to
disable watchpoint. No need to reset individual bits in
variable and then set in hw.
This seems like a pointless optimisation to me.
I'm all for adding more code/complexity if it buys us some performance, but I
can't imagine this is a fast path (nor have you stated any performance
benefits).
This gets called from sched_switch. I expected the improvement when
we switch from monitored process to non-monitored process. With such
scenario, I tried to measure the difference in execution time of
set_dawr but I don't see any improvement. So I'll drop the patch.
From: Ravi Bangoria <hidden> Date: 2019-06-18 04:28:04
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. Watchpoint
exception handler already ignores extraneous exceptions, so no
changes required for that.
Signed-off-by: Ravi Bangoria <redacted>
---
arch/powerpc/include/asm/hw_breakpoint.h | 7 ++--
arch/powerpc/kernel/hw_breakpoint.c | 44 +++++++++++++-----------
arch/powerpc/kernel/process.c | 34 ++++++++++++++++--
3 files changed, 60 insertions(+), 25 deletions(-)
@@ -126,6 +126,28 @@ int arch_bp_generic_fields(int type, int *gen_bp_type)return0;}+/* Maximum len for DABR is 8 bytes and DAWR is 512 bytes */+staticinthw_breakpoint_validate_len(structarch_hw_breakpoint*hw)+{+u16length_max=8;+u16final_len;+unsignedlongstart_addr,end_addr;++final_len=hw_breakpoint_get_final_len(hw,&start_addr,&end_addr);++if(dawr_enabled()){+length_max=512;+/* DAWR region can't cross 512 bytes boundary */+if((start_addr>>9)!=(end_addr>>9))+return-EINVAL;+}++if(final_len>length_max)+return-EINVAL;++return0;+}+/**Validatethearch-specificHWBreakpointregistersettings*/
@@ -133,12 +155,10 @@ int hw_breakpoint_arch_parse(struct perf_event *bp,conststructperf_event_attr*attr,structarch_hw_breakpoint*hw){-intlength_max;-if(!ppc_breakpoint_available())return-ENODEV;-if(!bp)+if(!bp||!attr->bp_len)return-EINVAL;hw->type=HW_BRK_TYPE_TRANSLATE;
@@ -802,9 +802,39 @@ static int disable_dawr(void)return0;}+/*+*Watchpointmatchrangeisalwaysdoubleword(8bytes)alignedon+*powerpc.Ifthegivenrangeiscrossingdoublewordboundary,we+*needtoincreasethelengthsuchthatnextdoublewordalsoget+*covered.Ex,+*+*addresslen=6bytes+*|=========.+*|------------v--|------v--------|+*|||||||||||||||||+*|---------------|---------------|+*<---8bytes--->+*+*Inthiscase,weshouldconfigurehwas:+*start_addr=address&~HW_BREAKPOINT_ALIGN+*len=16bytes+*+*@start_addrand@end_addrareinclusive.+*/+u16hw_breakpoint_get_final_len(structarch_hw_breakpoint*brk,+unsignedlong*start_addr,+unsignedlong*end_addr)+{+*start_addr=brk->address&~HW_BREAKPOINT_ALIGN;+*end_addr=(brk->address+brk->len-1)|HW_BREAKPOINT_ALIGN;+return*end_addr-*start_addr+1;+}+intset_dawr(structarch_hw_breakpoint*brk){unsignedlongdawr,dawrx,mrd;+unsignedlongstart_addr,end_addr;+u16final_len;if(brk->type==HW_BRK_TYPE_DISABLE)returndisable_dawr();
@@ -815,8 +845,8 @@ int set_dawr(struct arch_hw_breakpoint *brk)dawrx|=((brk->type&HW_BRK_TYPE_TRANSLATE)>>2)<<(63-59);dawrx|=(brk->type&HW_BRK_TYPE_PRIV_ALL)>>3;-/* brk->len is in bytes. */-mrd=((brk->len+7)>>3)-1;+final_len=hw_breakpoint_get_final_len(brk,&start_addr,&end_addr);+mrd=((final_len+7)>>3)-1;dawrx|=(mrd&0x3f)<<(63-53);if(ppc_md.set_dawr)
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. Watchpoint
exception handler already ignores extraneous exceptions, so no
changes required for that.
Signed-off-by: Ravi Bangoria <redacted>
---
arch/powerpc/include/asm/hw_breakpoint.h | 7 ++--
arch/powerpc/kernel/hw_breakpoint.c | 44 +++++++++++++-----------
arch/powerpc/kernel/process.c | 34 ++++++++++++++++--
3 files changed, 60 insertions(+), 25 deletions(-)
@@ -126,6 +126,28 @@ int arch_bp_generic_fields(int type, int *gen_bp_type)return0;}+/* Maximum len for DABR is 8 bytes and DAWR is 512 bytes */+staticinthw_breakpoint_validate_len(structarch_hw_breakpoint*hw)+{+u16length_max=8;+u16final_len;
You should be more consistent in naming. If one is called final_len, the
other one should be called max_len.
From: Ravi Bangoria <hidden> Date: 2019-06-19 06:51:50
On 6/18/19 12:16 PM, Christophe Leroy wrote:
quoted
+/* Maximum len for DABR is 8 bytes and DAWR is 512 bytes */
+static int hw_breakpoint_validate_len(struct arch_hw_breakpoint *hw)
+{
+ u16 length_max = 8;
+ u16 final_len;
You should be more consistent in naming. If one is called final_len, the other one should be called max_len.
This function gives horrible code (a couple of unneeded store/re-read and read/re-read).
000006bc <hw_breakpoint_get_final_len>:
6bc: 81 23 00 00 lwz r9,0(r3)
6c0: 55 29 00 38 rlwinm r9,r9,0,0,28
6c4: 91 24 00 00 stw r9,0(r4)
6c8: 81 43 00 00 lwz r10,0(r3)
6cc: a1 23 00 06 lhz r9,6(r3)
6d0: 38 6a ff ff addi r3,r10,-1
6d4: 7c 63 4a 14 add r3,r3,r9
6d8: 60 63 00 07 ori r3,r3,7
6dc: 90 65 00 00 stw r3,0(r5)
6e0: 38 63 00 01 addi r3,r3,1
6e4: 81 24 00 00 lwz r9,0(r4)
6e8: 7c 69 18 50 subf r3,r9,r3
6ec: 54 63 04 3e clrlwi r3,r3,16
6f0: 4e 80 00 20 blr
Below code gives something better:
u16 hw_breakpoint_get_final_len(struct arch_hw_breakpoint *brk,
unsigned long *start_addr,
unsigned long *end_addr)
{
unsigned long address = brk->address;
unsigned long len = brk->len;
unsigned long start = address & ~HW_BREAKPOINT_ALIGN;
unsigned long end = (address + len - 1) | HW_BREAKPOINT_ALIGN;
*start_addr = start;
*end_addr = end;
return end - start + 1;
}
000006bc <hw_breakpoint_get_final_len>:
6bc: 81 43 00 00 lwz r10,0(r3)
6c0: a1 03 00 06 lhz r8,6(r3)
6c4: 39 2a ff ff addi r9,r10,-1
6c8: 7d 28 4a 14 add r9,r8,r9
6cc: 55 4a 00 38 rlwinm r10,r10,0,0,28
6d0: 61 29 00 07 ori r9,r9,7
6d4: 91 44 00 00 stw r10,0(r4)
6d8: 20 6a 00 01 subfic r3,r10,1
6dc: 91 25 00 00 stw r9,0(r5)
6e0: 7c 63 4a 14 add r3,r3,r9
6e4: 54 63 04 3e clrlwi r3,r3,16
6e8: 4e 80 00 20 blr
And regardless, that's a pitty to have this function using pointers which are from local variables in the callers, as we loose the benefit of registers. Couldn't this function go in the .h as a static inline ? I'm sure the result would be worth it.
This is obviously a bit of optimization, but I like Mikey's idea of
storing start_addr and end_addr in the arch_hw_breakpoint. That way
we don't have to recalculate length every time in set_dawr.
From: Michael Neuling <hidden> Date: 2019-06-18 13:32:26
On Tue, 2019-06-18 at 09:57 +0530, Ravi Bangoria wrote:
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. Watchpoint
exception handler already ignores extraneous exceptions, so no
changes required for that.
Nice catch. Thanks.
I assume this has been broken forever? Should we be CCing stable? If so, it
would be nice to have this self contained (separate from the refactor) so we can
more easily backport it.
Also, can you update
tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c to catch this issue?
A couple more comments below.
@@ -126,6 +126,28 @@ int arch_bp_generic_fields(int type, int *gen_bp_type)return0;}+/* Maximum len for DABR is 8 bytes and DAWR is 512 bytes */+staticinthw_breakpoint_validate_len(structarch_hw_breakpoint*hw)+{+u16length_max=8;+u16final_len;+unsignedlongstart_addr,end_addr;++final_len=hw_breakpoint_get_final_len(hw,&start_addr,&end_addr);++if(dawr_enabled()){+length_max=512;+/* DAWR region can't cross 512 bytes boundary */+if((start_addr>>9)!=(end_addr>>9))+return-EINVAL;+}++if(final_len>length_max)+return-EINVAL;++return0;+}+/**Validatethearch-specificHWBreakpointregistersettings*/
@@ -133,12 +155,10 @@ int hw_breakpoint_arch_parse(struct perf_event *bp,conststructperf_event_attr*attr,structarch_hw_breakpoint*hw){-intlength_max;-if(!ppc_breakpoint_available())return-ENODEV;-if(!bp)+if(!bp||!attr->bp_len)return-EINVAL;hw->type=HW_BRK_TYPE_TRANSLATE;
@@ -802,9 +802,39 @@ static int disable_dawr(void)return0;}+/*+*Watchpointmatchrangeisalwaysdoubleword(8bytes)alignedon+*powerpc.Ifthegivenrangeiscrossingdoublewordboundary,we+*needtoincreasethelengthsuchthatnextdoublewordalsoget+*covered.Ex,+*+*addresslen=6bytes+*|=========.+*|------------v--|------v--------|+*|||||||||||||||||+*|---------------|---------------|+*<---8bytes--->+*+*Inthiscase,weshouldconfigurehwas:+*start_addr=address&~HW_BREAKPOINT_ALIGN+*len=16bytes+*+*@start_addrand@end_addrareinclusive.+*/+u16hw_breakpoint_get_final_len(structarch_hw_breakpoint*brk,+unsignedlong*start_addr,+unsignedlong*end_addr)
I don't really like this. "final" is not a good name. Something like hardware
would be better.
Also, can you put the start_addr and end addr in the arch_hw_breakpoint rather
than doing what you have above. Call them hw_start_addr, hw_end_addr.
We could even set these two new addresses where we set the set of
arch_hw_breakpoint rather than having this late call.
From: Ravi Bangoria <hidden> Date: 2019-06-19 07:46:04
On 6/18/19 7:02 PM, Michael Neuling wrote:
On Tue, 2019-06-18 at 09:57 +0530, Ravi Bangoria wrote:
quoted
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. Watchpoint
exception handler already ignores extraneous exceptions, so no
changes required for that.
Nice catch. Thanks.
I assume this has been broken forever? Should we be CCing stable? If so, it
would be nice to have this self contained (separate from the refactor) so we can
more easily backport it.
Yes this has been broken forever. I'll add Fixes: tag and cc stable.
Also, can you update
tools/testing/selftests/powerpc/ptrace/ptrace-hwbreak.c to catch this issue?
Sure, will add the test case.
[...]
quoted
+u16 hw_breakpoint_get_final_len(struct arch_hw_breakpoint *brk,
+ unsigned long *start_addr,
+ unsigned long *end_addr)
I don't really like this. "final" is not a good name. Something like hardware
would be better.
Also, can you put the start_addr and end addr in the arch_hw_breakpoint rather
than doing what you have above. Call them hw_start_addr, hw_end_addr.
We could even set these two new addresses where we set the set of
arch_hw_breakpoint rather than having this late call.