This changeset also includes a lot of work from Derek Hower <drh5@cs.wisc.edu> RubyMemory is now both a driver for Ruby and a port for M5. Changed makeRequest/hitCallback interface. Brought packets (superficially) into the sequencer. Modified tester infrastructure to be packet based. and Ruby can be used together through the example ruby_se.py script. SPARC parallel applications work, and the timing *seems* right from combined M5/Ruby debug traces. To run, % build/ALPHA_SE/m5.debug configs/example/ruby_se.py -c tests/test-progs/hello/bin/alpha/linux/hello -n 4 -t
192 lines
5.8 KiB
C++
192 lines
5.8 KiB
C++
|
|
/*
|
|
* Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
|
|
* 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.
|
|
*/
|
|
|
|
/*
|
|
* init.C
|
|
*
|
|
* Description: See init.h
|
|
*
|
|
* $Id$
|
|
*
|
|
*/
|
|
|
|
#include "mem/ruby/common/Global.hh"
|
|
#include "mem/ruby/eventqueue/RubyEventQueue.hh"
|
|
#include "mem/ruby/system/System.hh"
|
|
#include "mem/ruby/common/Debug.hh"
|
|
#include "mem/ruby/common/Driver.hh"
|
|
#include "mem/ruby/profiler/Profiler.hh"
|
|
#include "mem/ruby/tester/Tester.hh"
|
|
#include "mem/ruby/init.hh"
|
|
|
|
using namespace std;
|
|
#include <string>
|
|
#include <map>
|
|
#include <stdlib.h>
|
|
|
|
#include "mem/gems_common/ioutil/confio.hh"
|
|
#include "mem/gems_common/ioutil/initvar.hh"
|
|
|
|
// A generated file containing the default parameters in string form
|
|
// The defaults are stored in the variable global_default_param
|
|
#include "mem/ruby/default_param.hh"
|
|
|
|
static initvar_t *ruby_initvar_obj = NULL;
|
|
|
|
//***************************************************************************
|
|
static void init_generate_values( void )
|
|
{
|
|
/* update generated values, based on input configuration */
|
|
}
|
|
|
|
//***************************************************************************
|
|
|
|
void init_variables( void )
|
|
{
|
|
// allocate the "variable initialization" package
|
|
ruby_initvar_obj = new initvar_t( "ruby", "../../../ruby/",
|
|
global_default_param,
|
|
&init_simulator,
|
|
&init_generate_values);
|
|
}
|
|
|
|
|
|
/*
|
|
void init_variables(const char* config_str )
|
|
{
|
|
// allocate the "variable initialization" package
|
|
ruby_initvar_obj = new initvar_t( "ruby", "../../../ruby/",
|
|
config_str,
|
|
&init_simulator,
|
|
&init_generate_values );
|
|
}
|
|
*/
|
|
|
|
void init_simulator()
|
|
{
|
|
// Set things to NULL to make sure we don't de-reference them
|
|
// without a seg. fault.
|
|
g_system_ptr = NULL;
|
|
g_debug_ptr = NULL;
|
|
g_eventQueue_ptr = NULL;
|
|
|
|
cout << "Ruby Timing Mode" << endl;
|
|
|
|
|
|
g_debug_ptr = new Debug( DEBUG_FILTER_STRING,
|
|
DEBUG_VERBOSITY_STRING,
|
|
DEBUG_START_TIME,
|
|
DEBUG_OUTPUT_FILENAME );
|
|
RubyConfig::init();
|
|
|
|
cout << "Creating event queue..." << endl;
|
|
g_eventQueue_ptr = new RubyEventQueue;
|
|
cout << "Creating event queue done" << endl;
|
|
|
|
cout << "Creating system..." << endl;
|
|
cout << " Processors: " << RubyConfig::numberOfProcessors() << endl;
|
|
|
|
g_system_ptr = new RubySystem;
|
|
cout << "Creating system done" << endl;
|
|
|
|
cout << "Ruby initialization complete" << endl;
|
|
}
|
|
|
|
void init_simulator(Driver* _driver)
|
|
{
|
|
// Set things to NULL to make sure we don't de-reference them
|
|
// without a seg. fault.
|
|
g_system_ptr = NULL;
|
|
g_debug_ptr = NULL;
|
|
g_eventQueue_ptr = NULL;
|
|
|
|
cout << "Ruby Timing Mode" << endl;
|
|
|
|
|
|
g_debug_ptr = new Debug( DEBUG_FILTER_STRING,
|
|
DEBUG_VERBOSITY_STRING,
|
|
DEBUG_START_TIME,
|
|
DEBUG_OUTPUT_FILENAME );
|
|
RubyConfig::init();
|
|
|
|
cout << "Creating event queue..." << endl;
|
|
g_eventQueue_ptr = new RubyEventQueue;
|
|
cout << "Creating event queue done" << endl;
|
|
|
|
cout << "Creating system..." << endl;
|
|
cout << " Processors: " << RubyConfig::numberOfProcessors() << endl;
|
|
|
|
g_system_ptr = new RubySystem(_driver);
|
|
cout << "Creating system done" << endl;
|
|
|
|
cout << "Ruby initialization complete" << endl;
|
|
}
|
|
|
|
void destroy_simulator()
|
|
{
|
|
cout << "Deleting system..." << endl;
|
|
delete g_system_ptr;
|
|
cout << "Deleting system done" << endl;
|
|
|
|
cout << "Deleting event queue..." << endl;
|
|
delete g_eventQueue_ptr;
|
|
cout << "Deleting event queue done" << endl;
|
|
|
|
delete g_debug_ptr;
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------+
|
|
| DG: These are the external load and unload hooks that will be called by |
|
|
| M5 in phase 1 integration, and possibly afterwards, too. |
|
|
+-------------------------------------------------------------------------*/
|
|
|
|
//dsm: superfluous
|
|
/*extern "C"
|
|
int OnLoadRuby() {
|
|
init_variables();
|
|
return 0;
|
|
}
|
|
|
|
extern "C"
|
|
int OnInitRuby() {
|
|
init_simulator();
|
|
return 0;
|
|
}
|
|
|
|
extern "C"
|
|
int OnUnloadRuby() {
|
|
destroy_simulator();
|
|
return 0;
|
|
}*/
|
|
|
|
/* I have to put it somewhere for now */
|
|
void tester_main(int argc, char **argv) {
|
|
std::cout << __FILE__ << "(" << __LINE__ << "): Not implemented." << std::endl;
|
|
}
|