diff --git a/build_tools/marshal.py b/build_tools/marshal.py index a2af1b00b6..9c2964b477 100644 --- a/build_tools/marshal.py +++ b/build_tools/marshal.py @@ -77,7 +77,7 @@ compressed = zlib.compress(marshalled) code = code_formatter() code('''\ -#include "sim/init.hh" +#include "python/embedded.hh" namespace gem5 { diff --git a/src/python/SConscript b/src/python/SConscript index 1fab974180..c9cd2d497c 100644 --- a/src/python/SConscript +++ b/src/python/SConscript @@ -253,6 +253,7 @@ PySource('m5.ext.pystats', 'm5/ext/pystats/timeconversion.py') PySource('m5.ext.pystats', 'm5/ext/pystats/jsonloader.py') PySource('m5.stats', 'm5/stats/gem5stats.py') +Source('embedded.cc', add_tags='python') Source('importer.cc', add_tags='python') cc, hh = env.Blob('m5ImporterCode', 'importer.py') Source(cc, add_tags='python') diff --git a/src/python/embedded.cc b/src/python/embedded.cc new file mode 100644 index 0000000000..27bf770a4a --- /dev/null +++ b/src/python/embedded.cc @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2012, 2017 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Copyright (c) 2000-2005 The Regents of The University of Michigan + * Copyright (c) 2008 The Hewlett-Packard Development Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "pybind11/embed.h" + +#include "python/embedded.hh" + +#include + +#include + +#include "base/logging.hh" + +namespace py = pybind11; + +namespace gem5 +{ + +EmbeddedPython::EmbeddedPython(const char *abspath, const char *modpath, + const unsigned char *code, int zlen, int len) + : abspath(abspath), modpath(modpath), code(code), zlen(zlen), len(len) +{ + getList().push_back(this); +} + +std::list & +EmbeddedPython::getList() +{ + static std::list the_list; + return the_list; +} + +/* + * Uncompress and unmarshal the code object stored in the + * EmbeddedPython + */ +py::object +EmbeddedPython::getCode() const +{ + Bytef marshalled[len]; + uLongf unzlen = len; + int ret = uncompress(marshalled, &unzlen, (const Bytef *)code, zlen); + if (ret != Z_OK) + panic("Could not uncompress code: %s\n", zError(ret)); + assert(unzlen == (uLongf)len); + + auto marshal = py::module_::import("marshal"); + return marshal.attr("loads")(py::bytes((char *)marshalled, len)); +} + +bool +EmbeddedPython::addModule() const +{ + auto importer = py::module_::import("importer"); + importer.attr("add_module")(abspath, modpath, getCode()); + return true; +} + +/* + * Load and initialize all of the python parts of M5. + */ +int +EmbeddedPython::initAll() +{ + // Load the embedded python files into the embedded python importer. + for (auto *embedded: getList()) { + if (!embedded->addModule()) + return 1; + } + return 0; +} + +} // namespace gem5 diff --git a/src/python/embedded.hh b/src/python/embedded.hh new file mode 100644 index 0000000000..574856b2c2 --- /dev/null +++ b/src/python/embedded.hh @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2017 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Copyright (c) 2008 The Hewlett-Packard Development Company + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __PYTHON_EMBEDDED_HH__ +#define __PYTHON_EMBEDDED_HH__ + +#include "pybind11/pybind11.h" + +#include + +#include + +namespace gem5 +{ + +/* + * Data structure describing an embedded python file. + */ +struct EmbeddedPython +{ + const char *abspath; + const char *modpath; + const uint8_t *code; + int zlen; + int len; + + EmbeddedPython(const char *abspath, const char *modpath, + const uint8_t *code, int zlen, int len); + + pybind11::object getCode() const; + bool addModule() const; + + static std::list &getList(); + static int initAll(); +}; + +} // namespace gem5 + +#endif // __PYTHON_EMBEDDED_HH__ diff --git a/src/python/importer.cc b/src/python/importer.cc index 7d1f7dcf4c..2d10e962b4 100644 --- a/src/python/importer.cc +++ b/src/python/importer.cc @@ -29,7 +29,7 @@ #include "pybind11/pybind11.h" #include "python/m5ImporterCode.hh" -#include "sim/init.hh" +#include "python/embedded.hh" namespace py = pybind11; diff --git a/src/sim/init.cc b/src/sim/init.cc index c8a545fe56..8c0d1aa271 100644 --- a/src/sim/init.cc +++ b/src/sim/init.cc @@ -43,16 +43,10 @@ #include "sim/init.hh" -#include - -#include +#include #include -#include -#include "base/compiler.hh" #include "base/cprintf.hh" -#include "base/logging.hh" -#include "base/types.hh" #include "python/pybind11/pybind.hh" namespace py = pybind11; @@ -60,60 +54,6 @@ namespace py = pybind11; namespace gem5 { -EmbeddedPython::EmbeddedPython(const char *abspath, const char *modpath, - const unsigned char *code, int zlen, int len) - : abspath(abspath), modpath(modpath), code(code), zlen(zlen), len(len) -{ - getList().push_back(this); -} - -std::list & -EmbeddedPython::getList() -{ - static std::list the_list; - return the_list; -} - -/* - * Uncompress and unmarshal the code object stored in the - * EmbeddedPython - */ -py::object -EmbeddedPython::getCode() const -{ - Bytef marshalled[len]; - uLongf unzlen = len; - int ret = uncompress(marshalled, &unzlen, (const Bytef *)code, zlen); - if (ret != Z_OK) - panic("Could not uncompress code: %s\n", zError(ret)); - assert(unzlen == (uLongf)len); - - auto marshal = py::module_::import("marshal"); - return marshal.attr("loads")(py::bytes((char *)marshalled, len)); -} - -bool -EmbeddedPython::addModule() const -{ - auto importer = py::module_::import("importer"); - importer.attr("add_module")(abspath, modpath, getCode()); - return true; -} - -/* - * Load and initialize all of the python parts of M5. - */ -int -EmbeddedPython::initAll() -{ - // Load the embedded python files into the embedded python importer. - for (auto *embedded: getList()) { - if (!embedded->addModule()) - return 1; - } - return 0; -} - EmbeddedPyBind::EmbeddedPyBind(const char *_name, void (*init_func)(py::module_ &), const char *_base) diff --git a/src/sim/init.hh b/src/sim/init.hh index 95c597b8d4..9e7158a63e 100644 --- a/src/sim/init.hh +++ b/src/sim/init.hh @@ -43,36 +43,12 @@ #include "pybind11/pybind11.h" -#include #include #include -#include - namespace gem5 { -/* - * Data structure describing an embedded python file. - */ -struct EmbeddedPython -{ - const char *abspath; - const char *modpath; - const uint8_t *code; - int zlen; - int len; - - EmbeddedPython(const char *abspath, const char *modpath, - const uint8_t *code, int zlen, int len); - - pybind11::object getCode() const; - bool addModule() const; - - static std::list &getList(); - static int initAll(); -}; - class EmbeddedPyBind { public: diff --git a/src/sim/main.cc b/src/sim/main.cc index 0d9bcb7ed4..c44531e2f6 100644 --- a/src/sim/main.cc +++ b/src/sim/main.cc @@ -33,7 +33,7 @@ #include "pybind11/embed.h" #include "pybind11/pybind11.h" -#include "sim/init.hh" +#include "python/embedded.hh" #include "sim/init_signals.hh" using namespace gem5;