mirror of https://github.com/xemu-project/xemu.git
gdbstub: abstract target specific details from gdb_put_packet_binary
We unfortunately handle the checking of packet acknowledgement differently for user and softmmu modes. Abstract the user mode stuff behind gdb_got_immediate_ack with a stub for softmmu. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20230302190846.2593720-14-alex.bennee@linaro.org> Message-Id: <20230303025805.625589-14-richard.henderson@linaro.org>
This commit is contained in:
parent
ccd4c7c24a
commit
a7e0f9bd2a
|
@ -239,15 +239,9 @@ int gdb_put_packet_binary(const char *buf, int len, bool dump)
|
|||
gdb_put_buffer(gdbserver_state.last_packet->data,
|
||||
gdbserver_state.last_packet->len);
|
||||
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
i = gdb_get_char();
|
||||
if (i < 0)
|
||||
return -1;
|
||||
if (i == '+')
|
||||
if (gdb_got_immediate_ack()) {
|
||||
break;
|
||||
#else
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -110,6 +110,21 @@ void gdb_memtohex(GString *buf, const uint8_t *mem, int len);
|
|||
void gdb_memtox(GString *buf, const char *mem, int len);
|
||||
void gdb_read_byte(uint8_t ch);
|
||||
|
||||
/*
|
||||
* Packet acknowledgement - we handle this slightly differently
|
||||
* between user and softmmu mode, mainly to deal with the differences
|
||||
* between the flexible chardev and the direct fd approaches.
|
||||
*
|
||||
* We currently don't support a negotiated QStartNoAckMode
|
||||
*/
|
||||
|
||||
/**
|
||||
* gdb_got_immediate_ack() - check ok to continue
|
||||
*
|
||||
* Returns true to continue, false to re-transmit for user only, the
|
||||
* softmmu stub always returns true.
|
||||
*/
|
||||
bool gdb_got_immediate_ack(void);
|
||||
/* utility helpers */
|
||||
CPUState *gdb_first_attached_cpu(void);
|
||||
void gdb_append_thread_id(CPUState *cpu, GString *buf);
|
||||
|
|
|
@ -55,6 +55,14 @@ int gdb_get_cpu_index(CPUState *cpu)
|
|||
return cpu->cpu_index + 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* We check the status of the last message in the chardev receive code
|
||||
*/
|
||||
bool gdb_got_immediate_ack(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* GDB Connection management. For system emulation we do all of this
|
||||
* via our existing Chardev infrastructure which allows us to support
|
||||
|
|
|
@ -54,6 +54,25 @@ int gdb_get_char(void)
|
|||
return ch;
|
||||
}
|
||||
|
||||
bool gdb_got_immediate_ack(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
i = gdb_get_char();
|
||||
if (i < 0) {
|
||||
/* no response, continue anyway */
|
||||
return true;
|
||||
}
|
||||
|
||||
if (i == '+') {
|
||||
/* received correctly, continue */
|
||||
return true;
|
||||
}
|
||||
|
||||
/* anything else, including '-' then try again */
|
||||
return false;
|
||||
}
|
||||
|
||||
void gdb_put_buffer(const uint8_t *buf, int len)
|
||||
{
|
||||
int ret;
|
||||
|
|
Loading…
Reference in New Issue