Revision a87295e8 gdbstub.c
b/gdbstub.c | ||
---|---|---|
963 | 963 |
|
964 | 964 |
/* Send a gdb syscall request. |
965 | 965 |
This accepts limited printf-style format specifiers, specifically: |
966 |
%x - target_ulong argument printed in hex. |
|
967 |
%s - string pointer (target_ulong) and length (int) pair. */ |
|
966 |
%x - target_ulong argument printed in hex. |
|
967 |
%lx - 64-bit argument printed in hex. |
|
968 |
%s - string pointer (target_ulong) and length (int) pair. */ |
|
968 | 969 |
void gdb_do_syscall(gdb_syscall_complete_cb cb, char *fmt, ...) |
969 | 970 |
{ |
970 | 971 |
va_list va; |
971 | 972 |
char buf[256]; |
972 | 973 |
char *p; |
973 | 974 |
target_ulong addr; |
975 |
uint64_t i64; |
|
974 | 976 |
GDBState *s; |
975 | 977 |
|
976 | 978 |
s = gdb_syscall_state; |
... | ... | |
993 | 995 |
addr = va_arg(va, target_ulong); |
994 | 996 |
p += sprintf(p, TARGET_FMT_lx, addr); |
995 | 997 |
break; |
998 |
case 'l': |
|
999 |
if (*(fmt++) != 'x') |
|
1000 |
goto bad_format; |
|
1001 |
i64 = va_arg(va, uint64_t); |
|
1002 |
p += sprintf(p, "%" PRIx64, i64); |
|
1003 |
break; |
|
996 | 1004 |
case 's': |
997 | 1005 |
addr = va_arg(va, target_ulong); |
998 | 1006 |
p += sprintf(p, TARGET_FMT_lx "/%x", addr, va_arg(va, int)); |
999 | 1007 |
break; |
1000 | 1008 |
default: |
1009 |
bad_format: |
|
1001 | 1010 |
fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n", |
1002 | 1011 |
fmt - 1); |
1003 | 1012 |
break; |
Also available in: Unified diff