forked from auracaster/openocd
server/gdb_server: improve error handling for Z/z packet
* Report errors for `z` packet.
* Report not supported types as required by GDB Remote Protocol's
documentation:
> Implementation notes: A remote target shall return an empty string
for an unrecognized breakpoint or watchpoint packet type.
Link: https://sourceware.org/gdb/current/onlinedocs/gdb.html/Packets.html#insert-breakpoint-or-watchpoint-packet
Change-Id: I9130400aca5dbc54fefb413ed74f27d75fe50640
Signed-off-by: Evgeniy Naydanov <evgeniy.naydanov@syntacore.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/8488
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
committed by
Antonio Borneo
parent
1ae6b07b45
commit
e6ade35305
@@ -1781,18 +1781,9 @@ static int gdb_breakpoint_watchpoint_packet(struct connection *connection,
|
|||||||
case 1:
|
case 1:
|
||||||
if (packet[0] == 'Z') {
|
if (packet[0] == 'Z') {
|
||||||
retval = breakpoint_add(target, address, size, bp_type);
|
retval = breakpoint_add(target, address, size, bp_type);
|
||||||
if (retval == ERROR_NOT_IMPLEMENTED) {
|
|
||||||
/* Send empty reply to report that breakpoints of this type are not supported */
|
|
||||||
gdb_put_packet(connection, "", 0);
|
|
||||||
} else if (retval != ERROR_OK) {
|
|
||||||
retval = gdb_error(connection, retval);
|
|
||||||
if (retval != ERROR_OK)
|
|
||||||
return retval;
|
|
||||||
} else
|
|
||||||
gdb_put_packet(connection, "OK", 2);
|
|
||||||
} else {
|
} else {
|
||||||
breakpoint_remove(target, address);
|
assert(packet[0] == 'z');
|
||||||
gdb_put_packet(connection, "OK", 2);
|
retval = breakpoint_remove(target, address);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
@@ -1801,26 +1792,26 @@ static int gdb_breakpoint_watchpoint_packet(struct connection *connection,
|
|||||||
{
|
{
|
||||||
if (packet[0] == 'Z') {
|
if (packet[0] == 'Z') {
|
||||||
retval = watchpoint_add(target, address, size, wp_type, 0, WATCHPOINT_IGNORE_DATA_VALUE_MASK);
|
retval = watchpoint_add(target, address, size, wp_type, 0, WATCHPOINT_IGNORE_DATA_VALUE_MASK);
|
||||||
if (retval == ERROR_NOT_IMPLEMENTED) {
|
|
||||||
/* Send empty reply to report that watchpoints of this type are not supported */
|
|
||||||
gdb_put_packet(connection, "", 0);
|
|
||||||
} else if (retval != ERROR_OK) {
|
|
||||||
retval = gdb_error(connection, retval);
|
|
||||||
if (retval != ERROR_OK)
|
|
||||||
return retval;
|
|
||||||
} else
|
|
||||||
gdb_put_packet(connection, "OK", 2);
|
|
||||||
} else {
|
} else {
|
||||||
watchpoint_remove(target, address);
|
assert(packet[0] == 'z');
|
||||||
gdb_put_packet(connection, "OK", 2);
|
retval = watchpoint_remove(target, address);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
{
|
||||||
|
retval = ERROR_NOT_IMPLEMENTED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ERROR_OK;
|
if (retval == ERROR_NOT_IMPLEMENTED) {
|
||||||
|
/* Send empty reply to report that watchpoints of this type are not supported */
|
||||||
|
return gdb_put_packet(connection, "", 0);
|
||||||
|
}
|
||||||
|
if (retval != ERROR_OK)
|
||||||
|
return gdb_error(connection, retval);
|
||||||
|
return gdb_put_packet(connection, "OK", 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* print out a string and allocate more space as needed,
|
/* print out a string and allocate more space as needed,
|
||||||
|
|||||||
Reference in New Issue
Block a user