aarch64: fix context and hybrid hardware breakpoints

Fix 64bit address setting
Fix register spacing (16 instead of 4)
Set HMC bit for all but linked context match breakpoints,
where the bit is ignored anyway

Change-Id: I48428f39154a6fe5fadc075ca918d1500a0bb241
Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>
This commit is contained in:
Matthias Welwarsky 2016-09-17 21:43:15 +02:00
parent b085570de9
commit 4ba8388f26
1 changed files with 17 additions and 10 deletions

View File

@ -1348,18 +1348,19 @@ static int aarch64_set_context_breakpoint(struct target *target,
breakpoint->set = brp_i + 1; breakpoint->set = brp_i + 1;
control = ((matchmode & 0x7) << 20) control = ((matchmode & 0x7) << 20)
| (1 << 13)
| (byte_addr_select << 5) | (byte_addr_select << 5)
| (3 << 1) | 1; | (3 << 1) | 1;
brp_list[brp_i].used = 1; brp_list[brp_i].used = 1;
brp_list[brp_i].value = (breakpoint->asid); brp_list[brp_i].value = (breakpoint->asid);
brp_list[brp_i].control = control; brp_list[brp_i].control = control;
retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
+ CPUV8_DBG_BVR_BASE + 4 * brp_list[brp_i].BRPn, + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].BRPn,
brp_list[brp_i].value); brp_list[brp_i].value);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
+ CPUV8_DBG_BCR_BASE + 4 * brp_list[brp_i].BRPn, + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].BRPn,
brp_list[brp_i].control); brp_list[brp_i].control);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
@ -1420,30 +1421,36 @@ static int aarch64_set_hybrid_breakpoint(struct target *target, struct breakpoin
brp_list[brp_1].value = (breakpoint->asid); brp_list[brp_1].value = (breakpoint->asid);
brp_list[brp_1].control = control_CTX; brp_list[brp_1].control = control_CTX;
retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
+ CPUV8_DBG_BVR_BASE + 4 * brp_list[brp_1].BRPn, + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_1].BRPn,
brp_list[brp_1].value); brp_list[brp_1].value);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
+ CPUV8_DBG_BCR_BASE + 4 * brp_list[brp_1].BRPn, + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_1].BRPn,
brp_list[brp_1].control); brp_list[brp_1].control);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
control_IVA = ((IVA_machmode & 0x7) << 20) control_IVA = ((IVA_machmode & 0x7) << 20)
| (brp_1 << 16) | (brp_1 << 16)
| (1 << 13)
| (IVA_byte_addr_select << 5) | (IVA_byte_addr_select << 5)
| (3 << 1) | 1; | (3 << 1) | 1;
brp_list[brp_2].used = 1; brp_list[brp_2].used = 1;
brp_list[brp_2].value = (breakpoint->address & 0xFFFFFFFC); brp_list[brp_2].value = breakpoint->address & 0xFFFFFFFFFFFFFFFC;
brp_list[brp_2].control = control_IVA; brp_list[brp_2].control = control_IVA;
retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
+ CPUV8_DBG_BVR_BASE + 4 * brp_list[brp_2].BRPn, + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_2].BRPn,
brp_list[brp_2].value); brp_list[brp_2].value & 0xFFFFFFFF);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
+ CPUV8_DBG_BCR_BASE + 4 * brp_list[brp_2].BRPn, + CPUV8_DBG_BVR_BASE + 4 + 16 * brp_list[brp_2].BRPn,
brp_list[brp_2].value >> 32);
if (retval != ERROR_OK)
return retval;
retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
+ CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_2].BRPn,
brp_list[brp_2].control); brp_list[brp_2].control);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
@ -1511,12 +1518,12 @@ static int aarch64_unset_breakpoint(struct target *target, struct breakpoint *br
brp_list[brp_i].value = 0; brp_list[brp_i].value = 0;
brp_list[brp_i].control = 0; brp_list[brp_i].control = 0;
retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
+ CPUV8_DBG_BCR_BASE + 4 * brp_list[brp_i].BRPn, + CPUV8_DBG_BCR_BASE + 16 * brp_list[brp_i].BRPn,
brp_list[brp_i].control); brp_list[brp_i].control);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base retval = aarch64_dap_write_memap_register_u32(target, armv8->debug_base
+ CPUV8_DBG_BVR_BASE + 4 * brp_list[brp_i].BRPn, + CPUV8_DBG_BVR_BASE + 16 * brp_list[brp_i].BRPn,
brp_list[brp_i].value); brp_list[brp_i].value);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;