mirror of https://github.com/xemu-project/xemu.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.
|
||||
%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_syscallv(gdb_syscall_complete_cb cb, const char *fmt, va_list va)
|
||||
{
|
||||
va_list va;
|
||||
char *p;
|
||||
char *p_end;
|
||||
target_ulong addr;
|
||||
|
@ -1317,7 +1316,6 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
|
|||
#ifndef CONFIG_USER_ONLY
|
||||
vm_stop(RUN_STATE_DEBUG);
|
||||
#endif
|
||||
va_start(va, fmt);
|
||||
p = s->syscall_buf;
|
||||
p_end = &s->syscall_buf[sizeof(s->syscall_buf)];
|
||||
*(p++) = 'F';
|
||||
|
@ -1351,7 +1349,6 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
|
|||
}
|
||||
}
|
||||
*p = 0;
|
||||
va_end(va);
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
put_packet(s, s->syscall_buf);
|
||||
gdb_handlesig(s->c_cpu, 0);
|
||||
|
@ -1366,6 +1363,15 @@ void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...)
|
|||
#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)
|
||||
{
|
||||
int i, csum;
|
||||
|
|
|
@ -14,7 +14,34 @@
|
|||
typedef void (*gdb_syscall_complete_cb)(CPUState *cpu,
|
||||
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, ...);
|
||||
/**
|
||||
* 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);
|
||||
void gdb_set_stop_cpu(CPUState *cpu);
|
||||
void gdb_exit(CPUArchState *, int);
|
||||
|
|
Loading…
Reference in New Issue