xref: /openbmc/qemu/include/gdbstub/user.h (revision a53b931645183bd0c15dd19ae0708fc3c81ecf1d)
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  *
6*b14d0649SPhilippe Mathieu-Daudé  * SPDX-License-Identifier: LGPL-2.0-or-later
7d96bf49bSAlex Bennée  */
8d96bf49bSAlex Bennée 
9d96bf49bSAlex Bennée #ifndef GDBSTUB_USER_H
10d96bf49bSAlex Bennée #define GDBSTUB_USER_H
11d96bf49bSAlex Bennée 
12f84e313eSGustavo Romero #define MAX_SIGINFO_LENGTH 128
13f84e313eSGustavo Romero 
14d96bf49bSAlex Bennée /**
15b6617e93SGustavo Romero  * gdb_handlesig() - yield control to gdb
16d96bf49bSAlex Bennée  * @cpu: CPU
17d96bf49bSAlex Bennée  * @sig: if non-zero, the signal number which caused us to stop
188b7fcb8eSIlya Leoshkevich  * @reason: stop reason for stop reply packet or NULL
19f84e313eSGustavo Romero  * @siginfo: target-specific siginfo struct
20f84e313eSGustavo Romero  * @siginfo_len: target-specific siginfo struct length
21d96bf49bSAlex Bennée  *
22d96bf49bSAlex Bennée  * This function yields control to gdb, when a user-mode-only target
23d96bf49bSAlex Bennée  * needs to stop execution. If @sig is non-zero, then we will send a
24d96bf49bSAlex Bennée  * stop packet to tell gdb that we have stopped because of this signal.
25d96bf49bSAlex Bennée  *
26d96bf49bSAlex Bennée  * This function will block (handling protocol requests from gdb)
27d96bf49bSAlex Bennée  * until gdb tells us to continue target execution. When it does
28d96bf49bSAlex Bennée  * return, the return value is a signal to deliver to the target,
29d96bf49bSAlex Bennée  * or 0 if no signal should be delivered, ie the signal that caused
30d96bf49bSAlex Bennée  * us to stop should be ignored.
31d96bf49bSAlex Bennée  */
32f84e313eSGustavo Romero int gdb_handlesig(CPUState *, int, const char *, void *, int);
33d96bf49bSAlex Bennée 
34d96bf49bSAlex Bennée /**
35d96bf49bSAlex Bennée  * gdb_signalled() - inform remote gdb of sig exit
36d96bf49bSAlex Bennée  * @as: current CPUArchState
37d96bf49bSAlex Bennée  * @sig: signal number
38d96bf49bSAlex Bennée  */
39d96bf49bSAlex Bennée void gdb_signalled(CPUArchState *as, int sig);
40d96bf49bSAlex Bennée 
41d96bf49bSAlex Bennée /**
423d6ed98dSIlya Leoshkevich  * gdbserver_fork_start() - inform gdb of the upcoming fork()
433d6ed98dSIlya Leoshkevich  */
443d6ed98dSIlya Leoshkevich void gdbserver_fork_start(void);
453d6ed98dSIlya Leoshkevich 
463d6ed98dSIlya Leoshkevich /**
476604b057SIlya Leoshkevich  * gdbserver_fork_end() - inform gdb of the completed fork()
48d96bf49bSAlex Bennée  * @cs: CPU
496604b057SIlya Leoshkevich  * @pid: 0 if in child process, -1 if fork failed, child process pid otherwise
50d96bf49bSAlex Bennée  */
516604b057SIlya Leoshkevich void gdbserver_fork_end(CPUState *cs, pid_t pid);
52d96bf49bSAlex Bennée 
530a0d87c9SIlya Leoshkevich /**
540a0d87c9SIlya Leoshkevich  * gdb_syscall_entry() - inform gdb of syscall entry and yield control to it
550a0d87c9SIlya Leoshkevich  * @cs: CPU
560a0d87c9SIlya Leoshkevich  * @num: syscall number
570a0d87c9SIlya Leoshkevich  */
580a0d87c9SIlya Leoshkevich void gdb_syscall_entry(CPUState *cs, int num);
590a0d87c9SIlya Leoshkevich 
600a0d87c9SIlya Leoshkevich /**
610a0d87c9SIlya Leoshkevich  * gdb_syscall_entry() - inform gdb of syscall return and yield control to it
620a0d87c9SIlya Leoshkevich  * @cs: CPU
630a0d87c9SIlya Leoshkevich  * @num: syscall number
640a0d87c9SIlya Leoshkevich  */
650a0d87c9SIlya Leoshkevich void gdb_syscall_return(CPUState *cs, int num);
66d96bf49bSAlex Bennée 
67d96bf49bSAlex Bennée #endif /* GDBSTUB_USER_H */
68