quic/qbox
Loading...
Searching...
No Matches
qemu-components
common
include
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
18
namespace
qemu {
19
20
class
LibQemuObjectCallbackBase
21
{
22
public
:
23
virtual
void
clear(
Object
obj
) = 0;
24
};
25
26
template
<
typename
T>
27
class
LibQemuObjectCallback
:
public
LibQemuObjectCallbackBase
28
{
29
private
:
30
std::map<QemuObject*, T> m_cbs;
31
32
public
:
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
48
class
LibQemuInternals
49
{
50
private
:
51
LibQemu
& m_inst;
52
LibQemuExports
* m_exports =
nullptr
;
53
54
LibQemuObjectCallback<Cpu::EndOfLoopCallbackFn>
m_cpu_end_of_loop_cbs;
55
LibQemuObjectCallback<Cpu::CpuKickCallbackFn>
m_cpu_kick_cbs;
56
LibQemuObjectCallback<IOMMUMemoryRegion::IOMMUTranslateCallbackFn>
m_iommu_translate_cbs;
57
LibQemuObjectCallback<CpuRiscv64::MipUpdateCallbackFn>
m_riscv_mip_update_cbs;
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
65
public
:
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; }
81
LibQemuObjectCallback<IOMMUMemoryRegion::IOMMUTranslateCallbackFn>
& get_iommu_translate_cb()
82
{
83
return
m_iommu_translate_cbs;
84
}
85
86
LibQemuObjectCallback<CpuRiscv64::MipUpdateCallbackFn>
& get_cpu_riscv_mip_update_cb()
87
{
88
return
m_riscv_mip_update_cbs;
89
}
90
};
91
92
}
// namespace qemu
93
94
#endif
QemuTargetSocket
Definition
target.h:160
qemu::LibQemuInternals
Definition
internals.h:49
qemu::LibQemuObjectCallbackBase
Definition
internals.h:21
qemu::LibQemuObjectCallback
Definition
internals.h:28
qemu::LibQemu
Definition
libqemu-cxx.h:92
qemu::Object
Definition
libqemu-cxx.h:229
Generated by
1.9.8