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>
29struct DisplayGLCtxOps;
60 uint32_t, uint32_t, uint32_t);
67class LibQemuInternals;
71class IOMMUMemoryRegion;
89 std::shared_ptr<LibQemuInternals> m_int;
91 const char* m_lib_path;
95 std::vector<char*> m_qemu_argv;
97 LibraryLoaderIface::LibraryIfacePtr m_lib;
102 void check_cast(
Object&
o,
const char* type);
104 void init_callbacks();
106 void rcu_read_lock();
107 void rcu_read_unlock();
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; }
119 bool is_inited()
const {
return m_lib !=
nullptr; }
123 void start_gdb_server(std::string port);
125 void vm_stop_paused();
127 void lock_iothread();
128 void unlock_iothread();
132 void finish_qemu_init();
133 Bus sysbus_get_default();
135 void coroutine_yield();
143 check_cast(
o, T::TYPE);
149 T object_new_unparented()
151 T o(
Object(object_new_unparented(T::TYPE), m_int));
152 check_cast(
o, T::TYPE);
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();
166 std::shared_ptr<Timer> timer_new();
168 Chardev chardev_new(
const char*
label,
const char* type);
172 void enable_opengl();
174 std::vector<Console> get_all_consoles();
175 Console console_lookup_by_index(
int index);
180 int sdl2_init()
const;
181 const char* sdl2_get_error()
const;
183 std::vector<SDL2Console> sdl2_create_consoles(
int num);
204 bool virgl_has_blob()
const;
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);
216 std::shared_ptr<LibQemuInternals> m_int;
233 std::shared_ptr<LibQemuInternals> m_int;
235 bool check_cast_by_type(
const char*
type_name)
const {
return true; }
247 bool valid()
const {
return m_obj !=
nullptr; }
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);
256 Object get_prop_link(
const char* name);
258 QemuObject* get_qemu_obj()
const {
return m_obj; }
262 bool same_inst_as(
const Object&
o)
const {
return get_inst_id() ==
o.get_inst_id(); }
265 bool check_cast()
const
267 return check_cast_by_type(T::TYPE);
270 void clear_callbacks();
276 typedef std::function<
void(
bool)> GpioEventFn;
281 bool m_prev_valid =
false;
286 void event(
bool level)
288 if (!m_prev_valid || (
level != m_prev)) {
289 if (m_cb) m_cb(
level);
296 void set_callback(GpioEventFn
cb) { m_cb =
cb; }
300 std::shared_ptr<GpioProxy> m_proxy;
303 static constexpr const char*
const TYPE =
"irq";
311 void set_proxy(std::shared_ptr<GpioProxy>
proxy) { m_proxy =
proxy; }
313 void set_event_callback(GpioEventFn
cb)
316 m_proxy->set_callback(
cb);
324 enum MemTxResult { MemTxOK, MemTxError, MemTxDecodeError, MemTxOKExitTB };
340 std::shared_ptr<LibQemuInternals> m_int;
342 ReadCallback m_read_cb;
343 WriteCallback m_write_cb;
349 void set_read_callback(ReadCallback
cb);
350 void set_write_callback(WriteCallback
cb);
352 void set_max_access_size(
unsigned size);
354 ReadCallback get_read_callback() {
return m_read_cb; }
355 WriteCallback get_write_callback() {
return m_write_cb; }
360typedef std::shared_ptr<MemoryRegionOps> MemoryRegionOpsPtr;
365 MemoryRegionOpsPtr m_ops;
366 std::set<MemoryRegion> m_subregions;
372 using MemTxResult = MemoryRegionOps::MemTxResult;
375 static constexpr const char*
const TYPE =
"memory-region";
385 void removeSubRegions();
388 int get_priority()
const {
return m_priority; }
390 void set_priority(
int priority) { m_priority = priority; }
405 void set_ops(
const MemoryRegionOpsPtr
ops);
414 std::shared_ptr<LibQemuInternals> m_int;
416 bool m_inited =
false;
417 bool m_global =
false;
420 using MemTxResult = MemoryRegionOps::MemTxResult;
435 void update_topology();
446 static constexpr const char*
const TYPE =
"libqemu-iommu-memory-region";
449 std::shared_ptr<qemu::AddressSpace> m_as_te;
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;
459 , m_as_te(get_inst().address_space_new())
461 , m_as_io(get_inst().address_space_new())
477 IOMMUAccessFlags perm;
480 std::map<uint64_t, qemu::IOMMUMemoryRegion::IOMMUTLBEntry> m_mapped_te;
484 IOMMUTranslateCallbackFn
cb);
495 std::shared_ptr<LibQemuInternals> m_int;
496 std::shared_ptr<AddressSpace> m_as;
498 MapCallback m_map_cb;
507 void set_map_callback(MapCallback
cb);
508 MapCallback& get_map_callback() {
return m_map_cb; }
510 void register_as(std::shared_ptr<AddressSpace>
as);
516 ::DisplayOptions* m_opts;
517 std::shared_ptr<LibQemuInternals> m_int;
527 ::DisplayGLCtxOps* m_ops;
528 std::shared_ptr<LibQemuInternals> m_int;
539 std::shared_ptr<LibQemuInternals> m_int;
545 int get_index()
const;
546 bool is_graphic()
const;
548 void set_window_id(
int id);
555 std::shared_ptr<LibQemuInternals> m_int;
562 void set_hidden(
bool hidden);
563 void set_idx(
int idx);
565 void set_opengl(
bool opengl);
573 void register_dcl()
const;
582 std::shared_ptr<LibQemuInternals> m_int;
587 void* get_user_data();
594 std::shared_ptr<LibQemuInternals> m_int;
600 void set_name(
const char* name);
604 void set_refresh(LibQemuRefreshFn
refresh_fn);
615 static constexpr const char*
const TYPE =
"device";
622 void connect_gpio_out_named(
const char* name,
int idx,
Gpio gpio);
625 Gpio get_gpio_in_named(
const char* name,
int idx);
627 Bus get_child_bus(
const char* name);
628 void set_parent_bus(
Bus bus);
630 void set_prop_chardev(
const char* name,
Chardev chr);
631 void set_prop_uint_array(
const char* name, std::vector<unsigned int>
vec);
637 static constexpr const char*
const TYPE =
"sys-bus-device";
651 static constexpr const char*
const TYPE =
"gpex-pcihost";
663 static constexpr const char*
const TYPE =
"cpu";
665 using EndOfLoopCallbackFn = std::function<
void()>;
666 using CpuKickCallbackFn = std::function<
void()>;
667 using AsyncJobFn = std::function<
void()>;
670 Cpu(
const Cpu&) =
default;
673 int get_index()
const;
680 void set_soft_stopped(
bool stopped);
683 void reset(
bool reset);
686 void set_unplug(
bool unplug);
689 void register_thread();
691 Cpu set_as_current();
695 [[
noreturn]]
void exit_loop_from_io();
697 void async_run(AsyncJobFn
job);
698 void async_safe_run(AsyncJobFn
job);
700 void set_end_of_loop_callback(EndOfLoopCallbackFn
cb);
701 void set_kick_callback(CpuKickCallbackFn
cb);
703 bool is_in_exclusive_context()
const;
705 void set_vcpu_dirty(
bool dirty)
const;
711 typedef std::function<
void()> TimerCallbackFn;
714 std::shared_ptr<LibQemuInternals> m_int;
716 TimerCallbackFn m_cb;
722 void set_callback(TimerCallbackFn
cb);
731 static constexpr const char*
const TYPE =
"bus";
741 static constexpr const char*
const TYPE =
"chardev";
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 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