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