gdb server: new feature, add stop reason in stop reply packet for gdb
In GDB remote serial protocol, the stop reply packet could contain more detail stop reason. The currently defined stop reasons are listed below. * watch * rwatch * awatch * library * replaylog This commit adds stop reason, watch/rwatch/awatch, in stop reply packet for just hit watchpoint. As manual indicates, at most one stop reason should be present. The function needs target to implement new hook, hit_watchpoint. The hook will fill the hit watchpoint in second parameter. The information will assist gdb to locate the watchpoint. If no such information, gdb needs to scan all watchpoints by itself. Refer to GDB Manual, D.3 Stop Reply Packets Change-Id: I1f70a1a9cc772e88e641b6171f1a009629a43bd1 Signed-off-by: Hsiangkai Wang <hsiangkai@gmail.com> Reviewed-on: http://openocd.zylin.com/1092 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
committed by
Spencer Oliver
parent
d979d78e97
commit
80d412bafc
@@ -294,6 +294,45 @@ int nds32_v3_checksum_memory(struct target *target,
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
|
||||
/**
|
||||
* find out which watchpoint hits
|
||||
* get exception address and compare the address to watchpoints
|
||||
*/
|
||||
int nds32_v3_hit_watchpoint(struct target *target,
|
||||
struct watchpoint **hit_watchpoint)
|
||||
{
|
||||
static struct watchpoint scan_all_watchpoint;
|
||||
|
||||
uint32_t exception_address;
|
||||
struct watchpoint *wp;
|
||||
struct nds32 *nds32 = target_to_nds32(target);
|
||||
|
||||
exception_address = nds32->watched_address;
|
||||
|
||||
if (exception_address == 0xFFFFFFFF)
|
||||
return ERROR_FAIL;
|
||||
|
||||
if (exception_address == 0) {
|
||||
scan_all_watchpoint.address = 0;
|
||||
scan_all_watchpoint.rw = WPT_WRITE;
|
||||
scan_all_watchpoint.next = 0;
|
||||
scan_all_watchpoint.unique_id = 0x5CA8;
|
||||
|
||||
*hit_watchpoint = &scan_all_watchpoint;
|
||||
return ERROR_OK;
|
||||
}
|
||||
|
||||
for (wp = target->watchpoints; wp; wp = wp->next) {
|
||||
if (((exception_address ^ wp->address) & (~wp->mask)) == 0) {
|
||||
*hit_watchpoint = wp;
|
||||
|
||||
return ERROR_OK;
|
||||
}
|
||||
}
|
||||
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
|
||||
int nds32_v3_target_create_common(struct target *target, struct nds32 *nds32)
|
||||
{
|
||||
nds32->register_map = nds32_v3_register_mapping;
|
||||
|
||||
Reference in New Issue
Block a user