quic/qbox
Loading...
Searching...
No Matches
libqemu-cxx.h
1/*
2 * This file is part of libqemu-cxx
3 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All Rights Reserved.
4 * Author: GreenSocs 2015-2019
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9#pragma once
10
11#include <string>
12#include <unordered_map>
13#include <memory>
14#include <functional>
15#include <set>
16#include <vector>
17#include <map>
18
19#include <libqemu-cxx/target_info.h>
20#include <libqemu-cxx/exceptions.h>
21#include <libqemu-cxx/loader.h>
22
23#include <scp/report.h>
24
25/* libqemu types forward declaration */
26struct LibQemuExports;
27struct QemuObject;
28struct ObjectClass;
29struct DisplayGLCtxOps;
30struct DisplayGLCtx;
31struct QemuConsole;
32struct DisplaySurface;
33struct DisplayOptions;
34struct QEMUCursor;
35struct SDL_Window;
36struct sdl2_console;
39struct MemTxAttrs;
40struct QemuMemoryRegion;
43struct QemuAddressSpace;
45struct QemuTimer;
46struct FWCfgState;
47typedef void* QEMUGLContext;
48struct QEMUGLParams;
49typedef void (*LibQemuGfxUpdateFn)(DisplayChangeListener*, int, int, int, int);
50typedef void (*LibQemuGfxSwitchFn)(DisplayChangeListener*, DisplaySurface*);
51typedef void (*LibQemuRefreshFn)(DisplayChangeListener*);
52typedef void (*LibQemuWindowCreateFn)(DisplayChangeListener*);
53typedef void (*LibQemuWindowDestroyFn)(DisplayChangeListener*);
54typedef void (*LibQemuWindowResizeFn)(DisplayChangeListener*);
55typedef void (*LibQemuPollEventsFn)(DisplayChangeListener*);
56typedef void (*LibQemuMouseSetFn)(DisplayChangeListener*, int, int, int);
57typedef void (*LibQemuCursorDefineFn)(DisplayChangeListener*, QEMUCursor*);
58typedef void (*LibQemuGLScanoutDisableFn)(DisplayChangeListener*);
59typedef void (*LibQemuGLScanoutTextureFn)(DisplayChangeListener*, uint32_t, bool, uint32_t, uint32_t, uint32_t,
60 uint32_t, uint32_t, uint32_t);
61typedef void (*LibQemuGLUpdateFn)(DisplayChangeListener*, uint32_t, uint32_t, uint32_t, uint32_t);
62
63typedef bool (*LibQemuIsCompatibleDclFn)(DisplayGLCtx*, DisplayChangeListener*);
64
65namespace qemu {
66
67class LibQemuInternals;
68class Object;
69class MemoryRegion;
70class MemoryRegionOps;
71class IOMMUMemoryRegion;
72class AddressSpace;
73class MemoryListener;
74class Gpio;
75class Timer;
76class Bus;
77class Chardev;
78class DisplayOptions;
79class DisplayGLCtxOps;
80class Console;
81class SDL2Console;
82class Dcl;
83class DclOps;
84class RcuReadLock;
85
87{
88private:
89 std::shared_ptr<LibQemuInternals> m_int;
90 LibraryLoaderIface& m_library_loader;
91 const char* m_lib_path;
92 Target m_target;
93 bool m_auto_start;
94
95 std::vector<char*> m_qemu_argv;
96
97 LibraryLoaderIface::LibraryIfacePtr m_lib;
98
99 QemuObject* object_new_unparented(const char* type_name);
100 QemuObject* object_new_internal(const char* type_name, const char* id);
101
102 void check_cast(Object& o, const char* type);
103
104 void init_callbacks();
105
106 void rcu_read_lock();
107 void rcu_read_unlock();
108
109public:
112 ~LibQemu();
113
114 void push_qemu_arg(const char* arg);
115 void push_qemu_arg(std::initializer_list<const char*> args);
116 const std::vector<char*>& get_qemu_args() const { return m_qemu_argv; }
117
118 void init();
119 bool is_inited() const { return m_lib != nullptr; }
120
121 /* QEMU GDB stub
122 * @port: port the gdb server will be listening on. (ex: "tcp::1234") */
123 void start_gdb_server(std::string port);
124 void vm_start();
125 void vm_stop_paused();
126
127 void lock_iothread();
128 void unlock_iothread();
129
130 RcuReadLock rcu_read_lock_new();
131
132 void finish_qemu_init();
133 Bus sysbus_get_default();
134
135 void coroutine_yield();
136
137 void system_reset();
138
139 template <class T>
140 T object_new()
141 {
142 T o(Object(object_new_internal(T::TYPE, NULL), m_int));
143 check_cast(o, T::TYPE);
144
145 return o;
146 }
147
148 template <class T>
149 T object_new_unparented()
150 {
151 T o(Object(object_new_unparented(T::TYPE), m_int));
152 check_cast(o, T::TYPE);
153
154 return o;
155 }
156 int64_t get_virtual_clock();
157
158 Object object_new(const char* type_name, const char* id);
159 std::shared_ptr<MemoryRegionOps> memory_region_ops_new();
160 std::shared_ptr<AddressSpace> address_space_new();
161 std::shared_ptr<AddressSpace> address_space_get_system_memory();
162 std::shared_ptr<MemoryRegion> get_system_memory();
163 std::shared_ptr<MemoryListener> memory_listener_new();
164 Gpio gpio_new();
165
166 std::shared_ptr<Timer> timer_new();
167
168 Chardev chardev_new(const char* label, const char* type);
169
170 void tb_invalidate_phys_range(uint64_t start, uint64_t end);
171
172 void enable_opengl();
173 DisplayOptions display_options_new();
174 std::vector<Console> get_all_consoles();
175 Console console_lookup_by_index(int index);
176 DisplayGLCtxOps display_gl_ctx_ops_new(LibQemuIsCompatibleDclFn);
177 Dcl dcl_new(DisplayChangeListener* dcl);
178 DclOps dcl_ops_new();
179
180 int sdl2_init() const;
181 const char* sdl2_get_error() const;
182
183 std::vector<SDL2Console> sdl2_create_consoles(int num);
184 void sdl2_cleanup();
185 void sdl2_2d_update(DisplayChangeListener* dcl, int x, int y, int w, int h);
186 void sdl2_2d_switch(DisplayChangeListener* dcl, DisplaySurface* new_surface);
187 void sdl2_2d_refresh(DisplayChangeListener* dcl);
188
189 void sdl2_gl_update(DisplayChangeListener* dcl, int x, int y, int w, int h);
190 void sdl2_gl_switch(DisplayChangeListener* dcl, DisplaySurface* new_surface);
191 void sdl2_gl_refresh(DisplayChangeListener* dcl);
192
193 void sdl2_window_create(DisplayChangeListener* dcl);
194 void sdl2_window_destroy(DisplayChangeListener* dcl);
195 void sdl2_window_resize(DisplayChangeListener* dcl);
196 void sdl2_poll_events(DisplayChangeListener* dcl);
197
198 void dcl_dpy_gfx_replace_surface(DisplayChangeListener* dcl, DisplaySurface* new_surface);
199
200 QEMUGLContext sdl2_gl_create_context(DisplayGLCtx* dgc, QEMUGLParams* p);
201 void sdl2_gl_destroy_context(DisplayGLCtx* dgc, QEMUGLContext gl_ctx);
202 int sdl2_gl_make_context_current(DisplayGLCtx* dgc, QEMUGLContext gl_ctx);
203
204 bool virgl_has_blob() const;
205
206 FWCfgState* fw_cfg_find();
207 void fw_cfg_set_dma_as(FWCfgState* s);
208 void fw_cfg_add_i16(FWCfgState* s, uint16_t key, uint16_t value);
209 void fw_cfg_add_file(FWCfgState* s, const char* filename, void* data, size_t len);
210 void* fw_cfg_modify_file(FWCfgState* s, const char* filename, void* data, size_t len);
211};
212
214{
215private:
216 std::shared_ptr<LibQemuInternals> m_int;
217 RcuReadLock() = default;
218
219public:
220 RcuReadLock(std::shared_ptr<LibQemuInternals> internals);
221 ~RcuReadLock();
222
223 RcuReadLock(const RcuReadLock&) = delete;
224 RcuReadLock& operator=(const RcuReadLock&) = delete;
226 RcuReadLock& operator=(RcuReadLock&&);
227};
228
230{
231protected:
232 QemuObject* m_obj = nullptr;
233 std::shared_ptr<LibQemuInternals> m_int;
234
235 bool check_cast_by_type(const char* type_name) const { return true; }
236
237public:
238 Object() = default;
239 Object(QemuObject* obj, std::shared_ptr<LibQemuInternals>& internals);
240 Object(const Object& o);
241 Object(Object&& o);
242
243 Object& operator=(Object o);
244
245 virtual ~Object();
246
247 bool valid() const { return m_obj != nullptr; }
248
249 void set_prop_bool(const char* name, bool val);
250 void set_prop_int(const char* name, int64_t val);
251 void set_prop_uint(const char* name, uint64_t val);
252 void set_prop_str(const char* name, const char* val);
253 void set_prop_link(const char* name, const Object& link);
254 void set_prop_parse(const char* name, const char* value);
255
256 Object get_prop_link(const char* name);
257
258 QemuObject* get_qemu_obj() const { return m_obj; }
259
260 LibQemu& get_inst();
261 uintptr_t get_inst_id() const { return reinterpret_cast<uintptr_t>(m_int.get()); }
262 bool same_inst_as(const Object& o) const { return get_inst_id() == o.get_inst_id(); }
263
264 template <class T>
265 bool check_cast() const
266 {
267 return check_cast_by_type(T::TYPE);
268 }
269
270 void clear_callbacks();
271};
272
273class Gpio : public Object
274{
275public:
276 typedef std::function<void(bool)> GpioEventFn;
277
279 {
280 protected:
281 bool m_prev_valid = false;
282 bool m_prev;
283 GpioEventFn m_cb;
284
285 public:
286 void event(bool level)
287 {
288 if (!m_prev_valid || (level != m_prev)) {
289 if (m_cb) m_cb(level);
290 }
291
292 m_prev_valid = true;
293 m_prev = level;
294 }
295
296 void set_callback(GpioEventFn cb) { m_cb = cb; }
297 };
298
299private:
300 std::shared_ptr<GpioProxy> m_proxy;
301
302public:
303 static constexpr const char* const TYPE = "irq";
304
305 Gpio() = default;
306 Gpio(const Gpio& o) = default;
307 Gpio(const Object& o): Object(o) {}
308
309 void set(bool lvl);
310
311 void set_proxy(std::shared_ptr<GpioProxy> proxy) { m_proxy = proxy; }
312
313 void set_event_callback(GpioEventFn cb)
314 {
315 if (m_proxy) {
316 m_proxy->set_callback(cb);
317 }
318 }
319};
320
322{
323public:
324 enum MemTxResult { MemTxOK, MemTxError, MemTxDecodeError, MemTxOKExitTB };
325
326 struct MemTxAttrs {
327 bool secure = false;
328 bool debug = false;
329
330 MemTxAttrs() = default;
331 MemTxAttrs(const ::MemTxAttrs& qemu_attrs);
332 };
333
334 typedef std::function<MemTxResult(uint64_t, uint64_t*, unsigned int, MemTxAttrs)> ReadCallback;
335
336 typedef std::function<MemTxResult(uint64_t, uint64_t, unsigned int, MemTxAttrs)> WriteCallback;
337
338private:
339 QemuMemoryRegionOps* m_ops;
340 std::shared_ptr<LibQemuInternals> m_int;
341
342 ReadCallback m_read_cb;
343 WriteCallback m_write_cb;
344
345public:
346 MemoryRegionOps(QemuMemoryRegionOps* ops, std::shared_ptr<LibQemuInternals> internals);
348
349 void set_read_callback(ReadCallback cb);
350 void set_write_callback(WriteCallback cb);
351
352 void set_max_access_size(unsigned size);
353
354 ReadCallback get_read_callback() { return m_read_cb; }
355 WriteCallback get_write_callback() { return m_write_cb; }
356
357 QemuMemoryRegionOps* get_qemu_mr_ops() { return m_ops; }
358};
359
360typedef std::shared_ptr<MemoryRegionOps> MemoryRegionOpsPtr;
361
362class MemoryRegion : public Object
363{
364private:
365 MemoryRegionOpsPtr m_ops;
366 std::set<MemoryRegion> m_subregions;
367 int m_priority = 0;
368
369 void internal_del_subregion(const MemoryRegion& mr);
370
371public:
372 using MemTxResult = MemoryRegionOps::MemTxResult;
374
375 static constexpr const char* const TYPE = "memory-region";
376
377 MemoryRegion* container = nullptr;
378
379 MemoryRegion() = default;
380 MemoryRegion(const MemoryRegion&) = default;
381 MemoryRegion(const Object& o): Object(o) {}
382 MemoryRegion(QemuMemoryRegion* mr, std::shared_ptr<LibQemuInternals> internals);
383
385 void removeSubRegions();
386
387 uint64_t get_size();
388 int get_priority() const { return m_priority; }
389 /* Make sure to set the priority before calling `add_subregion_overlap()` */
390 void set_priority(int priority) { m_priority = priority; }
391
392 void init(const Object& owner, const char* name, uint64_t size);
393 void init_io(Object owner, const char* name, uint64_t size, MemoryRegionOpsPtr ops);
394 void init_ram_ptr(Object owner, const char* name, uint64_t size, void* ptr, int fd = -1);
395 void init_alias(Object owner, const char* name, const MemoryRegion& root, uint64_t offset, uint64_t size);
396
397 void add_subregion(MemoryRegion& mr, uint64_t offset);
398 void add_subregion_overlap(MemoryRegion& mr, uint64_t offset);
399 void del_subregion(const MemoryRegion& mr);
400
401 MemTxResult dispatch_read(uint64_t addr, uint64_t* data, uint64_t size, MemTxAttrs attrs);
402
403 MemTxResult dispatch_write(uint64_t addr, uint64_t data, uint64_t size, MemTxAttrs attrs);
404
405 void set_ops(const MemoryRegionOpsPtr ops);
406
407 bool operator<(const MemoryRegion& mr) const { return m_obj < mr.m_obj; }
408};
409
411{
412private:
413 QemuAddressSpace* m_as;
414 std::shared_ptr<LibQemuInternals> m_int;
415
416 bool m_inited = false;
417 bool m_global = false;
418
419public:
420 using MemTxResult = MemoryRegionOps::MemTxResult;
422
423 AddressSpace(QemuAddressSpace* as, std::shared_ptr<LibQemuInternals> internals);
424 AddressSpace(const AddressSpace&) = delete;
425
427
428 QemuAddressSpace* get_ptr() { return m_as; }
429
430 void init(MemoryRegion mr, const char* name, bool global = false);
431
432 MemTxResult read(uint64_t addr, void* data, size_t size, MemTxAttrs attrs);
433 MemTxResult write(uint64_t addr, const void* data, size_t size, MemTxAttrs attrs);
434
435 void update_topology();
436};
437
438/* this is simply used to hold shared_ptr's for memory management and
439 * to check if the DMIRegions exist.
440 */
442};
444{
445public:
446 static constexpr const char* const TYPE = "libqemu-iommu-memory-region";
447
448 qemu::MemoryRegion m_root_te;
449 std::shared_ptr<qemu::AddressSpace> m_as_te;
450 qemu::MemoryRegion m_root_io;
451 std::shared_ptr<qemu::AddressSpace> m_as_io;
452 std::map<uint64_t, std::shared_ptr<DmiRegionBase>> m_dmi_aliases_te;
453 std::map<uint64_t, std::shared_ptr<DmiRegionBase>> m_dmi_aliases_io;
454 uint64_t min_page_sz;
455
457 : MemoryRegion(o)
458 , m_root_te(get_inst().object_new_unparented<qemu::MemoryRegion>())
459 , m_as_te(get_inst().address_space_new())
460 , m_root_io(get_inst().object_new_unparented<qemu::MemoryRegion>())
461 , m_as_io(get_inst().address_space_new())
462 {
463 }
464
465 typedef enum {
466 IOMMU_NONE = 0,
467 IOMMU_RO = 1,
468 IOMMU_WO = 2,
469 IOMMU_RW = 3,
470 } IOMMUAccessFlags;
471
473 QemuAddressSpace* target_as;
474 uint64_t iova;
475 uint64_t translated_addr;
476 uint64_t addr_mask;
477 IOMMUAccessFlags perm;
478 };
479
480 std::map<uint64_t, qemu::IOMMUMemoryRegion::IOMMUTLBEntry> m_mapped_te;
481
482 using IOMMUTranslateCallbackFn = std::function<void(IOMMUTLBEntry*, uint64_t, IOMMUAccessFlags, int)>;
483 void init(const Object& owner, const char* name, uint64_t size, MemoryRegionOpsPtr ops,
484 IOMMUTranslateCallbackFn cb);
485 void iommu_unmap(IOMMUTLBEntry*);
486};
487
489{
490public:
491 typedef std::function<void(MemoryListener&, uint64_t addr, uint64_t len)> MapCallback;
492
493private:
494 QemuMemoryListener* m_ml;
495 std::shared_ptr<LibQemuInternals> m_int;
496 std::shared_ptr<AddressSpace> m_as;
497
498 MapCallback m_map_cb;
499
500public:
501 MemoryListener(std::shared_ptr<LibQemuInternals> internals);
502 MemoryListener(const MemoryListener&) = delete;
504
505 void set_ml(QemuMemoryListener* ml);
506
507 void set_map_callback(MapCallback cb);
508 MapCallback& get_map_callback() { return m_map_cb; }
509
510 void register_as(std::shared_ptr<AddressSpace> as);
511};
512
514{
515public:
516 ::DisplayOptions* m_opts;
517 std::shared_ptr<LibQemuInternals> m_int;
518
519 DisplayOptions() = default;
520 DisplayOptions(::DisplayOptions* opts, std::shared_ptr<LibQemuInternals>& internals);
521 DisplayOptions(const DisplayOptions&) = default;
522};
523
525{
526public:
527 ::DisplayGLCtxOps* m_ops;
528 std::shared_ptr<LibQemuInternals> m_int;
529
530 DisplayGLCtxOps() = default;
531 DisplayGLCtxOps(::DisplayGLCtxOps* ops, std::shared_ptr<LibQemuInternals>& internals);
532 DisplayGLCtxOps(const DisplayGLCtxOps&) = default;
533};
534
536{
537public:
538 QemuConsole* m_cons;
539 std::shared_ptr<LibQemuInternals> m_int;
540
541 Console() = default;
542 Console(QemuConsole* cons, std::shared_ptr<LibQemuInternals>& internals);
543 Console(const Console&) = default;
544
545 int get_index() const;
546 bool is_graphic() const;
547 void set_display_gl_ctx(DisplayGLCtx*);
548 void set_window_id(int id);
549};
550
552{
553public:
554 struct sdl2_console* m_cons;
555 std::shared_ptr<LibQemuInternals> m_int;
556
557 SDL2Console() = default;
558 SDL2Console(struct sdl2_console* cons, std::shared_ptr<LibQemuInternals>& internals);
559 SDL2Console(const SDL2Console&) = default;
560
561 void init(Console& con, void* user_data);
562 void set_hidden(bool hidden);
563 void set_idx(int idx);
564 void set_opts(DisplayOptions& opts);
565 void set_opengl(bool opengl);
566 void set_dcl_ops(DclOps& dcl_ops);
567 void set_dgc_ops(DisplayGLCtxOps& dgc_ops);
568
569 SDL_Window* get_real_window() const;
570 DisplayChangeListener* get_dcl() const;
571 DisplayGLCtx* get_dgc() const;
572
573 void register_dcl() const;
574
575 void set_window_id(Console& con) const;
576};
577
578class Dcl
579{
580private:
582 std::shared_ptr<LibQemuInternals> m_int;
583
584public:
585 Dcl(DisplayChangeListener* dcl, std::shared_ptr<LibQemuInternals>& internals);
586
587 void* get_user_data();
588};
589
591{
592public:
594 std::shared_ptr<LibQemuInternals> m_int;
595
596 DclOps() = default;
597 DclOps(DisplayChangeListenerOps* ops, std::shared_ptr<LibQemuInternals>& internals);
598 DclOps(const DclOps&) = default;
599
600 void set_name(const char* name);
601 bool is_used_by(DisplayChangeListener* dcl) const;
602 void set_gfx_update(LibQemuGfxUpdateFn gfx_update_fn);
603 void set_gfx_switch(LibQemuGfxSwitchFn gfx_switch_fn);
604 void set_refresh(LibQemuRefreshFn refresh_fn);
605
606 void set_window_create(LibQemuWindowCreateFn window_create_fn);
607 void set_window_destroy(LibQemuWindowDestroyFn window_destroy_fn);
608 void set_window_resize(LibQemuWindowResizeFn window_resize_fn);
609 void set_poll_events(LibQemuPollEventsFn poll_events_fn);
610};
611
612class Device : public Object
613{
614public:
615 static constexpr const char* const TYPE = "device";
616
617 Device() = default;
618 Device(const Device&) = default;
619 Device(const Object& o): Object(o) {}
620
621 void connect_gpio_out(int idx, Gpio gpio);
622 void connect_gpio_out_named(const char* name, int idx, Gpio gpio);
623
624 Gpio get_gpio_in(int idx);
625 Gpio get_gpio_in_named(const char* name, int idx);
626
627 Bus get_child_bus(const char* name);
628 void set_parent_bus(Bus bus);
629
630 void set_prop_chardev(const char* name, Chardev chr);
631 void set_prop_uint_array(const char* name, std::vector<unsigned int> vec);
632};
633
634class SysBusDevice : public Device
635{
636public:
637 static constexpr const char* const TYPE = "sys-bus-device";
638
639 SysBusDevice() = default;
640 SysBusDevice(const SysBusDevice&) = default;
641 SysBusDevice(const Object& o): Device(o) {}
642
643 MemoryRegion mmio_get_region(int id);
644
645 void connect_gpio_out(int idx, Gpio gpio);
646};
647
648class GpexHost : public SysBusDevice
649{
650public:
651 static constexpr const char* const TYPE = "gpex-pcihost";
652
653 GpexHost() = default;
654 GpexHost(const GpexHost&) = default;
655 GpexHost(const Object& o): SysBusDevice(o) {}
656
657 void set_irq_num(int idx, int gic_irq);
658};
659
660class Cpu : public Device
661{
662public:
663 static constexpr const char* const TYPE = "cpu";
664
665 using EndOfLoopCallbackFn = std::function<void()>;
666 using CpuKickCallbackFn = std::function<void()>;
667 using AsyncJobFn = std::function<void()>;
668
669 Cpu() = default;
670 Cpu(const Cpu&) = default;
671 Cpu(const Object& o): Device(o) {}
672
673 int get_index() const;
674
675 void loop();
676 bool loop_is_busy();
677
678 bool can_run();
679
680 void set_soft_stopped(bool stopped);
681 void halt(bool halted);
682
683 void reset(bool reset); /* Reset: on true, enter reset, call cpu_pause and cpu_reset
684 * on false exit reset and call cpu_resume */
685
686 void set_unplug(bool unplug);
687 void remove_sync();
688
689 void register_thread();
690
691 Cpu set_as_current();
692
693 void kick();
694
695 [[noreturn]] void exit_loop_from_io();
696
697 void async_run(AsyncJobFn job);
698 void async_safe_run(AsyncJobFn job);
699
700 void set_end_of_loop_callback(EndOfLoopCallbackFn cb);
701 void set_kick_callback(CpuKickCallbackFn cb);
702
703 bool is_in_exclusive_context() const;
704
705 void set_vcpu_dirty(bool dirty) const;
706};
707
708class Timer
709{
710public:
711 typedef std::function<void()> TimerCallbackFn;
712
713private:
714 std::shared_ptr<LibQemuInternals> m_int;
715 QemuTimer* m_timer = nullptr;
716 TimerCallbackFn m_cb;
717
718public:
719 Timer(std::shared_ptr<LibQemuInternals> internals);
720 ~Timer();
721
722 void set_callback(TimerCallbackFn cb);
723
724 void mod(int64_t deadline);
725 void del();
726};
727
728class Bus : public Object
729{
730public:
731 static constexpr const char* const TYPE = "bus";
732
733 Bus() = default;
734 Bus(const Bus& o) = default;
735 Bus(const Object& o): Object(o) {}
736};
737
738class Chardev : public Object
739{
740public:
741 static constexpr const char* const TYPE = "chardev";
742
743 Chardev() = default;
744 Chardev(const Chardev& o) = default;
745 Chardev(const Object& o): Object(o) {}
746};
747
748}; /* namespace qemu */
Definition target.h:160
Definition libqemu-cxx.h:411
Definition libqemu-cxx.h:729
Definition libqemu-cxx.h:739
Definition libqemu-cxx.h:536
Definition libqemu-cxx.h:661
Definition libqemu-cxx.h:591
Definition libqemu-cxx.h:579
Definition libqemu-cxx.h:613
Definition libqemu-cxx.h:525
Definition libqemu-cxx.h:514
Definition libqemu-cxx.h:649
Definition libqemu-cxx.h:279
Definition libqemu-cxx.h:274
Definition libqemu-cxx.h:444
Definition libqemu-cxx.h:87
Definition loader.h:22
Definition libqemu-cxx.h:489
Definition libqemu-cxx.h:322
Definition libqemu-cxx.h:363
Definition libqemu-cxx.h:230
Definition libqemu-cxx.h:214
Definition libqemu-cxx.h:552
Definition libqemu-cxx.h:635
Definition libqemu-cxx.h:709
Definition libqemu-cxx.h:441
Definition libqemu-cxx.h:472
Definition libqemu-cxx.h:326