36 auto mount_successful = vs_parent->getStruct()->mountStruct(this->
getName(), this->
getStruct());
38 if (!mount_successful)
41 std::string(
"'s VirtualStruct to ") + vs_parent->getName());
49 auto cpu_arch_str =
etiss::cfg().
get<std::string>(
"arch.cpu",
"");
50 arch_width = cpu_arch_str ==
"RISCV64" ? 64 : 32;
55 std::string elf_file =
etiss::cfg().
get<std::string>(
"vp.elf_file",
"");
57 if (!reader.load(elf_file))
61 arch_width = reader.get_class() == ELFCLASS64 ? 64 : 32;
65 std::string(
"'s VirtualStruct to CPUCore ") + vs_parent->getName());
70 "\"vp.elf_file\" config to retrieve architecture bit-width."));
73 std::string elf_file =
etiss::cfg().
get<std::string>(
"vp.elf_file",
"");
77 if (!reader.load(elf_file))
84 auto read = [
this](
size_t address, etiss::int32 &return_code)
87 return_code = dbus_access<false>(
nullptr,
static_cast<etiss::uint64
>(address),
88 reinterpret_cast<etiss::uint8 *
>(&x),
sizeof(x));
91 auto write = [
this](
size_t address, etiss::uint32 word, etiss::int32 &return_code)
93 return_code = dbus_access<true>(
nullptr,
static_cast<etiss::uint64
>(address),
94 reinterpret_cast<etiss::uint8 *
>(&word),
sizeof(word));
96 mem_manipulator_ = std::make_unique<MemoryWordManipulator<etiss::uint32>>(read, write);
98 else if (arch_width == 64)
100 auto read = [
this](
size_t address, etiss::int32 &return_code)
103 return_code = dbus_access<false>(
nullptr,
static_cast<etiss::uint64
>(address),
104 reinterpret_cast<etiss::uint8 *
>(&x),
sizeof(x));
107 auto write = [
this](
size_t address, etiss::uint64 word, etiss::int32 &return_code)
109 return_code = dbus_access<true>(
nullptr,
static_cast<etiss::uint64
>(address),
110 reinterpret_cast<etiss::uint8 *
>(&word),
sizeof(word));
112 mem_manipulator_ = std::make_unique<MemoryWordManipulator<etiss::uint64>>(read, write);
117 std::string(
"Failed to initiliaze MemStack: Architecture bit width not set."));
123 auto cmd = action.getCommand();
126 std::vector<std::string> split_cmd;
127 while ((pos = cmd.find(
" ")) != std::string::npos)
129 split_cmd.push_back(cmd.substr(0, pos));
130 cmd.erase(0, pos + 1);
132 split_cmd.push_back(cmd);
133 if (split_cmd.size() > 1)
135 etiss::uint64 dst_address;
136 etiss::int32 return_code;
137 dst_address = std::stoll(split_cmd[1],
nullptr, 16);
139 std::transform(split_cmd[0].begin(), split_cmd[0].end(), split_cmd[0].begin(), ::toupper);
140 auto mem_manip_cmd = MemoryWordManipulatorBase::mem_manip_cmd_t::_from_string(
"UNDEF");
141 if (
auto maybe = MemoryWordManipulatorBase::mem_manip_cmd_t::_from_string_nothrow(split_cmd[0].c_str()))
143 mem_manip_cmd = MemoryWordManipulatorBase::mem_manip_cmd_t::_from_integral(maybe);
146 switch (mem_manip_cmd)
148 case MemoryWordManipulatorBase::mem_manip_cmd_t::PUSH:
151 case MemoryWordManipulatorBase::mem_manip_cmd_t::POP:
154 case MemoryWordManipulatorBase::mem_manip_cmd_t::RMW:
157 val = std::stoll(split_cmd[3],
nullptr, 16);
162 case MemoryWordManipulatorBase::mem_manip_cmd_t::RRMW:
164 etiss::uint64 src2_addr;
165 src2_addr = std::stoll(split_cmd[3],
nullptr, 16);
172 std::string(
"MemoryManipulationSystem/VirtualStruct/applyCustomAction: \'") +
173 action.getCommand() +
174 std::string(
"\' unrecognized Action. Invalid memory manipulation command: ") +
179 if (return_code != etiss::RETURNCODE::NOERROR)
182 std::string(
"MemoryManipulationSystem/VirtualStruct/applyCustomAction: \'") +
183 action.getCommand() + std::string(
"\' memory access error"));
191 action.getCommand() + std::string(
"\' unrecognized Action"));