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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Peter Maydell
						Peter Maydell