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:85
 
Definition libqemu-cxx.h:355
 
Definition libqemu-cxx.h:222
 
Definition libqemu-cxx.h:433