xref: /openbmc/qemu/include/gdbstub/syscalls.h (revision a53b931645183bd0c15dd19ae0708fc3c81ecf1d)
1  /*
2   * GDB Syscall support
3   *
4   * Copyright (c) 2023 Linaro Ltd
5   *
6   * SPDX-License-Identifier: LGPL-2.0-or-later
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