quic/qbox
Loading...
Searching...
No Matches
internals.h
1/*
2 * This file is part of libqemu-cxx
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
4 * Author: GreenSocs 2021
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9#ifndef _LIBQEMU_CXX_INTERNALS_
10#define _LIBQEMU_CXX_INTERNALS_
11
12#include <map>
13
14#include <libqemu/libqemu.h>
15#include <libqemu-cxx/libqemu-cxx.h>
16#include <libqemu-cxx/target/riscv.h>
17
18namespace qemu {
19
21{
22public:
23 virtual void clear(Object obj) = 0;
24};
25
26template <typename T>
28{
29private:
30 std::map<QemuObject*, T> m_cbs;
31
32public:
33 void register_cb(Object obj, T cb) { m_cbs[obj.get_qemu_obj()] = cb; }
34
35 void clear(Object obj) { m_cbs.erase(obj.get_qemu_obj()); }
36
37 template <typename... Args>
38 void call(QemuObject* obj, Args... args) const
39 {
40 if (m_cbs.find(obj) == m_cbs.end()) {
41 return;
42 }
43
44 m_cbs.at(obj)(args...);
45 }
46};
47
49{
50private:
51 LibQemu& m_inst;
52 LibQemuExports* m_exports = nullptr;
53
58
59 std::vector<LibQemuObjectCallbackBase*> m_cbs{
60 &m_cpu_end_of_loop_cbs,
61 &m_cpu_kick_cbs,
62 &m_riscv_mip_update_cbs,
63 };
64
65public:
66 LibQemuInternals(LibQemu& inst, LibQemuExports* exports): m_inst(inst), m_exports(exports) {}
67
68 const LibQemuExports& exports() const { return *m_exports; };
69 LibQemu& get_inst() { return m_inst; }
70
71 void clear_callbacks(Object obj)
72 {
73 for (auto cb : m_cbs) {
74 cb->clear(obj);
75 }
76 }
77
78 LibQemuObjectCallback<Cpu::EndOfLoopCallbackFn>& get_cpu_end_of_loop_cb() { return m_cpu_end_of_loop_cbs; }
79
80 LibQemuObjectCallback<Cpu::CpuKickCallbackFn>& get_cpu_kick_cb() { return m_cpu_kick_cbs; }
82 {
83 return m_iommu_translate_cbs;
84 }
85
87 {
88 return m_riscv_mip_update_cbs;
89 }
90};
91
92} // namespace qemu
93
94#endif
Definition target.h:160
Definition internals.h:49
Definition internals.h:21
Definition internals.h:28
Definition libqemu-cxx.h:92
Definition libqemu-cxx.h:229