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 <atomic>
13#include <map>
14#include <memory>
15
16#include <libqemu/libqemu.h>
17#include <libqemu-cxx/libqemu-cxx.h>
18#include <libqemu-cxx/target/riscv.h>
19
20namespace qemu {
21
23{
24public:
25 virtual void clear(Object obj) = 0;
26};
27
28template <typename T>
30{
31private:
32 struct Entry {
33 T cb;
34 std::atomic<bool> active{ true };
35 };
36 std::map<QemuObject*, std::unique_ptr<Entry>> m_cbs;
37
38public:
39 void register_cb(Object obj, T cb)
40 {
41 auto entry = std::make_unique<Entry>();
42 entry->cb = std::move(cb);
43 entry->active.store(true, std::memory_order_release);
44 m_cbs[obj.get_qemu_obj()] = std::move(entry);
45 }
46
47 void clear(Object obj) override
48 {
49 auto it = m_cbs.find(obj.get_qemu_obj());
50 if (it != m_cbs.end() && it->second) {
51 it->second->active.store(false, std::memory_order_release);
52 }
53 }
54
55 template <typename... Args>
56 void call(QemuObject* obj, Args... args) const
57 {
58 auto it = m_cbs.find(obj);
59 if (it == m_cbs.end() || !it->second) {
60 return;
61 }
62
63 if (it->second->active.load(std::memory_order_acquire)) {
64 it->second->cb(args...);
65 }
66 }
67};
68
70{
71private:
72 LibQemu& m_inst;
73 LibQemuExports* m_exports = nullptr;
74
79
80 std::vector<LibQemuObjectCallbackBase*> m_cbs{
81 &m_cpu_end_of_loop_cbs,
82 &m_cpu_kick_cbs,
83 &m_iommu_translate_cbs,
84 &m_riscv_mip_update_cbs,
85 };
86
87public:
88 LibQemuInternals(LibQemu& inst, LibQemuExports* exports): m_inst(inst), m_exports(exports) {}
89
90 const LibQemuExports& exports() const { return *m_exports; };
91 LibQemu& get_inst() { return m_inst; }
92
93 void clear_callbacks(Object obj)
94 {
95 for (auto cb : m_cbs) {
96 cb->clear(obj);
97 }
98 }
99
100 LibQemuObjectCallback<Cpu::EndOfLoopCallbackFn>& get_cpu_end_of_loop_cb() { return m_cpu_end_of_loop_cbs; }
101
102 LibQemuObjectCallback<Cpu::CpuKickCallbackFn>& get_cpu_kick_cb() { return m_cpu_kick_cbs; }
104 {
105 return m_iommu_translate_cbs;
106 }
107
108 LibQemuObjectCallback<CpuRiscv64::MipUpdateCallbackFn>& get_cpu_riscv_mip_update_cb()
109 {
110 return m_riscv_mip_update_cbs;
111 }
112};
113
114} // namespace qemu
115
116#endif
Definition target.h:160
Definition internals.h:70
Definition internals.h:23
Definition internals.h:30
Definition libqemu-cxx.h:88
Definition libqemu-cxx.h:231