13#ifndef ETISS_PLUGIN_VIRTUALSTRUCT_H_
14#define ETISS_PLUGIN_VIRTUALSTRUCT_H_
15#include "etiss/CVirtualStruct.h"
130 const std::pair<
Listener *, std::shared_ptr<Listener>> &rhs)
const
132 return lhs.first < rhs.first;
152 static const int R = 1;
153 static const int W = 2;
155 static const int L = 4;
157 static const int F = 8;
158 static const int A = 16;
159 static const int P = 32;
169 Field(
VirtualStruct &parent,
const std::string &name,
const std::string &prettyname,
int flags,
size_t width,
170 size_t bitwidth = 0);
171 Field(
VirtualStruct &parent,
const std::string &name,
const std::string &prettyname,
int flags,
size_t width,
173 size_t bitwidth = 0);
198 std::string &errormsg);
239 bool addListener(Listener *listener, std::shared_ptr<Listener> ref =
nullptr);
244 void removeListener(Listener *listener, std::shared_ptr<Listener> ref =
nullptr);
251 template <
typename structT,
typename retT, retT structT::*field>
254 static_assert(
sizeof(retT) <=
sizeof(
uint64_t),
255 "Cannot use etiss::VirtualStruct::FieldT for a field larger than uint64_t");
259 :
Field(parent, name, prettyname, 0, sizeof(retT))
266 "Virtualstruct field offset out of range");
273 "Virtualstruct field offset out of range");
279 VirtualStruct(
void *structure, std::function<
void(Field *)> dtor = [](Field *f) {
delete f; });
284 bool addField(Field *f,
bool noerrorprint =
false);
286 template <
typename structT,
typename retT, retT structT::*field>
288 bool addField(
const std::string &name,
const std::string &prettyname =
"",
bool noerrorprint =
false)
302 template <
typename T>
303 bool addField(
const std::string &name,
const std::string &prettyname, std::function<T()> read,
304 std::function<
void(T)> write,
bool supportsListener =
false,
bool noerrorprint =
false)
311 if (supportsListener)
314 *
this, name, prettyname, flags,
sizeof(T),
false, [read]() {
return (
uint64_t)read(); },
322 std::shared_ptr<Field>
findName(
const std::string &name)
const;
323 std::shared_ptr<Field>
findPrettyName(
const std::string &name)
const;
324 void foreachField(
const std::function<
void(std::shared_ptr<Field>)> &func);
326 bool mountStruct(
const std::string &name,
const std::shared_ptr<VirtualStruct> vs);
327 std::shared_ptr<VirtualStruct>
findStruct(
const std::string &name);
337 virtual std::shared_ptr<etiss::fault::Injector>
getSubInjector(
const std::string &name);
344 virtual bool readField(
void *fastfieldaccessptr,
uint64_t &val, std::string &errormsg);
346 std::string &errormsg);
371 static std::shared_ptr<VirtualStruct>
allocate(
void *structure, std::function<
void(
Field *)> delete_);
374 static std::shared_ptr<VirtualStruct>
root();
378 std::shared_ptr<VirtualStruct::Field>
getResolvedField(
const std::string &path);
389 std::function<
void(
void *handle)> cleanup);
403 static std::recursive_mutex &
mutex();
416 std::list<std::shared_ptr<VirtualStruct::Field>> &dst_notWriteable,
417 std::list<std::shared_ptr<VirtualStruct::Field>> dst_unknown,
bool pretend =
false,
418 std::list<std::shared_ptr<VirtualStruct::Field>> *src_private = 0,
419 std::list<std::shared_ptr<VirtualStruct::Field>> *dst_private = 0);
432#define ETISS_VIRTUALSTRUCT_ADDFIELD(VIRTUALSTRUCT, STRUCT, FIELD, NAME, PRETTYNAME) \
433 (VIRTUALSTRUCT).addField<STRUCT, decltype(((STRUCT *)0)->FIELD), &STRUCT::FIELD>(NAME, PRETTYNAME);
contains the fault injector interface class.
general configuration and logging
static __inline__ uint64_t
static __inline__ int32_t
uint64_t(* VirtualStruct_read)(void *handle, uint32_t index)
read the value of the field at the given index
void(* VirtualStruct_setListenerCallback)(void *handle, void *callbackHandle, void(*callback)(void *handle, void *callbackHandle, uint32_t index))
setter function to register the callback handle for listener supported fields.
void(* VirtualStruct_write)(void *handle, uint32_t index)
write the value of the field at the given index
const char *const *(* VirtualStruct_names)(void *handle)
must return an array of zero terminated strings.
const char *const *(* VirtualStruct_prettyNames)(void *handle)
similar to above array but with human readable/alternative field names (see etiss::VirtualStruct)
used for synchronization of the tree of virtual structs.
static std::recursive_mutex & mutex()
virtual std::shared_ptr< VirtualStruct > getStruct()=0
virtual ~VirtualStructSupport()
virtual const std::string & getName()=0
virtual void _write(uint64_t val, size_t offset=0)
override this function to implement writes in case of AccessMode::VIRTUAL / AccessMode::PREFER_LAMBDA
virtual uint64_t _read(size_t offset=0) const
override this function to implement reads in case of AccessMode::VIRTUAL / AccessMode::PREFER_LAMBDA
FieldT(VirtualStruct &parent, const std::string &name, const std::string &prettyname)
NOTE: etiss::CPUArch should implement support for Listeners by either using the etiss::VirtualStruct:...
virtual void write(etiss::VirtualStruct::Field &field, uint64_t val)=0
a Field instance represents e.g.
Field & setDelete(std::function< void(Field *)> del)
std::function< uint64_t()> lread
set this function for reads in case of AccessMode::LAMBDA / AccessMode::PREFER_LAMBDA
static const int W
write flag
Field * setDeleteP(std::function< void(Field *)> del)
AccessMode
defines how a field should perform reads/writes.
@ PREFER_LAMBDA
tries to use the lread,lwrite functions and falls back to virtual functions
@ LAMBDA
uses the lread,lwrite functions
@ VIRTUAL
uses the virtual _read() / _write functions
uint64_t read(size_t offset=0) const
function to read bits/a value from the Field.
bool applyAction(const etiss::fault::Fault &f, const etiss::fault::Action &a, std::string &errormsg)
advanced fault injection. Field must have the A flag to use this.
static const int A
supports advanced fault injection/tracing with the applyAction function
const std::string name_
name of the field.
virtual bool _applyBitflip(unsigned position, uint64_t fault_id)
override this function to implement bitflip applying to a field
static const int RW
flags to signal that a field supports read and write operations
virtual void _write(uint64_t, size_t offset=0)
override this function to implement writes in case of AccessMode::VIRTUAL / AccessMode::PREFER_LAMBDA
const size_t width_
width in bytes (rounded up if neccessary)
virtual uint64_t _read(size_t offset=0) const
override this function to implement reads in case of AccessMode::VIRTUAL / AccessMode::PREFER_LAMBDA
void signalWrite()
this function should be called if the listener flag is set and the field changed without using the wr...
void removeListener(Listener *listener, std::shared_ptr< Listener > ref=nullptr)
static const int L
supports listener plugins; used for etiss::RegisterDevicePlugins to determine access to a variable/fi...
VirtualStruct & parent_
reference to parent virtual struct
int flags_
read write flags as specified by the static const int parameters of Field: R,W,L
bool addListener(Listener *listener, std::shared_ptr< Listener > ref=nullptr)
static const int P
private field: this flag indicates that this field is an implementation specific field that e....
bool applyBitflip(unsigned position, uint64_t fault_id)
function to write a bitflip to a field
std::function< bool(unsigned position, uint64_t fault_id)> lapplyBitflip
if this function is set the the default implementation of applyBitflip will use it
const AccessMode accessMode_
static const int R
read flag
static const int F
supports fault injection/tracing
const std::string prettyname_
alternative/human readable name of the field.
std::function< void(uint64_t)> lwrite
set this function for writes in case of AccessMode::LAMBDA / AccessMode::PREFER_LAMBDA
virtual bool _applyAction(const etiss::fault::Fault &f, const etiss::fault::Action &a, std::string &errormsg)
override this function to implement advanced action handling
std::set< std::pair< Listener *, std::shared_ptr< Listener > >, listener_pair_compare > listeners
const size_t bitwidth_
width in bits
std::function< void(Field *)> delete_
void write(uint64_t, size_t offset=0)
function to write bits/a value to the Field.
abstract representation of an module of a simulation which could be a embedded device of the cpu of a...
virtual bool readField(void *fastfieldaccessptr, uint64_t &val, std::string &errormsg)
read the value of a field
std::map< std::string, Field * > fieldNames_
std::map< std::string, Field * > fieldPrettyNames_
void foreachStruct(const std::function< void(const std::string &name, VirtualStruct &vs)> &func)
bool mountStruct(const std::string &name, const std::shared_ptr< VirtualStruct > vs)
std::shared_ptr< VirtualStruct > getVirtualStruct(const std::string &path)
bool addField(const std::string &name, const std::string &prettyname, std::function< T()> read, std::function< void(T)> write, bool supportsListener=false, bool noerrorprint=false)
virtual bool acceleratedTrigger(const etiss::fault::Trigger &, int32_t fault_id)
std::list< Field * > fields_
std::shared_ptr< Field > findName(const std::string &name) const
static std::shared_ptr< VirtualStruct > allocateFromC(void *handle, VirtualStruct_names names, VirtualStruct_prettyNames prettyNames_optional, VirtualStruct_read read_recommended, VirtualStruct_write write_optional, VirtualStruct_setListenerCallback setListenerCallback_optional, std::function< void(void *handle)> cleanup)
implemented in CVirtualStruct.cpp
virtual bool applyAction(const etiss::fault::Fault &fault, const etiss::fault::Action &action, std::string &errormsg)
bool addField(const std::string &name, const std::string &prettyname="", bool noerrorprint=false)
add a structure field to this VirtualStructure
static std::shared_ptr< VirtualStruct > root()
std::map< std::string, std::weak_ptr< VirtualStruct > > subStructs_
bool addField(Field *f, bool noerrorprint=false)
static std::shared_ptr< VirtualStruct > allocate(void *structure, std::function< void(Field *)> delete_)
virtual std::list< std::string > listSubInjectors()
list all sub injectors.
virtual std::list< std::string > listFields()
list all fields directly reachable by this injector
std::function< void(Field *)> dtor_
virtual void * fastFieldAccessPtr(const std::string &name, std::string &errormsg)
void foreachField(const std::function< void(std::shared_ptr< Field >)> &func)
std::shared_ptr< VirtualStruct > parent_
std::shared_ptr< VirtualStruct::Field > getResolvedField(const std::string &path)
std::function< bool(const etiss::fault::Trigger &, int32_t)> acceleratedTrigger_
virtual std::shared_ptr< etiss::fault::Injector > getParentInjector()
get a the parent injector (root returns 0).
virtual bool update_field_access_rights(const etiss::fault::Action &action, std::string &errormsg)
Update the field of injector with access rights to allow action (used to get type of action).
std::shared_ptr< Field > findPrettyName(const std::string &name) const
std::function< bool(const etiss::fault::Fault &, const etiss::fault::Action &, std::string &)> applyCustomAction
set this function to handle custom commands passed by etiss::fault::Action of the type etiss::fault::...
std::shared_ptr< VirtualStruct > findStruct(const std::string &name)
virtual std::shared_ptr< etiss::fault::Injector > getSubInjector(const std::string &name)
get a sub injector.
void copy(VirtualStruct &dst, VirtualStruct &src, std::list< std::shared_ptr< VirtualStruct::Field > > &dst_notPresent, std::list< std::shared_ptr< VirtualStruct::Field > > &dst_notWriteable, std::list< std::shared_ptr< VirtualStruct::Field > > dst_unknown, bool pretend=false, std::list< std::shared_ptr< VirtualStruct::Field > > *src_private=0, std::list< std::shared_ptr< VirtualStruct::Field > > *dst_private=0)
copies all fields with the same name from the source to the destination structure.
bool operator()(const std::pair< Listener *, std::shared_ptr< Listener > > &lhs, const std::pair< Listener *, std::shared_ptr< Listener > > &rhs) const