9#ifndef LIBQBOX_DMI_MANAGER_H_
10#define LIBQBOX_DMI_MANAGER_H_
20#include <libqemu-cxx/libqemu-cxx.h>
22#include <libgsutils.h>
24#include <scp/report.h>
53 static constexpr const char*
const TYPE =
"container";
80 using Ptr = std::shared_ptr<DmiRegion>;
89 bool m_retiring =
false;
91 static uint64_t size_from_tlm_dmi(
const tlm::tlm_dmi&
info)
96 assert(!((start == 0) && (end == std::numeric_limits<uint64_t>::max())));
97 return end - start + 1;
104 : m_ptr(
info.get_dmi_ptr())
107 , m_size(size_from_tlm_dmi(
info))
110 m_mr.init_ram_ptr(m_container,
"dmi", m_size, m_ptr,
fd);
111 m_mr.set_priority(priority);
112 SCP_INFO(
"DMI.Libqbox") <<
"Creating " << *
this;
117 uint64_t get_size()
const {
return m_size; }
122 Key get_key()
const {
return reinterpret_cast<Key>(m_ptr); }
123 Key get_end()
const {
return get_key() + (m_size - 1); }
124 unsigned char* get_ptr()
const {
return m_ptr; }
126 static Key key_from_tlm_dmi(
const tlm::tlm_dmi&
info) {
return reinterpret_cast<Key>(
info.get_dmi_ptr()); }
144 unsigned char* m_ptr;
149 bool m_installed =
false;
154 using Ptr = std::shared_ptr<DmiRegionAlias>;
160 : m_start(
info.get_start_address())
161 , m_end(
info.get_end_address())
162 , m_ptr(
info.get_dmi_ptr())
166 SCP_INFO(
"DMI.Libqbox") <<
"Creating Alias " << *
this;
170 m_alias.init_alias(m_container,
"dmi-alias",
root, offset, (m_end - m_start) + 1);
178 uint64_t get_start()
const {
return m_start; }
180 uint64_t get_end()
const {
return m_end; }
182 uint64_t get_size()
const {
return (m_end - m_start) + 1; }
186 unsigned char* get_dmi_ptr()
const {
return m_ptr; }
206 QemuContainer m_root_container;
218 using DmiRegionMap = std::map<DmiRegion::Key, DmiRegion>;
238 dmi.set_start_address(
info.get_start_address());
239 dmi.set_end_address(
info.get_end_address());
240 dmi.set_dmi_ptr(
info.get_dmi_ptr());
242 std::lock_guard<std::mutex>
lock(m_mutex);
248 (
"Overlapping DMI regions old size {:x} new size {:x}!",
existing_it->second.get_size(), size);
275 m_root_container = m_inst.object_new_unparented<QemuContainer>();
277 m_root.init(m_root_container,
"dmi-manager", std::numeric_limits<uint64_t>::max());
286 return std::make_shared<DmiRegionAlias>(
m_root,
info, m_inst);
An alias to a DMI region.
Definition dmi-manager.h:140
bool is_installed() const
Return true if the alias is mapped onto QEMU root MR.
Definition dmi-manager.h:200
void set_installed()
Mark the alias as mapped onto QEMU root MR.
Definition dmi-manager.h:193
a DMI region
Definition dmi-manager.h:77
Definition dmi-manager.h:51
Handles the DMI regions at the QEMU instance level.
Definition dmi-manager.h:47
DmiRegionMap m_regions
A copy of each RAM memory region is kept here. Another is stored in the m_root.m_subregions vector....
Definition dmi-manager.h:224
void get_region(const tlm::tlm_dmi &info, int fd=-1)
This regions are added as subregions of the manager root memory region container. They can overlap,...
Definition dmi-manager.h:232
qemu::MemoryRegion m_root
The DMI manager maintains a "container" memory region as a root where "RAM" memory regions are added ...
Definition dmi-manager.h:214
DmiRegionAlias::Ptr get_new_region_alias(const tlm::tlm_dmi &info, int fd=-1)
Create a new alias for the DMI region designated by info
Definition dmi-manager.h:283
Definition libqemu-cxx.h:92
Definition libqemu-cxx.h:362
Definition libqemu-cxx.h:229
Definition libqemu-cxx.h:440