Lines Matching +full:d +full:- +full:- +full:- +full:- +full:- +full:1
4 * Copyright (c) 2003-2008 Fabrice Bellard
31 #include "sysemu/block-backend.h"
32 #include "qapi/qapi-commands-control.h"
33 #include "chardev-internal.h"
47 MuxChardev *d = MUX_CHARDEV(chr); in mux_chr_write() local
49 if (!d->timestamps) { in mux_chr_write()
50 ret = qemu_chr_fe_write(&d->chr, buf, len); in mux_chr_write()
56 if (d->linestart) { in mux_chr_write()
62 if (d->timestamps_start == -1) { in mux_chr_write()
63 d->timestamps_start = ti; in mux_chr_write()
65 ti -= d->timestamps_start; in mux_chr_write()
68 "[%02d:%02d:%02d.%03d] ", in mux_chr_write()
75 qemu_chr_fe_write_all(&d->chr, in mux_chr_write()
77 d->linestart = false; in mux_chr_write()
79 ret += qemu_chr_fe_write(&d->chr, buf + i, 1); in mux_chr_write()
81 d->linestart = true; in mux_chr_write()
91 "% s save disk data back to file (if -snapshot)\n\r",
99 int term_escape_char = 0x01; /* ctrl-a is used for escape */
103 char ebuf[15] = "Escape-Char"; in mux_print_help()
108 snprintf(ebuf, sizeof(ebuf), "C-%c", term_escape_char - 1 + 'a'); in mux_print_help()
111 "\n\rEscape-Char set to Ascii: 0x%02x\n\r\n\r", in mux_print_help()
122 qemu_chr_write_all(chr, (uint8_t *)&mux_help[i][j], 1); in mux_print_help()
128 static void mux_chr_send_event(MuxChardev *d, unsigned int mux_nr, in mux_chr_send_event() argument
131 CharBackend *be = d->backends[mux_nr]; in mux_chr_send_event()
133 if (be && be->chr_event) { in mux_chr_send_event()
134 be->chr_event(be->opaque, event); in mux_chr_send_event()
140 MuxChardev *d = MUX_CHARDEV(chr); in mux_chr_be_event() local
142 if (d->focus != -1) { in mux_chr_be_event()
143 mux_chr_send_event(d, d->focus, event); in mux_chr_be_event()
147 static int mux_proc_byte(Chardev *chr, MuxChardev *d, int ch) in mux_proc_byte() argument
149 if (d->term_got_escape) { in mux_proc_byte()
150 d->term_got_escape = false; in mux_proc_byte()
176 assert(d->mux_bitset != 0); in mux_proc_byte()
178 bit = find_next_bit(&d->mux_bitset, MAX_MUX, d->focus + 1); in mux_proc_byte()
180 bit = find_next_bit(&d->mux_bitset, MAX_MUX, 0); in mux_proc_byte()
185 d->timestamps = !d->timestamps; in mux_proc_byte()
186 d->timestamps_start = -1; in mux_proc_byte()
187 d->linestart = false; in mux_proc_byte()
191 d->term_got_escape = true; in mux_proc_byte()
194 return 1; in mux_proc_byte()
201 MuxChardev *d = MUX_CHARDEV(chr); in mux_chr_accept_input() local
202 int m = d->focus; in mux_chr_accept_input()
203 CharBackend *be = d->backends[m]; in mux_chr_accept_input()
205 while (be && d->prod[m] != d->cons[m] && in mux_chr_accept_input()
206 be->chr_can_read && be->chr_can_read(be->opaque)) { in mux_chr_accept_input()
207 be->chr_read(be->opaque, in mux_chr_accept_input()
208 &d->buffer[m][d->cons[m]++ & MUX_BUFFER_MASK], 1); in mux_chr_accept_input()
214 MuxChardev *d = MUX_CHARDEV(opaque); in mux_chr_can_read() local
215 int m = d->focus; in mux_chr_can_read()
216 CharBackend *be = d->backends[m]; in mux_chr_can_read()
218 if ((d->prod[m] - d->cons[m]) < MUX_BUFFER_SIZE) { in mux_chr_can_read()
219 return 1; in mux_chr_can_read()
222 if (be && be->chr_can_read) { in mux_chr_can_read()
223 return be->chr_can_read(be->opaque); in mux_chr_can_read()
232 MuxChardev *d = MUX_CHARDEV(opaque); in mux_chr_read() local
233 int m = d->focus; in mux_chr_read()
234 CharBackend *be = d->backends[m]; in mux_chr_read()
240 if (mux_proc_byte(chr, d, buf[i])) { in mux_chr_read()
241 if (d->prod[m] == d->cons[m] && in mux_chr_read()
242 be && be->chr_can_read && in mux_chr_read()
243 be->chr_can_read(be->opaque)) { in mux_chr_read()
244 be->chr_read(be->opaque, &buf[i], 1); in mux_chr_read()
246 d->buffer[m][d->prod[m]++ & MUX_BUFFER_MASK] = buf[i]; in mux_chr_read()
253 MuxChardev *d = MUX_CHARDEV(chr); in mux_chr_send_all_event() local
261 bit = -1; in mux_chr_send_all_event()
262 while ((bit = find_next_bit(&d->mux_bitset, MAX_MUX, bit + 1)) < MAX_MUX) { in mux_chr_send_all_event()
263 mux_chr_send_event(d, bit, event); in mux_chr_send_all_event()
274 MuxChardev *d = MUX_CHARDEV(s); in mux_chr_add_watch() local
275 Chardev *chr = qemu_chr_fe_get_driver(&d->chr); in mux_chr_add_watch()
278 if (!cc->chr_add_watch) { in mux_chr_add_watch()
282 return cc->chr_add_watch(chr, cond); in mux_chr_add_watch()
287 MuxChardev *d = MUX_CHARDEV(obj); in char_mux_finalize() local
290 bit = -1; in char_mux_finalize()
291 while ((bit = find_next_bit(&d->mux_bitset, MAX_MUX, bit + 1)) < MAX_MUX) { in char_mux_finalize()
292 CharBackend *be = d->backends[bit]; in char_mux_finalize()
293 be->chr = NULL; in char_mux_finalize()
294 d->backends[bit] = NULL; in char_mux_finalize()
296 d->mux_bitset = 0; in char_mux_finalize()
297 qemu_chr_fe_deinit(&d->chr, false); in char_mux_finalize()
302 MuxChardev *d = MUX_CHARDEV(chr); in mux_chr_update_read_handlers() local
305 qemu_chr_fe_set_handlers_full(&d->chr, in mux_chr_update_read_handlers()
311 chr->gcontext, true, false); in mux_chr_update_read_handlers()
314 bool mux_chr_attach_frontend(MuxChardev *d, CharBackend *b, in mux_chr_attach_frontend() argument
319 QEMU_BUILD_BUG_ON(MAX_MUX > (sizeof(d->mux_bitset) * BITS_PER_BYTE)); in mux_chr_attach_frontend()
321 bit = find_next_zero_bit(&d->mux_bitset, MAX_MUX, 0); in mux_chr_attach_frontend()
326 d->parent.label); in mux_chr_attach_frontend()
330 d->mux_bitset |= (1ul << bit); in mux_chr_attach_frontend()
331 d->backends[bit] = b; in mux_chr_attach_frontend()
337 bool mux_chr_detach_frontend(MuxChardev *d, unsigned int tag) in mux_chr_detach_frontend() argument
339 if (!(d->mux_bitset & (1ul << tag))) { in mux_chr_detach_frontend()
343 d->mux_bitset &= ~(1ul << tag); in mux_chr_detach_frontend()
344 d->backends[tag] = NULL; in mux_chr_detach_frontend()
351 MuxChardev *d = MUX_CHARDEV(chr); in mux_set_focus() local
353 assert(d->mux_bitset & (1ul << focus)); in mux_set_focus()
355 if (d->focus != -1) { in mux_set_focus()
356 mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_OUT); in mux_set_focus()
359 d->focus = focus; in mux_set_focus()
360 chr->be = d->backends[focus]; in mux_set_focus()
361 mux_chr_send_event(d, d->focus, CHR_EVENT_MUX_IN); in mux_set_focus()
369 ChardevMux *mux = backend->u.mux.data; in qemu_chr_open_mux()
371 MuxChardev *d = MUX_CHARDEV(chr); in qemu_chr_open_mux() local
373 drv = qemu_chr_find(mux->chardev); in qemu_chr_open_mux()
375 error_setg(errp, "mux: base chardev %s not found", mux->chardev); in qemu_chr_open_mux()
379 d->focus = -1; in qemu_chr_open_mux()
384 qemu_chr_fe_init(&d->chr, drv, errp); in qemu_chr_open_mux()
397 backend->type = CHARDEV_BACKEND_KIND_MUX; in qemu_chr_parse_mux()
398 mux = backend->u.mux.data = g_new0(ChardevMux, 1); in qemu_chr_parse_mux()
400 mux->chardev = g_strdup(chardev); in qemu_chr_parse_mux()
404 * Called after processing of default and command-line-specified
408 * focus when initial command-line processing/machine init is
417 /* send OPENED to all already-attached FEs */ in open_muxes()
424 chr->be_open = 1; in open_muxes()
436 if (!chr->be_open && CHARDEV_IS_MUX(chr)) { in chardev_options_parsed_cb()
454 cc->parse = qemu_chr_parse_mux; in char_mux_class_init()
455 cc->open = qemu_chr_open_mux; in char_mux_class_init()
456 cc->chr_write = mux_chr_write; in char_mux_class_init()
457 cc->chr_accept_input = mux_chr_accept_input; in char_mux_class_init()
458 cc->chr_add_watch = mux_chr_add_watch; in char_mux_class_init()
459 cc->chr_be_event = mux_chr_be_event; in char_mux_class_init()
460 cc->chr_update_read_handler = mux_chr_update_read_handlers; in char_mux_class_init()