xref: /openbmc/qemu/include/gdbstub/syscalls.h (revision 259ebed4)
1 /*
2  * GDB Syscall support
3  *
4  * Copyright (c) 2023 Linaro Ltd
5  *
6  * SPDX-License-Identifier: LGPL-2.0+
7  */
8 
9 #ifndef _SYSCALLS_H_
10 #define _SYSCALLS_H_
11 
12 /* For gdb file i/o remote protocol open flags. */
13 #define GDB_O_RDONLY  0
14 #define GDB_O_WRONLY  1
15 #define GDB_O_RDWR    2
16 #define GDB_O_APPEND  8
17 #define GDB_O_CREAT   0x200
18 #define GDB_O_TRUNC   0x400
19 #define GDB_O_EXCL    0x800
20 
21 /* For gdb file i/o remote protocol errno values */
22 #define GDB_EPERM           1
23 #define GDB_ENOENT          2
24 #define GDB_EINTR           4
25 #define GDB_EBADF           9
26 #define GDB_EACCES         13
27 #define GDB_EFAULT         14
28 #define GDB_EBUSY          16
29 #define GDB_EEXIST         17
30 #define GDB_ENODEV         19
31 #define GDB_ENOTDIR        20
32 #define GDB_EISDIR         21
33 #define GDB_EINVAL         22
34 #define GDB_ENFILE         23
35 #define GDB_EMFILE         24
36 #define GDB_EFBIG          27
37 #define GDB_ENOSPC         28
38 #define GDB_ESPIPE         29
39 #define GDB_EROFS          30
40 #define GDB_ENAMETOOLONG   91
41 #define GDB_EUNKNOWN       9999
42 
43 /* For gdb file i/o remote protocol lseek whence. */
44 #define GDB_SEEK_SET  0
45 #define GDB_SEEK_CUR  1
46 #define GDB_SEEK_END  2
47 
48 /* For gdb file i/o stat/fstat. */
49 typedef uint32_t gdb_mode_t;
50 typedef uint32_t gdb_time_t;
51 
52 struct gdb_stat {
53   uint32_t    gdb_st_dev;     /* device */
54   uint32_t    gdb_st_ino;     /* inode */
55   gdb_mode_t  gdb_st_mode;    /* protection */
56   uint32_t    gdb_st_nlink;   /* number of hard links */
57   uint32_t    gdb_st_uid;     /* user ID of owner */
58   uint32_t    gdb_st_gid;     /* group ID of owner */
59   uint32_t    gdb_st_rdev;    /* device type (if inode device) */
60   uint64_t    gdb_st_size;    /* total size, in bytes */
61   uint64_t    gdb_st_blksize; /* blocksize for filesystem I/O */
62   uint64_t    gdb_st_blocks;  /* number of blocks allocated */
63   gdb_time_t  gdb_st_atime;   /* time of last access */
64   gdb_time_t  gdb_st_mtime;   /* time of last modification */
65   gdb_time_t  gdb_st_ctime;   /* time of last change */
66 } QEMU_PACKED;
67 
68 struct gdb_timeval {
69   gdb_time_t tv_sec;  /* second */
70   uint64_t tv_usec;   /* microsecond */
71 } QEMU_PACKED;
72 
73 typedef void (*gdb_syscall_complete_cb)(CPUState *cpu, uint64_t ret, int err);
74 
75 /**
76  * gdb_do_syscall:
77  * @cb: function to call when the system call has completed
78  * @fmt: gdb syscall format string
79  * ...: list of arguments to interpolate into @fmt
80  *
81  * Send a GDB syscall request. This function will return immediately;
82  * the callback function will be called later when the remote system
83  * call has completed.
84  *
85  * @fmt should be in the 'call-id,parameter,parameter...' format documented
86  * for the F request packet in the GDB remote protocol. A limited set of
87  * printf-style format specifiers is supported:
88  *   %x  - target_ulong argument printed in hex
89  *   %lx - 64-bit argument printed in hex
90  *   %s  - string pointer (target_ulong) and length (int) pair
91  */
92 void gdb_do_syscall(gdb_syscall_complete_cb cb, const char *fmt, ...);
93 
94 /**
95  * use_gdb_syscalls() - report if GDB should be used for syscalls
96  *
97  * This is mostly driven by the semihosting mode the user configures
98  * but assuming GDB is allowed by that we report true if GDB is
99  * connected to the stub.
100  */
101 int use_gdb_syscalls(void);
102 
103 /**
104  * gdb_exit: exit gdb session, reporting inferior status
105  * @code: exit code reported
106  *
107  * This closes the session and sends a final packet to GDB reporting
108  * the exit status of the program. It also cleans up any connections
109  * detritus before returning.
110  */
111 void gdb_exit(int code);
112 
113 /**
114  * gdb_qemu_exit: ask qemu to exit
115  * @code: exit code reported
116  *
117  * This requests qemu to exit. This function is allowed to return as
118  * the exit request might be processed asynchronously by qemu backend.
119  */
120 void gdb_qemu_exit(int code);
121 
122 #endif /* _SYSCALLS_H_ */
123