qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

console.h (18839B)


      1 #ifndef CONSOLE_H
      2 #define CONSOLE_H
      3 
      4 #include "ui/qemu-pixman.h"
      5 #include "qom/object.h"
      6 #include "qemu/notify.h"
      7 #include "qemu/error-report.h"
      8 #include "qapi/qapi-types-ui.h"
      9 
     10 #ifdef CONFIG_OPENGL
     11 # include <epoxy/gl.h>
     12 # include "ui/shader.h"
     13 #endif
     14 
     15 /* keyboard/mouse support */
     16 
     17 #define MOUSE_EVENT_LBUTTON 0x01
     18 #define MOUSE_EVENT_RBUTTON 0x02
     19 #define MOUSE_EVENT_MBUTTON 0x04
     20 #define MOUSE_EVENT_WHEELUP 0x08
     21 #define MOUSE_EVENT_WHEELDN 0x10
     22 
     23 /* identical to the ps/2 keyboard bits */
     24 #define QEMU_SCROLL_LOCK_LED (1 << 0)
     25 #define QEMU_NUM_LOCK_LED    (1 << 1)
     26 #define QEMU_CAPS_LOCK_LED   (1 << 2)
     27 
     28 /* in ms */
     29 #define GUI_REFRESH_INTERVAL_DEFAULT    30
     30 #define GUI_REFRESH_INTERVAL_IDLE     3000
     31 
     32 /* Color number is match to standard vga palette */
     33 enum qemu_color_names {
     34     QEMU_COLOR_BLACK   = 0,
     35     QEMU_COLOR_BLUE    = 1,
     36     QEMU_COLOR_GREEN   = 2,
     37     QEMU_COLOR_CYAN    = 3,
     38     QEMU_COLOR_RED     = 4,
     39     QEMU_COLOR_MAGENTA = 5,
     40     QEMU_COLOR_YELLOW  = 6,
     41     QEMU_COLOR_WHITE   = 7
     42 };
     43 /* Convert to curses char attributes */
     44 #define ATTR2CHTYPE(c, fg, bg, bold) \
     45     ((bold) << 21 | (bg) << 11 | (fg) << 8 | (c))
     46 
     47 typedef void QEMUPutKBDEvent(void *opaque, int keycode);
     48 typedef void QEMUPutLEDEvent(void *opaque, int ledstate);
     49 typedef void QEMUPutMouseEvent(void *opaque, int dx, int dy, int dz, int buttons_state);
     50 
     51 typedef struct QEMUPutMouseEntry QEMUPutMouseEntry;
     52 typedef struct QEMUPutKbdEntry QEMUPutKbdEntry;
     53 typedef struct QEMUPutLEDEntry QEMUPutLEDEntry;
     54 
     55 QEMUPutKbdEntry *qemu_add_kbd_event_handler(QEMUPutKBDEvent *func,
     56                                             void *opaque);
     57 QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
     58                                                 void *opaque, int absolute,
     59                                                 const char *name);
     60 void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry);
     61 void qemu_activate_mouse_event_handler(QEMUPutMouseEntry *entry);
     62 
     63 QEMUPutLEDEntry *qemu_add_led_event_handler(QEMUPutLEDEvent *func, void *opaque);
     64 void qemu_remove_led_event_handler(QEMUPutLEDEntry *entry);
     65 
     66 void kbd_put_ledstate(int ledstate);
     67 
     68 void hmp_mouse_set(Monitor *mon, const QDict *qdict);
     69 
     70 /* keysym is a unicode code except for special keys (see QEMU_KEY_xxx
     71    constants) */
     72 #define QEMU_KEY_ESC1(c) ((c) | 0xe100)
     73 #define QEMU_KEY_TAB        0x0009
     74 #define QEMU_KEY_BACKSPACE  0x007f
     75 #define QEMU_KEY_UP         QEMU_KEY_ESC1('A')
     76 #define QEMU_KEY_DOWN       QEMU_KEY_ESC1('B')
     77 #define QEMU_KEY_RIGHT      QEMU_KEY_ESC1('C')
     78 #define QEMU_KEY_LEFT       QEMU_KEY_ESC1('D')
     79 #define QEMU_KEY_HOME       QEMU_KEY_ESC1(1)
     80 #define QEMU_KEY_END        QEMU_KEY_ESC1(4)
     81 #define QEMU_KEY_PAGEUP     QEMU_KEY_ESC1(5)
     82 #define QEMU_KEY_PAGEDOWN   QEMU_KEY_ESC1(6)
     83 #define QEMU_KEY_DELETE     QEMU_KEY_ESC1(3)
     84 
     85 #define QEMU_KEY_CTRL_UP         0xe400
     86 #define QEMU_KEY_CTRL_DOWN       0xe401
     87 #define QEMU_KEY_CTRL_LEFT       0xe402
     88 #define QEMU_KEY_CTRL_RIGHT      0xe403
     89 #define QEMU_KEY_CTRL_HOME       0xe404
     90 #define QEMU_KEY_CTRL_END        0xe405
     91 #define QEMU_KEY_CTRL_PAGEUP     0xe406
     92 #define QEMU_KEY_CTRL_PAGEDOWN   0xe407
     93 
     94 void kbd_put_keysym_console(QemuConsole *s, int keysym);
     95 bool kbd_put_qcode_console(QemuConsole *s, int qcode, bool ctrl);
     96 void kbd_put_string_console(QemuConsole *s, const char *str, int len);
     97 void kbd_put_keysym(int keysym);
     98 
     99 /* consoles */
    100 
    101 #define TYPE_QEMU_CONSOLE "qemu-console"
    102 OBJECT_DECLARE_TYPE(QemuConsole, QemuConsoleClass, QEMU_CONSOLE)
    103 
    104 
    105 struct QemuConsoleClass {
    106     ObjectClass parent_class;
    107 };
    108 
    109 #define QEMU_ALLOCATED_FLAG     0x01
    110 #define QEMU_PLACEHOLDER_FLAG   0x02
    111 
    112 typedef struct ScanoutTexture {
    113     uint32_t backing_id;
    114     bool backing_y_0_top;
    115     uint32_t backing_width;
    116     uint32_t backing_height;
    117     uint32_t x;
    118     uint32_t y;
    119     uint32_t width;
    120     uint32_t height;
    121 } ScanoutTexture;
    122 
    123 typedef struct DisplaySurface {
    124     pixman_format_code_t format;
    125     pixman_image_t *image;
    126     uint8_t flags;
    127 #ifdef CONFIG_OPENGL
    128     GLenum glformat;
    129     GLenum gltype;
    130     GLuint texture;
    131 #endif
    132 } DisplaySurface;
    133 
    134 typedef struct QemuUIInfo {
    135     /* physical dimension */
    136     uint16_t width_mm;
    137     uint16_t height_mm;
    138     /* geometry */
    139     int       xoff;
    140     int       yoff;
    141     uint32_t  width;
    142     uint32_t  height;
    143     uint32_t  refresh_rate;
    144 } QemuUIInfo;
    145 
    146 /* cursor data format is 32bit RGBA */
    147 typedef struct QEMUCursor {
    148     int                 width, height;
    149     int                 hot_x, hot_y;
    150     int                 refcount;
    151     uint32_t            data[];
    152 } QEMUCursor;
    153 
    154 QEMUCursor *cursor_alloc(int width, int height);
    155 void cursor_get(QEMUCursor *c);
    156 void cursor_put(QEMUCursor *c);
    157 QEMUCursor *cursor_builtin_hidden(void);
    158 QEMUCursor *cursor_builtin_left_ptr(void);
    159 void cursor_print_ascii_art(QEMUCursor *c, const char *prefix);
    160 int cursor_get_mono_bpl(QEMUCursor *c);
    161 void cursor_set_mono(QEMUCursor *c,
    162                      uint32_t foreground, uint32_t background, uint8_t *image,
    163                      int transparent, uint8_t *mask);
    164 void cursor_get_mono_image(QEMUCursor *c, int foreground, uint8_t *mask);
    165 void cursor_get_mono_mask(QEMUCursor *c, int transparent, uint8_t *mask);
    166 
    167 typedef void *QEMUGLContext;
    168 typedef struct QEMUGLParams QEMUGLParams;
    169 
    170 struct QEMUGLParams {
    171     int major_ver;
    172     int minor_ver;
    173 };
    174 
    175 typedef struct QemuDmaBuf {
    176     int       fd;
    177     uint32_t  width;
    178     uint32_t  height;
    179     uint32_t  stride;
    180     uint32_t  fourcc;
    181     uint64_t  modifier;
    182     uint32_t  texture;
    183     uint32_t  x;
    184     uint32_t  y;
    185     uint32_t  scanout_width;
    186     uint32_t  scanout_height;
    187     bool      y0_top;
    188     void      *sync;
    189     int       fence_fd;
    190     bool      allow_fences;
    191     bool      draw_submitted;
    192 } QemuDmaBuf;
    193 
    194 enum display_scanout {
    195     SCANOUT_NONE,
    196     SCANOUT_SURFACE,
    197     SCANOUT_TEXTURE,
    198     SCANOUT_DMABUF,
    199 };
    200 
    201 typedef struct DisplayScanout {
    202     enum display_scanout kind;
    203     union {
    204         /* DisplaySurface *surface; is kept in QemuConsole */
    205         ScanoutTexture texture;
    206         QemuDmaBuf *dmabuf;
    207     };
    208 } DisplayScanout;
    209 
    210 typedef struct DisplayState DisplayState;
    211 typedef struct DisplayGLCtx DisplayGLCtx;
    212 
    213 typedef struct DisplayChangeListenerOps {
    214     const char *dpy_name;
    215 
    216     /* optional */
    217     void (*dpy_refresh)(DisplayChangeListener *dcl);
    218 
    219     /* optional */
    220     void (*dpy_gfx_update)(DisplayChangeListener *dcl,
    221                            int x, int y, int w, int h);
    222     /* optional */
    223     void (*dpy_gfx_switch)(DisplayChangeListener *dcl,
    224                            struct DisplaySurface *new_surface);
    225     /* optional */
    226     bool (*dpy_gfx_check_format)(DisplayChangeListener *dcl,
    227                                  pixman_format_code_t format);
    228 
    229     /* optional */
    230     void (*dpy_text_cursor)(DisplayChangeListener *dcl,
    231                             int x, int y);
    232     /* optional */
    233     void (*dpy_text_resize)(DisplayChangeListener *dcl,
    234                             int w, int h);
    235     /* optional */
    236     void (*dpy_text_update)(DisplayChangeListener *dcl,
    237                             int x, int y, int w, int h);
    238 
    239     /* optional */
    240     void (*dpy_mouse_set)(DisplayChangeListener *dcl,
    241                           int x, int y, int on);
    242     /* optional */
    243     void (*dpy_cursor_define)(DisplayChangeListener *dcl,
    244                               QEMUCursor *cursor);
    245 
    246     /* required if GL */
    247     void (*dpy_gl_scanout_disable)(DisplayChangeListener *dcl);
    248     /* required if GL */
    249     void (*dpy_gl_scanout_texture)(DisplayChangeListener *dcl,
    250                                    uint32_t backing_id,
    251                                    bool backing_y_0_top,
    252                                    uint32_t backing_width,
    253                                    uint32_t backing_height,
    254                                    uint32_t x, uint32_t y,
    255                                    uint32_t w, uint32_t h);
    256     /* optional (default to true if has dpy_gl_scanout_dmabuf) */
    257     bool (*dpy_has_dmabuf)(DisplayChangeListener *dcl);
    258     /* optional */
    259     void (*dpy_gl_scanout_dmabuf)(DisplayChangeListener *dcl,
    260                                   QemuDmaBuf *dmabuf);
    261     /* optional */
    262     void (*dpy_gl_cursor_dmabuf)(DisplayChangeListener *dcl,
    263                                  QemuDmaBuf *dmabuf, bool have_hot,
    264                                  uint32_t hot_x, uint32_t hot_y);
    265     /* optional */
    266     void (*dpy_gl_cursor_position)(DisplayChangeListener *dcl,
    267                                    uint32_t pos_x, uint32_t pos_y);
    268     /* optional */
    269     void (*dpy_gl_release_dmabuf)(DisplayChangeListener *dcl,
    270                                   QemuDmaBuf *dmabuf);
    271     /* required if GL */
    272     void (*dpy_gl_update)(DisplayChangeListener *dcl,
    273                           uint32_t x, uint32_t y, uint32_t w, uint32_t h);
    274 
    275 } DisplayChangeListenerOps;
    276 
    277 struct DisplayChangeListener {
    278     uint64_t update_interval;
    279     const DisplayChangeListenerOps *ops;
    280     DisplayState *ds;
    281     QemuConsole *con;
    282 
    283     QLIST_ENTRY(DisplayChangeListener) next;
    284 };
    285 
    286 typedef struct DisplayGLCtxOps {
    287     bool (*dpy_gl_ctx_is_compatible_dcl)(DisplayGLCtx *dgc,
    288                                          DisplayChangeListener *dcl);
    289     QEMUGLContext (*dpy_gl_ctx_create)(DisplayGLCtx *dgc,
    290                                        QEMUGLParams *params);
    291     void (*dpy_gl_ctx_destroy)(DisplayGLCtx *dgc,
    292                                QEMUGLContext ctx);
    293     int (*dpy_gl_ctx_make_current)(DisplayGLCtx *dgc,
    294                                    QEMUGLContext ctx);
    295     void (*dpy_gl_ctx_create_texture)(DisplayGLCtx *dgc,
    296                                       DisplaySurface *surface);
    297     void (*dpy_gl_ctx_destroy_texture)(DisplayGLCtx *dgc,
    298                                       DisplaySurface *surface);
    299     void (*dpy_gl_ctx_update_texture)(DisplayGLCtx *dgc,
    300                                       DisplaySurface *surface,
    301                                       int x, int y, int w, int h);
    302 } DisplayGLCtxOps;
    303 
    304 struct DisplayGLCtx {
    305     const DisplayGLCtxOps *ops;
    306 #ifdef CONFIG_OPENGL
    307     QemuGLShader *gls; /* optional shared shader */
    308 #endif
    309 };
    310 
    311 DisplayState *init_displaystate(void);
    312 DisplaySurface *qemu_create_displaysurface_from(int width, int height,
    313                                                 pixman_format_code_t format,
    314                                                 int linesize, uint8_t *data);
    315 DisplaySurface *qemu_create_displaysurface_pixman(pixman_image_t *image);
    316 DisplaySurface *qemu_create_placeholder_surface(int w, int h,
    317                                                 const char *msg);
    318 PixelFormat qemu_default_pixelformat(int bpp);
    319 
    320 DisplaySurface *qemu_create_displaysurface(int width, int height);
    321 void qemu_free_displaysurface(DisplaySurface *surface);
    322 
    323 static inline int is_buffer_shared(DisplaySurface *surface)
    324 {
    325     return !(surface->flags & QEMU_ALLOCATED_FLAG);
    326 }
    327 
    328 static inline int is_placeholder(DisplaySurface *surface)
    329 {
    330     return surface->flags & QEMU_PLACEHOLDER_FLAG;
    331 }
    332 
    333 void register_displaychangelistener(DisplayChangeListener *dcl);
    334 void update_displaychangelistener(DisplayChangeListener *dcl,
    335                                   uint64_t interval);
    336 void unregister_displaychangelistener(DisplayChangeListener *dcl);
    337 
    338 bool dpy_ui_info_supported(QemuConsole *con);
    339 const QemuUIInfo *dpy_get_ui_info(const QemuConsole *con);
    340 int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info, bool delay);
    341 
    342 void dpy_gfx_update(QemuConsole *con, int x, int y, int w, int h);
    343 void dpy_gfx_update_full(QemuConsole *con);
    344 void dpy_gfx_replace_surface(QemuConsole *con,
    345                              DisplaySurface *surface);
    346 void dpy_text_cursor(QemuConsole *con, int x, int y);
    347 void dpy_text_update(QemuConsole *con, int x, int y, int w, int h);
    348 void dpy_text_resize(QemuConsole *con, int w, int h);
    349 void dpy_mouse_set(QemuConsole *con, int x, int y, int on);
    350 void dpy_cursor_define(QemuConsole *con, QEMUCursor *cursor);
    351 bool dpy_cursor_define_supported(QemuConsole *con);
    352 bool dpy_gfx_check_format(QemuConsole *con,
    353                           pixman_format_code_t format);
    354 
    355 void dpy_gl_scanout_disable(QemuConsole *con);
    356 void dpy_gl_scanout_texture(QemuConsole *con,
    357                             uint32_t backing_id, bool backing_y_0_top,
    358                             uint32_t backing_width, uint32_t backing_height,
    359                             uint32_t x, uint32_t y, uint32_t w, uint32_t h);
    360 void dpy_gl_scanout_dmabuf(QemuConsole *con,
    361                            QemuDmaBuf *dmabuf);
    362 void dpy_gl_cursor_dmabuf(QemuConsole *con, QemuDmaBuf *dmabuf,
    363                           bool have_hot, uint32_t hot_x, uint32_t hot_y);
    364 void dpy_gl_cursor_position(QemuConsole *con,
    365                             uint32_t pos_x, uint32_t pos_y);
    366 void dpy_gl_release_dmabuf(QemuConsole *con,
    367                            QemuDmaBuf *dmabuf);
    368 void dpy_gl_update(QemuConsole *con,
    369                    uint32_t x, uint32_t y, uint32_t w, uint32_t h);
    370 
    371 QEMUGLContext dpy_gl_ctx_create(QemuConsole *con,
    372                                 QEMUGLParams *params);
    373 void dpy_gl_ctx_destroy(QemuConsole *con, QEMUGLContext ctx);
    374 int dpy_gl_ctx_make_current(QemuConsole *con, QEMUGLContext ctx);
    375 
    376 bool console_has_gl(QemuConsole *con);
    377 
    378 static inline int surface_stride(DisplaySurface *s)
    379 {
    380     return pixman_image_get_stride(s->image);
    381 }
    382 
    383 static inline void *surface_data(DisplaySurface *s)
    384 {
    385     return pixman_image_get_data(s->image);
    386 }
    387 
    388 static inline int surface_width(DisplaySurface *s)
    389 {
    390     return pixman_image_get_width(s->image);
    391 }
    392 
    393 static inline int surface_height(DisplaySurface *s)
    394 {
    395     return pixman_image_get_height(s->image);
    396 }
    397 
    398 static inline int surface_bits_per_pixel(DisplaySurface *s)
    399 {
    400     int bits = PIXMAN_FORMAT_BPP(s->format);
    401     return bits;
    402 }
    403 
    404 static inline int surface_bytes_per_pixel(DisplaySurface *s)
    405 {
    406     int bits = PIXMAN_FORMAT_BPP(s->format);
    407     return DIV_ROUND_UP(bits, 8);
    408 }
    409 
    410 static inline pixman_format_code_t surface_format(DisplaySurface *s)
    411 {
    412     return s->format;
    413 }
    414 
    415 typedef uint32_t console_ch_t;
    416 
    417 static inline void console_write_ch(console_ch_t *dest, uint32_t ch)
    418 {
    419     *dest = ch;
    420 }
    421 
    422 enum {
    423     GRAPHIC_FLAGS_NONE     = 0,
    424     /* require a console/display with GL callbacks */
    425     GRAPHIC_FLAGS_GL       = 1 << 0,
    426     /* require a console/display with DMABUF import */
    427     GRAPHIC_FLAGS_DMABUF   = 1 << 1,
    428 };
    429 
    430 typedef struct GraphicHwOps {
    431     int (*get_flags)(void *opaque); /* optional, default 0 */
    432     void (*invalidate)(void *opaque);
    433     void (*gfx_update)(void *opaque);
    434     bool gfx_update_async; /* if true, calls graphic_hw_update_done() */
    435     void (*text_update)(void *opaque, console_ch_t *text);
    436     void (*ui_info)(void *opaque, uint32_t head, QemuUIInfo *info);
    437     void (*gl_block)(void *opaque, bool block);
    438 } GraphicHwOps;
    439 
    440 QemuConsole *graphic_console_init(DeviceState *dev, uint32_t head,
    441                                   const GraphicHwOps *ops,
    442                                   void *opaque);
    443 void graphic_console_set_hwops(QemuConsole *con,
    444                                const GraphicHwOps *hw_ops,
    445                                void *opaque);
    446 void graphic_console_close(QemuConsole *con);
    447 
    448 void graphic_hw_update(QemuConsole *con);
    449 void graphic_hw_update_done(QemuConsole *con);
    450 void graphic_hw_invalidate(QemuConsole *con);
    451 void graphic_hw_text_update(QemuConsole *con, console_ch_t *chardata);
    452 void graphic_hw_gl_block(QemuConsole *con, bool block);
    453 
    454 void qemu_console_early_init(void);
    455 
    456 void qemu_console_set_display_gl_ctx(QemuConsole *con, DisplayGLCtx *ctx);
    457 
    458 QemuConsole *qemu_console_lookup_by_index(unsigned int index);
    459 QemuConsole *qemu_console_lookup_by_device(DeviceState *dev, uint32_t head);
    460 QemuConsole *qemu_console_lookup_by_device_name(const char *device_id,
    461                                                 uint32_t head, Error **errp);
    462 QemuConsole *qemu_console_lookup_unused(void);
    463 bool qemu_console_is_visible(QemuConsole *con);
    464 bool qemu_console_is_graphic(QemuConsole *con);
    465 bool qemu_console_is_fixedsize(QemuConsole *con);
    466 bool qemu_console_is_gl_blocked(QemuConsole *con);
    467 bool qemu_console_is_multihead(DeviceState *dev);
    468 char *qemu_console_get_label(QemuConsole *con);
    469 int qemu_console_get_index(QemuConsole *con);
    470 uint32_t qemu_console_get_head(QemuConsole *con);
    471 int qemu_console_get_width(QemuConsole *con, int fallback);
    472 int qemu_console_get_height(QemuConsole *con, int fallback);
    473 /* Return the low-level window id for the console */
    474 int qemu_console_get_window_id(QemuConsole *con);
    475 /* Set the low-level window id for the console */
    476 void qemu_console_set_window_id(QemuConsole *con, int window_id);
    477 
    478 void console_select(unsigned int index);
    479 void qemu_console_resize(QemuConsole *con, int width, int height);
    480 DisplaySurface *qemu_console_surface(QemuConsole *con);
    481 
    482 /* console-gl.c */
    483 #ifdef CONFIG_OPENGL
    484 bool console_gl_check_format(DisplayChangeListener *dcl,
    485                              pixman_format_code_t format);
    486 void surface_gl_create_texture(QemuGLShader *gls,
    487                                DisplaySurface *surface);
    488 void surface_gl_update_texture(QemuGLShader *gls,
    489                                DisplaySurface *surface,
    490                                int x, int y, int w, int h);
    491 void surface_gl_render_texture(QemuGLShader *gls,
    492                                DisplaySurface *surface);
    493 void surface_gl_destroy_texture(QemuGLShader *gls,
    494                                DisplaySurface *surface);
    495 void surface_gl_setup_viewport(QemuGLShader *gls,
    496                                DisplaySurface *surface,
    497                                int ww, int wh);
    498 #endif
    499 
    500 typedef struct QemuDisplay QemuDisplay;
    501 
    502 struct QemuDisplay {
    503     DisplayType type;
    504     void (*early_init)(DisplayOptions *opts);
    505     void (*init)(DisplayState *ds, DisplayOptions *opts);
    506 };
    507 
    508 void qemu_display_register(QemuDisplay *ui);
    509 bool qemu_display_find_default(DisplayOptions *opts);
    510 void qemu_display_early_init(DisplayOptions *opts);
    511 void qemu_display_init(DisplayState *ds, DisplayOptions *opts);
    512 void qemu_display_help(void);
    513 
    514 /* vnc.c */
    515 void vnc_display_init(const char *id, Error **errp);
    516 void vnc_display_open(const char *id, Error **errp);
    517 void vnc_display_add_client(const char *id, int csock, bool skipauth);
    518 int vnc_display_password(const char *id, const char *password);
    519 int vnc_display_pw_expire(const char *id, time_t expires);
    520 void vnc_parse(const char *str);
    521 int vnc_init_func(void *opaque, QemuOpts *opts, Error **errp);
    522 bool vnc_display_reload_certs(const char *id,  Error **errp);
    523 bool vnc_display_update(DisplayUpdateOptionsVNC *arg, Error **errp);
    524 
    525 /* input.c */
    526 int index_from_key(const char *key, size_t key_length);
    527 
    528 #ifdef CONFIG_LINUX
    529 /* udmabuf.c */
    530 int udmabuf_fd(void);
    531 #endif
    532 
    533 /* util.c */
    534 bool qemu_console_fill_device_address(QemuConsole *con,
    535                                       char *device_address,
    536                                       size_t size,
    537                                       Error **errp);
    538 
    539 #endif