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,
|
gdb_put_buffer(gdbserver_state.last_packet->data,
|
||||||
gdbserver_state.last_packet->len);
|
gdbserver_state.last_packet->len);
|
||||||
|
|
||||||
#ifdef CONFIG_USER_ONLY
|
if (gdb_got_immediate_ack()) {
|
||||||
i = gdb_get_char();
|
|
||||||
if (i < 0)
|
|
||||||
return -1;
|
|
||||||
if (i == '+')
|
|
||||||
break;
|
break;
|
||||||
#else
|
}
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return 0;
|
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_memtox(GString *buf, const char *mem, int len);
|
||||||
void gdb_read_byte(uint8_t ch);
|
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 */
|
/* utility helpers */
|
||||||
CPUState *gdb_first_attached_cpu(void);
|
CPUState *gdb_first_attached_cpu(void);
|
||||||
void gdb_append_thread_id(CPUState *cpu, GString *buf);
|
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;
|
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
|
* GDB Connection management. For system emulation we do all of this
|
||||||
* via our existing Chardev infrastructure which allows us to support
|
* via our existing Chardev infrastructure which allows us to support
|
||||||
|
|
|
@ -54,6 +54,25 @@ int gdb_get_char(void)
|
||||||
return ch;
|
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)
|
void gdb_put_buffer(const uint8_t *buf, int len)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
Loading…
Reference in New Issue