xref: /qemu/include/gdbstub/user.h (revision 3d6ed98da82e0bb2384bfbc83fadb518271fdbca)
1d96bf49bSAlex Bennée /*
2d96bf49bSAlex Bennée  * gdbstub user-mode only APIs
3d96bf49bSAlex Bennée  *
4d96bf49bSAlex Bennée  * Copyright (c) 2022 Linaro Ltd
5d96bf49bSAlex Bennée  *
6d96bf49bSAlex Bennée  * SPDX-License-Identifier: LGPL-2.0+
7d96bf49bSAlex Bennée  */
8d96bf49bSAlex Bennée 
9d96bf49bSAlex Bennée #ifndef GDBSTUB_USER_H
10d96bf49bSAlex Bennée #define GDBSTUB_USER_H
11d96bf49bSAlex Bennée 
12d96bf49bSAlex Bennée /**
138b7fcb8eSIlya Leoshkevich  * gdb_handlesig_reason() - yield control to gdb
14d96bf49bSAlex Bennée  * @cpu: CPU
15d96bf49bSAlex Bennée  * @sig: if non-zero, the signal number which caused us to stop
168b7fcb8eSIlya Leoshkevich  * @reason: stop reason for stop reply packet or NULL
17d96bf49bSAlex Bennée  *
18d96bf49bSAlex Bennée  * This function yields control to gdb, when a user-mode-only target
19d96bf49bSAlex Bennée  * needs to stop execution. If @sig is non-zero, then we will send a
20d96bf49bSAlex Bennée  * stop packet to tell gdb that we have stopped because of this signal.
21d96bf49bSAlex Bennée  *
22d96bf49bSAlex Bennée  * This function will block (handling protocol requests from gdb)
23d96bf49bSAlex Bennée  * until gdb tells us to continue target execution. When it does
24d96bf49bSAlex Bennée  * return, the return value is a signal to deliver to the target,
25d96bf49bSAlex Bennée  * or 0 if no signal should be delivered, ie the signal that caused
26d96bf49bSAlex Bennée  * us to stop should be ignored.
27d96bf49bSAlex Bennée  */
288b7fcb8eSIlya Leoshkevich int gdb_handlesig_reason(CPUState *, int, const char *);
298b7fcb8eSIlya Leoshkevich 
308b7fcb8eSIlya Leoshkevich /**
318b7fcb8eSIlya Leoshkevich  * gdb_handlesig() - yield control to gdb
328b7fcb8eSIlya Leoshkevich  * @cpu CPU
338b7fcb8eSIlya Leoshkevich  * @sig: if non-zero, the signal number which caused us to stop
348b7fcb8eSIlya Leoshkevich  * @see gdb_handlesig_reason()
358b7fcb8eSIlya Leoshkevich  */
368b7fcb8eSIlya Leoshkevich static inline int gdb_handlesig(CPUState *cpu, int sig)
378b7fcb8eSIlya Leoshkevich {
388b7fcb8eSIlya Leoshkevich     return gdb_handlesig_reason(cpu, sig, NULL);
398b7fcb8eSIlya Leoshkevich }
40d96bf49bSAlex Bennée 
41d96bf49bSAlex Bennée /**
42d96bf49bSAlex Bennée  * gdb_signalled() - inform remote gdb of sig exit
43d96bf49bSAlex Bennée  * @as: current CPUArchState
44d96bf49bSAlex Bennée  * @sig: signal number
45d96bf49bSAlex Bennée  */
46d96bf49bSAlex Bennée void gdb_signalled(CPUArchState *as, int sig);
47d96bf49bSAlex Bennée 
48d96bf49bSAlex Bennée /**
49*3d6ed98dSIlya Leoshkevich  * gdbserver_fork_start() - inform gdb of the upcoming fork()
50*3d6ed98dSIlya Leoshkevich  */
51*3d6ed98dSIlya Leoshkevich void gdbserver_fork_start(void);
52*3d6ed98dSIlya Leoshkevich 
53*3d6ed98dSIlya Leoshkevich /**
54d96bf49bSAlex Bennée  * gdbserver_fork() - disable gdb stub for child processes.
55d96bf49bSAlex Bennée  * @cs: CPU
56d96bf49bSAlex Bennée  */
57d96bf49bSAlex Bennée void gdbserver_fork(CPUState *cs);
58d96bf49bSAlex Bennée 
590a0d87c9SIlya Leoshkevich /**
600a0d87c9SIlya Leoshkevich  * gdb_syscall_entry() - inform gdb of syscall entry and yield control to it
610a0d87c9SIlya Leoshkevich  * @cs: CPU
620a0d87c9SIlya Leoshkevich  * @num: syscall number
630a0d87c9SIlya Leoshkevich  */
640a0d87c9SIlya Leoshkevich void gdb_syscall_entry(CPUState *cs, int num);
650a0d87c9SIlya Leoshkevich 
660a0d87c9SIlya Leoshkevich /**
670a0d87c9SIlya Leoshkevich  * gdb_syscall_entry() - inform gdb of syscall return and yield control to it
680a0d87c9SIlya Leoshkevich  * @cs: CPU
690a0d87c9SIlya Leoshkevich  * @num: syscall number
700a0d87c9SIlya Leoshkevich  */
710a0d87c9SIlya Leoshkevich void gdb_syscall_return(CPUState *cs, int num);
72d96bf49bSAlex Bennée 
73d96bf49bSAlex Bennée #endif /* GDBSTUB_USER_H */
74