12#include <unordered_map>
19#include <libqemu-cxx/target_info.h>
20#include <libqemu-cxx/exceptions.h>
21#include <libqemu-cxx/loader.h>
23#include <scp/report.h>
28struct DisplayGLCtxOps;
58 uint32_t, uint32_t, uint32_t);
65class LibQemuInternals;
69class IOMMUMemoryRegion;
87 std::shared_ptr<LibQemuInternals> m_int;
89 const char* m_lib_path;
93 std::vector<char*> m_qemu_argv;
95 LibraryLoaderIface::LibraryIfacePtr m_lib;
100 void check_cast(
Object&
o,
const char* type);
102 void init_callbacks();
104 void rcu_read_lock();
105 void rcu_read_unlock();
112 void push_qemu_arg(
const char*
arg);
113 void push_qemu_arg(std::initializer_list<const char*> args);
114 const std::vector<char*>& get_qemu_args()
const {
return m_qemu_argv; }
117 bool is_inited()
const {
return m_lib !=
nullptr; }
121 void start_gdb_server(std::string port);
123 void vm_stop_paused();
125 void lock_iothread();
126 void unlock_iothread();
130 void finish_qemu_init();
131 Bus sysbus_get_default();
133 void coroutine_yield();
141 check_cast(
o, T::TYPE);
147 T object_new_unparented()
149 T o(
Object(object_new_unparented(T::TYPE), m_int));
150 check_cast(
o, T::TYPE);
157 std::shared_ptr<MemoryRegionOps> memory_region_ops_new();
158 std::shared_ptr<AddressSpace> address_space_new();
159 std::shared_ptr<AddressSpace> address_space_get_system_memory();
160 std::shared_ptr<MemoryRegion> get_system_memory();
161 std::shared_ptr<MemoryListener> memory_listener_new();
164 std::shared_ptr<Timer> timer_new();
166 Chardev chardev_new(
const char*
label,
const char* type);
170 void enable_opengl();
172 std::vector<Console> get_all_consoles();
173 Console console_lookup_by_index(
int index);
178 int sdl2_init()
const;
179 const char* sdl2_get_error()
const;
181 std::vector<SDL2Console> sdl2_create_consoles(
int num);
202 bool virgl_has_blob()
const;
208 std::shared_ptr<LibQemuInternals> m_int;
225 std::shared_ptr<LibQemuInternals> m_int;
227 bool check_cast_by_type(
const char*
type_name)
const {
return true; }
239 bool valid()
const {
return m_obj !=
nullptr; }
241 void set_prop_bool(
const char* name,
bool val);
242 void set_prop_int(
const char* name,
int64_t val);
243 void set_prop_uint(
const char* name,
uint64_t val);
244 void set_prop_str(
const char* name,
const char*
val);
245 void set_prop_link(
const char* name,
const Object&
link);
246 void set_prop_parse(
const char* name,
const char* value);
248 Object get_prop_link(
const char* name);
250 QemuObject* get_qemu_obj()
const {
return m_obj; }
254 bool same_inst_as(
const Object&
o)
const {
return get_inst_id() ==
o.get_inst_id(); }
257 bool check_cast()
const
259 return check_cast_by_type(T::TYPE);
262 void clear_callbacks();
268 typedef std::function<
void(
bool)> GpioEventFn;
273 bool m_prev_valid =
false;
278 void event(
bool level)
280 if (!m_prev_valid || (
level != m_prev)) {
281 if (m_cb) m_cb(
level);
288 void set_callback(GpioEventFn
cb) { m_cb =
cb; }
292 std::shared_ptr<GpioProxy> m_proxy;
295 static constexpr const char*
const TYPE =
"irq";
303 void set_proxy(std::shared_ptr<GpioProxy>
proxy) { m_proxy =
proxy; }
305 void set_event_callback(GpioEventFn
cb)
308 m_proxy->set_callback(
cb);
316 enum MemTxResult { MemTxOK, MemTxError, MemTxDecodeError, MemTxOKExitTB };
332 std::shared_ptr<LibQemuInternals> m_int;
334 ReadCallback m_read_cb;
335 WriteCallback m_write_cb;
341 void set_read_callback(ReadCallback
cb);
342 void set_write_callback(WriteCallback
cb);
344 void set_max_access_size(
unsigned size);
346 ReadCallback get_read_callback() {
return m_read_cb; }
347 WriteCallback get_write_callback() {
return m_write_cb; }
352typedef std::shared_ptr<MemoryRegionOps> MemoryRegionOpsPtr;
357 MemoryRegionOpsPtr m_ops;
358 std::set<MemoryRegion> m_subregions;
364 using MemTxResult = MemoryRegionOps::MemTxResult;
367 static constexpr const char*
const TYPE =
"memory-region";
377 void removeSubRegions();
380 int get_priority()
const {
return m_priority; }
382 void set_priority(
int priority) { m_priority = priority; }
397 void set_ops(
const MemoryRegionOpsPtr
ops);
406 std::shared_ptr<LibQemuInternals> m_int;
408 bool m_inited =
false;
409 bool m_global =
false;
412 using MemTxResult = MemoryRegionOps::MemTxResult;
427 void update_topology();
438 static constexpr const char*
const TYPE =
"libqemu-iommu-memory-region";
441 std::shared_ptr<qemu::AddressSpace> m_as_te;
443 std::shared_ptr<qemu::AddressSpace> m_as;
444 std::map<uint64_t, std::shared_ptr<DmiRegionBase>> m_dmi_aliases_te;
445 std::map<uint64_t, std::shared_ptr<DmiRegionBase>> m_dmi_aliases_io;
451 , m_as_te(get_inst().address_space_new())
453 , m_as(get_inst().address_space_new())
469 IOMMUAccessFlags perm;
472 std::unordered_map<uint64_t, qemu::IOMMUMemoryRegion::IOMMUTLBEntry> m_mapped_te;
476 IOMMUTranslateCallbackFn
cb);
487 std::shared_ptr<LibQemuInternals> m_int;
488 std::shared_ptr<AddressSpace> m_as;
490 MapCallback m_map_cb;
499 void set_map_callback(MapCallback
cb);
500 MapCallback& get_map_callback() {
return m_map_cb; }
502 void register_as(std::shared_ptr<AddressSpace>
as);
508 ::DisplayOptions* m_opts;
509 std::shared_ptr<LibQemuInternals> m_int;
519 ::DisplayGLCtxOps* m_ops;
520 std::shared_ptr<LibQemuInternals> m_int;
531 std::shared_ptr<LibQemuInternals> m_int;
537 int get_index()
const;
538 bool is_graphic()
const;
540 void set_window_id(
int id);
547 std::shared_ptr<LibQemuInternals> m_int;
554 void set_hidden(
bool hidden);
555 void set_idx(
int idx);
557 void set_opengl(
bool opengl);
565 void register_dcl()
const;
574 std::shared_ptr<LibQemuInternals> m_int;
579 void* get_user_data();
586 std::shared_ptr<LibQemuInternals> m_int;
592 void set_name(
const char* name);
596 void set_refresh(LibQemuRefreshFn
refresh_fn);
607 static constexpr const char*
const TYPE =
"device";
614 void connect_gpio_out_named(
const char* name,
int idx,
Gpio gpio);
617 Gpio get_gpio_in_named(
const char* name,
int idx);
619 Bus get_child_bus(
const char* name);
620 void set_parent_bus(
Bus bus);
622 void set_prop_chardev(
const char* name,
Chardev chr);
623 void set_prop_uint_array(
const char* name, std::vector<unsigned int>
vec);
629 static constexpr const char*
const TYPE =
"sys-bus-device";
643 static constexpr const char*
const TYPE =
"gpex-pcihost";
655 static constexpr const char*
const TYPE =
"cpu";
657 using EndOfLoopCallbackFn = std::function<
void()>;
658 using CpuKickCallbackFn = std::function<
void()>;
659 using AsyncJobFn = std::function<
void()>;
662 Cpu(
const Cpu&) =
default;
665 int get_index()
const;
672 void set_soft_stopped(
bool stopped);
675 void reset(
bool reset);
678 void set_unplug(
bool unplug);
681 void register_thread();
683 Cpu set_as_current();
687 [[
noreturn]]
void exit_loop_from_io();
689 void async_run(AsyncJobFn
job);
690 void async_safe_run(AsyncJobFn
job);
692 void set_end_of_loop_callback(EndOfLoopCallbackFn
cb);
693 void set_kick_callback(CpuKickCallbackFn
cb);
695 bool is_in_exclusive_context()
const;
697 void set_vcpu_dirty(
bool dirty)
const;
703 typedef std::function<
void()> TimerCallbackFn;
706 std::shared_ptr<LibQemuInternals> m_int;
708 TimerCallbackFn m_cb;
714 void set_callback(TimerCallbackFn
cb);
723 static constexpr const char*
const TYPE =
"bus";
733 static constexpr const char*
const TYPE =
"chardev";
Definition libqemu-cxx.h:403
Definition libqemu-cxx.h:721
Definition libqemu-cxx.h:731
Definition libqemu-cxx.h:528
Definition libqemu-cxx.h:653
Definition libqemu-cxx.h:583
Definition libqemu-cxx.h:571
Definition libqemu-cxx.h:605
Definition libqemu-cxx.h:517
Definition libqemu-cxx.h:506
Definition libqemu-cxx.h:641
Definition libqemu-cxx.h:271
Definition libqemu-cxx.h:266
Definition libqemu-cxx.h:436
Definition libqemu-cxx.h:85
Definition libqemu-cxx.h:481
Definition libqemu-cxx.h:314
Definition libqemu-cxx.h:355
Definition libqemu-cxx.h:222
Definition libqemu-cxx.h:206
Definition libqemu-cxx.h:544
Definition libqemu-cxx.h:627
Definition libqemu-cxx.h:701
Definition libqemu-cxx.h:433
Definition libqemu-cxx.h:464
Definition libqemu-cxx.h:318