main.cc revision 13662
1247Sstever@eecs.umich.edu/*
2247Sstever@eecs.umich.edu * Copyright (c) 2008 The Hewlett-Packard Development Company
3247Sstever@eecs.umich.edu * All rights reserved.
4247Sstever@eecs.umich.edu *
5247Sstever@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
6247Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are
7247Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright
8247Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
9247Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
10247Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
11247Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution;
12247Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its
13247Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from
14247Sstever@eecs.umich.edu * this software without specific prior written permission.
15247Sstever@eecs.umich.edu *
16247Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17247Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18247Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19247Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20247Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21247Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22247Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23247Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24247Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25247Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26247Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27247Sstever@eecs.umich.edu *
28247Sstever@eecs.umich.edu * Authors: Nathan Binkert
29247Sstever@eecs.umich.edu */
30247Sstever@eecs.umich.edu
31247Sstever@eecs.umich.edu#include <Python.h>
32247Sstever@eecs.umich.edu
33247Sstever@eecs.umich.edu#include "sim/init.hh"
34247Sstever@eecs.umich.edu#include "sim/init_signals.hh"
35247Sstever@eecs.umich.edu
36247Sstever@eecs.umich.edu// main() is now pretty stripped down and just sets up python and then
37247Sstever@eecs.umich.edu// calls initM5Python which loads the various embedded python modules
38247Sstever@eecs.umich.edu// into the python environment and then starts things running by
39247Sstever@eecs.umich.edu// calling m5Main.
40247Sstever@eecs.umich.eduint
41247Sstever@eecs.umich.edumain(int argc, char **argv)
42247Sstever@eecs.umich.edu{
43247Sstever@eecs.umich.edu    int ret;
44247Sstever@eecs.umich.edu
45247Sstever@eecs.umich.edu    // Initialize m5 special signal handling.
46247Sstever@eecs.umich.edu    initSignals();
47247Sstever@eecs.umich.edu
48247Sstever@eecs.umich.edu#if PY_MAJOR_VERSION >= 3
49247Sstever@eecs.umich.edu    std::unique_ptr<wchar_t[], decltype(&PyMem_RawFree)> program(
50247Sstever@eecs.umich.edu        Py_DecodeLocale(argv[0], NULL),
51247Sstever@eecs.umich.edu        &PyMem_RawFree);
52247Sstever@eecs.umich.edu    Py_SetProgramName(program.get());
53247Sstever@eecs.umich.edu#else
54247Sstever@eecs.umich.edu    Py_SetProgramName(argv[0]);
55247Sstever@eecs.umich.edu#endif
56
57    // Register native modules with Python's init system before
58    // initializing the interpreter.
59    registerNativeModules();
60
61    // initialize embedded Python interpreter
62    Py_Initialize();
63
64    // Initialize the embedded m5 python library
65    ret = EmbeddedPython::initAll();
66
67    if (ret == 0) {
68        // start m5
69        ret = m5Main(argc, argv);
70    }
71
72    // clean up Python intepreter.
73    Py_Finalize();
74
75    return ret;
76}
77