mirror of https://github.com/xqemu/xqemu.git
gdbstub: Implement gdb_do_syscallv()
Implement a variant of the existing gdb_do_syscall() which takes a va_list. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Tested-by: Christopher Covington <cov@codeaurora.org> Message-id: 1439483745-28752-4-git-send-email-peter.maydell@linaro.org
This commit is contained in:
parent
205ace55ff
commit
19239b39e7
14
gdbstub.c
14
gdbstub.c
|
@ -1301,9 +1301,8 @@ send_packet:
|
||||||
%x - target_ulong argument printed in hex.
|
%x - target_ulong argument printed in hex.
|
||||||
%lx - 64-bit argument printed in hex.
|
%lx - 64-bit argument printed in hex.
|
||||||
%s - string pointer (target_ulong) and length (int) pair. */
|
%s - string pointer (target_ulong) and length (int) pair. */
|
||||||
void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
|
void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list va)
|
||||||
{
|
{
|
||||||
va_list va;
|
|
||||||
char *p;
|
char *p;
|
||||||
char *p_end;
|
char *p_end;
|
||||||
target_ulong addr;
|
target_ulong addr;
|
||||||
|
@ -1317,7 +1316,6 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
vm_stop(RUN_STATE_DEBUG);
|
vm_stop(RUN_STATE_DEBUG);
|
||||||
#endif
|
#endif
|
||||||
va_start(va, fmt);
|
|
||||||
p = s->syscall_buf;
|
p = s->syscall_buf;
|
||||||
p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
|
p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
|
||||||
*(p++) = 'F';
|
*(p++) = 'F';
|
||||||
|
@ -1351,7 +1349,6 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*p = 0;
|
*p = 0;
|
||||||
va_end(va);
|
|
||||||
#ifdef CONFIG_USER_ONLY
|
#ifdef CONFIG_USER_ONLY
|
||||||
put_packet(s, s->syscall_buf);
|
put_packet(s, s->syscall_buf);
|
||||||
gdb_handlesig(s->c_cpu, 0);
|
gdb_handlesig(s->c_cpu, 0);
|
||||||
|
@ -1366,6 +1363,15 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list va;
|
||||||
|
|
||||||
|
va_start(va, fmt);
|
||||||
|
gdb_do_syscallv(cb, fmt, va);
|
||||||
|
va_end(va);
|
||||||
|
}
|
||||||
|
|
||||||
static void gdb_read_byte(GDBState *s, int ch)
|
static void gdb_read_byte(GDBState *s, int ch)
|
||||||
{
|
{
|
||||||
int i, csum;
|
int i, csum;
|
||||||
|
|
|
@ -14,7 +14,34 @@
|
||||||
typedef void (*gdb_syscall_complete_cb)(CPUState *cpu,
|
typedef void (*gdb_syscall_complete_cb)(CPUState *cpu,
|
||||||
target_ulong ret, target_ulong err);
|
target_ulong ret, target_ulong err);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gdb_do_syscall:
|
||||||
|
* @cb: function to call when the system call has completed
|
||||||
|
* @fmt: gdb syscall format string
|
||||||
|
* ...: list of arguments to interpolate into @fmt
|
||||||
|
*
|
||||||
|
* Send a GDB syscall request. This function will return immediately;
|
||||||
|
* the callback function will be called later when the remote system
|
||||||
|
* call has completed.
|
||||||
|
*
|
||||||
|
* @fmt should be in the 'call-id,parameter,parameter...' format documented
|
||||||
|
* for the F request packet in the GDB remote protocol. A limited set of
|
||||||
|
* printf-style format specifiers is supported:
|
||||||
|
* %x - target_ulong argument printed in hex
|
||||||
|
* %lx - 64-bit argument printed in hex
|
||||||
|
* %s - string pointer (target_ulong) and length (int) pair
|
||||||
|
*/
|
||||||
void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...);
|
void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...);
|
||||||
|
/**
|
||||||
|
* gdb_do_syscallv:
|
||||||
|
* @cb: function to call when the system call has completed
|
||||||
|
* @fmt: gdb syscall format string
|
||||||
|
* @va: arguments to interpolate into @fmt
|
||||||
|
*
|
||||||
|
* As gdb_do_syscall, but taking a va_list rather than a variable
|
||||||
|
* argument list.
|
||||||
|
*/
|
||||||
|
void gdb_do_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list va);
|
||||||
int use_gdb_syscalls(void);
|
int use_gdb_syscalls(void);
|
||||||
void gdb_set_stop_cpu(CPUState *cpu);
|
void gdb_set_stop_cpu(CPUState *cpu);
|
||||||
void gdb_exit(CPUArchState *, int);
|
void gdb_exit(CPUArchState *, int);
|
||||||
|
|
Loading…
Reference in New Issue