mirror of
https://github.com/apache/nuttx.git
synced 2026-05-27 03:05:40 +08:00
libc/gdbstub: add memory binary read support
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
This commit is contained in:
@@ -815,7 +815,15 @@ static ssize_t gdb_get_memory(FAR struct gdb_state_s *state,
|
|||||||
|
|
||||||
if (gdb_is_valid_region(state, addr, len, PF_R))
|
if (gdb_is_valid_region(state, addr, len, PF_R))
|
||||||
{
|
{
|
||||||
return format(buf, buf_len, (FAR const void *)addr, len);
|
if (format)
|
||||||
|
{
|
||||||
|
return format(buf, buf_len, (FAR const void *)addr, len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = MIN(len, buf_len);
|
||||||
|
memcpy(buf, (FAR const void *)addr, ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -1164,6 +1172,49 @@ static int gdb_read_memory(FAR struct gdb_state_s *state)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: gdb_read_bin_memory
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Read Memory (Binary) Command Format: M addr,length
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* state - The pointer to the GDB state structure.
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* The number of bytes read if successful.
|
||||||
|
* Negative value on error.
|
||||||
|
*
|
||||||
|
* Note : Comand Format: MAAAAAAAAA,LLLLLLLL
|
||||||
|
* Response Format: bXXXXXXXXYYYYYYYYY...
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static int gdb_read_bin_memory(FAR struct gdb_state_s *state)
|
||||||
|
{
|
||||||
|
uintptr_t addr;
|
||||||
|
size_t length;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
state->pkt_next++;
|
||||||
|
ret = gdb_expect_addr_length(state, &addr, &length);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
state->pkt_buf[0] = 'b';
|
||||||
|
ret = gdb_get_memory(state, state->pkt_buf + 1, sizeof(state->pkt_buf) - 1,
|
||||||
|
addr, length, NULL);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
state->pkt_len = ret + 1;
|
||||||
|
gdb_send_packet(state);
|
||||||
|
return ret + 1;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: gdb_write_memory
|
* Name: gdb_write_memory
|
||||||
*
|
*
|
||||||
@@ -1998,6 +2049,9 @@ int gdb_process(FAR struct gdb_state_s *state, int stopreason,
|
|||||||
case 'M': /* Write memory */
|
case 'M': /* Write memory */
|
||||||
ret = gdb_write_memory(state);
|
ret = gdb_write_memory(state);
|
||||||
break;
|
break;
|
||||||
|
case 'x': /* Read binary memory */
|
||||||
|
ret = gdb_read_bin_memory(state);
|
||||||
|
break;
|
||||||
case 'X': /* Write binary memory */
|
case 'X': /* Write binary memory */
|
||||||
ret = gdb_write_bin_memory(state);
|
ret = gdb_write_bin_memory(state);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user