diff --git a/src/dev/qemu/QemuFwCfg.py b/src/dev/qemu/QemuFwCfg.py index 3a21063df1..0851ef0f40 100644 --- a/src/dev/qemu/QemuFwCfg.py +++ b/src/dev/qemu/QemuFwCfg.py @@ -56,6 +56,14 @@ class QemuFwCfgItemString(QemuFwCfgItem): # The string which directly populates this item. string = Param.String('String to export') +class QemuFwCfgItemBytes(QemuFwCfgItem): + type = 'QemuFwCfgItemBytes' + cxx_class = 'gem5::qemu::FwCfgItemFactory' + cxx_template_params = ['class ItemType'] + cxx_header = 'dev/qemu/fw_cfg.hh' + + data = VectorParam.UInt8('Bytes to export') + class QemuFwCfg(PioDevice): type = 'QemuFwCfg' cxx_class = 'gem5::qemu::FwCfg' diff --git a/src/dev/qemu/SConscript b/src/dev/qemu/SConscript index a2fff02231..59a50cf108 100644 --- a/src/dev/qemu/SConscript +++ b/src/dev/qemu/SConscript @@ -26,7 +26,8 @@ Import('*') SimObject('QemuFwCfg.py', sim_objects=[ - 'QemuFwCfgItem', 'QemuFwCfgItemFile', 'QemuFwCfgItemString', + 'QemuFwCfgItem', + 'QemuFwCfgItemBytes', 'QemuFwCfgItemFile', 'QemuFwCfgItemString', 'QemuFwCfg', 'QemuFwCfgIo', 'QemuFwCfgMmio']) Source('fw_cfg.cc') diff --git a/src/dev/qemu/fw_cfg.hh b/src/dev/qemu/fw_cfg.hh index 4c780b3fea..c196eb6c1f 100644 --- a/src/dev/qemu/fw_cfg.hh +++ b/src/dev/qemu/fw_cfg.hh @@ -40,6 +40,7 @@ #include "params/QemuFwCfg.hh" #include "params/QemuFwCfgIo.hh" #include "params/QemuFwCfgItem.hh" +#include "params/QemuFwCfgItemBytes.hh" #include "params/QemuFwCfgItemFile.hh" #include "params/QemuFwCfgItemString.hh" #include "params/QemuFwCfgMmio.hh" @@ -134,6 +135,26 @@ class FwCfgItemString : public FwCfgItemFixed } }; +// An item who's value comes from an array of bytes. +class FwCfgItemBytes : public FwCfgItemFixed +{ + private: + std::vector data; + + public: + FwCfgItemBytes(const std::string &new_path, bool arch_specific, + const std::vector &_data, uint16_t new_index=0) : + FwCfgItemFixed(new_path, arch_specific, new_index), data(_data) + {} + + FwCfgItemBytes(const QemuFwCfgItemBytesParams &p) : + FwCfgItemBytes(p.path, p.arch_specific, p.data, p.index) + {} + + const void *bytes() const override { return (void *)data.data(); } + uint64_t length() const override { return data.size(); } +}; + /* * Base and template classes for creating SimObject wrappers for item types. */