19#include <unordered_map>
26#include <libqemu-cxx/target_info.h>
27#include <libqemu-cxx/exceptions.h>
28#include <libqemu-cxx/loader.h>
30#include <scp/report.h>
35struct DisplayGLCtxOps;
65 uint32_t, uint32_t, uint32_t);
72class LibQemuInternals;
76class IOMMUMemoryRegion;
94 std::shared_ptr<LibQemuInternals> m_int;
96 const char* m_lib_path;
100 std::vector<char*> m_qemu_argv;
102 LibraryLoaderIface::LibraryIfacePtr m_lib;
107 void check_cast(
Object&
o,
const char* type);
109 void init_callbacks();
111 void rcu_read_lock();
112 void rcu_read_unlock();
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; }
124 bool is_inited()
const {
return m_lib !=
nullptr; }
128 void start_gdb_server(std::string port);
130 void vm_stop_paused();
132 void lock_iothread();
133 void unlock_iothread();
137 void finish_qemu_init();
138 Bus sysbus_get_default();
140 void coroutine_yield();
147 T o(
Object(object_new_internal(T::TYPE), m_int));
148 check_cast(
o, T::TYPE);
154 T object_new_unparented()
156 T o(
Object(object_new_unparented(T::TYPE), m_int));
157 check_cast(
o, T::TYPE);
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();
171 std::shared_ptr<Timer> timer_new();
173 Chardev chardev_new(
const char*
label,
const char* type);
177 void enable_opengl();
179 std::vector<Console> get_all_consoles();
180 Console console_lookup_by_index(
int index);
185 int sdl2_init()
const;
186 const char* sdl2_get_error()
const;
188 std::vector<SDL2Console> sdl2_create_consoles(
int num);
209 bool virgl_has_blob()
const;
215 std::shared_ptr<LibQemuInternals> m_int;
232 std::shared_ptr<LibQemuInternals> m_int;
234 bool check_cast_by_type(
const char*
type_name)
const {
return true; }
246 bool valid()
const {
return m_obj !=
nullptr; }
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);
255 Object get_prop_link(
const char* name);
257 QemuObject* get_qemu_obj()
const {
return m_obj; }
261 bool same_inst_as(
const Object&
o)
const {
return get_inst_id() ==
o.get_inst_id(); }
264 bool check_cast()
const
266 return check_cast_by_type(T::TYPE);
269 void clear_callbacks();
275 typedef std::function<
void(
bool)> GpioEventFn;
280 bool m_prev_valid =
false;
285 void event(
bool level)
287 if (!m_prev_valid || (
level != m_prev)) {
288 if (m_cb) m_cb(
level);
295 void set_callback(GpioEventFn
cb) { m_cb =
cb; }
299 std::shared_ptr<GpioProxy> m_proxy;
302 static constexpr const char*
const TYPE =
"irq";
310 void set_proxy(std::shared_ptr<GpioProxy>
proxy) { m_proxy =
proxy; }
312 void set_event_callback(GpioEventFn
cb)
315 m_proxy->set_callback(
cb);
323 enum MemTxResult { MemTxOK, MemTxError, MemTxDecodeError, MemTxOKExitTB };
339 std::shared_ptr<LibQemuInternals> m_int;
341 ReadCallback m_read_cb;
342 WriteCallback m_write_cb;
348 void set_read_callback(ReadCallback
cb);
349 void set_write_callback(WriteCallback
cb);
351 void set_max_access_size(
unsigned size);
353 ReadCallback get_read_callback() {
return m_read_cb; }
354 WriteCallback get_write_callback() {
return m_write_cb; }
359typedef std::shared_ptr<MemoryRegionOps> MemoryRegionOpsPtr;
364 MemoryRegionOpsPtr m_ops;
365 std::set<MemoryRegion> m_subregions;
371 using MemTxResult = MemoryRegionOps::MemTxResult;
374 static constexpr const char*
const TYPE =
"memory-region";
384 void removeSubRegions();
387 int get_priority()
const {
return m_priority; }
389 void set_priority(
int priority) { m_priority = priority; }
404 void set_ops(
const MemoryRegionOpsPtr
ops);
413 std::shared_ptr<LibQemuInternals> m_int;
415 bool m_inited =
false;
416 bool m_global =
false;
419 using MemTxResult = MemoryRegionOps::MemTxResult;
434 void update_topology();
445 static constexpr const char*
const TYPE =
"libqemu-iommu-memory-region";
448 std::shared_ptr<qemu::AddressSpace> m_as_te;
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;
458 , m_as_te(get_inst().address_space_new())
460 , m_as(get_inst().address_space_new())
476 IOMMUAccessFlags perm;
480 std::unordered_map<uint64_t, qemu::IOMMUMemoryRegion::IOMMUTLBEntry> m_mapped_te;
482 std::map<uint64_t, qemu::IOMMUMemoryRegion::IOMMUTLBEntry> m_mapped_te;
487 IOMMUTranslateCallbackFn
cb);
498 std::shared_ptr<LibQemuInternals> m_int;
499 std::shared_ptr<AddressSpace> m_as;
501 MapCallback m_map_cb;
510 void set_map_callback(MapCallback
cb);
511 MapCallback& get_map_callback() {
return m_map_cb; }
513 void register_as(std::shared_ptr<AddressSpace>
as);
519 ::DisplayOptions* m_opts;
520 std::shared_ptr<LibQemuInternals> m_int;
530 ::DisplayGLCtxOps* m_ops;
531 std::shared_ptr<LibQemuInternals> m_int;
542 std::shared_ptr<LibQemuInternals> m_int;
548 int get_index()
const;
549 bool is_graphic()
const;
551 void set_window_id(
int id);
558 std::shared_ptr<LibQemuInternals> m_int;
565 void set_hidden(
bool hidden);
566 void set_idx(
int idx);
568 void set_opengl(
bool opengl);
576 void register_dcl()
const;
585 std::shared_ptr<LibQemuInternals> m_int;
590 void* get_user_data();
597 std::shared_ptr<LibQemuInternals> m_int;
603 void set_name(
const char* name);
607 void set_refresh(LibQemuRefreshFn
refresh_fn);
618 static constexpr const char*
const TYPE =
"device";
625 void connect_gpio_out_named(
const char* name,
int idx,
Gpio gpio);
628 Gpio get_gpio_in_named(
const char* name,
int idx);
630 Bus get_child_bus(
const char* name);
631 void set_parent_bus(
Bus bus);
633 void set_prop_chardev(
const char* name,
Chardev chr);
634 void set_prop_uint_array(
const char* name, std::vector<unsigned int>
vec);
640 static constexpr const char*
const TYPE =
"sys-bus-device";
654 static constexpr const char*
const TYPE =
"gpex-pcihost";
666 static constexpr const char*
const TYPE =
"cpu";
668 using EndOfLoopCallbackFn = std::function<
void()>;
669 using CpuKickCallbackFn = std::function<
void()>;
670 using AsyncJobFn = std::function<
void()>;
673 Cpu(
const Cpu&) =
default;
676 int get_index()
const;
683 void set_soft_stopped(
bool stopped);
686 void reset(
bool reset);
689 void set_unplug(
bool unplug);
692 void register_thread();
694 Cpu set_as_current();
698 [[
noreturn]]
void exit_loop_from_io();
700 void async_run(AsyncJobFn
job);
701 void async_safe_run(AsyncJobFn
job);
703 void set_end_of_loop_callback(EndOfLoopCallbackFn
cb);
704 void set_kick_callback(CpuKickCallbackFn
cb);
706 bool is_in_exclusive_context()
const;
708 void set_vcpu_dirty(
bool dirty)
const;
714 typedef std::function<
void()> TimerCallbackFn;
717 std::shared_ptr<LibQemuInternals> m_int;
719 TimerCallbackFn m_cb;
725 void set_callback(TimerCallbackFn
cb);
734 static constexpr const char*
const TYPE =
"bus";
744 static constexpr const char*
const TYPE =
"chardev";
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 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