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