pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 1 | #ifndef QEMU_CHAR_H |
| 2 | #define QEMU_CHAR_H |
| 3 | |
aliguori | 376253e | 2009-03-05 23:01:23 +0000 | [diff] [blame] | 4 | #include "qemu-common.h" |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 5 | #include "qemu-queue.h" |
Gerd Hoffmann | 191bc01 | 2009-09-10 10:58:35 +0200 | [diff] [blame] | 6 | #include "qemu-option.h" |
| 7 | #include "qemu-config.h" |
Luiz Capitulino | 588b383 | 2009-12-10 17:16:08 -0200 | [diff] [blame] | 8 | #include "qobject.h" |
Luiz Capitulino | 999bd67 | 2010-10-22 16:09:05 -0200 | [diff] [blame] | 9 | #include "qstring.h" |
Paolo Bonzini | 44a9b35 | 2011-09-12 16:44:30 +0200 | [diff] [blame] | 10 | #include "main-loop.h" |
aliguori | 376253e | 2009-03-05 23:01:23 +0000 | [diff] [blame] | 11 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 12 | /* character device */ |
| 13 | |
aliguori | 2724b18 | 2009-03-05 23:01:47 +0000 | [diff] [blame] | 14 | #define CHR_EVENT_BREAK 0 /* serial break char */ |
| 15 | #define CHR_EVENT_FOCUS 1 /* focus to this terminal (modal input needed) */ |
Amit Shah | b6b8df5 | 2009-10-07 18:31:16 +0530 | [diff] [blame] | 16 | #define CHR_EVENT_OPENED 2 /* new connection established */ |
aliguori | 2724b18 | 2009-03-05 23:01:47 +0000 | [diff] [blame] | 17 | #define CHR_EVENT_MUX_IN 3 /* mux-focus was set to this terminal */ |
| 18 | #define CHR_EVENT_MUX_OUT 4 /* mux-focus will move on */ |
Amit Shah | 793cbfb | 2009-08-11 21:27:48 +0530 | [diff] [blame] | 19 | #define CHR_EVENT_CLOSED 5 /* connection closed */ |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 20 | |
| 21 | |
| 22 | #define CHR_IOCTL_SERIAL_SET_PARAMS 1 |
| 23 | typedef struct { |
| 24 | int speed; |
| 25 | int parity; |
| 26 | int data_bits; |
| 27 | int stop_bits; |
| 28 | } QEMUSerialSetParams; |
| 29 | |
| 30 | #define CHR_IOCTL_SERIAL_SET_BREAK 2 |
| 31 | |
| 32 | #define CHR_IOCTL_PP_READ_DATA 3 |
| 33 | #define CHR_IOCTL_PP_WRITE_DATA 4 |
| 34 | #define CHR_IOCTL_PP_READ_CONTROL 5 |
| 35 | #define CHR_IOCTL_PP_WRITE_CONTROL 6 |
| 36 | #define CHR_IOCTL_PP_READ_STATUS 7 |
| 37 | #define CHR_IOCTL_PP_EPP_READ_ADDR 8 |
| 38 | #define CHR_IOCTL_PP_EPP_READ 9 |
| 39 | #define CHR_IOCTL_PP_EPP_WRITE_ADDR 10 |
| 40 | #define CHR_IOCTL_PP_EPP_WRITE 11 |
aurel32 | 563e3c6 | 2008-08-22 08:57:09 +0000 | [diff] [blame] | 41 | #define CHR_IOCTL_PP_DATA_DIR 12 |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 42 | |
aurel32 | f066404 | 2008-08-22 21:25:00 +0000 | [diff] [blame] | 43 | #define CHR_IOCTL_SERIAL_SET_TIOCM 13 |
| 44 | #define CHR_IOCTL_SERIAL_GET_TIOCM 14 |
aliguori | 81174da | 2008-08-11 14:17:04 +0000 | [diff] [blame] | 45 | |
| 46 | #define CHR_TIOCM_CTS 0x020 |
| 47 | #define CHR_TIOCM_CAR 0x040 |
| 48 | #define CHR_TIOCM_DSR 0x100 |
| 49 | #define CHR_TIOCM_RI 0x080 |
| 50 | #define CHR_TIOCM_DTR 0x002 |
| 51 | #define CHR_TIOCM_RTS 0x004 |
| 52 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 53 | typedef void IOEventHandler(void *opaque, int event); |
| 54 | |
| 55 | struct CharDriverState { |
aurel32 | ceecf1d | 2009-01-18 14:08:04 +0000 | [diff] [blame] | 56 | void (*init)(struct CharDriverState *s); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 57 | int (*chr_write)(struct CharDriverState *s, const uint8_t *buf, int len); |
| 58 | void (*chr_update_read_handler)(struct CharDriverState *s); |
| 59 | int (*chr_ioctl)(struct CharDriverState *s, int cmd, void *arg); |
Mark McLoughlin | 7d17405 | 2009-07-22 09:11:39 +0100 | [diff] [blame] | 60 | int (*get_msgfd)(struct CharDriverState *s); |
Daniel P. Berrange | 1366108 | 2011-06-23 13:31:42 +0100 | [diff] [blame] | 61 | int (*chr_add_client)(struct CharDriverState *chr, int fd); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 62 | IOEventHandler *chr_event; |
Juan Quintela | 7b27a76 | 2010-03-11 17:55:39 +0100 | [diff] [blame] | 63 | IOCanReadHandler *chr_can_read; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 64 | IOReadHandler *chr_read; |
| 65 | void *handler_opaque; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 66 | void (*chr_close)(struct CharDriverState *chr); |
balrog | bd9bdce | 2007-11-25 00:55:06 +0000 | [diff] [blame] | 67 | void (*chr_accept_input)(struct CharDriverState *chr); |
Paolo Bonzini | c48855e | 2010-12-23 13:42:48 +0100 | [diff] [blame] | 68 | void (*chr_set_echo)(struct CharDriverState *chr, bool echo); |
Hans de Goede | 7c32c4f | 2011-03-24 11:12:02 +0100 | [diff] [blame] | 69 | void (*chr_guest_open)(struct CharDriverState *chr); |
| 70 | void (*chr_guest_close)(struct CharDriverState *chr); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 71 | void *opaque; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 72 | QEMUBH *bh; |
aliguori | 5ccfae1 | 2008-10-31 17:31:29 +0000 | [diff] [blame] | 73 | char *label; |
| 74 | char *filename; |
Alexander Graf | 73cdf3f | 2010-04-01 18:42:39 +0200 | [diff] [blame] | 75 | int opened; |
Kusanagi Kouichi | d5b2716 | 2011-04-26 19:19:26 +0900 | [diff] [blame] | 76 | int avail_connections; |
Blue Swirl | 72cf2d4 | 2009-09-12 07:36:22 +0000 | [diff] [blame] | 77 | QTAILQ_ENTRY(CharDriverState) next; |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 78 | }; |
| 79 | |
Anthony Liguori | 2011fe5 | 2011-08-15 11:17:41 -0500 | [diff] [blame] | 80 | /** |
| 81 | * @qemu_chr_new_from_opts: |
| 82 | * |
| 83 | * Create a new character backend from a QemuOpts list. |
| 84 | * |
| 85 | * @opts see qemu-config.c for a list of valid options |
| 86 | * @init not sure.. |
| 87 | * |
| 88 | * Returns: a new character backend |
| 89 | */ |
Anthony Liguori | f69554b | 2011-08-15 11:17:37 -0500 | [diff] [blame] | 90 | CharDriverState *qemu_chr_new_from_opts(QemuOpts *opts, |
Gerd Hoffmann | 191bc01 | 2009-09-10 10:58:35 +0200 | [diff] [blame] | 91 | void (*init)(struct CharDriverState *s)); |
Anthony Liguori | 2011fe5 | 2011-08-15 11:17:41 -0500 | [diff] [blame] | 92 | |
| 93 | /** |
| 94 | * @qemu_chr_new: |
| 95 | * |
| 96 | * Create a new character backend from a URI. |
| 97 | * |
| 98 | * @label the name of the backend |
| 99 | * @filename the URI |
| 100 | * @init not sure.. |
| 101 | * |
| 102 | * Returns: a new character backend |
| 103 | */ |
| 104 | CharDriverState *qemu_chr_new(const char *label, const char *filename, |
| 105 | void (*init)(struct CharDriverState *s)); |
| 106 | |
| 107 | /** |
| 108 | * @qemu_chr_delete: |
| 109 | * |
| 110 | * Destroy a character backend. |
| 111 | */ |
Anthony Liguori | 70f24fb | 2011-08-15 11:17:38 -0500 | [diff] [blame] | 112 | void qemu_chr_delete(CharDriverState *chr); |
Anthony Liguori | 2011fe5 | 2011-08-15 11:17:41 -0500 | [diff] [blame] | 113 | |
| 114 | /** |
| 115 | * @qemu_chr_fe_set_echo: |
| 116 | * |
| 117 | * Ask the backend to override its normal echo setting. This only really |
| 118 | * applies to the stdio backend and is used by the QMP server such that you |
| 119 | * can see what you type if you try to type QMP commands. |
| 120 | * |
| 121 | * @echo true to enable echo, false to disable echo |
| 122 | */ |
| 123 | void qemu_chr_fe_set_echo(struct CharDriverState *chr, bool echo); |
| 124 | |
| 125 | /** |
| 126 | * @qemu_chr_fe_open: |
| 127 | * |
| 128 | * Open a character backend. This function call is an indication that the |
| 129 | * front end is ready to begin doing I/O. |
| 130 | */ |
| 131 | void qemu_chr_fe_open(struct CharDriverState *chr); |
| 132 | |
| 133 | /** |
| 134 | * @qemu_chr_fe_close: |
| 135 | * |
| 136 | * Close a character backend. This function call indicates that the front end |
| 137 | * no longer is able to process I/O. To process I/O again, the front end will |
| 138 | * call @qemu_chr_fe_open. |
| 139 | */ |
| 140 | void qemu_chr_fe_close(struct CharDriverState *chr); |
| 141 | |
| 142 | /** |
| 143 | * @qemu_chr_fe_printf: |
| 144 | * |
| 145 | * Write to a character backend using a printf style interface. |
| 146 | * |
| 147 | * @fmt see #printf |
| 148 | */ |
Anthony Liguori | e7e71b0 | 2011-08-15 11:17:29 -0500 | [diff] [blame] | 149 | void qemu_chr_fe_printf(CharDriverState *s, const char *fmt, ...) |
Stefan Weil | 8b7968f | 2010-09-23 21:28:05 +0200 | [diff] [blame] | 150 | GCC_FMT_ATTR(2, 3); |
Anthony Liguori | 2011fe5 | 2011-08-15 11:17:41 -0500 | [diff] [blame] | 151 | |
| 152 | /** |
| 153 | * @qemu_chr_fe_write: |
| 154 | * |
| 155 | * Write data to a character backend from the front end. This function will |
| 156 | * send data from the front end to the back end. |
| 157 | * |
| 158 | * @buf the data |
| 159 | * @len the number of bytes to send |
| 160 | * |
| 161 | * Returns: the number of bytes consumed |
| 162 | */ |
Anthony Liguori | 2cc6e0a | 2011-08-15 11:17:28 -0500 | [diff] [blame] | 163 | int qemu_chr_fe_write(CharDriverState *s, const uint8_t *buf, int len); |
Anthony Liguori | 2011fe5 | 2011-08-15 11:17:41 -0500 | [diff] [blame] | 164 | |
| 165 | /** |
| 166 | * @qemu_chr_fe_ioctl: |
| 167 | * |
| 168 | * Issue a device specific ioctl to a backend. |
| 169 | * |
| 170 | * @cmd see CHR_IOCTL_* |
| 171 | * @arg the data associated with @cmd |
| 172 | * |
| 173 | * Returns: if @cmd is not supported by the backend, -ENOTSUP, otherwise the |
| 174 | * return value depends on the semantics of @cmd |
| 175 | */ |
| 176 | int qemu_chr_fe_ioctl(CharDriverState *s, int cmd, void *arg); |
| 177 | |
| 178 | /** |
| 179 | * @qemu_chr_fe_get_msgfd: |
| 180 | * |
| 181 | * For backends capable of fd passing, return the latest file descriptor passed |
| 182 | * by a client. |
| 183 | * |
| 184 | * Returns: -1 if fd passing isn't supported or there is no pending file |
| 185 | * descriptor. If a file descriptor is returned, subsequent calls to |
| 186 | * this function will return -1 until a client sends a new file |
| 187 | * descriptor. |
| 188 | */ |
| 189 | int qemu_chr_fe_get_msgfd(CharDriverState *s); |
| 190 | |
| 191 | /** |
| 192 | * @qemu_chr_be_can_write: |
| 193 | * |
| 194 | * Determine how much data the front end can currently accept. This function |
| 195 | * returns the number of bytes the front end can accept. If it returns 0, the |
| 196 | * front end cannot receive data at the moment. The function must be polled |
| 197 | * to determine when data can be received. |
| 198 | * |
| 199 | * Returns: the number of bytes the front end can receive via @qemu_chr_be_write |
| 200 | */ |
| 201 | int qemu_chr_be_can_write(CharDriverState *s); |
| 202 | |
| 203 | /** |
| 204 | * @qemu_chr_be_write: |
| 205 | * |
| 206 | * Write data from the back end to the front end. Before issuing this call, |
| 207 | * the caller should call @qemu_chr_be_can_write to determine how much data |
| 208 | * the front end can currently accept. |
| 209 | * |
| 210 | * @buf a buffer to receive data from the front end |
| 211 | * @len the number of bytes to receive from the front end |
| 212 | */ |
| 213 | void qemu_chr_be_write(CharDriverState *s, uint8_t *buf, int len); |
| 214 | |
Hans de Goede | a425d23 | 2011-11-19 10:22:43 +0100 | [diff] [blame] | 215 | |
| 216 | /** |
| 217 | * @qemu_chr_be_event: |
| 218 | * |
| 219 | * Send an event from the back end to the front end. |
| 220 | * |
| 221 | * @event the event to send |
| 222 | */ |
| 223 | void qemu_chr_be_event(CharDriverState *s, int event); |
| 224 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 225 | void qemu_chr_add_handlers(CharDriverState *s, |
Juan Quintela | 7b27a76 | 2010-03-11 17:55:39 +0100 | [diff] [blame] | 226 | IOCanReadHandler *fd_can_read, |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 227 | IOReadHandler *fd_read, |
| 228 | IOEventHandler *fd_event, |
| 229 | void *opaque); |
Anthony Liguori | 2011fe5 | 2011-08-15 11:17:41 -0500 | [diff] [blame] | 230 | |
Amit Shah | 127338e | 2009-11-03 19:59:56 +0530 | [diff] [blame] | 231 | void qemu_chr_generic_open(CharDriverState *s); |
balrog | bd9bdce | 2007-11-25 00:55:06 +0000 | [diff] [blame] | 232 | void qemu_chr_accept_input(CharDriverState *s); |
Daniel P. Berrange | 1366108 | 2011-06-23 13:31:42 +0100 | [diff] [blame] | 233 | int qemu_chr_add_client(CharDriverState *s, int fd); |
Luiz Capitulino | 588b383 | 2009-12-10 17:16:08 -0200 | [diff] [blame] | 234 | void qemu_chr_info_print(Monitor *mon, const QObject *ret_data); |
| 235 | void qemu_chr_info(Monitor *mon, QObject **ret_data); |
Gerd Hoffmann | c845f40 | 2009-09-10 10:58:52 +0200 | [diff] [blame] | 236 | CharDriverState *qemu_chr_find(const char *name); |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 237 | |
Anthony Liguori | 2011fe5 | 2011-08-15 11:17:41 -0500 | [diff] [blame] | 238 | QemuOpts *qemu_chr_parse_compat(const char *label, const char *filename); |
| 239 | |
Cam Macdonell | 6cbf4c8 | 2010-07-27 10:54:13 -0600 | [diff] [blame] | 240 | /* add an eventfd to the qemu devices that are polled */ |
| 241 | CharDriverState *qemu_chr_open_eventfd(int eventfd); |
| 242 | |
aliguori | 0e82f34 | 2008-10-31 18:44:40 +0000 | [diff] [blame] | 243 | extern int term_escape_char; |
| 244 | |
Luiz Capitulino | 999bd67 | 2010-10-22 16:09:05 -0200 | [diff] [blame] | 245 | /* memory chardev */ |
| 246 | void qemu_chr_init_mem(CharDriverState *chr); |
| 247 | void qemu_chr_close_mem(CharDriverState *chr); |
| 248 | QString *qemu_chr_mem_to_qs(CharDriverState *chr); |
| 249 | size_t qemu_chr_mem_osize(const CharDriverState *chr); |
| 250 | |
Anthony Liguori | 0beb494 | 2011-12-22 15:29:25 -0600 | [diff] [blame] | 251 | CharDriverState *qemu_char_get_next_serial(void); |
| 252 | |
pbrook | 87ecb68 | 2007-11-17 17:14:51 +0000 | [diff] [blame] | 253 | #endif |