Merge with head.
--HG-- extra : convert_revision : 4a34b3f91c4fc90055596245ae3efec45ea33888
This commit is contained in:
commit
26b1c455e0
137 changed files with 2045 additions and 6741 deletions
322
src/SConscript
322
src/SConscript
|
@ -26,14 +26,17 @@
|
|||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Authors: Steve Reinhardt
|
||||
# Authors: Nathan Binkert
|
||||
|
||||
import imp
|
||||
import os
|
||||
import sys
|
||||
import zipfile
|
||||
|
||||
from os.path import basename
|
||||
from os.path import join as joinpath
|
||||
from os.path import exists
|
||||
from os.path import isdir
|
||||
from os.path import isfile
|
||||
|
||||
import SCons
|
||||
|
||||
|
@ -45,47 +48,87 @@ Import('*')
|
|||
# Children need to see the environment
|
||||
Export('env')
|
||||
|
||||
########################################################################
|
||||
# Code for adding source files
|
||||
#
|
||||
sources = []
|
||||
def Source(source):
|
||||
if isinstance(source, SCons.Node.FS.File):
|
||||
sources.append(source)
|
||||
def sort_list(_list):
|
||||
"""return a sorted copy of '_list'"""
|
||||
if isinstance(_list, list):
|
||||
_list = _list[:]
|
||||
else:
|
||||
sources.append(File(source))
|
||||
_list = list(_list)
|
||||
_list.sort()
|
||||
return _list
|
||||
|
||||
class PySourceFile(object):
|
||||
def __init__(self, package, source):
|
||||
filename = str(source)
|
||||
pyname = basename(filename)
|
||||
assert pyname.endswith('.py')
|
||||
name = pyname[:-3]
|
||||
path = package.split('.')
|
||||
modpath = path
|
||||
if name != '__init__':
|
||||
modpath += [name]
|
||||
modpath = '.'.join(modpath)
|
||||
|
||||
arcpath = package.split('.') + [ pyname + 'c' ]
|
||||
arcname = joinpath(*arcpath)
|
||||
|
||||
self.source = source
|
||||
self.pyname = pyname
|
||||
self.srcpath = source.srcnode().abspath
|
||||
self.package = package
|
||||
self.modpath = modpath
|
||||
self.arcname = arcname
|
||||
self.filename = filename
|
||||
self.compiled = File(filename + 'c')
|
||||
|
||||
########################################################################
|
||||
# Code for adding source files of various types
|
||||
#
|
||||
cc_sources = []
|
||||
def Source(source):
|
||||
'''Add a C/C++ source file to the build'''
|
||||
if not isinstance(source, SCons.Node.FS.File):
|
||||
source = File(source)
|
||||
|
||||
cc_sources.append(source)
|
||||
|
||||
py_sources = []
|
||||
def PySource(package, source):
|
||||
'''Add a python source file to the named package'''
|
||||
if not isinstance(source, SCons.Node.FS.File):
|
||||
source = File(source)
|
||||
|
||||
source = PySourceFile(package, source)
|
||||
py_sources.append(source)
|
||||
|
||||
sim_objects_fixed = False
|
||||
sim_object_modfiles = set()
|
||||
def SimObject(source):
|
||||
'''Add a SimObject python file as a python source object and add
|
||||
it to a list of sim object modules'''
|
||||
|
||||
if sim_objects_fixed:
|
||||
raise AttributeError, "Too late to call SimObject now."
|
||||
|
||||
if not isinstance(source, SCons.Node.FS.File):
|
||||
source = File(source)
|
||||
|
||||
PySource('m5.objects', source)
|
||||
modfile = basename(str(source))
|
||||
assert modfile.endswith('.py')
|
||||
modname = modfile[:-3]
|
||||
sim_object_modfiles.add(modname)
|
||||
|
||||
swig_sources = []
|
||||
def SwigSource(package, source):
|
||||
'''Add a swig file to build'''
|
||||
if not isinstance(source, SCons.Node.FS.File):
|
||||
source = File(source)
|
||||
val = source,package
|
||||
swig_sources.append(val)
|
||||
|
||||
# Children should have access
|
||||
Export('Source')
|
||||
|
||||
########################################################################
|
||||
# Code for adding python objects
|
||||
#
|
||||
py_sources = []
|
||||
py_source_packages = {}
|
||||
def PySource(package, source):
|
||||
if not isinstance(source, SCons.Node.FS.File):
|
||||
source = File(source)
|
||||
py_source_packages[source] = package
|
||||
py_sources.append(source)
|
||||
|
||||
sim_objects = []
|
||||
def SimObject(source):
|
||||
if not isinstance(source, SCons.Node.FS.File):
|
||||
source = File(source)
|
||||
PySource('m5.objects', source)
|
||||
modname = basename(str(source))
|
||||
sim_objects.append(modname)
|
||||
|
||||
swig_sources = []
|
||||
swig_source_packages = {}
|
||||
def SwigSource(package, source):
|
||||
if not isinstance(source, SCons.Node.FS.File):
|
||||
source = File(source)
|
||||
swig_source_packages[source] = package
|
||||
swig_sources.append(source)
|
||||
|
||||
# Children should have access
|
||||
Export('PySource')
|
||||
Export('SimObject')
|
||||
Export('SwigSource')
|
||||
|
@ -105,6 +148,7 @@ env.Append(CPPPATH=Dir('.'))
|
|||
env.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())])
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Walk the tree and execute all SConscripts
|
||||
#
|
||||
scripts = []
|
||||
|
@ -113,7 +157,7 @@ for root, dirs, files in os.walk(srcdir, topdown=True):
|
|||
if root == srcdir:
|
||||
# we don't want to recurse back into this SConscript
|
||||
continue
|
||||
|
||||
|
||||
if 'SConscript' in files:
|
||||
# strip off the srcdir part since scons will try to find the
|
||||
# script in the build directory
|
||||
|
@ -125,120 +169,148 @@ for opt in env.ExportOptions:
|
|||
|
||||
########################################################################
|
||||
#
|
||||
# Deal with python/swig, object code. Collect .py files and
|
||||
# generating a zip archive that is appended to the m5 binary.
|
||||
# Prevent any SimObjects from being added after this point, they
|
||||
# should all have been added in the SConscripts above
|
||||
#
|
||||
sim_objects_fixed = True
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Manually turn python/generate.py into a python module and import it
|
||||
#
|
||||
generate_file = File('python/generate.py')
|
||||
generate_module = imp.new_module('generate')
|
||||
sys.modules['generate'] = generate_module
|
||||
exec file(generate_file.srcnode().abspath, 'r') in generate_module.__dict__
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# build a generate
|
||||
#
|
||||
from generate import Generate
|
||||
optionDict = dict([(opt, env[opt]) for opt in env.ExportOptions])
|
||||
generate = Generate(py_sources, sim_object_modfiles, optionDict)
|
||||
m5 = generate.m5
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# calculate extra dependencies
|
||||
#
|
||||
module_depends = ["m5", "m5.SimObject", "m5.params"]
|
||||
module_depends = [ File(generate.py_modules[dep]) for dep in module_depends ]
|
||||
file_depends = [ generate_file ]
|
||||
depends = module_depends + file_depends
|
||||
|
||||
########################################################################
|
||||
#
|
||||
# Commands for the basic automatically generated python files
|
||||
#
|
||||
|
||||
# Generate Python file that contains a dict specifying the current
|
||||
# build_env flags.
|
||||
def MakeDefinesPyFile(target, source, env):
|
||||
f = file(str(target[0]), 'w')
|
||||
print >>f, "m5_build_env = ", source[0]
|
||||
f.close()
|
||||
|
||||
optionDict = dict([(opt, env[opt]) for opt in env.ExportOptions])
|
||||
env.Command('python/m5/defines.py', Value(optionDict), MakeDefinesPyFile)
|
||||
# Generate a file with all of the compile options in it
|
||||
env.Command('python/m5/defines.py', Value(optionDict),
|
||||
generate.makeDefinesPyFile)
|
||||
PySource('m5', 'python/m5/defines.py')
|
||||
|
||||
def MakeInfoPyFile(target, source, env):
|
||||
f = file(str(target[0]), 'w')
|
||||
for src in source:
|
||||
data = ''.join(file(src.srcnode().abspath, 'r').xreadlines())
|
||||
print >>f, "%s = %s" % (src, repr(data))
|
||||
f.close()
|
||||
|
||||
# Generate a file that wraps the basic top level files
|
||||
env.Command('python/m5/info.py',
|
||||
[ '#/AUTHORS', '#/LICENSE', '#/README', '#/RELEASE_NOTES' ],
|
||||
MakeInfoPyFile)
|
||||
generate.makeInfoPyFile)
|
||||
PySource('m5', 'python/m5/info.py')
|
||||
|
||||
def MakeObjectsInitFile(target, source, env):
|
||||
f = file(str(target[0]), 'w')
|
||||
print >>f, 'from m5.SimObject import *'
|
||||
for src_path in source:
|
||||
src_file = basename(src_path.get_contents())
|
||||
assert(src_file.endswith('.py'))
|
||||
src_module = src_file[:-3]
|
||||
print >>f, 'from %s import *' % src_module
|
||||
f.close()
|
||||
|
||||
# Generate an __init__.py file for the objects package
|
||||
env.Command('python/m5/objects/__init__.py',
|
||||
[ Value(o) for o in sim_objects],
|
||||
MakeObjectsInitFile)
|
||||
[ Value(o) for o in sort_list(sim_object_modfiles) ],
|
||||
generate.makeObjectsInitFile)
|
||||
PySource('m5.objects', 'python/m5/objects/__init__.py')
|
||||
|
||||
swig_modules = []
|
||||
for source in swig_sources:
|
||||
source.rfile() # Hack to cause the symlink to the .i file to be created
|
||||
package = swig_source_packages[source]
|
||||
filename = str(source)
|
||||
module = basename(filename)
|
||||
########################################################################
|
||||
#
|
||||
# Create all of the SimObject param headers and enum headers
|
||||
#
|
||||
|
||||
assert(module.endswith('.i'))
|
||||
module = module[:-2]
|
||||
cc_file = 'swig/%s_wrap.cc' % module
|
||||
py_file = 'm5/internal/%s.py' % module
|
||||
# Generate all of the SimObject param struct header files
|
||||
params_hh_files = []
|
||||
for name,simobj in generate.sim_objects.iteritems():
|
||||
extra_deps = [ File(generate.py_modules[simobj.__module__]) ]
|
||||
|
||||
hh_file = File('params/%s.hh' % name)
|
||||
params_hh_files.append(hh_file)
|
||||
env.Command(hh_file, Value(name), generate.createSimObjectParam)
|
||||
env.Depends(hh_file, depends + extra_deps)
|
||||
|
||||
# Generate any parameter header files needed
|
||||
for name,param in generate.params.iteritems():
|
||||
if isinstance(param, m5.params.VectorParamDesc):
|
||||
ext = 'vptype'
|
||||
else:
|
||||
ext = 'ptype'
|
||||
|
||||
i_file = File('params/%s_%s.i' % (name, ext))
|
||||
env.Command(i_file, Value(name), generate.createSwigParam)
|
||||
env.Depends(i_file, depends)
|
||||
|
||||
# Generate all enum header files
|
||||
for name,enum in generate.enums.iteritems():
|
||||
extra_deps = [ File(generate.py_modules[enum.__module__]) ]
|
||||
|
||||
cc_file = File('enums/%s.cc' % name)
|
||||
env.Command(cc_file, Value(name), generate.createEnumStrings)
|
||||
env.Depends(cc_file, depends + extra_deps)
|
||||
Source(cc_file)
|
||||
|
||||
hh_file = File('enums/%s.hh' % name)
|
||||
env.Command(hh_file, Value(name), generate.createEnumParam)
|
||||
env.Depends(hh_file, depends + extra_deps)
|
||||
|
||||
# Build the big monolithic swigged params module (wraps all SimObject
|
||||
# param structs and enum structs)
|
||||
params_file = File('params/params.i')
|
||||
names = sort_list(generate.sim_objects.keys())
|
||||
env.Command(params_file, [ Value(v) for v in names ],
|
||||
generate.buildParams)
|
||||
env.Depends(params_file, params_hh_files + depends)
|
||||
SwigSource('m5.objects', params_file)
|
||||
|
||||
# Build all swig modules
|
||||
swig_modules = []
|
||||
for source,package in swig_sources:
|
||||
filename = str(source)
|
||||
assert filename.endswith('.i')
|
||||
|
||||
base = '.'.join(filename.split('.')[:-1])
|
||||
module = basename(base)
|
||||
cc_file = base + '_wrap.cc'
|
||||
py_file = base + '.py'
|
||||
|
||||
env.Command([cc_file, py_file], source,
|
||||
'$SWIG $SWIGFLAGS -outdir ${TARGETS[1].dir} '
|
||||
'-o ${TARGETS[0]} $SOURCES')
|
||||
env.Depends(py_file, source)
|
||||
env.Depends(cc_file, source)
|
||||
|
||||
|
||||
swig_modules.append(Value(module))
|
||||
Source(cc_file)
|
||||
PySource(package, py_file)
|
||||
|
||||
def MakeSwigInit(target, source, env):
|
||||
f = file(str(target[0]), 'w')
|
||||
print >>f, 'extern "C" {'
|
||||
for module in source:
|
||||
print >>f, ' void init_%s();' % module.get_contents()
|
||||
print >>f, '}'
|
||||
print >>f, 'void init_swig() {'
|
||||
for module in source:
|
||||
print >>f, ' init_%s();' % module.get_contents()
|
||||
print >>f, '}'
|
||||
f.close()
|
||||
env.Command('python/swig/init.cc', swig_modules, MakeSwigInit)
|
||||
|
||||
def CompilePyFile(target, source, env):
|
||||
import py_compile
|
||||
py_compile.compile(str(source[0]), str(target[0]))
|
||||
# Generate the main swig init file
|
||||
env.Command('swig/init.cc', swig_modules, generate.makeSwigInit)
|
||||
Source('swig/init.cc')
|
||||
|
||||
# Build the zip file
|
||||
py_compiled = []
|
||||
py_arcname = {}
|
||||
py_zip_depends = []
|
||||
for source in py_sources:
|
||||
filename = str(source)
|
||||
package = py_source_packages[source]
|
||||
arc_path = package.split('.') + [ basename(filename) + 'c' ]
|
||||
zip_path = [ 'zip' ] + arc_path
|
||||
arcname = joinpath(*arc_path)
|
||||
zipname = joinpath(*zip_path)
|
||||
f = File(zipname)
|
||||
|
||||
env.Command(f, source, CompilePyFile)
|
||||
py_compiled.append(f)
|
||||
py_arcname[f] = arcname
|
||||
env.Command(source.compiled, source.source, generate.compilePyFile)
|
||||
py_compiled.append(source.compiled)
|
||||
|
||||
# make the zipfile depend on the archive name so that the archive
|
||||
# is rebuilt if the name changes
|
||||
py_zip_depends.append(Value(arcname))
|
||||
|
||||
# Action function to build the zip archive. Uses the PyZipFile module
|
||||
# included in the standard Python library.
|
||||
def buildPyZip(target, source, env):
|
||||
zf = zipfile.ZipFile(str(target[0]), 'w')
|
||||
for s in source:
|
||||
arcname = py_arcname[s]
|
||||
zipname = str(s)
|
||||
zf.write(zipname, arcname)
|
||||
zf.close()
|
||||
py_zip_depends.append(Value(source.arcname))
|
||||
|
||||
# Add the zip file target to the environment.
|
||||
env.Command('m5py.zip', py_compiled, buildPyZip)
|
||||
env.Depends('m5py.zip', py_zip_depends)
|
||||
m5zip = File('m5py.zip')
|
||||
env.Command(m5zip, py_compiled, generate.buildPyZip)
|
||||
env.Depends(m5zip, py_zip_depends)
|
||||
|
||||
########################################################################
|
||||
#
|
||||
|
@ -273,7 +345,7 @@ def makeEnv(label, objsfx, strip = False, **kwargs):
|
|||
newEnv.Append(**kwargs)
|
||||
exe = 'm5.' + label # final executable
|
||||
bin = exe + '.bin' # executable w/o appended Python zip archive
|
||||
newEnv.Program(bin, make_objs(sources, newEnv))
|
||||
newEnv.Program(bin, make_objs(cc_sources, newEnv))
|
||||
if strip:
|
||||
stripped_bin = bin + '.stripped'
|
||||
if sys.platform == 'sunos5':
|
||||
|
@ -308,7 +380,7 @@ elif env['ICC']:
|
|||
ccflags['prof'] = '-fast -g -pg'
|
||||
else:
|
||||
print 'Unknown compiler, please fix compiler options'
|
||||
Exit(1)
|
||||
Exit(1)
|
||||
|
||||
makeEnv('debug', '.do',
|
||||
CCFLAGS = Split(ccflags['debug']),
|
||||
|
|
|
@ -35,8 +35,14 @@ class AlphaTLB(SimObject):
|
|||
|
||||
class AlphaDTB(AlphaTLB):
|
||||
type = 'AlphaDTB'
|
||||
cxx_namespace = 'AlphaISA'
|
||||
cxx_class = 'DTB'
|
||||
|
||||
size = 64
|
||||
|
||||
class AlphaITB(AlphaTLB):
|
||||
type = 'AlphaITB'
|
||||
cxx_namespace = 'AlphaISA'
|
||||
cxx_class = 'ITB'
|
||||
|
||||
size = 48
|
||||
|
|
|
@ -35,16 +35,15 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include "arch/alpha/system.hh"
|
||||
#include "arch/alpha/freebsd/system.hh"
|
||||
#include "arch/alpha/system.hh"
|
||||
#include "arch/isa_traits.hh"
|
||||
#include "arch/vtophys.hh"
|
||||
#include "base/loader/symtab.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "mem/physical.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "arch/isa_traits.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/byteswap.hh"
|
||||
#include "arch/vtophys.hh"
|
||||
|
||||
#define TIMER_FREQUENCY 1193180
|
||||
|
||||
|
@ -92,64 +91,8 @@ FreebsdAlphaSystem::SkipCalibrateClocksEvent::process(ThreadContext *tc)
|
|||
((FreebsdAlphaSystem *)tc->getSystemPtr())->doCalibrateClocks(tc);
|
||||
}
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(FreebsdAlphaSystem)
|
||||
|
||||
Param<Tick> boot_cpu_frequency;
|
||||
SimObjectParam<PhysicalMemory *> physmem;
|
||||
SimpleEnumParam<System::MemoryMode> mem_mode;
|
||||
|
||||
Param<string> kernel;
|
||||
Param<string> console;
|
||||
Param<string> pal;
|
||||
|
||||
Param<string> boot_osflags;
|
||||
Param<string> readfile;
|
||||
Param<string> symbolfile;
|
||||
Param<unsigned int> init_param;
|
||||
|
||||
Param<uint64_t> system_type;
|
||||
Param<uint64_t> system_rev;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(FreebsdAlphaSystem)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(FreebsdAlphaSystem)
|
||||
|
||||
INIT_PARAM(boot_cpu_frequency, "Frequency of the boot CPU"),
|
||||
INIT_PARAM(physmem, "phsyical memory"),
|
||||
INIT_ENUM_PARAM(mem_mode, "Memory Mode, (1=atomic, 2=timing)",
|
||||
System::MemoryModeStrings),
|
||||
INIT_PARAM(kernel, "file that contains the kernel code"),
|
||||
INIT_PARAM(console, "file that contains the console code"),
|
||||
INIT_PARAM(pal, "file that contains palcode"),
|
||||
INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
|
||||
"a"),
|
||||
INIT_PARAM_DFLT(readfile, "file to read startup script from", ""),
|
||||
INIT_PARAM_DFLT(symbolfile, "file to read symbols from", ""),
|
||||
INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0),
|
||||
INIT_PARAM_DFLT(system_type, "Type of system we are emulating", 34),
|
||||
INIT_PARAM_DFLT(system_rev, "Revision of system we are emulating", 1<<10)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(FreebsdAlphaSystem)
|
||||
|
||||
CREATE_SIM_OBJECT(FreebsdAlphaSystem)
|
||||
FreebsdAlphaSystem *
|
||||
FreebsdAlphaSystemParams::create()
|
||||
{
|
||||
AlphaSystem::Params *p = new AlphaSystem::Params;
|
||||
p->name = getInstanceName();
|
||||
p->boot_cpu_frequency = boot_cpu_frequency;
|
||||
p->physmem = physmem;
|
||||
p->mem_mode = mem_mode;
|
||||
p->kernel_path = kernel;
|
||||
p->console_path = console;
|
||||
p->palcode = pal;
|
||||
p->boot_osflags = boot_osflags;
|
||||
p->init_param = init_param;
|
||||
p->readfile = readfile;
|
||||
p->symbolfile = symbolfile;
|
||||
p->system_type = system_type;
|
||||
p->system_rev = system_rev;
|
||||
return new FreebsdAlphaSystem(p);
|
||||
return new FreebsdAlphaSystem(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("FreebsdAlphaSystem", FreebsdAlphaSystem)
|
||||
|
||||
|
|
|
@ -28,10 +28,13 @@
|
|||
* Authors: Ben Nash
|
||||
*/
|
||||
|
||||
#ifndef __KERN_FREEBSD_FREEBSD_SYSTEM_HH__
|
||||
#define __KERN_FREEBSD_FREEBSD_SYSTEM_HH__
|
||||
#ifndef __ARCH_ALPHA_FREEBSD_SYSTEM_HH__
|
||||
#define __ARCH_ALPHA_FREEBSD_SYSTEM_HH__
|
||||
|
||||
#include "arch/alpha/system.hh"
|
||||
#include "kern/system_events.hh"
|
||||
#include "params/FreebsdAlphaSystem.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
class FreebsdAlphaSystem : public AlphaSystem
|
||||
{
|
||||
|
@ -49,10 +52,12 @@ class FreebsdAlphaSystem : public AlphaSystem
|
|||
SkipCalibrateClocksEvent *skipCalibrateClocks;
|
||||
|
||||
public:
|
||||
typedef FreebsdAlphaSystemParams Params;
|
||||
FreebsdAlphaSystem(Params *p);
|
||||
~FreebsdAlphaSystem();
|
||||
|
||||
void doCalibrateClocks(ThreadContext *tc);
|
||||
|
||||
};
|
||||
|
||||
#endif // __KERN_FREEBSD_FREEBSD_SYSTEM_HH__
|
||||
#endif // __ARCH_ALPHA_FREEBSD_SYSTEM_HH__
|
||||
|
|
|
@ -54,7 +54,6 @@
|
|||
#include "kern/linux/events.hh"
|
||||
#include "mem/physical.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/byteswap.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -192,64 +191,8 @@ LinuxAlphaSystem::PrintThreadInfo::process(ThreadContext *tc)
|
|||
ti.curTaskName(), ti.curTaskPID(), ti.curTaskStart());
|
||||
}
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(LinuxAlphaSystem)
|
||||
|
||||
Param<Tick> boot_cpu_frequency;
|
||||
SimObjectParam<PhysicalMemory *> physmem;
|
||||
SimpleEnumParam<System::MemoryMode> mem_mode;
|
||||
|
||||
Param<string> kernel;
|
||||
Param<string> console;
|
||||
Param<string> pal;
|
||||
|
||||
Param<string> boot_osflags;
|
||||
Param<string> readfile;
|
||||
Param<string> symbolfile;
|
||||
Param<unsigned int> init_param;
|
||||
|
||||
Param<uint64_t> system_type;
|
||||
Param<uint64_t> system_rev;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(LinuxAlphaSystem)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(LinuxAlphaSystem)
|
||||
|
||||
INIT_PARAM(boot_cpu_frequency, "Frequency of the boot CPU"),
|
||||
INIT_PARAM(physmem, "phsyical memory"),
|
||||
INIT_ENUM_PARAM(mem_mode, "Memory Mode, (1=atomic, 2=timing)",
|
||||
System::MemoryModeStrings),
|
||||
INIT_PARAM(kernel, "file that contains the kernel code"),
|
||||
INIT_PARAM(console, "file that contains the console code"),
|
||||
INIT_PARAM(pal, "file that contains palcode"),
|
||||
INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
|
||||
"a"),
|
||||
INIT_PARAM_DFLT(readfile, "file to read startup script from", ""),
|
||||
INIT_PARAM_DFLT(symbolfile, "file to read symbols from", ""),
|
||||
INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0),
|
||||
INIT_PARAM_DFLT(system_type, "Type of system we are emulating", 34),
|
||||
INIT_PARAM_DFLT(system_rev, "Revision of system we are emulating", 1<<10)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(LinuxAlphaSystem)
|
||||
|
||||
CREATE_SIM_OBJECT(LinuxAlphaSystem)
|
||||
LinuxAlphaSystem *
|
||||
LinuxAlphaSystemParams::create()
|
||||
{
|
||||
AlphaSystem::Params *p = new AlphaSystem::Params;
|
||||
p->name = getInstanceName();
|
||||
p->boot_cpu_frequency = boot_cpu_frequency;
|
||||
p->physmem = physmem;
|
||||
p->mem_mode = mem_mode;
|
||||
p->kernel_path = kernel;
|
||||
p->console_path = console;
|
||||
p->palcode = pal;
|
||||
p->boot_osflags = boot_osflags;
|
||||
p->init_param = init_param;
|
||||
p->readfile = readfile;
|
||||
p->symbolfile = symbolfile;
|
||||
p->system_type = system_type;
|
||||
p->system_rev = system_rev;
|
||||
return new LinuxAlphaSystem(p);
|
||||
return new LinuxAlphaSystem(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("LinuxAlphaSystem", LinuxAlphaSystem)
|
||||
|
||||
|
|
|
@ -41,6 +41,7 @@ class IdleStartEvent;
|
|||
#include "arch/alpha/idle_event.hh"
|
||||
#include "arch/alpha/system.hh"
|
||||
#include "kern/linux/events.hh"
|
||||
#include "params/LinuxAlphaSystem.hh"
|
||||
|
||||
using namespace AlphaISA;
|
||||
using namespace Linux;
|
||||
|
@ -129,6 +130,7 @@ class LinuxAlphaSystem : public AlphaSystem
|
|||
IdleStartEvent *idleStartEvent;
|
||||
|
||||
public:
|
||||
typedef LinuxAlphaSystemParams Params;
|
||||
LinuxAlphaSystem(Params *p);
|
||||
~LinuxAlphaSystem();
|
||||
|
||||
|
|
|
@ -39,8 +39,8 @@
|
|||
#include "base/loader/symtab.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "mem/physical.hh"
|
||||
#include "params/AlphaSystem.hh"
|
||||
#include "sim/byteswap.hh"
|
||||
#include "sim/builder.hh"
|
||||
|
||||
|
||||
using namespace LittleEndianGuest;
|
||||
|
@ -56,14 +56,14 @@ AlphaSystem::AlphaSystem(Params *p)
|
|||
* Load the pal, and console code into memory
|
||||
*/
|
||||
// Load Console Code
|
||||
console = createObjectFile(params()->console_path);
|
||||
console = createObjectFile(params()->console);
|
||||
if (console == NULL)
|
||||
fatal("Could not load console file %s", params()->console_path);
|
||||
fatal("Could not load console file %s", params()->console);
|
||||
|
||||
// Load pal file
|
||||
pal = createObjectFile(params()->palcode);
|
||||
pal = createObjectFile(params()->pal);
|
||||
if (pal == NULL)
|
||||
fatal("Could not load PALcode file %s", params()->palcode);
|
||||
fatal("Could not load PALcode file %s", params()->pal);
|
||||
|
||||
|
||||
// Load program sections into memory
|
||||
|
@ -212,65 +212,8 @@ AlphaSystem::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
palSymtab->unserialize("pal_symtab", cp, section);
|
||||
}
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(AlphaSystem)
|
||||
|
||||
Param<Tick> boot_cpu_frequency;
|
||||
SimObjectParam<PhysicalMemory *> physmem;
|
||||
SimpleEnumParam<System::MemoryMode> mem_mode;
|
||||
|
||||
Param<std::string> kernel;
|
||||
Param<std::string> console;
|
||||
Param<std::string> pal;
|
||||
|
||||
Param<std::string> boot_osflags;
|
||||
Param<std::string> readfile;
|
||||
Param<std::string> symbolfile;
|
||||
Param<unsigned int> init_param;
|
||||
|
||||
Param<uint64_t> system_type;
|
||||
Param<uint64_t> system_rev;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(AlphaSystem)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(AlphaSystem)
|
||||
|
||||
INIT_PARAM(boot_cpu_frequency, "Frequency of the boot CPU"),
|
||||
INIT_PARAM(physmem, "phsyical memory"),
|
||||
INIT_ENUM_PARAM(mem_mode, "Memory Mode, (1=atomic, 2=timing)",
|
||||
System::MemoryModeStrings),
|
||||
INIT_PARAM(kernel, "file that contains the kernel code"),
|
||||
INIT_PARAM(console, "file that contains the console code"),
|
||||
INIT_PARAM(pal, "file that contains palcode"),
|
||||
INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
|
||||
"a"),
|
||||
INIT_PARAM_DFLT(readfile, "file to read startup script from", ""),
|
||||
INIT_PARAM_DFLT(symbolfile, "file to read symbols from", ""),
|
||||
INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0),
|
||||
INIT_PARAM_DFLT(system_type, "Type of system we are emulating", 34),
|
||||
INIT_PARAM_DFLT(system_rev, "Revision of system we are emulating", 1<<10)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(AlphaSystem)
|
||||
|
||||
CREATE_SIM_OBJECT(AlphaSystem)
|
||||
AlphaSystem *
|
||||
AlphaSystemParams::create()
|
||||
{
|
||||
AlphaSystem::Params *p = new AlphaSystem::Params;
|
||||
p->name = getInstanceName();
|
||||
p->boot_cpu_frequency = boot_cpu_frequency;
|
||||
p->physmem = physmem;
|
||||
p->mem_mode = mem_mode;
|
||||
p->kernel_path = kernel;
|
||||
p->console_path = console;
|
||||
p->palcode = pal;
|
||||
p->boot_osflags = boot_osflags;
|
||||
p->init_param = init_param;
|
||||
p->readfile = readfile;
|
||||
p->symbolfile = symbolfile;
|
||||
p->system_type = system_type;
|
||||
p->system_rev = system_rev;
|
||||
return new AlphaSystem(p);
|
||||
return new AlphaSystem(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("AlphaSystem", AlphaSystem)
|
||||
|
||||
|
||||
|
|
|
@ -35,25 +35,18 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "sim/system.hh"
|
||||
#include "base/loader/symtab.hh"
|
||||
#include "cpu/pc_event.hh"
|
||||
#include "kern/system_events.hh"
|
||||
#include "params/AlphaSystem.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
class AlphaSystem : public System
|
||||
{
|
||||
public:
|
||||
struct Params : public System::Params
|
||||
{
|
||||
std::string console_path;
|
||||
std::string palcode;
|
||||
uint64_t system_type;
|
||||
uint64_t system_rev;
|
||||
};
|
||||
|
||||
typedef AlphaSystemParams Params;
|
||||
AlphaSystem(Params *p);
|
||||
|
||||
~AlphaSystem();
|
||||
|
||||
/**
|
||||
|
|
|
@ -41,7 +41,8 @@
|
|||
#include "base/trace.hh"
|
||||
#include "config/alpha_tlaser.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/AlphaDTB.hh"
|
||||
#include "params/AlphaITB.hh"
|
||||
|
||||
using namespace std;
|
||||
using namespace EV5;
|
||||
|
@ -600,44 +601,14 @@ TLB::index(bool advance)
|
|||
|
||||
/* end namespace AlphaISA */ }
|
||||
|
||||
DEFINE_SIM_OBJECT_CLASS_NAME("AlphaTLB", TLB)
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(ITB)
|
||||
|
||||
Param<int> size;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(ITB)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(ITB)
|
||||
|
||||
INIT_PARAM_DFLT(size, "TLB size", 48)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(ITB)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(ITB)
|
||||
AlphaISA::ITB *
|
||||
AlphaITBParams::create()
|
||||
{
|
||||
return new ITB(getInstanceName(), size);
|
||||
return new AlphaISA::ITB(name, size);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("AlphaITB", ITB)
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(DTB)
|
||||
|
||||
Param<int> size;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(DTB)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(DTB)
|
||||
|
||||
INIT_PARAM_DFLT(size, "TLB size", 64)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(DTB)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(DTB)
|
||||
AlphaISA::DTB *
|
||||
AlphaDTBParams::create()
|
||||
{
|
||||
return new DTB(getInstanceName(), size);
|
||||
return new AlphaISA::DTB(name, size);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("AlphaDTB", DTB)
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
#include "kern/system_events.hh"
|
||||
#include "mem/physical.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "sim/builder.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -91,63 +90,8 @@ Tru64AlphaSystem::~Tru64AlphaSystem()
|
|||
#endif
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(Tru64AlphaSystem)
|
||||
|
||||
Param<Tick> boot_cpu_frequency;
|
||||
SimObjectParam<PhysicalMemory *> physmem;
|
||||
SimpleEnumParam<System::MemoryMode> mem_mode;
|
||||
|
||||
Param<string> kernel;
|
||||
Param<string> console;
|
||||
Param<string> pal;
|
||||
|
||||
Param<string> boot_osflags;
|
||||
Param<string> readfile;
|
||||
Param<string> symbolfile;
|
||||
Param<unsigned int> init_param;
|
||||
|
||||
Param<uint64_t> system_type;
|
||||
Param<uint64_t> system_rev;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(Tru64AlphaSystem)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(Tru64AlphaSystem)
|
||||
|
||||
INIT_PARAM(boot_cpu_frequency, "frequency of the boot cpu"),
|
||||
INIT_PARAM(physmem, "phsyical memory"),
|
||||
INIT_ENUM_PARAM(mem_mode, "Memory Mode, (1=atomic, 2=timing)",
|
||||
System::MemoryModeStrings),
|
||||
INIT_PARAM(kernel, "file that contains the kernel code"),
|
||||
INIT_PARAM(console, "file that contains the console code"),
|
||||
INIT_PARAM(pal, "file that contains palcode"),
|
||||
INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
|
||||
"a"),
|
||||
INIT_PARAM_DFLT(readfile, "file to read startup script from", ""),
|
||||
INIT_PARAM_DFLT(symbolfile, "file to read symbols from", ""),
|
||||
INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0),
|
||||
INIT_PARAM_DFLT(system_type, "Type of system we are emulating", 12),
|
||||
INIT_PARAM_DFLT(system_rev, "Revision of system we are emulating", 2<<1)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(Tru64AlphaSystem)
|
||||
|
||||
CREATE_SIM_OBJECT(Tru64AlphaSystem)
|
||||
Tru64AlphaSystem *
|
||||
Tru64AlphaSystemParams::create()
|
||||
{
|
||||
AlphaSystem::Params *p = new AlphaSystem::Params;
|
||||
p->name = getInstanceName();
|
||||
p->boot_cpu_frequency = boot_cpu_frequency;
|
||||
p->physmem = physmem;
|
||||
p->mem_mode = mem_mode;
|
||||
p->kernel_path = kernel;
|
||||
p->console_path = console;
|
||||
p->palcode = pal;
|
||||
p->boot_osflags = boot_osflags;
|
||||
p->init_param = init_param;
|
||||
p->readfile = readfile;
|
||||
p->symbolfile = symbolfile;
|
||||
p->system_type = system_type;
|
||||
p->system_rev = system_rev;
|
||||
|
||||
return new Tru64AlphaSystem(p);
|
||||
return new Tru64AlphaSystem(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("Tru64AlphaSystem", Tru64AlphaSystem)
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
|
||||
#include "arch/alpha/system.hh"
|
||||
#include "arch/isa_traits.hh"
|
||||
#include "params/Tru64AlphaSystem.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
class ThreadContext;
|
||||
|
@ -64,6 +65,7 @@ class Tru64AlphaSystem : public AlphaSystem
|
|||
DumpMbufEvent *dumpMbufEvent;
|
||||
|
||||
public:
|
||||
typedef Tru64AlphaSystemParams Params;
|
||||
Tru64AlphaSystem(Params *p);
|
||||
~Tru64AlphaSystem();
|
||||
|
||||
|
|
|
@ -35,8 +35,14 @@ class SparcTLB(SimObject):
|
|||
|
||||
class SparcDTB(SparcTLB):
|
||||
type = 'SparcDTB'
|
||||
cxx_namespace = 'SparcISA'
|
||||
cxx_class = 'DTB'
|
||||
|
||||
size = 64
|
||||
|
||||
class SparcITB(SparcTLB):
|
||||
type = 'SparcITB'
|
||||
cxx_namespace = 'SparcISA'
|
||||
cxx_class = 'ITB'
|
||||
|
||||
size = 64
|
||||
|
|
|
@ -35,8 +35,8 @@
|
|||
#include "base/loader/symtab.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "mem/physical.hh"
|
||||
#include "params/SparcSystem.hh"
|
||||
#include "sim/byteswap.hh"
|
||||
#include "sim/builder.hh"
|
||||
|
||||
|
||||
using namespace BigEndianGuest;
|
||||
|
@ -216,104 +216,8 @@ SparcSystem::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
partitionDescSymtab->unserialize("partition_desc_symtab", cp, section);
|
||||
}
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(SparcSystem)
|
||||
|
||||
SimObjectParam<PhysicalMemory *> physmem;
|
||||
SimObjectParam<PhysicalMemory *> rom;
|
||||
SimObjectParam<PhysicalMemory *> nvram;
|
||||
SimObjectParam<PhysicalMemory *> hypervisor_desc;
|
||||
SimObjectParam<PhysicalMemory *> partition_desc;
|
||||
SimpleEnumParam<System::MemoryMode> mem_mode;
|
||||
|
||||
Param<Addr> reset_addr;
|
||||
Param<Addr> hypervisor_addr;
|
||||
Param<Addr> openboot_addr;
|
||||
Param<Addr> nvram_addr;
|
||||
Param<Addr> hypervisor_desc_addr;
|
||||
Param<Addr> partition_desc_addr;
|
||||
|
||||
Param<std::string> kernel;
|
||||
Param<std::string> reset_bin;
|
||||
Param<std::string> hypervisor_bin;
|
||||
Param<std::string> openboot_bin;
|
||||
Param<std::string> nvram_bin;
|
||||
Param<std::string> hypervisor_desc_bin;
|
||||
Param<std::string> partition_desc_bin;
|
||||
|
||||
Param<Tick> boot_cpu_frequency;
|
||||
Param<std::string> boot_osflags;
|
||||
Param<std::string> readfile;
|
||||
Param<unsigned int> init_param;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(SparcSystem)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(SparcSystem)
|
||||
|
||||
INIT_PARAM(physmem, "phsyical memory"),
|
||||
INIT_PARAM(rom, "ROM for boot code"),
|
||||
INIT_PARAM(nvram, "Non-volatile RAM for the nvram"),
|
||||
INIT_PARAM(hypervisor_desc, "ROM for the hypervisor description"),
|
||||
INIT_PARAM(partition_desc, "ROM for the partition description"),
|
||||
INIT_ENUM_PARAM(mem_mode, "Memory Mode, (1=atomic, 2=timing)",
|
||||
System::MemoryModeStrings),
|
||||
|
||||
INIT_PARAM(reset_addr, "Address that reset should be loaded at"),
|
||||
INIT_PARAM(hypervisor_addr, "Address that hypervisor should be loaded at"),
|
||||
INIT_PARAM(openboot_addr, "Address that openboot should be loaded at"),
|
||||
INIT_PARAM(nvram_addr, "Address that nvram should be loaded at"),
|
||||
INIT_PARAM(hypervisor_desc_addr,
|
||||
"Address that hypervisor description should be loaded at"),
|
||||
INIT_PARAM(partition_desc_addr,
|
||||
"Address that partition description should be loaded at"),
|
||||
|
||||
INIT_PARAM(kernel, "file that contains the kernel code"),
|
||||
INIT_PARAM(reset_bin, "file that contains the reset code"),
|
||||
INIT_PARAM(hypervisor_bin, "file that contains the hypervisor code"),
|
||||
INIT_PARAM(openboot_bin, "file that contains the openboot code"),
|
||||
INIT_PARAM(nvram_bin, "file that contains the nvram image"),
|
||||
INIT_PARAM(hypervisor_desc_bin,
|
||||
"file that contains the hypervisor description image"),
|
||||
INIT_PARAM(partition_desc_bin,
|
||||
"file that contains the partition description image"),
|
||||
INIT_PARAM(boot_cpu_frequency, "Frequency of the boot CPU"),
|
||||
INIT_PARAM_DFLT(boot_osflags, "flags to pass to the kernel during boot",
|
||||
"a"),
|
||||
INIT_PARAM_DFLT(readfile, "file to read startup script from", ""),
|
||||
INIT_PARAM_DFLT(init_param, "numerical value to pass into simulator", 0)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(SparcSystem)
|
||||
|
||||
CREATE_SIM_OBJECT(SparcSystem)
|
||||
SparcSystem *
|
||||
SparcSystemParams::create()
|
||||
{
|
||||
SparcSystem::Params *p = new SparcSystem::Params;
|
||||
p->name = getInstanceName();
|
||||
p->boot_cpu_frequency = boot_cpu_frequency;
|
||||
p->physmem = physmem;
|
||||
p->rom = rom;
|
||||
p->nvram = nvram;
|
||||
p->hypervisor_desc = hypervisor_desc;
|
||||
p->partition_desc = partition_desc;
|
||||
p->mem_mode = mem_mode;
|
||||
p->kernel_path = kernel;
|
||||
p->reset_addr = reset_addr;
|
||||
p->hypervisor_addr = hypervisor_addr;
|
||||
p->openboot_addr = openboot_addr;
|
||||
p->nvram_addr = nvram_addr;
|
||||
p->hypervisor_desc_addr = hypervisor_desc_addr;
|
||||
p->partition_desc_addr = partition_desc_addr;
|
||||
p->reset_bin = reset_bin;
|
||||
p->hypervisor_bin = hypervisor_bin;
|
||||
p->openboot_bin = openboot_bin;
|
||||
p->nvram_bin = nvram_bin;
|
||||
p->hypervisor_desc_bin = hypervisor_desc_bin;
|
||||
p->partition_desc_bin = partition_desc_bin;
|
||||
p->boot_osflags = boot_osflags;
|
||||
p->init_param = init_param;
|
||||
p->readfile = readfile;
|
||||
return new SparcSystem(p);
|
||||
return new SparcSystem(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("SparcSystem", SparcSystem)
|
||||
|
||||
|
||||
|
|
|
@ -37,35 +37,15 @@
|
|||
#include "base/loader/symtab.hh"
|
||||
#include "cpu/pc_event.hh"
|
||||
#include "kern/system_events.hh"
|
||||
#include "params/SparcSystem.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
class SparcSystem : public System
|
||||
{
|
||||
public:
|
||||
struct Params : public System::Params
|
||||
{
|
||||
PhysicalMemory *rom;
|
||||
PhysicalMemory *nvram;
|
||||
PhysicalMemory *hypervisor_desc;
|
||||
PhysicalMemory *partition_desc;
|
||||
Addr reset_addr;
|
||||
Addr hypervisor_addr;
|
||||
Addr openboot_addr;
|
||||
Addr nvram_addr;
|
||||
Addr hypervisor_desc_addr;
|
||||
Addr partition_desc_addr;
|
||||
std::string reset_bin;
|
||||
std::string hypervisor_bin;
|
||||
std::string openboot_bin;
|
||||
std::string nvram_bin;
|
||||
std::string hypervisor_desc_bin;
|
||||
std::string partition_desc_bin;
|
||||
std::string boot_osflags;
|
||||
};
|
||||
|
||||
typedef SparcSystemParams Params;
|
||||
SparcSystem(Params *p);
|
||||
|
||||
~SparcSystem();
|
||||
|
||||
/**
|
||||
|
|
|
@ -39,7 +39,8 @@
|
|||
#include "cpu/base.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "mem/request.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/SparcDTB.hh"
|
||||
#include "params/SparcITB.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
/* @todo remove some of the magic constants. -- ali
|
||||
|
@ -1386,46 +1387,14 @@ TLB::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
|
||||
/* end namespace SparcISA */ }
|
||||
|
||||
using namespace SparcISA;
|
||||
|
||||
DEFINE_SIM_OBJECT_CLASS_NAME("SparcTLB", TLB)
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(ITB)
|
||||
|
||||
Param<int> size;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(ITB)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(ITB)
|
||||
|
||||
INIT_PARAM_DFLT(size, "TLB size", 48)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(ITB)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(ITB)
|
||||
SparcISA::ITB *
|
||||
SparcITBParams::create()
|
||||
{
|
||||
return new ITB(getInstanceName(), size);
|
||||
return new SparcISA::ITB(name, size);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("SparcITB", ITB)
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(DTB)
|
||||
|
||||
Param<int> size;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(DTB)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(DTB)
|
||||
|
||||
INIT_PARAM_DFLT(size, "TLB size", 64)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(DTB)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(DTB)
|
||||
SparcISA::DTB *
|
||||
SparcDTBParams::create()
|
||||
{
|
||||
return new DTB(getInstanceName(), size);
|
||||
return new SparcISA::DTB(name, size);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("SparcDTB", DTB)
|
||||
|
|
|
@ -72,7 +72,7 @@ temp_cpu_list = env['CPU_MODELS'][:]
|
|||
if env['USE_CHECKER']:
|
||||
temp_cpu_list.append('CheckerCPU')
|
||||
|
||||
# Generate header.
|
||||
# Generate header.
|
||||
def gen_cpu_exec_signatures(target, source, env):
|
||||
f = open(str(target[0]), 'w')
|
||||
print >> f, '''
|
||||
|
@ -111,7 +111,6 @@ Source('base.cc')
|
|||
Source('cpuevent.cc')
|
||||
Source('exetrace.cc')
|
||||
Source('func_unit.cc')
|
||||
Source('op_class.cc')
|
||||
Source('pc_event.cc')
|
||||
Source('quiesce_event.cc')
|
||||
Source('static_inst.cc')
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
#include "cpu/thread_context.hh"
|
||||
#include "cpu/profile.hh"
|
||||
#include "sim/sim_exit.hh"
|
||||
#include "sim/param.hh"
|
||||
#include "sim/process.hh"
|
||||
#include "sim/sim_events.hh"
|
||||
#include "sim/system.hh"
|
||||
|
@ -455,6 +454,3 @@ BaseCPU::traceFunctionsInternal(Addr pc)
|
|||
functionEntryTick = curTick;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
DEFINE_SIM_OBJECT_CLASS_NAME("BaseCPU", BaseCPU)
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
#include "cpu/base.hh"
|
||||
#include "cpu/exetrace.hh"
|
||||
#include "cpu/static_inst.hh"
|
||||
#include "sim/param.hh"
|
||||
#include "enums/OpClass.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
#if FULL_SYSTEM
|
||||
|
@ -355,7 +355,7 @@ Trace::InstRecord::dump()
|
|||
outs << " : ";
|
||||
|
||||
if (IsOn(ExecOpClass)) {
|
||||
outs << opClassStrings[staticInst->opClass()] << " : ";
|
||||
outs << Enums::OpClassStrings[staticInst->opClass()] << " : ";
|
||||
}
|
||||
|
||||
if (IsOn(ExecResult) && data_status != DataInvalid) {
|
||||
|
|
|
@ -32,7 +32,8 @@
|
|||
|
||||
#include "base/misc.hh"
|
||||
#include "cpu/func_unit.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/OpDesc.hh"
|
||||
#include "params/FUDesc.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -116,56 +117,17 @@ FuncUnit::issueLatency(OpClass capability)
|
|||
//
|
||||
// The operation-class description object
|
||||
//
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(OpDesc)
|
||||
|
||||
SimpleEnumParam<OpClass> opClass;
|
||||
Param<unsigned> opLat;
|
||||
Param<unsigned> issueLat;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(OpDesc)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(OpDesc)
|
||||
|
||||
INIT_ENUM_PARAM(opClass, "type of operation", opClassStrings),
|
||||
INIT_PARAM(opLat, "cycles until result is available"),
|
||||
INIT_PARAM(issueLat, "cycles until another can be issued")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(OpDesc)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(OpDesc)
|
||||
OpDesc *
|
||||
OpDescParams::create()
|
||||
{
|
||||
return new OpDesc(getInstanceName(), opClass, opLat, issueLat);
|
||||
return new OpDesc(name, opClass, opLat, issueLat);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("OpDesc", OpDesc)
|
||||
|
||||
|
||||
//
|
||||
// The FuDesc object
|
||||
//
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(FUDesc)
|
||||
|
||||
SimObjectVectorParam<OpDesc *> opList;
|
||||
Param<unsigned> count;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(FUDesc)
|
||||
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(FUDesc)
|
||||
|
||||
INIT_PARAM(opList, "list of operation classes for this FU type"),
|
||||
INIT_PARAM(count, "number of these FU's available")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(FUDesc)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(FUDesc)
|
||||
FUDesc *
|
||||
FUDescParams::create()
|
||||
{
|
||||
return new FUDesc(getInstanceName(), opList, count);
|
||||
return new FUDesc(name, opList, count);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("FUDesc", FUDesc)
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include "cpu/base.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "cpu/intr_control.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/IntrControl.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -76,21 +76,8 @@ IntrControl::clear(int cpu_id, int int_num, int index)
|
|||
temp->clear_interrupt(int_num, index);
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(IntrControl)
|
||||
|
||||
SimObjectParam<System *> sys;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(IntrControl)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(IntrControl)
|
||||
|
||||
INIT_PARAM(sys, "the system we are part of")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(IntrControl)
|
||||
|
||||
CREATE_SIM_OBJECT(IntrControl)
|
||||
IntrControl *
|
||||
IntrControlParams::create()
|
||||
{
|
||||
return new IntrControl(getInstanceName(), sys);
|
||||
return new IntrControl(name, sys);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("IntrControl", IntrControl)
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
#include "mem/packet.hh"
|
||||
//#include "mem/physical.hh"
|
||||
#include "mem/request.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/MemTest.hh"
|
||||
#include "sim/sim_events.hh"
|
||||
#include "sim/stats.hh"
|
||||
|
||||
|
@ -496,53 +496,15 @@ MemTest::doRetry()
|
|||
}
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(MemTest)
|
||||
|
||||
// SimObjectParam<BaseCache *> cache;
|
||||
// SimObjectParam<PhysicalMemory *> main_mem;
|
||||
// SimObjectParam<PhysicalMemory *> check_mem;
|
||||
Param<unsigned> memory_size;
|
||||
Param<unsigned> percent_reads;
|
||||
Param<unsigned> percent_functional;
|
||||
Param<unsigned> percent_uncacheable;
|
||||
Param<unsigned> progress_interval;
|
||||
Param<unsigned> percent_source_unaligned;
|
||||
Param<unsigned> percent_dest_unaligned;
|
||||
Param<Addr> trace_addr;
|
||||
Param<Counter> max_loads;
|
||||
Param<bool> atomic;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(MemTest)
|
||||
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(MemTest)
|
||||
|
||||
// INIT_PARAM(cache, "L1 cache"),
|
||||
// INIT_PARAM(main_mem, "hierarchical memory"),
|
||||
// INIT_PARAM(check_mem, "check memory"),
|
||||
INIT_PARAM(memory_size, "memory size"),
|
||||
INIT_PARAM(percent_reads, "target read percentage"),
|
||||
INIT_PARAM(percent_functional, "percentage of access that are functional"),
|
||||
INIT_PARAM(percent_uncacheable, "target uncacheable percentage"),
|
||||
INIT_PARAM(progress_interval, "progress report interval (in accesses)"),
|
||||
INIT_PARAM(percent_source_unaligned,
|
||||
"percent of copy source address that are unaligned"),
|
||||
INIT_PARAM(percent_dest_unaligned,
|
||||
"percent of copy dest address that are unaligned"),
|
||||
INIT_PARAM(trace_addr, "address to trace"),
|
||||
INIT_PARAM(max_loads, "terminate when we have reached this load count"),
|
||||
INIT_PARAM(atomic, "Is the tester testing atomic mode (or timing)")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(MemTest)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(MemTest)
|
||||
MemTest *
|
||||
MemTestParams::create()
|
||||
{
|
||||
return new MemTest(getInstanceName(), /*cache->getInterface(),*/ /*main_mem,*/
|
||||
/*check_mem,*/ memory_size, percent_reads, percent_functional,
|
||||
return new MemTest(name,
|
||||
#if 0
|
||||
cache->getInterface(), main_mem, check_mem,
|
||||
#endif
|
||||
memory_size, percent_reads, percent_functional,
|
||||
percent_uncacheable, progress_interval,
|
||||
percent_source_unaligned, percent_dest_unaligned,
|
||||
trace_addr, max_loads, atomic);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("MemTest", MemTest)
|
||||
|
|
|
@ -30,12 +30,13 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#include "config/use_checker.hh"
|
||||
#include "cpu/base.hh"
|
||||
#include "cpu/o3/alpha/cpu.hh"
|
||||
#include "cpu/o3/alpha/impl.hh"
|
||||
#include "cpu/o3/alpha/params.hh"
|
||||
#include "cpu/o3/fu_pool.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/DerivO3CPU.hh"
|
||||
|
||||
class DerivO3CPU : public AlphaO3CPU<AlphaSimpleImpl>
|
||||
{
|
||||
|
@ -45,245 +46,8 @@ class DerivO3CPU : public AlphaO3CPU<AlphaSimpleImpl>
|
|||
{ }
|
||||
};
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
Param<int> clock;
|
||||
Param<int> phase;
|
||||
Param<int> numThreads;
|
||||
Param<int> cpu_id;
|
||||
Param<int> activity;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<AlphaISA::ITB *> itb;
|
||||
SimObjectParam<AlphaISA::DTB *> dtb;
|
||||
Param<Tick> profile;
|
||||
|
||||
Param<bool> do_quiesce;
|
||||
Param<bool> do_checkpoint_insts;
|
||||
Param<bool> do_statistics_insts;
|
||||
#else
|
||||
SimObjectVectorParam<Process *> workload;
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
SimObjectParam<BaseCPU *> checker;
|
||||
|
||||
Param<Counter> max_insts_any_thread;
|
||||
Param<Counter> max_insts_all_threads;
|
||||
Param<Counter> max_loads_any_thread;
|
||||
Param<Counter> max_loads_all_threads;
|
||||
Param<Tick> progress_interval;
|
||||
|
||||
Param<unsigned> cachePorts;
|
||||
|
||||
Param<unsigned> decodeToFetchDelay;
|
||||
Param<unsigned> renameToFetchDelay;
|
||||
Param<unsigned> iewToFetchDelay;
|
||||
Param<unsigned> commitToFetchDelay;
|
||||
Param<unsigned> fetchWidth;
|
||||
|
||||
Param<unsigned> renameToDecodeDelay;
|
||||
Param<unsigned> iewToDecodeDelay;
|
||||
Param<unsigned> commitToDecodeDelay;
|
||||
Param<unsigned> fetchToDecodeDelay;
|
||||
Param<unsigned> decodeWidth;
|
||||
|
||||
Param<unsigned> iewToRenameDelay;
|
||||
Param<unsigned> commitToRenameDelay;
|
||||
Param<unsigned> decodeToRenameDelay;
|
||||
Param<unsigned> renameWidth;
|
||||
|
||||
Param<unsigned> commitToIEWDelay;
|
||||
Param<unsigned> renameToIEWDelay;
|
||||
Param<unsigned> issueToExecuteDelay;
|
||||
Param<unsigned> dispatchWidth;
|
||||
Param<unsigned> issueWidth;
|
||||
Param<unsigned> wbWidth;
|
||||
Param<unsigned> wbDepth;
|
||||
SimObjectParam<FUPool *> fuPool;
|
||||
|
||||
Param<unsigned> iewToCommitDelay;
|
||||
Param<unsigned> renameToROBDelay;
|
||||
Param<unsigned> commitWidth;
|
||||
Param<unsigned> squashWidth;
|
||||
Param<Tick> trapLatency;
|
||||
|
||||
Param<unsigned> backComSize;
|
||||
Param<unsigned> forwardComSize;
|
||||
|
||||
Param<std::string> predType;
|
||||
Param<unsigned> localPredictorSize;
|
||||
Param<unsigned> localCtrBits;
|
||||
Param<unsigned> localHistoryTableSize;
|
||||
Param<unsigned> localHistoryBits;
|
||||
Param<unsigned> globalPredictorSize;
|
||||
Param<unsigned> globalCtrBits;
|
||||
Param<unsigned> globalHistoryBits;
|
||||
Param<unsigned> choicePredictorSize;
|
||||
Param<unsigned> choiceCtrBits;
|
||||
|
||||
Param<unsigned> BTBEntries;
|
||||
Param<unsigned> BTBTagSize;
|
||||
|
||||
Param<unsigned> RASSize;
|
||||
|
||||
Param<unsigned> LQEntries;
|
||||
Param<unsigned> SQEntries;
|
||||
Param<unsigned> LFSTSize;
|
||||
Param<unsigned> SSITSize;
|
||||
|
||||
Param<unsigned> numPhysIntRegs;
|
||||
Param<unsigned> numPhysFloatRegs;
|
||||
Param<unsigned> numIQEntries;
|
||||
Param<unsigned> numROBEntries;
|
||||
|
||||
Param<unsigned> smtNumFetchingThreads;
|
||||
Param<std::string> smtFetchPolicy;
|
||||
Param<std::string> smtLSQPolicy;
|
||||
Param<unsigned> smtLSQThreshold;
|
||||
Param<std::string> smtIQPolicy;
|
||||
Param<unsigned> smtIQThreshold;
|
||||
Param<std::string> smtROBPolicy;
|
||||
Param<unsigned> smtROBThreshold;
|
||||
Param<std::string> smtCommitPolicy;
|
||||
|
||||
Param<unsigned> instShiftAmt;
|
||||
|
||||
Param<bool> defer_registration;
|
||||
|
||||
Param<bool> function_trace;
|
||||
Param<Tick> function_trace_start;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
INIT_PARAM(clock, "clock speed"),
|
||||
INIT_PARAM_DFLT(phase, "clock phase", 0),
|
||||
INIT_PARAM(numThreads, "number of HW thread contexts"),
|
||||
INIT_PARAM(cpu_id, "processor ID"),
|
||||
INIT_PARAM_DFLT(activity, "Initial activity count", 0),
|
||||
|
||||
#if FULL_SYSTEM
|
||||
INIT_PARAM(system, "System object"),
|
||||
INIT_PARAM(itb, "Instruction translation buffer"),
|
||||
INIT_PARAM(dtb, "Data translation buffer"),
|
||||
INIT_PARAM(profile, ""),
|
||||
|
||||
INIT_PARAM(do_quiesce, ""),
|
||||
INIT_PARAM(do_checkpoint_insts, ""),
|
||||
INIT_PARAM(do_statistics_insts, ""),
|
||||
#else
|
||||
INIT_PARAM(workload, "Processes to run"),
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
INIT_PARAM_DFLT(checker, "Checker CPU", NULL),
|
||||
|
||||
INIT_PARAM_DFLT(max_insts_any_thread,
|
||||
"Terminate when any thread reaches this inst count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_insts_all_threads,
|
||||
"Terminate when all threads have reached"
|
||||
"this inst count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_loads_any_thread,
|
||||
"Terminate when any thread reaches this load count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_loads_all_threads,
|
||||
"Terminate when all threads have reached this load"
|
||||
"count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(progress_interval, "Progress interval", 0),
|
||||
|
||||
INIT_PARAM_DFLT(cachePorts, "Cache Ports", 200),
|
||||
|
||||
INIT_PARAM(decodeToFetchDelay, "Decode to fetch delay"),
|
||||
INIT_PARAM(renameToFetchDelay, "Rename to fetch delay"),
|
||||
INIT_PARAM(iewToFetchDelay, "Issue/Execute/Writeback to fetch"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToFetchDelay, "Commit to fetch delay"),
|
||||
INIT_PARAM(fetchWidth, "Fetch width"),
|
||||
INIT_PARAM(renameToDecodeDelay, "Rename to decode delay"),
|
||||
INIT_PARAM(iewToDecodeDelay, "Issue/Execute/Writeback to decode"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToDecodeDelay, "Commit to decode delay"),
|
||||
INIT_PARAM(fetchToDecodeDelay, "Fetch to decode delay"),
|
||||
INIT_PARAM(decodeWidth, "Decode width"),
|
||||
|
||||
INIT_PARAM(iewToRenameDelay, "Issue/Execute/Writeback to rename"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToRenameDelay, "Commit to rename delay"),
|
||||
INIT_PARAM(decodeToRenameDelay, "Decode to rename delay"),
|
||||
INIT_PARAM(renameWidth, "Rename width"),
|
||||
|
||||
INIT_PARAM(commitToIEWDelay, "Commit to "
|
||||
"Issue/Execute/Writeback delay"),
|
||||
INIT_PARAM(renameToIEWDelay, "Rename to "
|
||||
"Issue/Execute/Writeback delay"),
|
||||
INIT_PARAM(issueToExecuteDelay, "Issue to execute delay (internal"
|
||||
"to the IEW stage)"),
|
||||
INIT_PARAM(dispatchWidth, "Dispatch width"),
|
||||
INIT_PARAM(issueWidth, "Issue width"),
|
||||
INIT_PARAM(wbWidth, "Writeback width"),
|
||||
INIT_PARAM(wbDepth, "Writeback depth (number of cycles it can buffer)"),
|
||||
INIT_PARAM_DFLT(fuPool, "Functional unit pool", NULL),
|
||||
|
||||
INIT_PARAM(iewToCommitDelay, "Issue/Execute/Writeback to commit "
|
||||
"delay"),
|
||||
INIT_PARAM(renameToROBDelay, "Rename to reorder buffer delay"),
|
||||
INIT_PARAM(commitWidth, "Commit width"),
|
||||
INIT_PARAM(squashWidth, "Squash width"),
|
||||
INIT_PARAM_DFLT(trapLatency, "Number of cycles before the trap is handled", 6),
|
||||
|
||||
INIT_PARAM(backComSize, "Time buffer size for backwards communication"),
|
||||
INIT_PARAM(forwardComSize, "Time buffer size for forward communication"),
|
||||
|
||||
INIT_PARAM(predType, "Type of branch predictor ('local', 'tournament')"),
|
||||
INIT_PARAM(localPredictorSize, "Size of local predictor"),
|
||||
INIT_PARAM(localCtrBits, "Bits per counter"),
|
||||
INIT_PARAM(localHistoryTableSize, "Size of local history table"),
|
||||
INIT_PARAM(localHistoryBits, "Bits for the local history"),
|
||||
INIT_PARAM(globalPredictorSize, "Size of global predictor"),
|
||||
INIT_PARAM(globalCtrBits, "Bits per counter"),
|
||||
INIT_PARAM(globalHistoryBits, "Bits of history"),
|
||||
INIT_PARAM(choicePredictorSize, "Size of choice predictor"),
|
||||
INIT_PARAM(choiceCtrBits, "Bits of choice counters"),
|
||||
|
||||
INIT_PARAM(BTBEntries, "Number of BTB entries"),
|
||||
INIT_PARAM(BTBTagSize, "Size of the BTB tags, in bits"),
|
||||
|
||||
INIT_PARAM(RASSize, "RAS size"),
|
||||
|
||||
INIT_PARAM(LQEntries, "Number of load queue entries"),
|
||||
INIT_PARAM(SQEntries, "Number of store queue entries"),
|
||||
INIT_PARAM(LFSTSize, "Last fetched store table size"),
|
||||
INIT_PARAM(SSITSize, "Store set ID table size"),
|
||||
|
||||
INIT_PARAM(numPhysIntRegs, "Number of physical integer registers"),
|
||||
INIT_PARAM(numPhysFloatRegs, "Number of physical floating point "
|
||||
"registers"),
|
||||
INIT_PARAM(numIQEntries, "Number of instruction queue entries"),
|
||||
INIT_PARAM(numROBEntries, "Number of reorder buffer entries"),
|
||||
|
||||
INIT_PARAM_DFLT(smtNumFetchingThreads, "SMT Number of Fetching Threads", 1),
|
||||
INIT_PARAM_DFLT(smtFetchPolicy, "SMT Fetch Policy", "SingleThread"),
|
||||
INIT_PARAM_DFLT(smtLSQPolicy, "SMT LSQ Sharing Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtLSQThreshold,"SMT LSQ Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtIQPolicy, "SMT IQ Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtIQThreshold, "SMT IQ Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtROBPolicy, "SMT ROB Sharing Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtROBThreshold,"SMT ROB Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtCommitPolicy,"SMT Commit Fetch Policy", "RoundRobin"),
|
||||
|
||||
INIT_PARAM(instShiftAmt, "Number of bits to shift instructions by"),
|
||||
INIT_PARAM(defer_registration, "defer system registration (for sampling)"),
|
||||
|
||||
INIT_PARAM(function_trace, "Enable function trace"),
|
||||
INIT_PARAM(function_trace_start, "Cycle to start function trace")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
CREATE_SIM_OBJECT(DerivO3CPU)
|
||||
DerivO3CPU *
|
||||
DerivO3CPUParams::create()
|
||||
{
|
||||
DerivO3CPU *cpu;
|
||||
|
||||
|
@ -294,8 +58,7 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
|||
// In non-full-system mode, we infer the number of threads from
|
||||
// the workload if it's not explicitly specified.
|
||||
int actual_num_threads =
|
||||
(numThreads.isValid() && numThreads >= workload.size()) ?
|
||||
numThreads : workload.size();
|
||||
(numThreads >= workload.size()) ? numThreads : workload.size();
|
||||
|
||||
if (workload.size() == 0) {
|
||||
fatal("Must specify at least one workload!");
|
||||
|
@ -307,7 +70,7 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
|||
params->clock = clock;
|
||||
params->phase = phase;
|
||||
|
||||
params->name = getInstanceName();
|
||||
params->name = name;
|
||||
params->numberOfThreads = actual_num_threads;
|
||||
params->cpu_id = cpu_id;
|
||||
params->activity = activity;
|
||||
|
@ -325,7 +88,9 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
|||
params->workload = workload;
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
#if USE_CHECKER
|
||||
params->checker = checker;
|
||||
#endif
|
||||
|
||||
params->max_insts_any_thread = max_insts_any_thread;
|
||||
params->max_insts_all_threads = max_insts_all_threads;
|
||||
|
@ -429,6 +194,3 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
|||
|
||||
return cpu;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("DerivO3CPU", DerivO3CPU)
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include "cpu/inst_seq.hh"
|
||||
#include "cpu/o3/alpha/dyn_inst.hh"
|
||||
#include "cpu/o3/alpha/impl.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/O3Checker.hh"
|
||||
#include "sim/process.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
|
@ -58,73 +58,11 @@ class O3Checker : public Checker<RefCountingPtr<AlphaDynInst<AlphaSimpleImpl> >
|
|||
//
|
||||
// CheckerCPU Simulation Object
|
||||
//
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(O3Checker)
|
||||
|
||||
Param<Counter> max_insts_any_thread;
|
||||
Param<Counter> max_insts_all_threads;
|
||||
Param<Counter> max_loads_any_thread;
|
||||
Param<Counter> max_loads_all_threads;
|
||||
Param<Tick> progress_interval;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
SimObjectParam<TheISA::ITB *> itb;
|
||||
SimObjectParam<TheISA::DTB *> dtb;
|
||||
SimObjectParam<System *> system;
|
||||
Param<int> cpu_id;
|
||||
Param<Tick> profile;
|
||||
#else
|
||||
SimObjectParam<Process *> workload;
|
||||
#endif // FULL_SYSTEM
|
||||
Param<int> clock;
|
||||
|
||||
Param<bool> defer_registration;
|
||||
Param<bool> exitOnError;
|
||||
Param<bool> updateOnError;
|
||||
Param<bool> warnOnlyOnLoadError;
|
||||
Param<bool> function_trace;
|
||||
Param<Tick> function_trace_start;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(O3Checker)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(O3Checker)
|
||||
|
||||
INIT_PARAM(max_insts_any_thread,
|
||||
"terminate when any thread reaches this inst count"),
|
||||
INIT_PARAM(max_insts_all_threads,
|
||||
"terminate when all threads have reached this inst count"),
|
||||
INIT_PARAM(max_loads_any_thread,
|
||||
"terminate when any thread reaches this load count"),
|
||||
INIT_PARAM(max_loads_all_threads,
|
||||
"terminate when all threads have reached this load count"),
|
||||
INIT_PARAM_DFLT(progress_interval, "CPU Progress Interval", 0),
|
||||
|
||||
#if FULL_SYSTEM
|
||||
INIT_PARAM(itb, "Instruction TLB"),
|
||||
INIT_PARAM(dtb, "Data TLB"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(cpu_id, "processor ID"),
|
||||
INIT_PARAM(profile, ""),
|
||||
#else
|
||||
INIT_PARAM(workload, "processes to run"),
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
INIT_PARAM(clock, "clock speed"),
|
||||
|
||||
INIT_PARAM(defer_registration, "defer system registration (for sampling)"),
|
||||
INIT_PARAM(exitOnError, "exit on error"),
|
||||
INIT_PARAM(updateOnError, "Update the checker with the main CPU's state on error"),
|
||||
INIT_PARAM_DFLT(warnOnlyOnLoadError, "warn, but don't exit, if a load "
|
||||
"result errors", false),
|
||||
INIT_PARAM(function_trace, "Enable function trace"),
|
||||
INIT_PARAM(function_trace_start, "Cycle to start function trace")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(O3Checker)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(O3Checker)
|
||||
O3Checker *
|
||||
O3CheckerParams::create()
|
||||
{
|
||||
O3Checker::Params *params = new O3Checker::Params();
|
||||
params->name = getInstanceName();
|
||||
params->name = name;
|
||||
params->numberOfThreads = 1;
|
||||
params->max_insts_any_thread = 0;
|
||||
params->max_insts_all_threads = 0;
|
||||
|
@ -161,5 +99,3 @@ CREATE_SIM_OBJECT(O3Checker)
|
|||
O3Checker *cpu = new O3Checker(params);
|
||||
return cpu;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("O3Checker", O3Checker)
|
||||
|
|
|
@ -32,6 +32,15 @@
|
|||
#include "config/full_system.hh"
|
||||
#include "config/use_checker.hh"
|
||||
|
||||
#include "cpu/activity.hh"
|
||||
#include "cpu/simple_thread.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "cpu/o3/isa_specific.hh"
|
||||
#include "cpu/o3/cpu.hh"
|
||||
#include "enums/MemoryMode.hh"
|
||||
#include "sim/core.hh"
|
||||
#include "sim/stat_control.hh"
|
||||
|
||||
#if FULL_SYSTEM
|
||||
#include "cpu/quiesce_event.hh"
|
||||
#include "sim/system.hh"
|
||||
|
@ -39,15 +48,6 @@
|
|||
#include "sim/process.hh"
|
||||
#endif
|
||||
|
||||
#include "cpu/activity.hh"
|
||||
#include "cpu/simple_thread.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "cpu/o3/isa_specific.hh"
|
||||
#include "cpu/o3/cpu.hh"
|
||||
|
||||
#include "sim/core.hh"
|
||||
#include "sim/stat_control.hh"
|
||||
|
||||
#if USE_CHECKER
|
||||
#include "cpu/checker/cpu.hh"
|
||||
#endif
|
||||
|
@ -882,7 +882,7 @@ FullO3CPU<Impl>::resume()
|
|||
return;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
assert(system->getMemoryMode() == System::Timing);
|
||||
assert(system->getMemoryMode() == Enums::timing);
|
||||
#endif
|
||||
|
||||
if (!tickEvent.scheduled())
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
|
||||
#include "cpu/o3/fu_pool.hh"
|
||||
#include "cpu/func_unit.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/FUPool.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -275,25 +275,8 @@ FUPool::takeOverFrom()
|
|||
//
|
||||
// The FuPool object
|
||||
//
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(FUPool)
|
||||
|
||||
SimObjectVectorParam<FUDesc *> FUList;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(FUPool)
|
||||
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(FUPool)
|
||||
|
||||
INIT_PARAM(FUList, "list of FU's for this pool")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(FUPool)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(FUPool)
|
||||
FUPool *
|
||||
FUPoolParams::create()
|
||||
{
|
||||
return new FUPool(getInstanceName(), FUList);
|
||||
return new FUPool(name, FUList);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("FUPool", FUPool)
|
||||
|
||||
|
|
|
@ -32,10 +32,10 @@
|
|||
#include <limits>
|
||||
#include <vector>
|
||||
|
||||
#include "sim/core.hh"
|
||||
|
||||
#include "cpu/o3/fu_pool.hh"
|
||||
#include "cpu/o3/inst_queue.hh"
|
||||
#include "enums/OpClass.hh"
|
||||
#include "sim/core.hh"
|
||||
|
||||
template <class Impl>
|
||||
InstructionQueue<Impl>::FUCompletion::FUCompletion(DynInstPtr &_inst,
|
||||
|
@ -259,12 +259,12 @@ InstructionQueue<Impl>::regStats()
|
|||
}
|
||||
*/
|
||||
statIssuedInstType
|
||||
.init(numThreads,Num_OpClasses)
|
||||
.init(numThreads,Enums::Num_OpClass)
|
||||
.name(name() + ".ISSUE:FU_type")
|
||||
.desc("Type of FU issued")
|
||||
.flags(total | pdf | dist)
|
||||
;
|
||||
statIssuedInstType.ysubnames(opClassStrings);
|
||||
statIssuedInstType.ysubnames(Enums::OpClassStrings);
|
||||
|
||||
//
|
||||
// How long did instructions for a particular FU type wait prior to issue
|
||||
|
@ -297,7 +297,7 @@ InstructionQueue<Impl>::regStats()
|
|||
.flags(pdf | dist)
|
||||
;
|
||||
for (int i=0; i < Num_OpClasses; ++i) {
|
||||
statFuBusy.subname(i, opClassStrings[i]);
|
||||
statFuBusy.subname(i, Enums::OpClassStrings[i]);
|
||||
}
|
||||
|
||||
fuBusy
|
||||
|
|
|
@ -31,12 +31,13 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#include "config/use_checker.hh"
|
||||
#include "cpu/base.hh"
|
||||
#include "cpu/o3/mips/cpu.hh"
|
||||
#include "cpu/o3/mips/impl.hh"
|
||||
#include "cpu/o3/mips/params.hh"
|
||||
#include "cpu/o3/fu_pool.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/DerivO3CPU.hh"
|
||||
|
||||
class DerivO3CPU : public MipsO3CPU<MipsSimpleImpl>
|
||||
{
|
||||
|
@ -46,229 +47,15 @@ class DerivO3CPU : public MipsO3CPU<MipsSimpleImpl>
|
|||
{ }
|
||||
};
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
Param<int> clock;
|
||||
Param<int> phase;
|
||||
Param<int> numThreads;
|
||||
Param<int> cpu_id;
|
||||
Param<int> activity;
|
||||
|
||||
SimObjectVectorParam<Process *> workload;
|
||||
|
||||
SimObjectParam<BaseCPU *> checker;
|
||||
|
||||
Param<Counter> max_insts_any_thread;
|
||||
Param<Counter> max_insts_all_threads;
|
||||
Param<Counter> max_loads_any_thread;
|
||||
Param<Counter> max_loads_all_threads;
|
||||
|
||||
Param<unsigned> cachePorts;
|
||||
|
||||
Param<unsigned> decodeToFetchDelay;
|
||||
Param<unsigned> renameToFetchDelay;
|
||||
Param<unsigned> iewToFetchDelay;
|
||||
Param<unsigned> commitToFetchDelay;
|
||||
Param<unsigned> fetchWidth;
|
||||
|
||||
Param<unsigned> renameToDecodeDelay;
|
||||
Param<unsigned> iewToDecodeDelay;
|
||||
Param<unsigned> commitToDecodeDelay;
|
||||
Param<unsigned> fetchToDecodeDelay;
|
||||
Param<unsigned> decodeWidth;
|
||||
|
||||
Param<unsigned> iewToRenameDelay;
|
||||
Param<unsigned> commitToRenameDelay;
|
||||
Param<unsigned> decodeToRenameDelay;
|
||||
Param<unsigned> renameWidth;
|
||||
|
||||
Param<unsigned> commitToIEWDelay;
|
||||
Param<unsigned> renameToIEWDelay;
|
||||
Param<unsigned> issueToExecuteDelay;
|
||||
Param<unsigned> dispatchWidth;
|
||||
Param<unsigned> issueWidth;
|
||||
Param<unsigned> wbWidth;
|
||||
Param<unsigned> wbDepth;
|
||||
SimObjectParam<FUPool *> fuPool;
|
||||
|
||||
Param<unsigned> iewToCommitDelay;
|
||||
Param<unsigned> renameToROBDelay;
|
||||
Param<unsigned> commitWidth;
|
||||
Param<unsigned> squashWidth;
|
||||
Param<Tick> trapLatency;
|
||||
|
||||
Param<unsigned> backComSize;
|
||||
Param<unsigned> forwardComSize;
|
||||
|
||||
Param<std::string> predType;
|
||||
Param<unsigned> localPredictorSize;
|
||||
Param<unsigned> localCtrBits;
|
||||
Param<unsigned> localHistoryTableSize;
|
||||
Param<unsigned> localHistoryBits;
|
||||
Param<unsigned> globalPredictorSize;
|
||||
Param<unsigned> globalCtrBits;
|
||||
Param<unsigned> globalHistoryBits;
|
||||
Param<unsigned> choicePredictorSize;
|
||||
Param<unsigned> choiceCtrBits;
|
||||
|
||||
Param<unsigned> BTBEntries;
|
||||
Param<unsigned> BTBTagSize;
|
||||
|
||||
Param<unsigned> RASSize;
|
||||
|
||||
Param<unsigned> LQEntries;
|
||||
Param<unsigned> SQEntries;
|
||||
Param<unsigned> LFSTSize;
|
||||
Param<unsigned> SSITSize;
|
||||
|
||||
Param<unsigned> numPhysIntRegs;
|
||||
Param<unsigned> numPhysFloatRegs;
|
||||
Param<unsigned> numIQEntries;
|
||||
Param<unsigned> numROBEntries;
|
||||
|
||||
Param<unsigned> smtNumFetchingThreads;
|
||||
Param<std::string> smtFetchPolicy;
|
||||
Param<std::string> smtLSQPolicy;
|
||||
Param<unsigned> smtLSQThreshold;
|
||||
Param<std::string> smtIQPolicy;
|
||||
Param<unsigned> smtIQThreshold;
|
||||
Param<std::string> smtROBPolicy;
|
||||
Param<unsigned> smtROBThreshold;
|
||||
Param<std::string> smtCommitPolicy;
|
||||
|
||||
Param<unsigned> instShiftAmt;
|
||||
|
||||
Param<bool> defer_registration;
|
||||
|
||||
Param<bool> function_trace;
|
||||
Param<Tick> function_trace_start;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
INIT_PARAM(clock, "clock speed"),
|
||||
INIT_PARAM_DFLT(phase, "clock phase", 0),
|
||||
INIT_PARAM(numThreads, "number of HW thread contexts"),
|
||||
INIT_PARAM(cpu_id, "processor ID"),
|
||||
INIT_PARAM_DFLT(activity, "Initial activity count", 0),
|
||||
|
||||
INIT_PARAM(workload, "Processes to run"),
|
||||
|
||||
INIT_PARAM_DFLT(checker, "Checker CPU", NULL),
|
||||
|
||||
INIT_PARAM_DFLT(max_insts_any_thread,
|
||||
"Terminate when any thread reaches this inst count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_insts_all_threads,
|
||||
"Terminate when all threads have reached"
|
||||
"this inst count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_loads_any_thread,
|
||||
"Terminate when any thread reaches this load count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_loads_all_threads,
|
||||
"Terminate when all threads have reached this load"
|
||||
"count",
|
||||
0),
|
||||
|
||||
INIT_PARAM_DFLT(cachePorts, "Cache Ports", 200),
|
||||
|
||||
INIT_PARAM(decodeToFetchDelay, "Decode to fetch delay"),
|
||||
INIT_PARAM(renameToFetchDelay, "Rename to fetch delay"),
|
||||
INIT_PARAM(iewToFetchDelay, "Issue/Execute/Writeback to fetch"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToFetchDelay, "Commit to fetch delay"),
|
||||
INIT_PARAM(fetchWidth, "Fetch width"),
|
||||
INIT_PARAM(renameToDecodeDelay, "Rename to decode delay"),
|
||||
INIT_PARAM(iewToDecodeDelay, "Issue/Execute/Writeback to decode"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToDecodeDelay, "Commit to decode delay"),
|
||||
INIT_PARAM(fetchToDecodeDelay, "Fetch to decode delay"),
|
||||
INIT_PARAM(decodeWidth, "Decode width"),
|
||||
|
||||
INIT_PARAM(iewToRenameDelay, "Issue/Execute/Writeback to rename"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToRenameDelay, "Commit to rename delay"),
|
||||
INIT_PARAM(decodeToRenameDelay, "Decode to rename delay"),
|
||||
INIT_PARAM(renameWidth, "Rename width"),
|
||||
|
||||
INIT_PARAM(commitToIEWDelay, "Commit to "
|
||||
"Issue/Execute/Writeback delay"),
|
||||
INIT_PARAM(renameToIEWDelay, "Rename to "
|
||||
"Issue/Execute/Writeback delay"),
|
||||
INIT_PARAM(issueToExecuteDelay, "Issue to execute delay (internal"
|
||||
"to the IEW stage)"),
|
||||
INIT_PARAM(dispatchWidth, "Dispatch width"),
|
||||
INIT_PARAM(issueWidth, "Issue width"),
|
||||
INIT_PARAM(wbWidth, "Writeback width"),
|
||||
INIT_PARAM(wbDepth, "Writeback depth (number of cycles it can buffer)"),
|
||||
INIT_PARAM_DFLT(fuPool, "Functional unit pool", NULL),
|
||||
|
||||
INIT_PARAM(iewToCommitDelay, "Issue/Execute/Writeback to commit "
|
||||
"delay"),
|
||||
INIT_PARAM(renameToROBDelay, "Rename to reorder buffer delay"),
|
||||
INIT_PARAM(commitWidth, "Commit width"),
|
||||
INIT_PARAM(squashWidth, "Squash width"),
|
||||
INIT_PARAM_DFLT(trapLatency, "Number of cycles before the trap is handled", 6),
|
||||
|
||||
INIT_PARAM(backComSize, "Time buffer size for backwards communication"),
|
||||
INIT_PARAM(forwardComSize, "Time buffer size for forward communication"),
|
||||
|
||||
INIT_PARAM(predType, "Type of branch predictor ('local', 'tournament')"),
|
||||
INIT_PARAM(localPredictorSize, "Size of local predictor"),
|
||||
INIT_PARAM(localCtrBits, "Bits per counter"),
|
||||
INIT_PARAM(localHistoryTableSize, "Size of local history table"),
|
||||
INIT_PARAM(localHistoryBits, "Bits for the local history"),
|
||||
INIT_PARAM(globalPredictorSize, "Size of global predictor"),
|
||||
INIT_PARAM(globalCtrBits, "Bits per counter"),
|
||||
INIT_PARAM(globalHistoryBits, "Bits of history"),
|
||||
INIT_PARAM(choicePredictorSize, "Size of choice predictor"),
|
||||
INIT_PARAM(choiceCtrBits, "Bits of choice counters"),
|
||||
|
||||
INIT_PARAM(BTBEntries, "Number of BTB entries"),
|
||||
INIT_PARAM(BTBTagSize, "Size of the BTB tags, in bits"),
|
||||
|
||||
INIT_PARAM(RASSize, "RAS size"),
|
||||
|
||||
INIT_PARAM(LQEntries, "Number of load queue entries"),
|
||||
INIT_PARAM(SQEntries, "Number of store queue entries"),
|
||||
INIT_PARAM(LFSTSize, "Last fetched store table size"),
|
||||
INIT_PARAM(SSITSize, "Store set ID table size"),
|
||||
|
||||
INIT_PARAM(numPhysIntRegs, "Number of physical integer registers"),
|
||||
INIT_PARAM(numPhysFloatRegs, "Number of physical floating point "
|
||||
"registers"),
|
||||
INIT_PARAM(numIQEntries, "Number of instruction queue entries"),
|
||||
INIT_PARAM(numROBEntries, "Number of reorder buffer entries"),
|
||||
|
||||
INIT_PARAM_DFLT(smtNumFetchingThreads, "SMT Number of Fetching Threads", 1),
|
||||
INIT_PARAM_DFLT(smtFetchPolicy, "SMT Fetch Policy", "SingleThread"),
|
||||
INIT_PARAM_DFLT(smtLSQPolicy, "SMT LSQ Sharing Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtLSQThreshold,"SMT LSQ Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtIQPolicy, "SMT IQ Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtIQThreshold, "SMT IQ Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtROBPolicy, "SMT ROB Sharing Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtROBThreshold,"SMT ROB Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtCommitPolicy,"SMT Commit Fetch Policy", "RoundRobin"),
|
||||
|
||||
INIT_PARAM(instShiftAmt, "Number of bits to shift instructions by"),
|
||||
INIT_PARAM(defer_registration, "defer system registration (for sampling)"),
|
||||
|
||||
INIT_PARAM(function_trace, "Enable function trace"),
|
||||
INIT_PARAM(function_trace_start, "Cycle to start function trace")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
CREATE_SIM_OBJECT(DerivO3CPU)
|
||||
DerivO3CPU *
|
||||
DerivO3CPUParams::create()
|
||||
{
|
||||
DerivO3CPU *cpu;
|
||||
|
||||
// In non-full-system mode, we infer the number of threads from
|
||||
// the workload if it's not explicitly specified.
|
||||
int actual_num_threads =
|
||||
(numThreads.isValid() && numThreads >= workload.size()) ?
|
||||
numThreads : workload.size();
|
||||
(numThreads >= workload.size()) ? numThreads : workload.size();
|
||||
|
||||
if (workload.size() == 0) {
|
||||
fatal("Must specify at least one workload!");
|
||||
|
@ -279,14 +66,16 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
|||
params->clock = clock;
|
||||
params->phase = phase;
|
||||
|
||||
params->name = getInstanceName();
|
||||
params->name = name;
|
||||
params->numberOfThreads = actual_num_threads;
|
||||
params->cpu_id = cpu_id;
|
||||
params->activity = activity;
|
||||
|
||||
params->workload = workload;
|
||||
|
||||
#if USE_CHECKER
|
||||
params->checker = checker;
|
||||
#endif
|
||||
|
||||
params->max_insts_any_thread = max_insts_any_thread;
|
||||
params->max_insts_all_threads = max_insts_all_threads;
|
||||
|
@ -389,6 +178,3 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
|||
|
||||
return cpu;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("DerivO3CPU", DerivO3CPU)
|
||||
|
||||
|
|
|
@ -30,12 +30,14 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#include "config/full_system.hh"
|
||||
#include "config/use_checker.hh"
|
||||
#include "cpu/base.hh"
|
||||
#include "cpu/o3/sparc/cpu.hh"
|
||||
#include "cpu/o3/sparc/impl.hh"
|
||||
#include "cpu/o3/sparc/params.hh"
|
||||
#include "cpu/o3/fu_pool.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/DerivO3CPU.hh"
|
||||
|
||||
class DerivO3CPU : public SparcO3CPU<SparcSimpleImpl>
|
||||
{
|
||||
|
@ -45,245 +47,8 @@ class DerivO3CPU : public SparcO3CPU<SparcSimpleImpl>
|
|||
{ }
|
||||
};
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
Param<int> clock;
|
||||
Param<int> phase;
|
||||
Param<int> numThreads;
|
||||
Param<int> cpu_id;
|
||||
Param<int> activity;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<SparcISA::ITB *> itb;
|
||||
SimObjectParam<SparcISA::DTB *> dtb;
|
||||
Param<Tick> profile;
|
||||
|
||||
Param<bool> do_quiesce;
|
||||
Param<bool> do_checkpoint_insts;
|
||||
Param<bool> do_statistics_insts;
|
||||
#else
|
||||
SimObjectVectorParam<Process *> workload;
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
SimObjectParam<BaseCPU *> checker;
|
||||
|
||||
Param<Counter> max_insts_any_thread;
|
||||
Param<Counter> max_insts_all_threads;
|
||||
Param<Counter> max_loads_any_thread;
|
||||
Param<Counter> max_loads_all_threads;
|
||||
Param<Tick> progress_interval;
|
||||
|
||||
Param<unsigned> cachePorts;
|
||||
|
||||
Param<unsigned> decodeToFetchDelay;
|
||||
Param<unsigned> renameToFetchDelay;
|
||||
Param<unsigned> iewToFetchDelay;
|
||||
Param<unsigned> commitToFetchDelay;
|
||||
Param<unsigned> fetchWidth;
|
||||
|
||||
Param<unsigned> renameToDecodeDelay;
|
||||
Param<unsigned> iewToDecodeDelay;
|
||||
Param<unsigned> commitToDecodeDelay;
|
||||
Param<unsigned> fetchToDecodeDelay;
|
||||
Param<unsigned> decodeWidth;
|
||||
|
||||
Param<unsigned> iewToRenameDelay;
|
||||
Param<unsigned> commitToRenameDelay;
|
||||
Param<unsigned> decodeToRenameDelay;
|
||||
Param<unsigned> renameWidth;
|
||||
|
||||
Param<unsigned> commitToIEWDelay;
|
||||
Param<unsigned> renameToIEWDelay;
|
||||
Param<unsigned> issueToExecuteDelay;
|
||||
Param<unsigned> dispatchWidth;
|
||||
Param<unsigned> issueWidth;
|
||||
Param<unsigned> wbWidth;
|
||||
Param<unsigned> wbDepth;
|
||||
SimObjectParam<FUPool *> fuPool;
|
||||
|
||||
Param<unsigned> iewToCommitDelay;
|
||||
Param<unsigned> renameToROBDelay;
|
||||
Param<unsigned> commitWidth;
|
||||
Param<unsigned> squashWidth;
|
||||
Param<Tick> trapLatency;
|
||||
|
||||
Param<unsigned> backComSize;
|
||||
Param<unsigned> forwardComSize;
|
||||
|
||||
Param<std::string> predType;
|
||||
Param<unsigned> localPredictorSize;
|
||||
Param<unsigned> localCtrBits;
|
||||
Param<unsigned> localHistoryTableSize;
|
||||
Param<unsigned> localHistoryBits;
|
||||
Param<unsigned> globalPredictorSize;
|
||||
Param<unsigned> globalCtrBits;
|
||||
Param<unsigned> globalHistoryBits;
|
||||
Param<unsigned> choicePredictorSize;
|
||||
Param<unsigned> choiceCtrBits;
|
||||
|
||||
Param<unsigned> BTBEntries;
|
||||
Param<unsigned> BTBTagSize;
|
||||
|
||||
Param<unsigned> RASSize;
|
||||
|
||||
Param<unsigned> LQEntries;
|
||||
Param<unsigned> SQEntries;
|
||||
Param<unsigned> LFSTSize;
|
||||
Param<unsigned> SSITSize;
|
||||
|
||||
Param<unsigned> numPhysIntRegs;
|
||||
Param<unsigned> numPhysFloatRegs;
|
||||
Param<unsigned> numIQEntries;
|
||||
Param<unsigned> numROBEntries;
|
||||
|
||||
Param<unsigned> smtNumFetchingThreads;
|
||||
Param<std::string> smtFetchPolicy;
|
||||
Param<std::string> smtLSQPolicy;
|
||||
Param<unsigned> smtLSQThreshold;
|
||||
Param<std::string> smtIQPolicy;
|
||||
Param<unsigned> smtIQThreshold;
|
||||
Param<std::string> smtROBPolicy;
|
||||
Param<unsigned> smtROBThreshold;
|
||||
Param<std::string> smtCommitPolicy;
|
||||
|
||||
Param<unsigned> instShiftAmt;
|
||||
|
||||
Param<bool> defer_registration;
|
||||
|
||||
Param<bool> function_trace;
|
||||
Param<Tick> function_trace_start;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
INIT_PARAM(clock, "clock speed"),
|
||||
INIT_PARAM_DFLT(phase, "clock phase", 0),
|
||||
INIT_PARAM(numThreads, "number of HW thread contexts"),
|
||||
INIT_PARAM(cpu_id, "processor ID"),
|
||||
INIT_PARAM_DFLT(activity, "Initial activity count", 0),
|
||||
|
||||
#if FULL_SYSTEM
|
||||
INIT_PARAM(system, "System object"),
|
||||
INIT_PARAM(itb, "Instruction translation buffer"),
|
||||
INIT_PARAM(dtb, "Data translation buffer"),
|
||||
INIT_PARAM(profile, ""),
|
||||
|
||||
INIT_PARAM(do_quiesce, ""),
|
||||
INIT_PARAM(do_checkpoint_insts, ""),
|
||||
INIT_PARAM(do_statistics_insts, ""),
|
||||
#else
|
||||
INIT_PARAM(workload, "Processes to run"),
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
INIT_PARAM_DFLT(checker, "Checker CPU", NULL),
|
||||
|
||||
INIT_PARAM_DFLT(max_insts_any_thread,
|
||||
"Terminate when any thread reaches this inst count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_insts_all_threads,
|
||||
"Terminate when all threads have reached"
|
||||
"this inst count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_loads_any_thread,
|
||||
"Terminate when any thread reaches this load count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_loads_all_threads,
|
||||
"Terminate when all threads have reached this load"
|
||||
"count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(progress_interval, "Progress interval", 0),
|
||||
|
||||
INIT_PARAM_DFLT(cachePorts, "Cache Ports", 200),
|
||||
|
||||
INIT_PARAM(decodeToFetchDelay, "Decode to fetch delay"),
|
||||
INIT_PARAM(renameToFetchDelay, "Rename to fetch delay"),
|
||||
INIT_PARAM(iewToFetchDelay, "Issue/Execute/Writeback to fetch"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToFetchDelay, "Commit to fetch delay"),
|
||||
INIT_PARAM(fetchWidth, "Fetch width"),
|
||||
INIT_PARAM(renameToDecodeDelay, "Rename to decode delay"),
|
||||
INIT_PARAM(iewToDecodeDelay, "Issue/Execute/Writeback to decode"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToDecodeDelay, "Commit to decode delay"),
|
||||
INIT_PARAM(fetchToDecodeDelay, "Fetch to decode delay"),
|
||||
INIT_PARAM(decodeWidth, "Decode width"),
|
||||
|
||||
INIT_PARAM(iewToRenameDelay, "Issue/Execute/Writeback to rename"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToRenameDelay, "Commit to rename delay"),
|
||||
INIT_PARAM(decodeToRenameDelay, "Decode to rename delay"),
|
||||
INIT_PARAM(renameWidth, "Rename width"),
|
||||
|
||||
INIT_PARAM(commitToIEWDelay, "Commit to "
|
||||
"Issue/Execute/Writeback delay"),
|
||||
INIT_PARAM(renameToIEWDelay, "Rename to "
|
||||
"Issue/Execute/Writeback delay"),
|
||||
INIT_PARAM(issueToExecuteDelay, "Issue to execute delay (internal"
|
||||
"to the IEW stage)"),
|
||||
INIT_PARAM(dispatchWidth, "Dispatch width"),
|
||||
INIT_PARAM(issueWidth, "Issue width"),
|
||||
INIT_PARAM(wbWidth, "Writeback width"),
|
||||
INIT_PARAM(wbDepth, "Writeback depth (number of cycles it can buffer)"),
|
||||
INIT_PARAM_DFLT(fuPool, "Functional unit pool", NULL),
|
||||
|
||||
INIT_PARAM(iewToCommitDelay, "Issue/Execute/Writeback to commit "
|
||||
"delay"),
|
||||
INIT_PARAM(renameToROBDelay, "Rename to reorder buffer delay"),
|
||||
INIT_PARAM(commitWidth, "Commit width"),
|
||||
INIT_PARAM(squashWidth, "Squash width"),
|
||||
INIT_PARAM_DFLT(trapLatency, "Number of cycles before the trap is handled", 6),
|
||||
|
||||
INIT_PARAM(backComSize, "Time buffer size for backwards communication"),
|
||||
INIT_PARAM(forwardComSize, "Time buffer size for forward communication"),
|
||||
|
||||
INIT_PARAM(predType, "Type of branch predictor ('local', 'tournament')"),
|
||||
INIT_PARAM(localPredictorSize, "Size of local predictor"),
|
||||
INIT_PARAM(localCtrBits, "Bits per counter"),
|
||||
INIT_PARAM(localHistoryTableSize, "Size of local history table"),
|
||||
INIT_PARAM(localHistoryBits, "Bits for the local history"),
|
||||
INIT_PARAM(globalPredictorSize, "Size of global predictor"),
|
||||
INIT_PARAM(globalCtrBits, "Bits per counter"),
|
||||
INIT_PARAM(globalHistoryBits, "Bits of history"),
|
||||
INIT_PARAM(choicePredictorSize, "Size of choice predictor"),
|
||||
INIT_PARAM(choiceCtrBits, "Bits of choice counters"),
|
||||
|
||||
INIT_PARAM(BTBEntries, "Number of BTB entries"),
|
||||
INIT_PARAM(BTBTagSize, "Size of the BTB tags, in bits"),
|
||||
|
||||
INIT_PARAM(RASSize, "RAS size"),
|
||||
|
||||
INIT_PARAM(LQEntries, "Number of load queue entries"),
|
||||
INIT_PARAM(SQEntries, "Number of store queue entries"),
|
||||
INIT_PARAM(LFSTSize, "Last fetched store table size"),
|
||||
INIT_PARAM(SSITSize, "Store set ID table size"),
|
||||
|
||||
INIT_PARAM(numPhysIntRegs, "Number of physical integer registers"),
|
||||
INIT_PARAM(numPhysFloatRegs, "Number of physical floating point "
|
||||
"registers"),
|
||||
INIT_PARAM(numIQEntries, "Number of instruction queue entries"),
|
||||
INIT_PARAM(numROBEntries, "Number of reorder buffer entries"),
|
||||
|
||||
INIT_PARAM_DFLT(smtNumFetchingThreads, "SMT Number of Fetching Threads", 1),
|
||||
INIT_PARAM_DFLT(smtFetchPolicy, "SMT Fetch Policy", "SingleThread"),
|
||||
INIT_PARAM_DFLT(smtLSQPolicy, "SMT LSQ Sharing Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtLSQThreshold,"SMT LSQ Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtIQPolicy, "SMT IQ Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtIQThreshold, "SMT IQ Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtROBPolicy, "SMT ROB Sharing Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtROBThreshold,"SMT ROB Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtCommitPolicy,"SMT Commit Fetch Policy", "RoundRobin"),
|
||||
|
||||
INIT_PARAM(instShiftAmt, "Number of bits to shift instructions by"),
|
||||
INIT_PARAM(defer_registration, "defer system registration (for sampling)"),
|
||||
|
||||
INIT_PARAM(function_trace, "Enable function trace"),
|
||||
INIT_PARAM(function_trace_start, "Cycle to start function trace")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||
|
||||
CREATE_SIM_OBJECT(DerivO3CPU)
|
||||
DerivO3CPU *
|
||||
DerivO3CPUParams::create()
|
||||
{
|
||||
DerivO3CPU *cpu;
|
||||
|
||||
|
@ -294,8 +59,7 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
|||
// In non-full-system mode, we infer the number of threads from
|
||||
// the workload if it's not explicitly specified.
|
||||
int actual_num_threads =
|
||||
(numThreads.isValid() && numThreads >= workload.size()) ?
|
||||
numThreads : workload.size();
|
||||
(numThreads >= workload.size()) ? numThreads : workload.size();
|
||||
|
||||
if (workload.size() == 0) {
|
||||
fatal("Must specify at least one workload!");
|
||||
|
@ -307,7 +71,7 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
|||
params->clock = clock;
|
||||
params->phase = phase;
|
||||
|
||||
params->name = getInstanceName();
|
||||
params->name = name;
|
||||
params->numberOfThreads = actual_num_threads;
|
||||
params->cpu_id = cpu_id;
|
||||
params->activity = activity;
|
||||
|
@ -325,7 +89,9 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
|||
params->workload = workload;
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
#if USE_CHECKER
|
||||
params->checker = checker;
|
||||
#endif
|
||||
|
||||
params->max_insts_any_thread = max_insts_any_thread;
|
||||
params->max_insts_all_threads = max_insts_all_threads;
|
||||
|
@ -429,6 +195,3 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
|||
|
||||
return cpu;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("DerivO3CPU", DerivO3CPU)
|
||||
|
||||
|
|
|
@ -25,43 +25,35 @@
|
|||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* Authors: Steve Reinhardt
|
||||
* Nathan Binkert
|
||||
* Authors: Nathan Binkert
|
||||
*/
|
||||
|
||||
#ifndef __CPU__OP_CLASS_HH__
|
||||
#define __CPU__OP_CLASS_HH__
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Definition of operation classes.
|
||||
*/
|
||||
#include "enums/OpClass.hh"
|
||||
|
||||
/**
|
||||
* Instruction operation classes. These classes are used for
|
||||
* assigning instructions to functional units.
|
||||
/*
|
||||
* Do a bunch of wonky stuff to maintain backward compatability so I
|
||||
* don't have to change code in a zillion places.
|
||||
*/
|
||||
enum OpClass {
|
||||
No_OpClass = 0, ///< Instruction does not use a functional unit
|
||||
IntAluOp, ///< Integer ALU operaton (add/sub/logical)
|
||||
IntMultOp, ///< Integer multiply
|
||||
IntDivOp, ///< Integer divide
|
||||
FloatAddOp, ///< Floating point add/subtract
|
||||
FloatCmpOp, ///< Floating point comparison
|
||||
FloatCvtOp, ///< Floating point<->integer conversion
|
||||
FloatMultOp, ///< Floating point multiply
|
||||
FloatDivOp, ///< Floating point divide
|
||||
FloatSqrtOp, ///< Floating point square root
|
||||
MemReadOp, ///< Memory read port
|
||||
MemWriteOp, ///< Memory write port
|
||||
IprAccessOp, ///< Internal Processor Register read/write port
|
||||
InstPrefetchOp, ///< Instruction prefetch port (on I-cache)
|
||||
Num_OpClasses ///< Total number of operation classes
|
||||
};
|
||||
using Enums::OpClass;
|
||||
using Enums::No_OpClass;
|
||||
using Enums::Num_OpClass;
|
||||
|
||||
/**
|
||||
* Array mapping OpClass enum values to strings. Defined in op_class.cc.
|
||||
*/
|
||||
extern const char *opClassStrings[Num_OpClasses];
|
||||
const OpClass IntAluOp = Enums::IntAlu;
|
||||
const OpClass IntMultOp = Enums::IntMult;
|
||||
const OpClass IntDivOp = Enums::IntDiv;
|
||||
const OpClass FloatAddOp = Enums::FloatAdd;
|
||||
const OpClass FloatCmpOp = Enums::FloatCmp;
|
||||
const OpClass FloatCvtOp = Enums::FloatCvt;
|
||||
const OpClass FloatMultOp = Enums::FloatMult;
|
||||
const OpClass FloatDivOp = Enums::FloatDiv;
|
||||
const OpClass FloatSqrtOp = Enums::FloatSqrt;
|
||||
const OpClass MemReadOp = Enums::MemRead;
|
||||
const OpClass MemWriteOp = Enums::MemWrite;
|
||||
const OpClass IprAccessOp = Enums::IprAccess;
|
||||
const OpClass InstPrefetchOp = Enums::InstPrefetch;
|
||||
const OpClass Num_OpClasses = Num_OpClass;
|
||||
|
||||
#endif // __CPU__OP_CLASS_HH__
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include "cpu/inst_seq.hh"
|
||||
#include "cpu/ozone/dyn_inst.hh"
|
||||
#include "cpu/ozone/ozone_impl.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/OzoneChecker.hh"
|
||||
#include "sim/process.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
|
@ -59,73 +59,11 @@ class OzoneChecker :
|
|||
//
|
||||
// CheckerCPU Simulation Object
|
||||
//
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(OzoneChecker)
|
||||
|
||||
Param<Counter> max_insts_any_thread;
|
||||
Param<Counter> max_insts_all_threads;
|
||||
Param<Counter> max_loads_any_thread;
|
||||
Param<Counter> max_loads_all_threads;
|
||||
Param<Tick> progress_interval;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
SimObjectParam<TheISA::ITB *> itb;
|
||||
SimObjectParam<TheISA::DTB *> dtb;
|
||||
SimObjectParam<System *> system;
|
||||
Param<int> cpu_id;
|
||||
Param<Tick> profile;
|
||||
#else
|
||||
SimObjectParam<Process *> workload;
|
||||
#endif // FULL_SYSTEM
|
||||
Param<int> clock;
|
||||
|
||||
Param<bool> defer_registration;
|
||||
Param<bool> exitOnError;
|
||||
Param<bool> updateOnError;
|
||||
Param<bool> warnOnlyOnLoadError;
|
||||
Param<bool> function_trace;
|
||||
Param<Tick> function_trace_start;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(OzoneChecker)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(OzoneChecker)
|
||||
|
||||
INIT_PARAM(max_insts_any_thread,
|
||||
"terminate when any thread reaches this inst count"),
|
||||
INIT_PARAM(max_insts_all_threads,
|
||||
"terminate when all threads have reached this inst count"),
|
||||
INIT_PARAM(max_loads_any_thread,
|
||||
"terminate when any thread reaches this load count"),
|
||||
INIT_PARAM(max_loads_all_threads,
|
||||
"terminate when all threads have reached this load count"),
|
||||
INIT_PARAM_DFLT(progress_interval, "CPU Progress Interval", 0),
|
||||
|
||||
#if FULL_SYSTEM
|
||||
INIT_PARAM(itb, "Instruction TLB"),
|
||||
INIT_PARAM(dtb, "Data TLB"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(cpu_id, "processor ID"),
|
||||
INIT_PARAM(profile, ""),
|
||||
#else
|
||||
INIT_PARAM(workload, "processes to run"),
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
INIT_PARAM(clock, "clock speed"),
|
||||
|
||||
INIT_PARAM(defer_registration, "defer system registration (for sampling)"),
|
||||
INIT_PARAM(exitOnError, "exit on error"),
|
||||
INIT_PARAM(updateOnError, "Update the checker with the main CPU's state on error"),
|
||||
INIT_PARAM_DFLT(warnOnlyOnLoadError, "warn, but don't exit, if a load "
|
||||
"result errors", false),
|
||||
INIT_PARAM(function_trace, "Enable function trace"),
|
||||
INIT_PARAM(function_trace_start, "Cycle to start function trace")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(OzoneChecker)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(OzoneChecker)
|
||||
OzoneChecker *
|
||||
OzoneCheckerParams::create()
|
||||
{
|
||||
OzoneChecker::Params *params = new OzoneChecker::Params();
|
||||
params->name = getInstanceName();
|
||||
params->name = name;
|
||||
params->numberOfThreads = 1;
|
||||
params->max_insts_any_thread = 0;
|
||||
params->max_insts_all_threads = 0;
|
||||
|
@ -162,5 +100,3 @@ CREATE_SIM_OBJECT(OzoneChecker)
|
|||
OzoneChecker *cpu = new OzoneChecker(params);
|
||||
return cpu;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("OzoneChecker", OzoneChecker)
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include "cpu/ozone/cpu.hh"
|
||||
#include "cpu/ozone/ozone_impl.hh"
|
||||
#include "cpu/ozone/simple_params.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/DerivOzoneCPU.hh"
|
||||
#include "sim/process.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
|
@ -52,271 +52,8 @@ class DerivOzoneCPU : public OzoneCPU<OzoneImpl>
|
|||
//
|
||||
// OzoneCPU Simulation Object
|
||||
//
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(DerivOzoneCPU)
|
||||
|
||||
Param<int> clock;
|
||||
Param<int> numThreads;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
SimObjectParam<System *> system;
|
||||
Param<int> cpu_id;
|
||||
SimObjectParam<TheISA::ITB *> itb;
|
||||
SimObjectParam<TheISA::DTB *> dtb;
|
||||
Param<Tick> profile;
|
||||
|
||||
Param<bool> do_quiesce;
|
||||
Param<bool> do_checkpoint_insts;
|
||||
Param<bool> do_statistics_insts;
|
||||
#else
|
||||
SimObjectVectorParam<Process *> workload;
|
||||
//SimObjectParam<PageTable *> page_table;
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
SimObjectParam<BaseCPU *> checker;
|
||||
|
||||
Param<Counter> max_insts_any_thread;
|
||||
Param<Counter> max_insts_all_threads;
|
||||
Param<Counter> max_loads_any_thread;
|
||||
Param<Counter> max_loads_all_threads;
|
||||
Param<Tick> progress_interval;
|
||||
|
||||
//SimObjectParam<BaseCache *> icache;
|
||||
//SimObjectParam<BaseCache *> dcache;
|
||||
|
||||
Param<unsigned> cachePorts;
|
||||
Param<unsigned> width;
|
||||
Param<unsigned> frontEndLatency;
|
||||
Param<unsigned> frontEndWidth;
|
||||
Param<unsigned> backEndLatency;
|
||||
Param<unsigned> backEndWidth;
|
||||
Param<unsigned> backEndSquashLatency;
|
||||
Param<unsigned> maxInstBufferSize;
|
||||
Param<unsigned> numPhysicalRegs;
|
||||
Param<unsigned> maxOutstandingMemOps;
|
||||
|
||||
Param<unsigned> decodeToFetchDelay;
|
||||
Param<unsigned> renameToFetchDelay;
|
||||
Param<unsigned> iewToFetchDelay;
|
||||
Param<unsigned> commitToFetchDelay;
|
||||
Param<unsigned> fetchWidth;
|
||||
|
||||
Param<unsigned> renameToDecodeDelay;
|
||||
Param<unsigned> iewToDecodeDelay;
|
||||
Param<unsigned> commitToDecodeDelay;
|
||||
Param<unsigned> fetchToDecodeDelay;
|
||||
Param<unsigned> decodeWidth;
|
||||
|
||||
Param<unsigned> iewToRenameDelay;
|
||||
Param<unsigned> commitToRenameDelay;
|
||||
Param<unsigned> decodeToRenameDelay;
|
||||
Param<unsigned> renameWidth;
|
||||
|
||||
Param<unsigned> commitToIEWDelay;
|
||||
Param<unsigned> renameToIEWDelay;
|
||||
Param<unsigned> issueToExecuteDelay;
|
||||
Param<unsigned> issueWidth;
|
||||
Param<unsigned> executeWidth;
|
||||
Param<unsigned> executeIntWidth;
|
||||
Param<unsigned> executeFloatWidth;
|
||||
Param<unsigned> executeBranchWidth;
|
||||
Param<unsigned> executeMemoryWidth;
|
||||
|
||||
Param<unsigned> iewToCommitDelay;
|
||||
Param<unsigned> renameToROBDelay;
|
||||
Param<unsigned> commitWidth;
|
||||
Param<unsigned> squashWidth;
|
||||
|
||||
Param<std::string> predType;
|
||||
Param<unsigned> localPredictorSize;
|
||||
Param<unsigned> localCtrBits;
|
||||
Param<unsigned> localHistoryTableSize;
|
||||
Param<unsigned> localHistoryBits;
|
||||
Param<unsigned> globalPredictorSize;
|
||||
Param<unsigned> globalCtrBits;
|
||||
Param<unsigned> globalHistoryBits;
|
||||
Param<unsigned> choicePredictorSize;
|
||||
Param<unsigned> choiceCtrBits;
|
||||
|
||||
Param<unsigned> BTBEntries;
|
||||
Param<unsigned> BTBTagSize;
|
||||
|
||||
Param<unsigned> RASSize;
|
||||
|
||||
Param<unsigned> LQEntries;
|
||||
Param<unsigned> SQEntries;
|
||||
Param<bool> lsqLimits;
|
||||
Param<unsigned> LFSTSize;
|
||||
Param<unsigned> SSITSize;
|
||||
|
||||
Param<unsigned> numPhysIntRegs;
|
||||
Param<unsigned> numPhysFloatRegs;
|
||||
Param<unsigned> numIQEntries;
|
||||
Param<unsigned> numROBEntries;
|
||||
|
||||
Param<bool> decoupledFrontEnd;
|
||||
Param<int> dispatchWidth;
|
||||
Param<int> wbWidth;
|
||||
|
||||
Param<unsigned> smtNumFetchingThreads;
|
||||
Param<std::string> smtFetchPolicy;
|
||||
Param<std::string> smtLSQPolicy;
|
||||
Param<unsigned> smtLSQThreshold;
|
||||
Param<std::string> smtIQPolicy;
|
||||
Param<unsigned> smtIQThreshold;
|
||||
Param<std::string> smtROBPolicy;
|
||||
Param<unsigned> smtROBThreshold;
|
||||
Param<std::string> smtCommitPolicy;
|
||||
|
||||
Param<unsigned> instShiftAmt;
|
||||
|
||||
Param<bool> defer_registration;
|
||||
|
||||
Param<bool> function_trace;
|
||||
Param<Tick> function_trace_start;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(DerivOzoneCPU)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(DerivOzoneCPU)
|
||||
|
||||
INIT_PARAM(clock, "clock speed"),
|
||||
INIT_PARAM(numThreads, "number of HW thread contexts"),
|
||||
|
||||
#if FULL_SYSTEM
|
||||
INIT_PARAM(system, "System object"),
|
||||
INIT_PARAM(cpu_id, "processor ID"),
|
||||
INIT_PARAM(itb, "Instruction translation buffer"),
|
||||
INIT_PARAM(dtb, "Data translation buffer"),
|
||||
INIT_PARAM(profile, ""),
|
||||
INIT_PARAM(do_quiesce, ""),
|
||||
INIT_PARAM(do_checkpoint_insts, ""),
|
||||
INIT_PARAM(do_statistics_insts, ""),
|
||||
#else
|
||||
INIT_PARAM(workload, "Processes to run"),
|
||||
// INIT_PARAM(page_table, "Page table"),
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
INIT_PARAM_DFLT(checker, "Checker CPU", NULL),
|
||||
|
||||
INIT_PARAM_DFLT(max_insts_any_thread,
|
||||
"Terminate when any thread reaches this inst count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_insts_all_threads,
|
||||
"Terminate when all threads have reached"
|
||||
"this inst count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_loads_any_thread,
|
||||
"Terminate when any thread reaches this load count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_loads_all_threads,
|
||||
"Terminate when all threads have reached this load"
|
||||
"count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(progress_interval, "Progress interval", 0),
|
||||
|
||||
// INIT_PARAM_DFLT(icache, "L1 instruction cache", NULL),
|
||||
// INIT_PARAM_DFLT(dcache, "L1 data cache", NULL),
|
||||
|
||||
INIT_PARAM_DFLT(cachePorts, "Cache Ports", 200),
|
||||
INIT_PARAM_DFLT(width, "Width", 1),
|
||||
INIT_PARAM_DFLT(frontEndLatency, "Front end latency", 1),
|
||||
INIT_PARAM_DFLT(frontEndWidth, "Front end width", 1),
|
||||
INIT_PARAM_DFLT(backEndLatency, "Back end latency", 1),
|
||||
INIT_PARAM_DFLT(backEndWidth, "Back end width", 1),
|
||||
INIT_PARAM_DFLT(backEndSquashLatency, "Back end squash latency", 1),
|
||||
INIT_PARAM_DFLT(maxInstBufferSize, "Maximum instruction buffer size", 16),
|
||||
INIT_PARAM(numPhysicalRegs, "Number of physical registers"),
|
||||
INIT_PARAM_DFLT(maxOutstandingMemOps, "Maximum outstanding memory operations", 4),
|
||||
|
||||
INIT_PARAM(decodeToFetchDelay, "Decode to fetch delay"),
|
||||
INIT_PARAM(renameToFetchDelay, "Rename to fetch delay"),
|
||||
INIT_PARAM(iewToFetchDelay, "Issue/Execute/Writeback to fetch"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToFetchDelay, "Commit to fetch delay"),
|
||||
INIT_PARAM(fetchWidth, "Fetch width"),
|
||||
INIT_PARAM(renameToDecodeDelay, "Rename to decode delay"),
|
||||
INIT_PARAM(iewToDecodeDelay, "Issue/Execute/Writeback to decode"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToDecodeDelay, "Commit to decode delay"),
|
||||
INIT_PARAM(fetchToDecodeDelay, "Fetch to decode delay"),
|
||||
INIT_PARAM(decodeWidth, "Decode width"),
|
||||
|
||||
INIT_PARAM(iewToRenameDelay, "Issue/Execute/Writeback to rename"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToRenameDelay, "Commit to rename delay"),
|
||||
INIT_PARAM(decodeToRenameDelay, "Decode to rename delay"),
|
||||
INIT_PARAM(renameWidth, "Rename width"),
|
||||
|
||||
INIT_PARAM(commitToIEWDelay, "Commit to "
|
||||
"Issue/Execute/Writeback delay"),
|
||||
INIT_PARAM(renameToIEWDelay, "Rename to "
|
||||
"Issue/Execute/Writeback delay"),
|
||||
INIT_PARAM(issueToExecuteDelay, "Issue to execute delay (internal"
|
||||
"to the IEW stage)"),
|
||||
INIT_PARAM(issueWidth, "Issue width"),
|
||||
INIT_PARAM(executeWidth, "Execute width"),
|
||||
INIT_PARAM(executeIntWidth, "Integer execute width"),
|
||||
INIT_PARAM(executeFloatWidth, "Floating point execute width"),
|
||||
INIT_PARAM(executeBranchWidth, "Branch execute width"),
|
||||
INIT_PARAM(executeMemoryWidth, "Memory execute width"),
|
||||
|
||||
INIT_PARAM(iewToCommitDelay, "Issue/Execute/Writeback to commit "
|
||||
"delay"),
|
||||
INIT_PARAM(renameToROBDelay, "Rename to reorder buffer delay"),
|
||||
INIT_PARAM(commitWidth, "Commit width"),
|
||||
INIT_PARAM(squashWidth, "Squash width"),
|
||||
|
||||
INIT_PARAM(predType, "Type of branch predictor ('local', 'tournament')"),
|
||||
INIT_PARAM(localPredictorSize, "Size of local predictor"),
|
||||
INIT_PARAM(localCtrBits, "Bits per counter"),
|
||||
INIT_PARAM(localHistoryTableSize, "Size of local history table"),
|
||||
INIT_PARAM(localHistoryBits, "Bits for the local history"),
|
||||
INIT_PARAM(globalPredictorSize, "Size of global predictor"),
|
||||
INIT_PARAM(globalCtrBits, "Bits per counter"),
|
||||
INIT_PARAM(globalHistoryBits, "Bits of history"),
|
||||
INIT_PARAM(choicePredictorSize, "Size of choice predictor"),
|
||||
INIT_PARAM(choiceCtrBits, "Bits of choice counters"),
|
||||
|
||||
INIT_PARAM(BTBEntries, "Number of BTB entries"),
|
||||
INIT_PARAM(BTBTagSize, "Size of the BTB tags, in bits"),
|
||||
|
||||
INIT_PARAM(RASSize, "RAS size"),
|
||||
|
||||
INIT_PARAM(LQEntries, "Number of load queue entries"),
|
||||
INIT_PARAM(SQEntries, "Number of store queue entries"),
|
||||
INIT_PARAM_DFLT(lsqLimits, "LSQ size limits dispatch", true),
|
||||
INIT_PARAM(LFSTSize, "Last fetched store table size"),
|
||||
INIT_PARAM(SSITSize, "Store set ID table size"),
|
||||
|
||||
INIT_PARAM(numPhysIntRegs, "Number of physical integer registers"),
|
||||
INIT_PARAM(numPhysFloatRegs, "Number of physical floating point "
|
||||
"registers"),
|
||||
INIT_PARAM(numIQEntries, "Number of instruction queue entries"),
|
||||
INIT_PARAM(numROBEntries, "Number of reorder buffer entries"),
|
||||
|
||||
INIT_PARAM_DFLT(decoupledFrontEnd, "Decoupled front end", true),
|
||||
INIT_PARAM_DFLT(dispatchWidth, "Dispatch width", 0),
|
||||
INIT_PARAM_DFLT(wbWidth, "Writeback width", 0),
|
||||
|
||||
INIT_PARAM_DFLT(smtNumFetchingThreads, "SMT Number of Fetching Threads", 1),
|
||||
INIT_PARAM_DFLT(smtFetchPolicy, "SMT Fetch Policy", "SingleThread"),
|
||||
INIT_PARAM_DFLT(smtLSQPolicy, "SMT LSQ Sharing Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtLSQThreshold,"SMT LSQ Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtIQPolicy, "SMT IQ Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtIQThreshold, "SMT IQ Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtROBPolicy, "SMT ROB Sharing Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtROBThreshold,"SMT ROB Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtCommitPolicy,"SMT Commit Fetch Policy", "RoundRobin"),
|
||||
|
||||
INIT_PARAM(instShiftAmt, "Number of bits to shift instructions by"),
|
||||
INIT_PARAM(defer_registration, "defer system registration (for sampling)"),
|
||||
|
||||
INIT_PARAM(function_trace, "Enable function trace"),
|
||||
INIT_PARAM(function_trace_start, "Cycle to start function trace")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(DerivOzoneCPU)
|
||||
|
||||
CREATE_SIM_OBJECT(DerivOzoneCPU)
|
||||
DerivOzoneCPU *
|
||||
DerivOzoneCPUParams::create()
|
||||
{
|
||||
DerivOzoneCPU *cpu;
|
||||
|
||||
|
@ -339,7 +76,7 @@ CREATE_SIM_OBJECT(DerivOzoneCPU)
|
|||
|
||||
params->clock = clock;
|
||||
|
||||
params->name = getInstanceName();
|
||||
params->name = name;
|
||||
params->numberOfThreads = actual_num_threads;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
|
@ -464,5 +201,3 @@ CREATE_SIM_OBJECT(DerivOzoneCPU)
|
|||
|
||||
return cpu;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("DerivOzoneCPU", DerivOzoneCPU)
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#include "cpu/ozone/simple_impl.hh"
|
||||
#include "cpu/ozone/simple_params.hh"
|
||||
#include "mem/cache/base_cache.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/SimpleOzoneCPU.hh"
|
||||
#include "sim/process.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
|
@ -55,258 +55,8 @@ class SimpleOzoneCPU : public OzoneCPU<SimpleImpl>
|
|||
//
|
||||
// OzoneCPU Simulation Object
|
||||
//
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(SimpleOzoneCPU)
|
||||
|
||||
Param<int> clock;
|
||||
Param<int> numThreads;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
SimObjectParam<System *> system;
|
||||
Param<int> cpu_id;
|
||||
SimObjectParam<TheISA::ITB *> itb;
|
||||
SimObjectParam<TheISA::DTB *> dtb;
|
||||
#else
|
||||
SimObjectVectorParam<Process *> workload;
|
||||
//SimObjectParam<PageTable *> page_table;
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
SimObjectParam<FunctionalMemory *> mem;
|
||||
|
||||
SimObjectParam<BaseCPU *> checker;
|
||||
|
||||
Param<Counter> max_insts_any_thread;
|
||||
Param<Counter> max_insts_all_threads;
|
||||
Param<Counter> max_loads_any_thread;
|
||||
Param<Counter> max_loads_all_threads;
|
||||
|
||||
SimObjectParam<BaseCache *> icache;
|
||||
SimObjectParam<BaseCache *> dcache;
|
||||
|
||||
Param<unsigned> cachePorts;
|
||||
Param<unsigned> width;
|
||||
Param<unsigned> frontEndWidth;
|
||||
Param<unsigned> backEndWidth;
|
||||
Param<unsigned> backEndSquashLatency;
|
||||
Param<unsigned> backEndLatency;
|
||||
Param<unsigned> maxInstBufferSize;
|
||||
Param<unsigned> numPhysicalRegs;
|
||||
|
||||
Param<unsigned> decodeToFetchDelay;
|
||||
Param<unsigned> renameToFetchDelay;
|
||||
Param<unsigned> iewToFetchDelay;
|
||||
Param<unsigned> commitToFetchDelay;
|
||||
Param<unsigned> fetchWidth;
|
||||
|
||||
Param<unsigned> renameToDecodeDelay;
|
||||
Param<unsigned> iewToDecodeDelay;
|
||||
Param<unsigned> commitToDecodeDelay;
|
||||
Param<unsigned> fetchToDecodeDelay;
|
||||
Param<unsigned> decodeWidth;
|
||||
|
||||
Param<unsigned> iewToRenameDelay;
|
||||
Param<unsigned> commitToRenameDelay;
|
||||
Param<unsigned> decodeToRenameDelay;
|
||||
Param<unsigned> renameWidth;
|
||||
|
||||
Param<unsigned> commitToIEWDelay;
|
||||
Param<unsigned> renameToIEWDelay;
|
||||
Param<unsigned> issueToExecuteDelay;
|
||||
Param<unsigned> issueWidth;
|
||||
Param<unsigned> executeWidth;
|
||||
Param<unsigned> executeIntWidth;
|
||||
Param<unsigned> executeFloatWidth;
|
||||
Param<unsigned> executeBranchWidth;
|
||||
Param<unsigned> executeMemoryWidth;
|
||||
|
||||
Param<unsigned> iewToCommitDelay;
|
||||
Param<unsigned> renameToROBDelay;
|
||||
Param<unsigned> commitWidth;
|
||||
Param<unsigned> squashWidth;
|
||||
|
||||
Param<std::string> predType;
|
||||
Param<unsigned> localPredictorSize;
|
||||
Param<unsigned> localCtrBits;
|
||||
Param<unsigned> localHistoryTableSize;
|
||||
Param<unsigned> localHistoryBits;
|
||||
Param<unsigned> globalPredictorSize;
|
||||
Param<unsigned> globalCtrBits;
|
||||
Param<unsigned> globalHistoryBits;
|
||||
Param<unsigned> choicePredictorSize;
|
||||
Param<unsigned> choiceCtrBits;
|
||||
|
||||
Param<unsigned> BTBEntries;
|
||||
Param<unsigned> BTBTagSize;
|
||||
|
||||
Param<unsigned> RASSize;
|
||||
|
||||
Param<unsigned> LQEntries;
|
||||
Param<unsigned> SQEntries;
|
||||
Param<unsigned> LFSTSize;
|
||||
Param<unsigned> SSITSize;
|
||||
|
||||
Param<unsigned> numPhysIntRegs;
|
||||
Param<unsigned> numPhysFloatRegs;
|
||||
Param<unsigned> numIQEntries;
|
||||
Param<unsigned> numROBEntries;
|
||||
|
||||
Param<bool> decoupledFrontEnd;
|
||||
Param<int> dispatchWidth;
|
||||
Param<int> wbWidth;
|
||||
|
||||
Param<unsigned> smtNumFetchingThreads;
|
||||
Param<std::string> smtFetchPolicy;
|
||||
Param<std::string> smtLSQPolicy;
|
||||
Param<unsigned> smtLSQThreshold;
|
||||
Param<std::string> smtIQPolicy;
|
||||
Param<unsigned> smtIQThreshold;
|
||||
Param<std::string> smtROBPolicy;
|
||||
Param<unsigned> smtROBThreshold;
|
||||
Param<std::string> smtCommitPolicy;
|
||||
|
||||
Param<unsigned> instShiftAmt;
|
||||
|
||||
Param<bool> defer_registration;
|
||||
|
||||
Param<bool> function_trace;
|
||||
Param<Tick> function_trace_start;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(SimpleOzoneCPU)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(SimpleOzoneCPU)
|
||||
|
||||
INIT_PARAM(clock, "clock speed"),
|
||||
INIT_PARAM(numThreads, "number of HW thread contexts"),
|
||||
|
||||
#if FULL_SYSTEM
|
||||
INIT_PARAM(system, "System object"),
|
||||
INIT_PARAM(cpu_id, "processor ID"),
|
||||
INIT_PARAM(itb, "Instruction translation buffer"),
|
||||
INIT_PARAM(dtb, "Data translation buffer"),
|
||||
#else
|
||||
INIT_PARAM(workload, "Processes to run"),
|
||||
// INIT_PARAM(page_table, "Page table"),
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
INIT_PARAM_DFLT(mem, "Memory", NULL),
|
||||
|
||||
INIT_PARAM_DFLT(checker, "Checker CPU", NULL),
|
||||
|
||||
INIT_PARAM_DFLT(max_insts_any_thread,
|
||||
"Terminate when any thread reaches this inst count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_insts_all_threads,
|
||||
"Terminate when all threads have reached"
|
||||
"this inst count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_loads_any_thread,
|
||||
"Terminate when any thread reaches this load count",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_loads_all_threads,
|
||||
"Terminate when all threads have reached this load"
|
||||
"count",
|
||||
0),
|
||||
|
||||
INIT_PARAM_DFLT(icache, "L1 instruction cache", NULL),
|
||||
INIT_PARAM_DFLT(dcache, "L1 data cache", NULL),
|
||||
|
||||
INIT_PARAM_DFLT(cachePorts, "Cache Ports", 200),
|
||||
INIT_PARAM_DFLT(width, "Width", 1),
|
||||
INIT_PARAM_DFLT(frontEndWidth, "Front end width", 1),
|
||||
INIT_PARAM_DFLT(backEndWidth, "Back end width", 1),
|
||||
INIT_PARAM_DFLT(backEndSquashLatency, "Back end squash latency", 1),
|
||||
INIT_PARAM_DFLT(backEndLatency, "Back end latency", 1),
|
||||
INIT_PARAM_DFLT(maxInstBufferSize, "Maximum instruction buffer size", 16),
|
||||
INIT_PARAM(numPhysicalRegs, "Number of physical registers"),
|
||||
|
||||
INIT_PARAM(decodeToFetchDelay, "Decode to fetch delay"),
|
||||
INIT_PARAM(renameToFetchDelay, "Rename to fetch delay"),
|
||||
INIT_PARAM(iewToFetchDelay, "Issue/Execute/Writeback to fetch"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToFetchDelay, "Commit to fetch delay"),
|
||||
INIT_PARAM(fetchWidth, "Fetch width"),
|
||||
INIT_PARAM(renameToDecodeDelay, "Rename to decode delay"),
|
||||
INIT_PARAM(iewToDecodeDelay, "Issue/Execute/Writeback to decode"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToDecodeDelay, "Commit to decode delay"),
|
||||
INIT_PARAM(fetchToDecodeDelay, "Fetch to decode delay"),
|
||||
INIT_PARAM(decodeWidth, "Decode width"),
|
||||
|
||||
INIT_PARAM(iewToRenameDelay, "Issue/Execute/Writeback to rename"
|
||||
"delay"),
|
||||
INIT_PARAM(commitToRenameDelay, "Commit to rename delay"),
|
||||
INIT_PARAM(decodeToRenameDelay, "Decode to rename delay"),
|
||||
INIT_PARAM(renameWidth, "Rename width"),
|
||||
|
||||
INIT_PARAM(commitToIEWDelay, "Commit to "
|
||||
"Issue/Execute/Writeback delay"),
|
||||
INIT_PARAM(renameToIEWDelay, "Rename to "
|
||||
"Issue/Execute/Writeback delay"),
|
||||
INIT_PARAM(issueToExecuteDelay, "Issue to execute delay (internal"
|
||||
"to the IEW stage)"),
|
||||
INIT_PARAM(issueWidth, "Issue width"),
|
||||
INIT_PARAM(executeWidth, "Execute width"),
|
||||
INIT_PARAM(executeIntWidth, "Integer execute width"),
|
||||
INIT_PARAM(executeFloatWidth, "Floating point execute width"),
|
||||
INIT_PARAM(executeBranchWidth, "Branch execute width"),
|
||||
INIT_PARAM(executeMemoryWidth, "Memory execute width"),
|
||||
|
||||
INIT_PARAM(iewToCommitDelay, "Issue/Execute/Writeback to commit "
|
||||
"delay"),
|
||||
INIT_PARAM(renameToROBDelay, "Rename to reorder buffer delay"),
|
||||
INIT_PARAM(commitWidth, "Commit width"),
|
||||
INIT_PARAM(squashWidth, "Squash width"),
|
||||
|
||||
INIT_PARAM(predType, "Type of branch predictor ('local', 'tournament')"),
|
||||
INIT_PARAM(localPredictorSize, "Size of local predictor"),
|
||||
INIT_PARAM(localCtrBits, "Bits per counter"),
|
||||
INIT_PARAM(localHistoryTableSize, "Size of local history table"),
|
||||
INIT_PARAM(localHistoryBits, "Bits for the local history"),
|
||||
INIT_PARAM(globalPredictorSize, "Size of global predictor"),
|
||||
INIT_PARAM(globalCtrBits, "Bits per counter"),
|
||||
INIT_PARAM(globalHistoryBits, "Bits of history"),
|
||||
INIT_PARAM(choicePredictorSize, "Size of choice predictor"),
|
||||
INIT_PARAM(choiceCtrBits, "Bits of choice counters"),
|
||||
|
||||
INIT_PARAM(BTBEntries, "Number of BTB entries"),
|
||||
INIT_PARAM(BTBTagSize, "Size of the BTB tags, in bits"),
|
||||
|
||||
INIT_PARAM(RASSize, "RAS size"),
|
||||
|
||||
INIT_PARAM(LQEntries, "Number of load queue entries"),
|
||||
INIT_PARAM(SQEntries, "Number of store queue entries"),
|
||||
INIT_PARAM(LFSTSize, "Last fetched store table size"),
|
||||
INIT_PARAM(SSITSize, "Store set ID table size"),
|
||||
|
||||
INIT_PARAM(numPhysIntRegs, "Number of physical integer registers"),
|
||||
INIT_PARAM(numPhysFloatRegs, "Number of physical floating point "
|
||||
"registers"),
|
||||
INIT_PARAM(numIQEntries, "Number of instruction queue entries"),
|
||||
INIT_PARAM(numROBEntries, "Number of reorder buffer entries"),
|
||||
|
||||
INIT_PARAM_DFLT(decoupledFrontEnd, "Decoupled front end", true),
|
||||
INIT_PARAM_DFLT(dispatchWidth, "Dispatch width", 0),
|
||||
INIT_PARAM_DFLT(wbWidth, "Writeback width", 0),
|
||||
|
||||
INIT_PARAM_DFLT(smtNumFetchingThreads, "SMT Number of Fetching Threads", 1),
|
||||
INIT_PARAM_DFLT(smtFetchPolicy, "SMT Fetch Policy", "SingleThread"),
|
||||
INIT_PARAM_DFLT(smtLSQPolicy, "SMT LSQ Sharing Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtLSQThreshold,"SMT LSQ Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtIQPolicy, "SMT IQ Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtIQThreshold, "SMT IQ Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtROBPolicy, "SMT ROB Sharing Policy", "Partitioned"),
|
||||
INIT_PARAM_DFLT(smtROBThreshold,"SMT ROB Threshold", 100),
|
||||
INIT_PARAM_DFLT(smtCommitPolicy,"SMT Commit Fetch Policy", "RoundRobin"),
|
||||
|
||||
INIT_PARAM(instShiftAmt, "Number of bits to shift instructions by"),
|
||||
INIT_PARAM(defer_registration, "defer system registration (for sampling)"),
|
||||
|
||||
INIT_PARAM(function_trace, "Enable function trace"),
|
||||
INIT_PARAM(function_trace_start, "Cycle to start function trace")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(SimpleOzoneCPU)
|
||||
|
||||
CREATE_SIM_OBJECT(SimpleOzoneCPU)
|
||||
SimpleOzoneCPU *
|
||||
SimpleOzoneCPUParams::create()
|
||||
{
|
||||
SimpleOzoneCPU *cpu;
|
||||
|
||||
|
@ -329,7 +79,7 @@ CREATE_SIM_OBJECT(SimpleOzoneCPU)
|
|||
|
||||
params->clock = clock;
|
||||
|
||||
params->name = getInstanceName();
|
||||
params->name = name;
|
||||
params->numberOfThreads = actual_num_threads;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
|
@ -447,6 +197,3 @@ CREATE_SIM_OBJECT(SimpleOzoneCPU)
|
|||
|
||||
return cpu;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("SimpleOzoneCPU", SimpleOzoneCPU)
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#include "cpu/simple/atomic.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/AtomicSimpleCPU.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -198,7 +198,7 @@ void
|
|||
AtomicSimpleCPU::resume()
|
||||
{
|
||||
if (_status != SwitchedOut && _status != Idle) {
|
||||
assert(system->getMemoryMode() == System::Atomic);
|
||||
assert(system->getMemoryMode() == Enums::atomic);
|
||||
|
||||
changeState(SimObject::Running);
|
||||
if (thread->status() == ThreadContext::Active) {
|
||||
|
@ -570,79 +570,11 @@ AtomicSimpleCPU::tick()
|
|||
//
|
||||
// AtomicSimpleCPU Simulation Object
|
||||
//
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(AtomicSimpleCPU)
|
||||
|
||||
Param<Counter> max_insts_any_thread;
|
||||
Param<Counter> max_insts_all_threads;
|
||||
Param<Counter> max_loads_any_thread;
|
||||
Param<Counter> max_loads_all_threads;
|
||||
Param<Tick> progress_interval;
|
||||
SimObjectParam<System *> system;
|
||||
Param<int> cpu_id;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
SimObjectParam<TheISA::ITB *> itb;
|
||||
SimObjectParam<TheISA::DTB *> dtb;
|
||||
Param<Tick> profile;
|
||||
|
||||
Param<bool> do_quiesce;
|
||||
Param<bool> do_checkpoint_insts;
|
||||
Param<bool> do_statistics_insts;
|
||||
#else
|
||||
SimObjectParam<Process *> workload;
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
Param<int> clock;
|
||||
Param<int> phase;
|
||||
|
||||
Param<bool> defer_registration;
|
||||
Param<int> width;
|
||||
Param<bool> function_trace;
|
||||
Param<Tick> function_trace_start;
|
||||
Param<bool> simulate_stalls;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(AtomicSimpleCPU)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(AtomicSimpleCPU)
|
||||
|
||||
INIT_PARAM(max_insts_any_thread,
|
||||
"terminate when any thread reaches this inst count"),
|
||||
INIT_PARAM(max_insts_all_threads,
|
||||
"terminate when all threads have reached this inst count"),
|
||||
INIT_PARAM(max_loads_any_thread,
|
||||
"terminate when any thread reaches this load count"),
|
||||
INIT_PARAM(max_loads_all_threads,
|
||||
"terminate when all threads have reached this load count"),
|
||||
INIT_PARAM(progress_interval, "Progress interval"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(cpu_id, "processor ID"),
|
||||
|
||||
#if FULL_SYSTEM
|
||||
INIT_PARAM(itb, "Instruction TLB"),
|
||||
INIT_PARAM(dtb, "Data TLB"),
|
||||
INIT_PARAM(profile, ""),
|
||||
INIT_PARAM(do_quiesce, ""),
|
||||
INIT_PARAM(do_checkpoint_insts, ""),
|
||||
INIT_PARAM(do_statistics_insts, ""),
|
||||
#else
|
||||
INIT_PARAM(workload, "processes to run"),
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
INIT_PARAM(clock, "clock speed"),
|
||||
INIT_PARAM_DFLT(phase, "clock phase", 0),
|
||||
INIT_PARAM(defer_registration, "defer system registration (for sampling)"),
|
||||
INIT_PARAM(width, "cpu width"),
|
||||
INIT_PARAM(function_trace, "Enable function trace"),
|
||||
INIT_PARAM(function_trace_start, "Cycle to start function trace"),
|
||||
INIT_PARAM(simulate_stalls, "Simulate cache stall cycles")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(AtomicSimpleCPU)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(AtomicSimpleCPU)
|
||||
AtomicSimpleCPU *
|
||||
AtomicSimpleCPUParams::create()
|
||||
{
|
||||
AtomicSimpleCPU::Params *params = new AtomicSimpleCPU::Params();
|
||||
params->name = getInstanceName();
|
||||
params->name = name;
|
||||
params->numberOfThreads = 1;
|
||||
params->max_insts_any_thread = max_insts_any_thread;
|
||||
params->max_insts_all_threads = max_insts_all_threads;
|
||||
|
@ -667,12 +599,11 @@ CREATE_SIM_OBJECT(AtomicSimpleCPU)
|
|||
params->do_checkpoint_insts = do_checkpoint_insts;
|
||||
params->do_statistics_insts = do_statistics_insts;
|
||||
#else
|
||||
params->process = workload;
|
||||
if (workload.size() != 1)
|
||||
panic("only one workload allowed");
|
||||
params->process = workload[0];
|
||||
#endif
|
||||
|
||||
AtomicSimpleCPU *cpu = new AtomicSimpleCPU(params);
|
||||
return cpu;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("AtomicSimpleCPU", AtomicSimpleCPU)
|
||||
|
||||
|
|
|
@ -47,7 +47,6 @@
|
|||
#include "cpu/static_inst.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/byteswap.hh"
|
||||
#include "sim/debug.hh"
|
||||
#include "sim/host.hh"
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include "cpu/simple/timing.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/TimingSimpleCPU.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -158,7 +158,7 @@ void
|
|||
TimingSimpleCPU::resume()
|
||||
{
|
||||
if (_status != SwitchedOut && _status != Idle) {
|
||||
assert(system->getMemoryMode() == System::Timing);
|
||||
assert(system->getMemoryMode() == Enums::timing);
|
||||
|
||||
// Delete the old event if it existed.
|
||||
if (fetchEvent) {
|
||||
|
@ -701,79 +701,11 @@ TimingSimpleCPU::DcachePort::recvRetry()
|
|||
//
|
||||
// TimingSimpleCPU Simulation Object
|
||||
//
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(TimingSimpleCPU)
|
||||
|
||||
Param<Counter> max_insts_any_thread;
|
||||
Param<Counter> max_insts_all_threads;
|
||||
Param<Counter> max_loads_any_thread;
|
||||
Param<Counter> max_loads_all_threads;
|
||||
Param<Tick> progress_interval;
|
||||
SimObjectParam<System *> system;
|
||||
Param<int> cpu_id;
|
||||
|
||||
#if FULL_SYSTEM
|
||||
SimObjectParam<TheISA::ITB *> itb;
|
||||
SimObjectParam<TheISA::DTB *> dtb;
|
||||
Param<Tick> profile;
|
||||
|
||||
Param<bool> do_quiesce;
|
||||
Param<bool> do_checkpoint_insts;
|
||||
Param<bool> do_statistics_insts;
|
||||
#else
|
||||
SimObjectParam<Process *> workload;
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
Param<int> clock;
|
||||
Param<int> phase;
|
||||
|
||||
Param<bool> defer_registration;
|
||||
Param<int> width;
|
||||
Param<bool> function_trace;
|
||||
Param<Tick> function_trace_start;
|
||||
Param<bool> simulate_stalls;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(TimingSimpleCPU)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(TimingSimpleCPU)
|
||||
|
||||
INIT_PARAM(max_insts_any_thread,
|
||||
"terminate when any thread reaches this inst count"),
|
||||
INIT_PARAM(max_insts_all_threads,
|
||||
"terminate when all threads have reached this inst count"),
|
||||
INIT_PARAM(max_loads_any_thread,
|
||||
"terminate when any thread reaches this load count"),
|
||||
INIT_PARAM(max_loads_all_threads,
|
||||
"terminate when all threads have reached this load count"),
|
||||
INIT_PARAM(progress_interval, "Progress interval"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(cpu_id, "processor ID"),
|
||||
|
||||
#if FULL_SYSTEM
|
||||
INIT_PARAM(itb, "Instruction TLB"),
|
||||
INIT_PARAM(dtb, "Data TLB"),
|
||||
INIT_PARAM(profile, ""),
|
||||
INIT_PARAM(do_quiesce, ""),
|
||||
INIT_PARAM(do_checkpoint_insts, ""),
|
||||
INIT_PARAM(do_statistics_insts, ""),
|
||||
#else
|
||||
INIT_PARAM(workload, "processes to run"),
|
||||
#endif // FULL_SYSTEM
|
||||
|
||||
INIT_PARAM(clock, "clock speed"),
|
||||
INIT_PARAM_DFLT(phase, "clock phase", 0),
|
||||
INIT_PARAM(defer_registration, "defer system registration (for sampling)"),
|
||||
INIT_PARAM(width, "cpu width"),
|
||||
INIT_PARAM(function_trace, "Enable function trace"),
|
||||
INIT_PARAM(function_trace_start, "Cycle to start function trace"),
|
||||
INIT_PARAM(simulate_stalls, "Simulate cache stall cycles")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(TimingSimpleCPU)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(TimingSimpleCPU)
|
||||
TimingSimpleCPU *
|
||||
TimingSimpleCPUParams::create()
|
||||
{
|
||||
TimingSimpleCPU::Params *params = new TimingSimpleCPU::Params();
|
||||
params->name = getInstanceName();
|
||||
params->name = name;
|
||||
params->numberOfThreads = 1;
|
||||
params->max_insts_any_thread = max_insts_any_thread;
|
||||
params->max_insts_all_threads = max_insts_all_threads;
|
||||
|
@ -796,12 +728,11 @@ CREATE_SIM_OBJECT(TimingSimpleCPU)
|
|||
params->do_checkpoint_insts = do_checkpoint_insts;
|
||||
params->do_statistics_insts = do_statistics_insts;
|
||||
#else
|
||||
params->process = workload;
|
||||
if (workload.size() != 1)
|
||||
panic("only one workload allowed");
|
||||
params->process = workload[0];
|
||||
#endif
|
||||
|
||||
TimingSimpleCPU *cpu = new TimingSimpleCPU(params);
|
||||
return cpu;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("TimingSimpleCPU", TimingSimpleCPU)
|
||||
|
||||
|
|
|
@ -38,8 +38,7 @@
|
|||
|
||||
#include "cpu/trace/opt_cpu.hh"
|
||||
#include "cpu/trace/reader/mem_trace_reader.hh"
|
||||
|
||||
#include "sim/builder.hh"
|
||||
#include "params/OptCPU.hh"
|
||||
#include "sim/sim_events.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -211,31 +210,8 @@ OptCPU::TickEvent::description()
|
|||
}
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(OptCPU)
|
||||
|
||||
SimObjectParam<MemTraceReader *> data_trace;
|
||||
Param<int> size;
|
||||
Param<int> block_size;
|
||||
Param<int> assoc;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(OptCPU)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(OptCPU)
|
||||
|
||||
INIT_PARAM_DFLT(data_trace, "memory trace", NULL),
|
||||
INIT_PARAM(size, "cache size"),
|
||||
INIT_PARAM(block_size, "block size"),
|
||||
INIT_PARAM(assoc,"associativity")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(OptCPU)
|
||||
|
||||
CREATE_SIM_OBJECT(OptCPU)
|
||||
OptCPU *
|
||||
OptCPUParams::create()
|
||||
{
|
||||
return new OptCPU(getInstanceName(),
|
||||
data_trace,
|
||||
block_size,
|
||||
size,
|
||||
assoc);
|
||||
return new OptCPU(name, data_trace, block_size, size, assoc);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("OptCPU", OptCPU)
|
||||
|
|
|
@ -34,9 +34,9 @@
|
|||
*/
|
||||
#include <sstream>
|
||||
|
||||
#include "cpu/trace/reader/ibm_reader.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "base/misc.hh" // for fatal
|
||||
#include "cpu/trace/reader/ibm_reader.hh"
|
||||
#include "params/IBMReader.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -100,23 +100,8 @@ IBMReader::getNextReq(MemReqPtr &req)
|
|||
return 0;
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(IBMReader)
|
||||
|
||||
Param<string> filename;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(IBMReader)
|
||||
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(IBMReader)
|
||||
|
||||
INIT_PARAM(filename, "trace file")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(IBMReader)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(IBMReader)
|
||||
IBMReader *
|
||||
IBMReaderParams::create()
|
||||
{
|
||||
return new IBMReader(getInstanceName(), filename);
|
||||
return new IBMReader(name, filename);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("IBMReader", IBMReader)
|
||||
|
|
|
@ -34,9 +34,9 @@
|
|||
*/
|
||||
#include <sstream>
|
||||
|
||||
#include "cpu/trace/reader/itx_reader.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "base/misc.hh" // for fatal
|
||||
#include "cpu/trace/reader/itx_reader.hh"
|
||||
#include "params/ITXReader.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -186,23 +186,8 @@ ITXReader::getNextReq(MemReqPtr &req)
|
|||
return 0;
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(ITXReader)
|
||||
|
||||
Param<string> filename;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(ITXReader)
|
||||
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(ITXReader)
|
||||
|
||||
INIT_PARAM(filename, "trace file")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(ITXReader)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(ITXReader)
|
||||
ITXReader *
|
||||
ITXReaderParams::create()
|
||||
{
|
||||
return new ITXReader(getInstanceName(), filename);
|
||||
return new ITXReader(name, filename);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("ITXReader", ITXReader)
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#include "cpu/trace/reader/m5_reader.hh"
|
||||
#include "mem/trace/m5_format.hh"
|
||||
#include "mem/mem_cmd.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/M5Reader.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -77,23 +77,8 @@ M5Reader::getNextReq(MemReqPtr &req)
|
|||
return ref.cycle;
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(M5Reader)
|
||||
|
||||
Param<string> filename;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(M5Reader)
|
||||
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(M5Reader)
|
||||
|
||||
INIT_PARAM(filename, "trace file")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(M5Reader)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(M5Reader)
|
||||
M5Reader *
|
||||
M5ReaderParams::create()
|
||||
{
|
||||
return new M5Reader(getInstanceName(), filename);
|
||||
return new M5Reader(name, filename);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("M5Reader", M5Reader)
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
#include "cpu/trace/reader/mem_trace_reader.hh"
|
||||
#include "mem/base_mem.hh" // For PARAM constructor
|
||||
#include "mem/mem_interface.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/TraceCPU.hh"
|
||||
#include "sim/sim_events.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -151,31 +151,11 @@ TraceCPU::TickEvent::description()
|
|||
return "TraceCPU tick event";
|
||||
}
|
||||
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(TraceCPU)
|
||||
|
||||
SimObjectParam<BaseMem *> icache;
|
||||
SimObjectParam<BaseMem *> dcache;
|
||||
SimObjectParam<MemTraceReader *> data_trace;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(TraceCPU)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(TraceCPU)
|
||||
|
||||
INIT_PARAM_DFLT(icache, "instruction cache", NULL),
|
||||
INIT_PARAM_DFLT(dcache, "data cache", NULL),
|
||||
INIT_PARAM_DFLT(data_trace, "data trace", NULL)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(TraceCPU)
|
||||
|
||||
CREATE_SIM_OBJECT(TraceCPU)
|
||||
TraceCPU *
|
||||
TraceCPUParams::create()
|
||||
{
|
||||
return new TraceCPU(getInstanceName(),
|
||||
return new TraceCPU(name,
|
||||
(icache) ? icache->getInterface() : NULL,
|
||||
(dcache) ? dcache->getInterface() : NULL,
|
||||
data_trace);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("TraceCPU", TraceCPU)
|
||||
|
||||
|
|
|
@ -180,6 +180,8 @@ class SinicPciData(PciConfigData):
|
|||
|
||||
class Sinic(EtherDevBase):
|
||||
type = 'Sinic'
|
||||
cxx_namespace = 'Sinic'
|
||||
cxx_class = 'Device'
|
||||
|
||||
rx_max_copy = Param.MemorySize('1514B', "rx max copy")
|
||||
tx_max_copy = Param.MemorySize('16kB', "tx max copy")
|
||||
|
@ -197,4 +199,7 @@ class Sinic(EtherDevBase):
|
|||
|
||||
class SinicInt(EtherInt):
|
||||
type = 'SinicInt'
|
||||
cxx_namespace = 'Sinic'
|
||||
cxx_class = 'Interface'
|
||||
|
||||
device = Param.Sinic("Ethernet device of this interface")
|
||||
|
|
|
@ -50,7 +50,7 @@ if env['FULL_SYSTEM']:
|
|||
Source('etherint.cc')
|
||||
Source('etherlink.cc')
|
||||
Source('etherpkt.cc')
|
||||
Source('ethertap.cc')
|
||||
Source('ethertap.cc')
|
||||
Source('i8254xGBe.cc')
|
||||
Source('ide_ctrl.cc')
|
||||
Source('ide_disk.cc')
|
||||
|
@ -63,6 +63,6 @@ if env['FULL_SYSTEM']:
|
|||
Source('platform.cc')
|
||||
Source('simconsole.cc')
|
||||
Source('simple_disk.cc')
|
||||
#Source('sinic.cc')
|
||||
Source('sinic.cc')
|
||||
Source('uart.cc')
|
||||
Source('uart8250.cc')
|
||||
|
|
|
@ -51,15 +51,15 @@
|
|||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "mem/physical.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/AlphaConsole.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
using namespace std;
|
||||
using namespace AlphaISA;
|
||||
|
||||
AlphaConsole::AlphaConsole(Params *p)
|
||||
: BasicPioDevice(p), disk(p->disk),
|
||||
console(params()->cons), system(params()->alpha_sys), cpu(params()->cpu)
|
||||
AlphaConsole::AlphaConsole(const Params *p)
|
||||
: BasicPioDevice(p), disk(p->disk), console(p->sim_console),
|
||||
system(p->system), cpu(p->cpu)
|
||||
{
|
||||
|
||||
pioSize = sizeof(struct AlphaAccess);
|
||||
|
@ -306,43 +306,8 @@ AlphaConsole::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
alphaAccess->unserialize(cp, section);
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(AlphaConsole)
|
||||
|
||||
SimObjectParam<SimConsole *> sim_console;
|
||||
SimObjectParam<SimpleDisk *> disk;
|
||||
Param<Addr> pio_addr;
|
||||
SimObjectParam<AlphaSystem *> system;
|
||||
SimObjectParam<BaseCPU *> cpu;
|
||||
SimObjectParam<Platform *> platform;
|
||||
Param<Tick> pio_latency;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(AlphaConsole)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(AlphaConsole)
|
||||
|
||||
INIT_PARAM(sim_console, "The Simulator Console"),
|
||||
INIT_PARAM(disk, "Simple Disk"),
|
||||
INIT_PARAM(pio_addr, "Device Address"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(cpu, "Processor"),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM_DFLT(pio_latency, "Programmed IO latency", 1000)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(AlphaConsole)
|
||||
|
||||
CREATE_SIM_OBJECT(AlphaConsole)
|
||||
AlphaConsole *
|
||||
AlphaConsoleParams::create()
|
||||
{
|
||||
AlphaConsole::Params *p = new AlphaConsole::Params;
|
||||
p->name = getInstanceName();
|
||||
p->platform = platform;
|
||||
p->pio_addr = pio_addr;
|
||||
p->pio_delay = pio_latency;
|
||||
p->cons = sim_console;
|
||||
p->disk = disk;
|
||||
p->alpha_sys = system;
|
||||
p->system = system;
|
||||
p->cpu = cpu;
|
||||
return new AlphaConsole(p);
|
||||
return new AlphaConsole(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("AlphaConsole", AlphaConsole)
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "base/range.hh"
|
||||
#include "dev/alpha/access.h"
|
||||
#include "dev/io_device.hh"
|
||||
#include "params/AlphaConsole.hh"
|
||||
#include "sim/host.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
|
@ -98,20 +99,14 @@ class AlphaConsole : public BasicPioDevice
|
|||
BaseCPU *cpu;
|
||||
|
||||
public:
|
||||
struct Params : public BasicPioDevice::Params
|
||||
typedef AlphaConsoleParams Params;
|
||||
AlphaConsole(const Params *p);
|
||||
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
SimConsole *cons;
|
||||
SimpleDisk *disk;
|
||||
AlphaSystem *alpha_sys;
|
||||
BaseCPU *cpu;
|
||||
};
|
||||
protected:
|
||||
const Params *params() const {return (const Params *)_params; }
|
||||
|
||||
public:
|
||||
|
||||
/** Standard Constructor */
|
||||
AlphaConsole(Params *p);
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
virtual void startup();
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
#include "dev/alpha/tsunami_pchip.hh"
|
||||
#include "dev/alpha/tsunami_io.hh"
|
||||
#include "dev/alpha/tsunami.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/Tsunami.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -114,23 +114,8 @@ Tsunami::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
UNSERIALIZE_ARRAY(intr_sum_type, Tsunami::Max_CPUs);
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(Tsunami)
|
||||
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<IntrControl *> intrctrl;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(Tsunami)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(Tsunami)
|
||||
|
||||
INIT_PARAM(system, "system"),
|
||||
INIT_PARAM(intrctrl, "interrupt controller")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(Tsunami)
|
||||
|
||||
CREATE_SIM_OBJECT(Tsunami)
|
||||
Tsunami *
|
||||
TsunamiParams::create()
|
||||
{
|
||||
return new Tsunami(getInstanceName(), system, intrctrl);
|
||||
return new Tsunami(name, system, intrctrl);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("Tsunami", Tsunami)
|
||||
|
|
|
@ -47,14 +47,14 @@
|
|||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/TsunamiCChip.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
//Should this be AlphaISA?
|
||||
using namespace TheISA;
|
||||
|
||||
TsunamiCChip::TsunamiCChip(Params *p)
|
||||
TsunamiCChip::TsunamiCChip(const Params *p)
|
||||
: BasicPioDevice(p), tsunami(p->tsunami)
|
||||
{
|
||||
pioSize = 0x10000000;
|
||||
|
@ -522,36 +522,8 @@ TsunamiCChip::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
UNSERIALIZE_SCALAR(drir);
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiCChip)
|
||||
|
||||
Param<Addr> pio_addr;
|
||||
Param<Tick> pio_latency;
|
||||
SimObjectParam<Platform *> platform;
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<Tsunami *> tsunami;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(TsunamiCChip)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiCChip)
|
||||
|
||||
INIT_PARAM(pio_addr, "Device Address"),
|
||||
INIT_PARAM(pio_latency, "Programmed IO latency"),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(tsunami, "Tsunami")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(TsunamiCChip)
|
||||
|
||||
CREATE_SIM_OBJECT(TsunamiCChip)
|
||||
TsunamiCChip *
|
||||
TsunamiCChipParams::create()
|
||||
{
|
||||
TsunamiCChip::Params *p = new TsunamiCChip::Params;
|
||||
p->name = getInstanceName();
|
||||
p->pio_addr = pio_addr;
|
||||
p->pio_delay = pio_latency;
|
||||
p->platform = platform;
|
||||
p->system = system;
|
||||
p->tsunami = tsunami;
|
||||
return new TsunamiCChip(p);
|
||||
return new TsunamiCChip(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("TsunamiCChip", TsunamiCChip)
|
||||
|
|
|
@ -35,10 +35,10 @@
|
|||
#ifndef __TSUNAMI_CCHIP_HH__
|
||||
#define __TSUNAMI_CCHIP_HH__
|
||||
|
||||
#include "dev/alpha/tsunami.hh"
|
||||
#include "base/range.hh"
|
||||
#include "dev/alpha/tsunami.hh"
|
||||
#include "dev/io_device.hh"
|
||||
|
||||
#include "params/TsunamiCChip.hh"
|
||||
|
||||
/**
|
||||
* Tsunami CChip CSR Emulation. This device includes all the interrupt
|
||||
|
@ -79,20 +79,19 @@ class TsunamiCChip : public BasicPioDevice
|
|||
uint64_t itint;
|
||||
|
||||
public:
|
||||
struct Params : public BasicPioDevice::Params
|
||||
{
|
||||
Tsunami *tsunami;
|
||||
};
|
||||
protected:
|
||||
const Params *params() const {return (const Params *)_params; }
|
||||
|
||||
public:
|
||||
typedef TsunamiCChipParams Params;
|
||||
/**
|
||||
* Initialize the Tsunami CChip by setting all of the
|
||||
* device register to 0.
|
||||
* @param p params struct
|
||||
*/
|
||||
TsunamiCChip(Params *p);
|
||||
TsunamiCChip(const Params *p);
|
||||
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
virtual Tick read(PacketPtr pkt);
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "base/time.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "dev/pitreg.h"
|
||||
#include "dev/rtcreg.h"
|
||||
|
@ -50,27 +51,23 @@
|
|||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
//Should this be AlphaISA?
|
||||
using namespace TheISA;
|
||||
|
||||
TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami, const vector<int> &t,
|
||||
bool bcd, Tick i)
|
||||
: _name(n), event(tsunami, i), addr(0), year_is_bcd(bcd)
|
||||
TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami,
|
||||
const TsunamiIO::Params *p)
|
||||
: _name(n), event(tsunami, p->frequency), addr(0)
|
||||
{
|
||||
memset(clock_data, 0, sizeof(clock_data));
|
||||
stat_regA = RTCA_32768HZ | RTCA_1024HZ;
|
||||
stat_regB = RTCB_PRDC_IE |RTCB_BIN | RTCB_24HR;
|
||||
|
||||
struct tm tm;
|
||||
parseTime(t, &tm);
|
||||
year = p->time.tm_year;
|
||||
|
||||
year = tm.tm_year;
|
||||
|
||||
if (year_is_bcd) {
|
||||
if (p->year_is_bcd) {
|
||||
// The datasheet says that the year field can be either BCD or
|
||||
// years since 1900. Linux seems to be happy with years since
|
||||
// 1900.
|
||||
|
@ -81,16 +78,16 @@ TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami, const vector<int> &t,
|
|||
}
|
||||
|
||||
// Unix is 0-11 for month, data seet says start at 1
|
||||
mon = tm.tm_mon + 1;
|
||||
mday = tm.tm_mday;
|
||||
hour = tm.tm_hour;
|
||||
min = tm.tm_min;
|
||||
sec = tm.tm_sec;
|
||||
mon = p->time.tm_mon + 1;
|
||||
mday = p->time.tm_mday;
|
||||
hour = p->time.tm_hour;
|
||||
min = p->time.tm_min;
|
||||
sec = p->time.tm_sec;
|
||||
|
||||
// Datasheet says 1 is sunday
|
||||
wday = tm.tm_wday + 1;
|
||||
wday = p->time.tm_wday + 1;
|
||||
|
||||
DPRINTFN("Real-time clock set to %s", asctime(&tm));
|
||||
DPRINTFN("Real-time clock set to %s", asctime(&p->time));
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -437,10 +434,9 @@ TsunamiIO::PITimer::Counter::CounterEvent::description()
|
|||
return "tsunami 8254 Interval timer";
|
||||
}
|
||||
|
||||
TsunamiIO::TsunamiIO(Params *p)
|
||||
TsunamiIO::TsunamiIO(const Params *p)
|
||||
: BasicPioDevice(p), tsunami(p->tsunami), pitimer(p->name + "pitimer"),
|
||||
rtc(p->name + ".rtc", p->tsunami, p->init_time, p->year_is_bcd,
|
||||
p->frequency)
|
||||
rtc(p->name + ".rtc", p->tsunami, p)
|
||||
{
|
||||
pioSize = 0x100;
|
||||
|
||||
|
@ -658,45 +654,8 @@ TsunamiIO::unserialize(Checkpoint *cp, const string §ion)
|
|||
rtc.unserialize("rtc", cp, section);
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiIO)
|
||||
|
||||
Param<Addr> pio_addr;
|
||||
Param<Tick> pio_latency;
|
||||
Param<Tick> frequency;
|
||||
SimObjectParam<Platform *> platform;
|
||||
SimObjectParam<System *> system;
|
||||
VectorParam<int> time;
|
||||
Param<bool> year_is_bcd;
|
||||
SimObjectParam<Tsunami *> tsunami;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(TsunamiIO)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiIO)
|
||||
|
||||
INIT_PARAM(pio_addr, "Device Address"),
|
||||
INIT_PARAM(pio_latency, "Programmed IO latency"),
|
||||
INIT_PARAM(frequency, "clock interrupt frequency"),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(time, "System time to use (0 for actual time"),
|
||||
INIT_PARAM(year_is_bcd, ""),
|
||||
INIT_PARAM(tsunami, "Tsunami")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(TsunamiIO)
|
||||
|
||||
CREATE_SIM_OBJECT(TsunamiIO)
|
||||
TsunamiIO *
|
||||
TsunamiIOParams::create()
|
||||
{
|
||||
TsunamiIO::Params *p = new TsunamiIO::Params;
|
||||
p->frequency = frequency;
|
||||
p->name = getInstanceName();
|
||||
p->pio_addr = pio_addr;
|
||||
p->pio_delay = pio_latency;
|
||||
p->platform = platform;
|
||||
p->system = system;
|
||||
p->init_time = time;
|
||||
p->year_is_bcd = year_is_bcd;
|
||||
p->tsunami = tsunami;
|
||||
return new TsunamiIO(p);
|
||||
return new TsunamiIO(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("TsunamiIO", TsunamiIO)
|
||||
|
|
|
@ -37,9 +37,10 @@
|
|||
#ifndef __DEV_TSUNAMI_IO_HH__
|
||||
#define __DEV_TSUNAMI_IO_HH__
|
||||
|
||||
#include "dev/io_device.hh"
|
||||
#include "base/range.hh"
|
||||
#include "dev/alpha/tsunami.hh"
|
||||
#include "dev/io_device.hh"
|
||||
#include "params/TsunamiIO.hh"
|
||||
#include "sim/eventq.hh"
|
||||
|
||||
/**
|
||||
|
@ -85,9 +86,6 @@ class TsunamiIO : public BasicPioDevice
|
|||
/** Current RTC register address/index */
|
||||
int addr;
|
||||
|
||||
/** should the year be interpreted as BCD? */
|
||||
bool year_is_bcd;
|
||||
|
||||
/** Data for real-time clock function */
|
||||
union {
|
||||
uint8_t clock_data[10];
|
||||
|
@ -114,7 +112,7 @@ class TsunamiIO : public BasicPioDevice
|
|||
|
||||
public:
|
||||
RTC(const std::string &name, Tsunami* tsunami,
|
||||
const std::vector<int> &t, bool bcd, Tick i);
|
||||
const TsunamiIOParams *params);
|
||||
|
||||
/** RTC address port: write address of RTC RAM data to access */
|
||||
void writeAddr(const uint8_t data);
|
||||
|
@ -313,23 +311,19 @@ class TsunamiIO : public BasicPioDevice
|
|||
*/
|
||||
Tick frequency() const;
|
||||
|
||||
struct Params : public BasicPioDevice::Params
|
||||
{
|
||||
Tick frequency;
|
||||
Tsunami *tsunami;
|
||||
std::vector<int> init_time;
|
||||
bool year_is_bcd;
|
||||
};
|
||||
|
||||
protected:
|
||||
const Params *params() const { return (const Params*)_params; }
|
||||
|
||||
public:
|
||||
typedef TsunamiIOParams Params;
|
||||
/**
|
||||
* Initialize all the data for devices supported by Tsunami I/O.
|
||||
* @param p pointer to Params struct
|
||||
*/
|
||||
TsunamiIO(Params *p);
|
||||
TsunamiIO(const Params *p);
|
||||
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
virtual Tick read(PacketPtr pkt);
|
||||
virtual Tick write(PacketPtr pkt);
|
||||
|
|
|
@ -43,14 +43,13 @@
|
|||
#include "dev/alpha/tsunami.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
//Should this be AlphaISA?
|
||||
using namespace TheISA;
|
||||
|
||||
TsunamiPChip::TsunamiPChip(Params *p)
|
||||
TsunamiPChip::TsunamiPChip(const Params *p)
|
||||
: BasicPioDevice(p)
|
||||
{
|
||||
pioSize = 0x1000;
|
||||
|
@ -334,36 +333,8 @@ TsunamiPChip::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
}
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiPChip)
|
||||
|
||||
Param<Addr> pio_addr;
|
||||
Param<Tick> pio_latency;
|
||||
SimObjectParam<Platform *> platform;
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<Tsunami *> tsunami;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(TsunamiPChip)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiPChip)
|
||||
|
||||
INIT_PARAM(pio_addr, "Device Address"),
|
||||
INIT_PARAM(pio_latency, "Programmed IO latency"),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(tsunami, "Tsunami")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(TsunamiPChip)
|
||||
|
||||
CREATE_SIM_OBJECT(TsunamiPChip)
|
||||
TsunamiPChip *
|
||||
TsunamiPChipParams::create()
|
||||
{
|
||||
TsunamiPChip::Params *p = new TsunamiPChip::Params;
|
||||
p->name = getInstanceName();
|
||||
p->pio_addr = pio_addr;
|
||||
p->pio_delay = pio_latency;
|
||||
p->platform = platform;
|
||||
p->system = system;
|
||||
p->tsunami = tsunami;
|
||||
return new TsunamiPChip(p);
|
||||
return new TsunamiPChip(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("TsunamiPChip", TsunamiPChip)
|
||||
|
|
|
@ -35,9 +35,10 @@
|
|||
#ifndef __TSUNAMI_PCHIP_HH__
|
||||
#define __TSUNAMI_PCHIP_HH__
|
||||
|
||||
#include "dev/alpha/tsunami.hh"
|
||||
#include "base/range.hh"
|
||||
#include "dev/alpha/tsunami.hh"
|
||||
#include "dev/io_device.hh"
|
||||
#include "params/TsunamiPChip.hh"
|
||||
|
||||
/**
|
||||
* A very simple implementation of the Tsunami PCI interface chips.
|
||||
|
@ -61,19 +62,18 @@ class TsunamiPChip : public BasicPioDevice
|
|||
uint64_t tba[4];
|
||||
|
||||
public:
|
||||
struct Params : public BasicPioDevice::Params
|
||||
{
|
||||
Tsunami *tsunami;
|
||||
};
|
||||
protected:
|
||||
const Params *params() const { return (const Params*)_params; }
|
||||
|
||||
public:
|
||||
typedef TsunamiPChipParams Params;
|
||||
/**
|
||||
* Register the PChip with the mmu and init all wsba, wsm, and tba to 0
|
||||
* @param p pointer to the parameters struct
|
||||
*/
|
||||
TsunamiPChip(Params *p);
|
||||
TsunamiPChip(const Params *p);
|
||||
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate a PCI bus address to a memory address for DMA.
|
||||
|
|
|
@ -40,14 +40,14 @@
|
|||
#include "dev/baddev.hh"
|
||||
#include "dev/platform.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/BadDevice.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
using namespace TheISA;
|
||||
|
||||
BadDevice::BadDevice(Params *p)
|
||||
: BasicPioDevice(p), devname(p->device_name)
|
||||
: BasicPioDevice(p), devname(p->devicename)
|
||||
{
|
||||
pioSize = 0x10;
|
||||
}
|
||||
|
@ -66,36 +66,8 @@ BadDevice::write(PacketPtr pkt)
|
|||
M5_DUMMY_RETURN
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(BadDevice)
|
||||
|
||||
Param<string> devicename;
|
||||
Param<Addr> pio_addr;
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<Platform *> platform;
|
||||
Param<Tick> pio_latency;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(BadDevice)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(BadDevice)
|
||||
|
||||
INIT_PARAM(devicename, "Name of device to error on"),
|
||||
INIT_PARAM(pio_addr, "Device Address"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM_DFLT(pio_latency, "Programmed IO latency", 1000)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(BadDevice)
|
||||
|
||||
CREATE_SIM_OBJECT(BadDevice)
|
||||
BadDevice *
|
||||
BadDeviceParams::create()
|
||||
{
|
||||
BadDevice::Params *p = new BadDevice::Params;
|
||||
p->name =getInstanceName();
|
||||
p->platform = platform;
|
||||
p->pio_addr = pio_addr;
|
||||
p->pio_delay = pio_latency;
|
||||
p->system = system;
|
||||
p->device_name = devicename;
|
||||
return new BadDevice(p);
|
||||
return new BadDevice(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("BadDevice", BadDevice)
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
|
||||
#include "base/range.hh"
|
||||
#include "dev/io_device.hh"
|
||||
|
||||
#include "params/BadDevice.hh"
|
||||
|
||||
/**
|
||||
* BadDevice
|
||||
|
@ -52,12 +52,14 @@ class BadDevice : public BasicPioDevice
|
|||
std::string devname;
|
||||
|
||||
public:
|
||||
struct Params : public BasicPioDevice::Params
|
||||
{
|
||||
std::string device_name;
|
||||
};
|
||||
typedef BadDeviceParams Params;
|
||||
|
||||
protected:
|
||||
const Params *params() const { return (const Params *)_params; }
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
public:
|
||||
/**
|
||||
|
|
|
@ -45,7 +45,8 @@
|
|||
#include "base/misc.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "dev/disk_image.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/CowDiskImage.hh"
|
||||
#include "params/RawDiskImage.hh"
|
||||
#include "sim/sim_exit.hh"
|
||||
#include "sim/byteswap.hh"
|
||||
|
||||
|
@ -143,30 +144,12 @@ RawDiskImage::write(const uint8_t *data, off_t offset)
|
|||
return stream.tellp() - pos;
|
||||
}
|
||||
|
||||
DEFINE_SIM_OBJECT_CLASS_NAME("DiskImage", DiskImage)
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(RawDiskImage)
|
||||
|
||||
Param<string> image_file;
|
||||
Param<bool> read_only;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(RawDiskImage)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(RawDiskImage)
|
||||
|
||||
INIT_PARAM(image_file, "disk image file"),
|
||||
INIT_PARAM_DFLT(read_only, "read only image", false)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(RawDiskImage)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(RawDiskImage)
|
||||
RawDiskImage *
|
||||
RawDiskImageParams::create()
|
||||
{
|
||||
return new RawDiskImage(getInstanceName(), image_file, read_only);
|
||||
return new RawDiskImage(name, image_file, read_only);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("RawDiskImage", RawDiskImage)
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copy on Write Disk image
|
||||
|
@ -440,33 +423,12 @@ CowDiskImage::unserialize(Checkpoint *cp, const string §ion)
|
|||
open(cowFilename);
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(CowDiskImage)
|
||||
|
||||
SimObjectParam<DiskImage *> child;
|
||||
Param<string> image_file;
|
||||
Param<int> table_size;
|
||||
Param<bool> read_only;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(CowDiskImage)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(CowDiskImage)
|
||||
|
||||
INIT_PARAM(child, "child image"),
|
||||
INIT_PARAM_DFLT(image_file, "disk image file", ""),
|
||||
INIT_PARAM_DFLT(table_size, "initial table size", 65536),
|
||||
INIT_PARAM_DFLT(read_only, "don't write back to the copy-on-write file",
|
||||
true)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(CowDiskImage)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(CowDiskImage)
|
||||
CowDiskImage *
|
||||
CowDiskImageParams::create()
|
||||
{
|
||||
if (((string)image_file).empty())
|
||||
return new CowDiskImage(getInstanceName(), child, table_size);
|
||||
return new CowDiskImage(name, child, table_size);
|
||||
else
|
||||
return new CowDiskImage(getInstanceName(), child, table_size,
|
||||
return new CowDiskImage(name, child, table_size,
|
||||
image_file, read_only);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("CowDiskImage", CowDiskImage)
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
#include "dev/etherdump.hh"
|
||||
#include "dev/etherint.hh"
|
||||
#include "dev/etherpkt.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/EtherBus.hh"
|
||||
#include "sim/core.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -103,25 +103,8 @@ EtherBus::send(EtherInt *sndr, EthPacketPtr &pkt)
|
|||
return true;
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(EtherBus)
|
||||
|
||||
Param<bool> loopback;
|
||||
Param<double> speed;
|
||||
SimObjectParam<EtherDump *> packet_dump;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(EtherBus)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(EtherBus)
|
||||
|
||||
INIT_PARAM(loopback, "send the packet back to the sending interface"),
|
||||
INIT_PARAM(speed, "bus speed in ticks per byte"),
|
||||
INIT_PARAM(packet_dump, "object to dump network packets to")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(EtherBus)
|
||||
|
||||
CREATE_SIM_OBJECT(EtherBus)
|
||||
EtherBus *
|
||||
EtherBusParams::create()
|
||||
{
|
||||
return new EtherBus(getInstanceName(), speed, loopback, packet_dump);
|
||||
return new EtherBus(name, speed, loopback, dump);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("EtherBus", EtherBus)
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
#include "base/misc.hh"
|
||||
#include "base/output.hh"
|
||||
#include "dev/etherdump.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/EtherDump.hh"
|
||||
#include "sim/core.hh"
|
||||
|
||||
using std::string;
|
||||
|
@ -116,23 +116,8 @@ EtherDump::dumpPacket(EthPacketPtr &packet)
|
|||
stream.flush();
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(EtherDump)
|
||||
|
||||
Param<string> file;
|
||||
Param<int> maxlen;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(EtherDump)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(EtherDump)
|
||||
|
||||
INIT_PARAM(file, "file to dump packets to"),
|
||||
INIT_PARAM(maxlen, "max portion of packet data to dump")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(EtherDump)
|
||||
|
||||
CREATE_SIM_OBJECT(EtherDump)
|
||||
EtherDump *
|
||||
EtherDumpParams::create()
|
||||
{
|
||||
return new EtherDump(getInstanceName(), simout.resolve(file), maxlen);
|
||||
return new EtherDump(name, simout.resolve(file), maxlen);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("EtherDump", EtherDump)
|
||||
|
|
|
@ -30,7 +30,6 @@
|
|||
|
||||
#include "dev/etherint.hh"
|
||||
#include "base/misc.hh"
|
||||
#include "sim/param.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
void
|
||||
|
@ -42,6 +41,3 @@ EtherInt::setPeer(EtherInt *p)
|
|||
|
||||
peer = p;
|
||||
}
|
||||
|
||||
DEFINE_SIM_OBJECT_CLASS_NAME("EtherInt", EtherInt)
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
#include "dev/etherint.hh"
|
||||
#include "dev/etherlink.hh"
|
||||
#include "dev/etherpkt.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/EtherLink.hh"
|
||||
#include "sim/serialize.hh"
|
||||
#include "sim/system.hh"
|
||||
#include "sim/core.hh"
|
||||
|
@ -272,32 +272,8 @@ LinkDelayEvent::createForUnserialize(Checkpoint *cp, const string §ion)
|
|||
|
||||
REGISTER_SERIALIZEABLE("LinkDelayEvent", LinkDelayEvent)
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(EtherLink)
|
||||
|
||||
SimObjectParam<EtherInt *> int1;
|
||||
SimObjectParam<EtherInt *> int2;
|
||||
Param<double> speed;
|
||||
Param<Tick> delay;
|
||||
Param<Tick> delay_var;
|
||||
SimObjectParam<EtherDump *> dump;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(EtherLink)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(EtherLink)
|
||||
|
||||
INIT_PARAM(int1, "interface 1"),
|
||||
INIT_PARAM(int2, "interface 2"),
|
||||
INIT_PARAM(speed, "link speed in bits per second"),
|
||||
INIT_PARAM(delay, "transmit delay of packets in us"),
|
||||
INIT_PARAM(delay_var, "Difference in amount of time to traverse wire"),
|
||||
INIT_PARAM(dump, "object to dump network packets to")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(EtherLink)
|
||||
|
||||
CREATE_SIM_OBJECT(EtherLink)
|
||||
EtherLink *
|
||||
EtherLinkParams::create()
|
||||
{
|
||||
return new EtherLink(getInstanceName(), int1, int2, speed, delay, delay_var,
|
||||
dump);
|
||||
return new EtherLink(name, int1, int2, speed, delay, delay_var, dump);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("EtherLink", EtherLink)
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
#include "dev/etherint.hh"
|
||||
#include "dev/etherpkt.hh"
|
||||
#include "dev/ethertap.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/EtherTap.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -313,28 +313,10 @@ EtherTap::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
|
||||
//=====================================================================
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(EtherTap)
|
||||
|
||||
SimObjectParam<EtherInt *> peer;
|
||||
SimObjectParam<EtherDump *> dump;
|
||||
Param<unsigned> port;
|
||||
Param<unsigned> bufsz;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(EtherTap)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(EtherTap)
|
||||
|
||||
INIT_PARAM_DFLT(peer, "peer interface", NULL),
|
||||
INIT_PARAM_DFLT(dump, "object to dump network packets to", NULL),
|
||||
INIT_PARAM_DFLT(port, "tap port", 3500),
|
||||
INIT_PARAM_DFLT(bufsz, "tap buffer size", 10000)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(EtherTap)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(EtherTap)
|
||||
EtherTap *
|
||||
EtherTapParams::create()
|
||||
{
|
||||
EtherTap *tap = new EtherTap(getInstanceName(), dump, port, bufsz);
|
||||
EtherTap *tap = new EtherTap(name, dump, port, bufsz);
|
||||
|
||||
if (peer) {
|
||||
tap->setPeer(peer);
|
||||
|
@ -343,5 +325,3 @@ CREATE_SIM_OBJECT(EtherTap)
|
|||
|
||||
return tap;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("EtherTap", EtherTap)
|
||||
|
|
|
@ -40,17 +40,18 @@
|
|||
* @todo really there are multiple dma engines.. we should implement them.
|
||||
*/
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
#include "base/inet.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "dev/i8254xGBe.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/IGbE.hh"
|
||||
#include "params/IGbEInt.hh"
|
||||
#include "sim/stats.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
using namespace iGbReg;
|
||||
using namespace Net;
|
||||
|
||||
|
@ -1446,24 +1447,10 @@ IGbE::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
rxDescCache.unserialize(cp, csprintf("%s.RxDescCache", section));
|
||||
}
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(IGbEInt)
|
||||
|
||||
SimObjectParam<EtherInt *> peer;
|
||||
SimObjectParam<IGbE *> device;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(IGbEInt)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(IGbEInt)
|
||||
|
||||
INIT_PARAM_DFLT(peer, "peer interface", NULL),
|
||||
INIT_PARAM(device, "Ethernet device of this interface")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(IGbEInt)
|
||||
|
||||
CREATE_SIM_OBJECT(IGbEInt)
|
||||
IGbEInt *
|
||||
IGbEIntParams::create()
|
||||
{
|
||||
IGbEInt *dev_int = new IGbEInt(getInstanceName(), device);
|
||||
IGbEInt *dev_int = new IGbEInt(name, device);
|
||||
|
||||
EtherInt *p = (EtherInt *)peer;
|
||||
if (p) {
|
||||
|
@ -1474,80 +1461,8 @@ CREATE_SIM_OBJECT(IGbEInt)
|
|||
return dev_int;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("IGbEInt", IGbEInt)
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(IGbE)
|
||||
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<Platform *> platform;
|
||||
Param<Tick> min_backoff_delay;
|
||||
Param<Tick> max_backoff_delay;
|
||||
SimObjectParam<PciConfigData *> configdata;
|
||||
Param<uint32_t> pci_bus;
|
||||
Param<uint32_t> pci_dev;
|
||||
Param<uint32_t> pci_func;
|
||||
Param<Tick> pio_latency;
|
||||
Param<Tick> config_latency;
|
||||
Param<std::string> hardware_address;
|
||||
Param<bool> use_flow_control;
|
||||
Param<int> rx_fifo_size;
|
||||
Param<int> tx_fifo_size;
|
||||
Param<int> rx_desc_cache_size;
|
||||
Param<int> tx_desc_cache_size;
|
||||
Param<Tick> clock;
|
||||
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(IGbE)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(IGbE)
|
||||
|
||||
INIT_PARAM(system, "System pointer"),
|
||||
INIT_PARAM(platform, "Platform pointer"),
|
||||
INIT_PARAM(min_backoff_delay, "Minimum delay after receving a nack packed"),
|
||||
INIT_PARAM(max_backoff_delay, "Maximum delay after receving a nack packed"),
|
||||
INIT_PARAM(configdata, "PCI Config data"),
|
||||
INIT_PARAM(pci_bus, "PCI bus ID"),
|
||||
INIT_PARAM(pci_dev, "PCI device number"),
|
||||
INIT_PARAM(pci_func, "PCI function code"),
|
||||
INIT_PARAM_DFLT(pio_latency, "Programmed IO latency in bus cycles", 1),
|
||||
INIT_PARAM(config_latency, "Number of cycles for a config read or write"),
|
||||
INIT_PARAM(hardware_address, "Ethernet Hardware Address"),
|
||||
INIT_PARAM(use_flow_control,"Should the device use xon/off packets"),
|
||||
INIT_PARAM(rx_fifo_size,"Size of the RX FIFO"),
|
||||
INIT_PARAM(tx_fifo_size,"Size of the TX FIFO"),
|
||||
INIT_PARAM(rx_desc_cache_size,"Size of the RX descriptor cache"),
|
||||
INIT_PARAM(tx_desc_cache_size,"Size of the TX descriptor cache"),
|
||||
INIT_PARAM(clock,"Clock rate for the device to tick at")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(IGbE)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(IGbE)
|
||||
IGbE *
|
||||
IGbEParams::create()
|
||||
{
|
||||
IGbE::Params *params = new IGbE::Params;
|
||||
|
||||
params->name = getInstanceName();
|
||||
params->platform = platform;
|
||||
params->system = system;
|
||||
params->min_backoff_delay = min_backoff_delay;
|
||||
params->max_backoff_delay = max_backoff_delay;
|
||||
params->configData = configdata;
|
||||
params->busNum = pci_bus;
|
||||
params->deviceNum = pci_dev;
|
||||
params->functionNum = pci_func;
|
||||
params->pio_delay = pio_latency;
|
||||
params->config_delay = config_latency;
|
||||
params->hardware_address = hardware_address;
|
||||
params->use_flow_control = use_flow_control;
|
||||
params->rx_fifo_size = rx_fifo_size;
|
||||
params->tx_fifo_size = tx_fifo_size;
|
||||
params->rx_desc_cache_size = rx_desc_cache_size;
|
||||
params->tx_desc_cache_size = tx_desc_cache_size;
|
||||
params->clock = clock;
|
||||
|
||||
|
||||
return new IGbE(params);
|
||||
return new IGbE(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("IGbE", IGbE)
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#include "dev/i8254xGBe_defs.hh"
|
||||
#include "dev/pcidev.hh"
|
||||
#include "dev/pktfifo.hh"
|
||||
#include "params/IGbE.hh"
|
||||
#include "sim/eventq.hh"
|
||||
|
||||
class IGbEInt;
|
||||
|
@ -585,19 +586,14 @@ class IGbE : public PciDev
|
|||
TxDescCache txDescCache;
|
||||
|
||||
public:
|
||||
struct Params : public PciDev::Params
|
||||
typedef IGbEParams Params;
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
Net::EthAddr hardware_address;
|
||||
bool use_flow_control;
|
||||
int rx_fifo_size;
|
||||
int tx_fifo_size;
|
||||
int rx_desc_cache_size;
|
||||
int tx_desc_cache_size;
|
||||
Tick clock;
|
||||
};
|
||||
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
IGbE(Params *params);
|
||||
~IGbE() {;}
|
||||
~IGbE() {}
|
||||
|
||||
Tick clock;
|
||||
inline Tick cycles(int numCycles) const { return numCycles * clock; }
|
||||
|
@ -612,9 +608,6 @@ class IGbE : public PciDev
|
|||
|
||||
void setEthInt(IGbEInt *i) { assert(!etherInt); etherInt = i; }
|
||||
|
||||
|
||||
const Params *params() const {return (const Params *)_params; }
|
||||
|
||||
virtual void serialize(std::ostream &os);
|
||||
virtual void unserialize(Checkpoint *cp, const std::string §ion);
|
||||
virtual unsigned int drain(Event *de);
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
#include "dev/platform.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/IdeController.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
#include "sim/byteswap.hh"
|
||||
|
||||
|
@ -745,58 +745,8 @@ IdeController::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
sizeof(cmd_in_progress) / sizeof(cmd_in_progress[0]));
|
||||
}
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(IdeController)
|
||||
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<Platform *> platform;
|
||||
Param<Tick> min_backoff_delay;
|
||||
Param<Tick> max_backoff_delay;
|
||||
SimObjectParam<PciConfigData *> configdata;
|
||||
Param<uint32_t> pci_bus;
|
||||
Param<uint32_t> pci_dev;
|
||||
Param<uint32_t> pci_func;
|
||||
Param<Tick> pio_latency;
|
||||
Param<Tick> config_latency;
|
||||
SimObjectVectorParam<IdeDisk *> disks;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(IdeController)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(IdeController)
|
||||
|
||||
INIT_PARAM(system, "System pointer"),
|
||||
INIT_PARAM(platform, "Platform pointer"),
|
||||
INIT_PARAM(min_backoff_delay, "Minimum delay after receving a nack packed"),
|
||||
INIT_PARAM(max_backoff_delay, "Maximum delay after receving a nack packed"),
|
||||
INIT_PARAM(configdata, "PCI Config data"),
|
||||
INIT_PARAM(pci_bus, "PCI bus ID"),
|
||||
INIT_PARAM(pci_dev, "PCI device number"),
|
||||
INIT_PARAM(pci_func, "PCI function code"),
|
||||
INIT_PARAM_DFLT(pio_latency, "Programmed IO latency in bus cycles", 1),
|
||||
INIT_PARAM(config_latency, "Number of cycles for a config read or write"),
|
||||
INIT_PARAM(disks, "IDE disks attached to this controller")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(IdeController)
|
||||
|
||||
CREATE_SIM_OBJECT(IdeController)
|
||||
IdeController *
|
||||
IdeControllerParams::create()
|
||||
{
|
||||
IdeController::Params *params = new IdeController::Params;
|
||||
params->name = getInstanceName();
|
||||
params->platform = platform;
|
||||
params->system = system;
|
||||
params->min_backoff_delay = min_backoff_delay;
|
||||
params->max_backoff_delay = max_backoff_delay;
|
||||
params->configData = configdata;
|
||||
params->busNum = pci_bus;
|
||||
params->deviceNum = pci_dev;
|
||||
params->functionNum = pci_func;
|
||||
params->pio_delay = pio_latency;
|
||||
params->config_delay = config_latency;
|
||||
params->disks = disks;
|
||||
return new IdeController(params);
|
||||
return new IdeController(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("IdeController", IdeController)
|
||||
|
||||
#endif //DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include "dev/pcidev.hh"
|
||||
#include "dev/pcireg.h"
|
||||
#include "dev/io_device.hh"
|
||||
#include "params/IdeController.hh"
|
||||
|
||||
#define BMIC0 0x0 // Bus master IDE command register
|
||||
#define BMIS0 0x2 // Bus master IDE status register
|
||||
|
@ -193,14 +194,8 @@ class IdeController : public PciDev
|
|||
bool isDiskSelected(IdeDisk *diskPtr);
|
||||
|
||||
public:
|
||||
struct Params : public PciDev::Params
|
||||
{
|
||||
/** Array of disk objects */
|
||||
std::vector<IdeDisk *> disks;
|
||||
};
|
||||
typedef IdeControllerParams Params;
|
||||
const Params *params() const { return (const Params *)_params; }
|
||||
|
||||
public:
|
||||
IdeController(Params *p);
|
||||
~IdeController();
|
||||
|
||||
|
|
|
@ -38,18 +38,16 @@
|
|||
#include <deque>
|
||||
#include <string>
|
||||
|
||||
#include "arch/isa_traits.hh"
|
||||
#include "base/chunk_generator.hh"
|
||||
#include "base/cprintf.hh" // csprintf
|
||||
#include "base/trace.hh"
|
||||
#include "dev/disk_image.hh"
|
||||
#include "dev/ide_disk.hh"
|
||||
#include "dev/ide_ctrl.hh"
|
||||
#include "dev/alpha/tsunami.hh"
|
||||
#include "dev/alpha/tsunami_pchip.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
#include "dev/ide_disk.hh"
|
||||
#include "params/IdeDisk.hh"
|
||||
#include "sim/core.hh"
|
||||
#include "arch/isa_traits.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
using namespace std;
|
||||
using namespace TheISA;
|
||||
|
@ -1116,32 +1114,8 @@ IdeDisk::unserialize(Checkpoint *cp, const string §ion)
|
|||
UNSERIALIZE_ARRAY(dataBuffer, MAX_DMA_SIZE);
|
||||
}
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
||||
enum DriveID { master, slave };
|
||||
static const char *DriveID_strings[] = { "master", "slave" };
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(IdeDisk)
|
||||
|
||||
SimObjectParam<DiskImage *> image;
|
||||
SimpleEnumParam<DriveID> driveID;
|
||||
Param<int> delay;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(IdeDisk)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(IdeDisk)
|
||||
|
||||
INIT_PARAM(image, "Disk image"),
|
||||
INIT_ENUM_PARAM(driveID, "Drive ID (0=master 1=slave)", DriveID_strings),
|
||||
INIT_PARAM_DFLT(delay, "Fixed disk delay in microseconds", 1)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(IdeDisk)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(IdeDisk)
|
||||
IdeDisk *
|
||||
IdeDiskParams::create()
|
||||
{
|
||||
return new IdeDisk(getInstanceName(), image, driveID, delay);
|
||||
return new IdeDisk(name, image, driveID, delay);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("IdeDisk", IdeDisk)
|
||||
|
||||
#endif //DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include "base/chunk_generator.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "dev/io_device.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
|
||||
|
@ -55,6 +54,10 @@ PioPort::getDeviceAddressRanges(AddrRangeList &resp, bool &snoop)
|
|||
}
|
||||
|
||||
|
||||
PioDevice::PioDevice(const Params *p)
|
||||
: MemObject(p), platform(p->platform), sys(p->system), pioPort(NULL)
|
||||
{}
|
||||
|
||||
PioDevice::~PioDevice()
|
||||
{
|
||||
if (pioPort)
|
||||
|
@ -82,6 +85,11 @@ PioDevice::drain(Event *de)
|
|||
return count;
|
||||
}
|
||||
|
||||
BasicPioDevice::BasicPioDevice(const Params *p)
|
||||
: PioDevice(p), pioAddr(p->pio_addr), pioSize(0),
|
||||
pioDelay(p->pio_latency)
|
||||
{}
|
||||
|
||||
void
|
||||
BasicPioDevice::addressRanges(AddrRangeList &range_list)
|
||||
{
|
||||
|
@ -149,7 +157,7 @@ DmaPort::recvTiming(PacketPtr pkt)
|
|||
return true;
|
||||
}
|
||||
|
||||
DmaDevice::DmaDevice(Params *p)
|
||||
DmaDevice::DmaDevice(const Params *p)
|
||||
: PioDevice(p), dmaPort(NULL), minBackoffDelay(p->min_backoff_delay),
|
||||
maxBackoffDelay(p->max_backoff_delay)
|
||||
{ }
|
||||
|
@ -262,8 +270,8 @@ DmaPort::sendDma()
|
|||
assert(transmitList.size());
|
||||
PacketPtr pkt = transmitList.front();
|
||||
|
||||
System::MemoryMode state = sys->getMemoryMode();
|
||||
if (state == System::Timing) {
|
||||
Enums::MemoryMode state = sys->getMemoryMode();
|
||||
if (state == Enums::timing) {
|
||||
if (backoffEvent.scheduled() || inRetry) {
|
||||
DPRINTF(DMA, "Can't send immediately, waiting for retry or backoff timer\n");
|
||||
return;
|
||||
|
@ -290,7 +298,7 @@ DmaPort::sendDma()
|
|||
backoffTime+curTick);
|
||||
backoffEvent.schedule(backoffTime+curTick);
|
||||
}
|
||||
} else if (state == System::Atomic) {
|
||||
} else if (state == Enums::atomic) {
|
||||
transmitList.pop_front();
|
||||
|
||||
Tick lat;
|
||||
|
@ -330,5 +338,3 @@ DmaDevice::~DmaDevice()
|
|||
if (dmaPort)
|
||||
delete dmaPort;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -35,6 +35,9 @@
|
|||
#include "mem/mem_object.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/tport.hh"
|
||||
#include "params/BasicPioDevice.hh"
|
||||
#include "params/DmaDevice.hh"
|
||||
#include "params/PioDevice.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
class Event;
|
||||
|
@ -186,29 +189,16 @@ class PioDevice : public MemObject
|
|||
virtual Tick write(PacketPtr pkt) = 0;
|
||||
|
||||
public:
|
||||
/** Params struct which is extended through each device based on
|
||||
* the parameters it needs. Since we are re-writing everything, we
|
||||
* might as well start from the bottom this time. */
|
||||
struct Params
|
||||
{
|
||||
std::string name;
|
||||
Platform *platform;
|
||||
System *system;
|
||||
};
|
||||
|
||||
protected:
|
||||
Params *_params;
|
||||
|
||||
public:
|
||||
const Params *params() const { return _params; }
|
||||
|
||||
PioDevice(Params *p)
|
||||
: MemObject(p->name), platform(p->platform), sys(p->system),
|
||||
pioPort(NULL), _params(p)
|
||||
{}
|
||||
|
||||
typedef PioDeviceParams Params;
|
||||
PioDevice(const Params *p);
|
||||
virtual ~PioDevice();
|
||||
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
virtual void init();
|
||||
|
||||
virtual unsigned int drain(Event *de);
|
||||
|
@ -229,13 +219,6 @@ class PioDevice : public MemObject
|
|||
|
||||
class BasicPioDevice : public PioDevice
|
||||
{
|
||||
public:
|
||||
struct Params : public PioDevice::Params
|
||||
{
|
||||
Addr pio_addr;
|
||||
Tick pio_delay;
|
||||
};
|
||||
|
||||
protected:
|
||||
/** Address that the device listens to. */
|
||||
Addr pioAddr;
|
||||
|
@ -247,10 +230,14 @@ class BasicPioDevice : public PioDevice
|
|||
Tick pioDelay;
|
||||
|
||||
public:
|
||||
BasicPioDevice(Params *p)
|
||||
: PioDevice(p), pioAddr(p->pio_addr), pioSize(0),
|
||||
pioDelay(p->pio_delay)
|
||||
{}
|
||||
typedef BasicPioDeviceParams Params;
|
||||
BasicPioDevice(const Params *p);
|
||||
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
/** return the address ranges that this device responds to.
|
||||
* @param range_list range list to populate with ranges
|
||||
|
@ -261,22 +248,22 @@ class BasicPioDevice : public PioDevice
|
|||
|
||||
class DmaDevice : public PioDevice
|
||||
{
|
||||
public:
|
||||
struct Params : public PioDevice::Params
|
||||
{
|
||||
Tick min_backoff_delay;
|
||||
Tick max_backoff_delay;
|
||||
};
|
||||
|
||||
protected:
|
||||
DmaPort *dmaPort;
|
||||
Tick minBackoffDelay;
|
||||
Tick maxBackoffDelay;
|
||||
|
||||
public:
|
||||
DmaDevice(Params *p);
|
||||
typedef DmaDeviceParams Params;
|
||||
DmaDevice(const Params *p);
|
||||
virtual ~DmaDevice();
|
||||
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
void dmaWrite(Addr addr, int size, Event *event, uint8_t *data)
|
||||
{
|
||||
dmaPort->dmaAction(MemCmd::WriteInvalidateReq,
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
#include "dev/isa_fake.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -44,13 +43,13 @@ using namespace std;
|
|||
IsaFake::IsaFake(Params *p)
|
||||
: BasicPioDevice(p)
|
||||
{
|
||||
if (!params()->retBadAddr)
|
||||
if (!p->ret_bad_addr)
|
||||
pioSize = p->pio_size;
|
||||
|
||||
retData8 = params()->retData8;
|
||||
retData16 = params()->retData16;
|
||||
retData32 = params()->retData32;
|
||||
retData64 = params()->retData64;
|
||||
retData8 = p->ret_data8;
|
||||
retData16 = p->ret_data16;
|
||||
retData32 = p->ret_data32;
|
||||
retData64 = p->ret_data64;
|
||||
}
|
||||
|
||||
Tick
|
||||
|
@ -58,10 +57,10 @@ IsaFake::read(PacketPtr pkt)
|
|||
{
|
||||
assert(pkt->result == Packet::Unknown);
|
||||
|
||||
if (params()->warnAccess != "")
|
||||
if (params()->warn_access != "")
|
||||
warn("Device %s accessed by read to address %#x size=%d\n",
|
||||
name(), pkt->getAddr(), pkt->getSize());
|
||||
if (params()->retBadAddr) {
|
||||
if (params()->ret_bad_addr) {
|
||||
DPRINTF(Tsunami, "read to bad address va=%#x size=%d\n",
|
||||
pkt->getAddr(), pkt->getSize());
|
||||
pkt->result = Packet::BadAddress;
|
||||
|
@ -93,7 +92,7 @@ IsaFake::read(PacketPtr pkt)
|
|||
Tick
|
||||
IsaFake::write(PacketPtr pkt)
|
||||
{
|
||||
if (params()->warnAccess != "") {
|
||||
if (params()->warn_access != "") {
|
||||
uint64_t data;
|
||||
switch (pkt->getSize()) {
|
||||
case sizeof(uint64_t):
|
||||
|
@ -114,7 +113,7 @@ IsaFake::write(PacketPtr pkt)
|
|||
warn("Device %s accessed by write to address %#x size=%d data=%#x\n",
|
||||
name(), pkt->getAddr(), pkt->getSize(), data);
|
||||
}
|
||||
if (params()->retBadAddr) {
|
||||
if (params()->ret_bad_addr) {
|
||||
DPRINTF(Tsunami, "write to bad address va=%#x size=%d \n",
|
||||
pkt->getAddr(), pkt->getSize());
|
||||
pkt->result = Packet::BadAddress;
|
||||
|
@ -122,7 +121,7 @@ IsaFake::write(PacketPtr pkt)
|
|||
DPRINTF(Tsunami, "write - va=%#x size=%d \n",
|
||||
pkt->getAddr(), pkt->getSize());
|
||||
|
||||
if (params()->updateData) {
|
||||
if (params()->update_data) {
|
||||
switch (pkt->getSize()) {
|
||||
case sizeof(uint64_t):
|
||||
retData64 = pkt->get<uint64_t>();
|
||||
|
@ -145,57 +144,8 @@ IsaFake::write(PacketPtr pkt)
|
|||
return pioDelay;
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(IsaFake)
|
||||
|
||||
Param<Addr> pio_addr;
|
||||
Param<Tick> pio_latency;
|
||||
Param<Addr> pio_size;
|
||||
Param<bool> ret_bad_addr;
|
||||
Param<bool> update_data;
|
||||
Param<std::string> warn_access;
|
||||
Param<uint8_t> ret_data8;
|
||||
Param<uint16_t> ret_data16;
|
||||
Param<uint32_t> ret_data32;
|
||||
Param<uint64_t> ret_data64;
|
||||
SimObjectParam<Platform *> platform;
|
||||
SimObjectParam<System *> system;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(IsaFake)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(IsaFake)
|
||||
|
||||
INIT_PARAM(pio_addr, "Device Address"),
|
||||
INIT_PARAM(pio_latency, "Programmed IO latency"),
|
||||
INIT_PARAM(pio_size, "Size of address range"),
|
||||
INIT_PARAM(ret_bad_addr, "Return pkt status BadAddr"),
|
||||
INIT_PARAM(update_data, "Update returned data"),
|
||||
INIT_PARAM(warn_access, "Warn if this device is touched"),
|
||||
INIT_PARAM(ret_data8, "Data to return if not bad addr"),
|
||||
INIT_PARAM(ret_data16, "Data to return if not bad addr"),
|
||||
INIT_PARAM(ret_data32, "Data to return if not bad addr"),
|
||||
INIT_PARAM(ret_data64, "Data to return if not bad addr"),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM(system, "system object")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(IsaFake)
|
||||
|
||||
CREATE_SIM_OBJECT(IsaFake)
|
||||
IsaFake *
|
||||
IsaFakeParams::create()
|
||||
{
|
||||
IsaFake::Params *p = new IsaFake::Params;
|
||||
p->name = getInstanceName();
|
||||
p->pio_addr = pio_addr;
|
||||
p->pio_delay = pio_latency;
|
||||
p->pio_size = pio_size;
|
||||
p->retBadAddr = ret_bad_addr;
|
||||
p->updateData = update_data;
|
||||
p->warnAccess = warn_access;
|
||||
p->retData8= ret_data8;
|
||||
p->retData16 = ret_data16;
|
||||
p->retData32 = ret_data32;
|
||||
p->retData64 = ret_data64;
|
||||
p->platform = platform;
|
||||
p->system = system;
|
||||
return new IsaFake(p);
|
||||
return new IsaFake(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("IsaFake", IsaFake)
|
||||
|
|
|
@ -35,13 +35,14 @@
|
|||
#ifndef __ISA_FAKE_HH__
|
||||
#define __ISA_FAKE_HH__
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "base/range.hh"
|
||||
#include "dev/io_device.hh"
|
||||
#include "dev/alpha/tsunami.hh"
|
||||
#include "params/IsaFake.hh"
|
||||
#include "mem/packet.hh"
|
||||
|
||||
#include <string>
|
||||
|
||||
/**
|
||||
* IsaFake is a device that returns, BadAddr, 1 or 0 on all reads and
|
||||
* rites. It is meant to be placed at an address range
|
||||
|
@ -51,27 +52,19 @@
|
|||
*/
|
||||
class IsaFake : public BasicPioDevice
|
||||
{
|
||||
public:
|
||||
struct Params : public BasicPioDevice::Params
|
||||
{
|
||||
Addr pio_size;
|
||||
bool retBadAddr;
|
||||
bool updateData;
|
||||
uint8_t retData8;
|
||||
uint16_t retData16;
|
||||
uint32_t retData32;
|
||||
uint64_t retData64;
|
||||
std::string warnAccess;
|
||||
};
|
||||
protected:
|
||||
const Params *params() const { return (const Params*)_params; }
|
||||
uint8_t retData8;
|
||||
uint16_t retData16;
|
||||
uint32_t retData32;
|
||||
uint64_t retData64;
|
||||
|
||||
|
||||
public:
|
||||
typedef IsaFakeParams Params;
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
/**
|
||||
* The constructor for Tsunmami Fake just registers itself with the MMU.
|
||||
* @param p params structure
|
||||
|
|
|
@ -43,7 +43,8 @@
|
|||
#include "dev/pciconfigall.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/NSGigE.hh"
|
||||
#include "params/NSGigEInt.hh"
|
||||
#include "sim/debug.hh"
|
||||
#include "sim/host.hh"
|
||||
#include "sim/stats.hh"
|
||||
|
@ -118,7 +119,7 @@ NSGigE::NSGigE(Params *p)
|
|||
|
||||
|
||||
regsReset();
|
||||
memcpy(&rom.perfectMatch, p->eaddr.bytes(), ETH_ADDR_LEN);
|
||||
memcpy(&rom.perfectMatch, p->hardware_address.bytes(), ETH_ADDR_LEN);
|
||||
|
||||
memset(&rxDesc32, 0, sizeof(rxDesc32));
|
||||
memset(&txDesc32, 0, sizeof(txDesc32));
|
||||
|
@ -2773,23 +2774,10 @@ NSGigE::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
}
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(NSGigEInt)
|
||||
|
||||
SimObjectParam<EtherInt *> peer;
|
||||
SimObjectParam<NSGigE *> device;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(NSGigEInt)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(NSGigEInt)
|
||||
|
||||
INIT_PARAM_DFLT(peer, "peer interface", NULL),
|
||||
INIT_PARAM(device, "Ethernet device of this interface")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(NSGigEInt)
|
||||
|
||||
CREATE_SIM_OBJECT(NSGigEInt)
|
||||
NSGigEInt *
|
||||
NSGigEIntParams::create()
|
||||
{
|
||||
NSGigEInt *dev_int = new NSGigEInt(getInstanceName(), device);
|
||||
NSGigEInt *dev_int = new NSGigEInt(name, device);
|
||||
|
||||
EtherInt *p = (EtherInt *)peer;
|
||||
if (p) {
|
||||
|
@ -2800,121 +2788,8 @@ CREATE_SIM_OBJECT(NSGigEInt)
|
|||
return dev_int;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("NSGigEInt", NSGigEInt)
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(NSGigE)
|
||||
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<Platform *> platform;
|
||||
Param<Tick> min_backoff_delay;
|
||||
Param<Tick> max_backoff_delay;
|
||||
SimObjectParam<PciConfigData *> configdata;
|
||||
Param<uint32_t> pci_bus;
|
||||
Param<uint32_t> pci_dev;
|
||||
Param<uint32_t> pci_func;
|
||||
Param<Tick> pio_latency;
|
||||
Param<Tick> config_latency;
|
||||
|
||||
Param<Tick> clock;
|
||||
Param<bool> dma_desc_free;
|
||||
Param<bool> dma_data_free;
|
||||
Param<Tick> dma_read_delay;
|
||||
Param<Tick> dma_write_delay;
|
||||
Param<Tick> dma_read_factor;
|
||||
Param<Tick> dma_write_factor;
|
||||
Param<bool> dma_no_allocate;
|
||||
Param<Tick> intr_delay;
|
||||
|
||||
Param<Tick> rx_delay;
|
||||
Param<Tick> tx_delay;
|
||||
Param<uint32_t> rx_fifo_size;
|
||||
Param<uint32_t> tx_fifo_size;
|
||||
|
||||
Param<bool> rx_filter;
|
||||
Param<string> hardware_address;
|
||||
Param<bool> rx_thread;
|
||||
Param<bool> tx_thread;
|
||||
Param<bool> rss;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(NSGigE)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(NSGigE)
|
||||
|
||||
INIT_PARAM(system, "System pointer"),
|
||||
INIT_PARAM(platform, "Platform pointer"),
|
||||
INIT_PARAM(min_backoff_delay, "Minimum delay after receving a nack packed"),
|
||||
INIT_PARAM(max_backoff_delay, "Maximum delay after receving a nack packed"),
|
||||
INIT_PARAM(configdata, "PCI Config data"),
|
||||
INIT_PARAM(pci_bus, "PCI bus ID"),
|
||||
INIT_PARAM(pci_dev, "PCI device number"),
|
||||
INIT_PARAM(pci_func, "PCI function code"),
|
||||
INIT_PARAM_DFLT(pio_latency, "Programmed IO latency in bus cycles", 1),
|
||||
INIT_PARAM(config_latency, "Number of cycles for a config read or write"),
|
||||
INIT_PARAM(clock, "State machine cycle time"),
|
||||
|
||||
INIT_PARAM(dma_desc_free, "DMA of Descriptors is free"),
|
||||
INIT_PARAM(dma_data_free, "DMA of Data is free"),
|
||||
INIT_PARAM(dma_read_delay, "fixed delay for dma reads"),
|
||||
INIT_PARAM(dma_write_delay, "fixed delay for dma writes"),
|
||||
INIT_PARAM(dma_read_factor, "multiplier for dma reads"),
|
||||
INIT_PARAM(dma_write_factor, "multiplier for dma writes"),
|
||||
INIT_PARAM(dma_no_allocate, "Should DMA reads allocate cache lines"),
|
||||
INIT_PARAM(intr_delay, "Interrupt Delay in microseconds"),
|
||||
|
||||
INIT_PARAM(rx_delay, "Receive Delay"),
|
||||
INIT_PARAM(tx_delay, "Transmit Delay"),
|
||||
INIT_PARAM(rx_fifo_size, "max size in bytes of rxFifo"),
|
||||
INIT_PARAM(tx_fifo_size, "max size in bytes of txFifo"),
|
||||
|
||||
INIT_PARAM(rx_filter, "Enable Receive Filter"),
|
||||
INIT_PARAM(hardware_address, "Ethernet Hardware Address"),
|
||||
INIT_PARAM(rx_thread, ""),
|
||||
INIT_PARAM(tx_thread, ""),
|
||||
INIT_PARAM(rss, "")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(NSGigE)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(NSGigE)
|
||||
NSGigE *
|
||||
NSGigEParams::create()
|
||||
{
|
||||
NSGigE::Params *params = new NSGigE::Params;
|
||||
|
||||
params->name = getInstanceName();
|
||||
params->platform = platform;
|
||||
params->system = system;
|
||||
params->min_backoff_delay = min_backoff_delay;
|
||||
params->max_backoff_delay = max_backoff_delay;
|
||||
params->configData = configdata;
|
||||
params->busNum = pci_bus;
|
||||
params->deviceNum = pci_dev;
|
||||
params->functionNum = pci_func;
|
||||
params->pio_delay = pio_latency;
|
||||
params->config_delay = config_latency;
|
||||
|
||||
params->clock = clock;
|
||||
params->dma_desc_free = dma_desc_free;
|
||||
params->dma_data_free = dma_data_free;
|
||||
params->dma_read_delay = dma_read_delay;
|
||||
params->dma_write_delay = dma_write_delay;
|
||||
params->dma_read_factor = dma_read_factor;
|
||||
params->dma_write_factor = dma_write_factor;
|
||||
params->dma_no_allocate = dma_no_allocate;
|
||||
params->pio_delay = pio_latency;
|
||||
params->intr_delay = intr_delay;
|
||||
|
||||
params->rx_delay = rx_delay;
|
||||
params->tx_delay = tx_delay;
|
||||
params->rx_fifo_size = rx_fifo_size;
|
||||
params->tx_fifo_size = tx_fifo_size;
|
||||
|
||||
params->rx_filter = rx_filter;
|
||||
params->eaddr = hardware_address;
|
||||
params->rx_thread = rx_thread;
|
||||
params->tx_thread = tx_thread;
|
||||
params->rss = rss;
|
||||
|
||||
return new NSGigE(params);
|
||||
return new NSGigE(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("NSGigE", NSGigE)
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#include "dev/ns_gige_reg.h"
|
||||
#include "dev/pcidev.hh"
|
||||
#include "dev/pktfifo.hh"
|
||||
#include "params/NSGigE.hh"
|
||||
#include "sim/eventq.hh"
|
||||
|
||||
// Hash filtering constants
|
||||
|
@ -349,31 +350,10 @@ class NSGigE : public PciDev
|
|||
NSGigEInt *interface;
|
||||
|
||||
public:
|
||||
struct Params : public PciDev::Params
|
||||
{
|
||||
Tick clock;
|
||||
Tick intr_delay;
|
||||
Tick tx_delay;
|
||||
Tick rx_delay;
|
||||
bool dma_desc_free;
|
||||
bool dma_data_free;
|
||||
Tick dma_read_delay;
|
||||
Tick dma_write_delay;
|
||||
Tick dma_read_factor;
|
||||
Tick dma_write_factor;
|
||||
bool rx_filter;
|
||||
Net::EthAddr eaddr;
|
||||
uint32_t tx_fifo_size;
|
||||
uint32_t rx_fifo_size;
|
||||
bool rx_thread;
|
||||
bool tx_thread;
|
||||
bool rss;
|
||||
bool dma_no_allocate;
|
||||
};
|
||||
|
||||
typedef NSGigEParams Params;
|
||||
const Params *params() const { return (const Params *)_params; }
|
||||
NSGigE(Params *params);
|
||||
~NSGigE();
|
||||
const Params *params() const { return (const Params *)_params; }
|
||||
|
||||
virtual Tick writeConfig(PacketPtr pkt);
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#include "dev/platform.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/PciConfigAll.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -97,27 +97,8 @@ PciConfigAll::addressRanges(AddrRangeList &range_list)
|
|||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(PciConfigAll)
|
||||
|
||||
Param<Tick> pio_latency;
|
||||
Param<int> bus;
|
||||
Param<Addr> size;
|
||||
SimObjectParam<Platform *> platform;
|
||||
SimObjectParam<System *> system;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(PciConfigAll)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(PciConfigAll)
|
||||
|
||||
INIT_PARAM(pio_latency, "Programmed IO latency"),
|
||||
INIT_PARAM(bus, "Bus that this object handles config space for"),
|
||||
INIT_PARAM(size, "The size of config space"),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM(system, "system object")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(PciConfigAll)
|
||||
|
||||
CREATE_SIM_OBJECT(PciConfigAll)
|
||||
PciConfigAll *
|
||||
PciConfigAllParams::create()
|
||||
{
|
||||
PciConfigAll::Params *p = new PciConfigAll::Params;
|
||||
p->pio_delay = pio_latency;
|
||||
|
@ -129,6 +110,4 @@ CREATE_SIM_OBJECT(PciConfigAll)
|
|||
return new PciConfigAll(p);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("PciConfigAll", PciConfigAll)
|
||||
|
||||
#endif // DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
|
|
@ -48,9 +48,8 @@
|
|||
#include "dev/alpha/tsunamireg.h"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/PciConfigData.hh"
|
||||
#include "sim/byteswap.hh"
|
||||
#include "sim/param.hh"
|
||||
#include "sim/core.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -84,8 +83,8 @@ PciDev::PciConfigPort::getDeviceAddressRanges(AddrRangeList &resp,
|
|||
|
||||
|
||||
PciDev::PciDev(Params *p)
|
||||
: DmaDevice(p), plat(p->platform), configData(p->configData),
|
||||
pioDelay(p->pio_delay), configDelay(p->config_delay),
|
||||
: DmaDevice(p), plat(p->platform), configData(p->configdata),
|
||||
pioDelay(p->pio_latency), configDelay(p->config_latency),
|
||||
configPort(NULL)
|
||||
{
|
||||
// copy the config data from the PciConfigData object
|
||||
|
@ -97,7 +96,7 @@ PciDev::PciDev(Params *p)
|
|||
|
||||
memset(BARAddrs, 0, sizeof(BARAddrs));
|
||||
|
||||
plat->registerPciDevice(0, p->deviceNum, p->functionNum,
|
||||
plat->registerPciDevice(0, p->pci_dev, p->pci_func,
|
||||
letoh(configData->config.interruptLine));
|
||||
}
|
||||
|
||||
|
@ -136,21 +135,21 @@ PciDev::readConfig(PacketPtr pkt)
|
|||
pkt->set<uint8_t>(config.data[offset]);
|
||||
DPRINTF(PCIDEV,
|
||||
"readConfig: dev %#x func %#x reg %#x 1 bytes: data = %#x\n",
|
||||
params()->deviceNum, params()->functionNum, offset,
|
||||
params()->pci_dev, params()->pci_func, offset,
|
||||
(uint32_t)pkt->get<uint8_t>());
|
||||
break;
|
||||
case sizeof(uint16_t):
|
||||
pkt->set<uint16_t>(*(uint16_t*)&config.data[offset]);
|
||||
DPRINTF(PCIDEV,
|
||||
"readConfig: dev %#x func %#x reg %#x 2 bytes: data = %#x\n",
|
||||
params()->deviceNum, params()->functionNum, offset,
|
||||
params()->pci_dev, params()->pci_func, offset,
|
||||
(uint32_t)pkt->get<uint16_t>());
|
||||
break;
|
||||
case sizeof(uint32_t):
|
||||
pkt->set<uint32_t>(*(uint32_t*)&config.data[offset]);
|
||||
DPRINTF(PCIDEV,
|
||||
"readConfig: dev %#x func %#x reg %#x 4 bytes: data = %#x\n",
|
||||
params()->deviceNum, params()->functionNum, offset,
|
||||
params()->pci_dev, params()->pci_func, offset,
|
||||
(uint32_t)pkt->get<uint32_t>());
|
||||
break;
|
||||
default:
|
||||
|
@ -200,7 +199,7 @@ PciDev::writeConfig(PacketPtr pkt)
|
|||
}
|
||||
DPRINTF(PCIDEV,
|
||||
"writeConfig: dev %#x func %#x reg %#x 1 bytes: data = %#x\n",
|
||||
params()->deviceNum, params()->functionNum, offset,
|
||||
params()->pci_dev, params()->pci_func, offset,
|
||||
(uint32_t)pkt->get<uint8_t>());
|
||||
break;
|
||||
case sizeof(uint16_t):
|
||||
|
@ -217,7 +216,7 @@ PciDev::writeConfig(PacketPtr pkt)
|
|||
}
|
||||
DPRINTF(PCIDEV,
|
||||
"writeConfig: dev %#x func %#x reg %#x 2 bytes: data = %#x\n",
|
||||
params()->deviceNum, params()->functionNum, offset,
|
||||
params()->pci_dev, params()->pci_func, offset,
|
||||
(uint32_t)pkt->get<uint16_t>());
|
||||
break;
|
||||
case sizeof(uint32_t):
|
||||
|
@ -277,7 +276,7 @@ PciDev::writeConfig(PacketPtr pkt)
|
|||
}
|
||||
DPRINTF(PCIDEV,
|
||||
"writeConfig: dev %#x func %#x reg %#x 4 bytes: data = %#x\n",
|
||||
params()->deviceNum, params()->functionNum, offset,
|
||||
params()->pci_dev, params()->pci_func, offset,
|
||||
(uint32_t)pkt->get<uint32_t>());
|
||||
break;
|
||||
default:
|
||||
|
@ -307,113 +306,38 @@ PciDev::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
|
||||
}
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(PciConfigData)
|
||||
|
||||
Param<uint16_t> VendorID;
|
||||
Param<uint16_t> DeviceID;
|
||||
Param<uint16_t> Command;
|
||||
Param<uint16_t> Status;
|
||||
Param<uint8_t> Revision;
|
||||
Param<uint8_t> ProgIF;
|
||||
Param<uint8_t> SubClassCode;
|
||||
Param<uint8_t> ClassCode;
|
||||
Param<uint8_t> CacheLineSize;
|
||||
Param<uint8_t> LatencyTimer;
|
||||
Param<uint8_t> HeaderType;
|
||||
Param<uint8_t> BIST;
|
||||
Param<uint32_t> BAR0;
|
||||
Param<uint32_t> BAR1;
|
||||
Param<uint32_t> BAR2;
|
||||
Param<uint32_t> BAR3;
|
||||
Param<uint32_t> BAR4;
|
||||
Param<uint32_t> BAR5;
|
||||
Param<uint32_t> CardbusCIS;
|
||||
Param<uint16_t> SubsystemVendorID;
|
||||
Param<uint16_t> SubsystemID;
|
||||
Param<uint32_t> ExpansionROM;
|
||||
Param<uint8_t> InterruptLine;
|
||||
Param<uint8_t> InterruptPin;
|
||||
Param<uint8_t> MinimumGrant;
|
||||
Param<uint8_t> MaximumLatency;
|
||||
Param<uint32_t> BAR0Size;
|
||||
Param<uint32_t> BAR1Size;
|
||||
Param<uint32_t> BAR2Size;
|
||||
Param<uint32_t> BAR3Size;
|
||||
Param<uint32_t> BAR4Size;
|
||||
Param<uint32_t> BAR5Size;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(PciConfigData)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(PciConfigData)
|
||||
|
||||
INIT_PARAM(VendorID, "Vendor ID"),
|
||||
INIT_PARAM(DeviceID, "Device ID"),
|
||||
INIT_PARAM_DFLT(Command, "Command Register", 0x00),
|
||||
INIT_PARAM_DFLT(Status, "Status Register", 0x00),
|
||||
INIT_PARAM_DFLT(Revision, "Device Revision", 0x00),
|
||||
INIT_PARAM_DFLT(ProgIF, "Programming Interface", 0x00),
|
||||
INIT_PARAM(SubClassCode, "Sub-Class Code"),
|
||||
INIT_PARAM(ClassCode, "Class Code"),
|
||||
INIT_PARAM_DFLT(CacheLineSize, "System Cacheline Size", 0x00),
|
||||
INIT_PARAM_DFLT(LatencyTimer, "PCI Latency Timer", 0x00),
|
||||
INIT_PARAM_DFLT(HeaderType, "PCI Header Type", 0x00),
|
||||
INIT_PARAM_DFLT(BIST, "Built In Self Test", 0x00),
|
||||
INIT_PARAM_DFLT(BAR0, "Base Address Register 0", 0x00),
|
||||
INIT_PARAM_DFLT(BAR1, "Base Address Register 1", 0x00),
|
||||
INIT_PARAM_DFLT(BAR2, "Base Address Register 2", 0x00),
|
||||
INIT_PARAM_DFLT(BAR3, "Base Address Register 3", 0x00),
|
||||
INIT_PARAM_DFLT(BAR4, "Base Address Register 4", 0x00),
|
||||
INIT_PARAM_DFLT(BAR5, "Base Address Register 5", 0x00),
|
||||
INIT_PARAM_DFLT(CardbusCIS, "Cardbus Card Information Structure", 0x00),
|
||||
INIT_PARAM_DFLT(SubsystemVendorID, "Subsystem Vendor ID", 0x00),
|
||||
INIT_PARAM_DFLT(SubsystemID, "Subsystem ID", 0x00),
|
||||
INIT_PARAM_DFLT(ExpansionROM, "Expansion ROM Base Address Register", 0x00),
|
||||
INIT_PARAM(InterruptLine, "Interrupt Line Register"),
|
||||
INIT_PARAM(InterruptPin, "Interrupt Pin Register"),
|
||||
INIT_PARAM_DFLT(MinimumGrant, "Minimum Grant", 0x00),
|
||||
INIT_PARAM_DFLT(MaximumLatency, "Maximum Latency", 0x00),
|
||||
INIT_PARAM_DFLT(BAR0Size, "Base Address Register 0 Size", 0x00),
|
||||
INIT_PARAM_DFLT(BAR1Size, "Base Address Register 1 Size", 0x00),
|
||||
INIT_PARAM_DFLT(BAR2Size, "Base Address Register 2 Size", 0x00),
|
||||
INIT_PARAM_DFLT(BAR3Size, "Base Address Register 3 Size", 0x00),
|
||||
INIT_PARAM_DFLT(BAR4Size, "Base Address Register 4 Size", 0x00),
|
||||
INIT_PARAM_DFLT(BAR5Size, "Base Address Register 5 Size", 0x00)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(PciConfigData)
|
||||
|
||||
CREATE_SIM_OBJECT(PciConfigData)
|
||||
PciConfigData *
|
||||
PciConfigDataParams::create()
|
||||
{
|
||||
PciConfigData *data = new PciConfigData(getInstanceName());
|
||||
PciConfigData *data = new PciConfigData(name);
|
||||
|
||||
data->config.vendor = htole(VendorID.returnValue());
|
||||
data->config.device = htole(DeviceID.returnValue());
|
||||
data->config.command = htole(Command.returnValue());
|
||||
data->config.status = htole(Status.returnValue());
|
||||
data->config.revision = htole(Revision.returnValue());
|
||||
data->config.progIF = htole(ProgIF.returnValue());
|
||||
data->config.subClassCode = htole(SubClassCode.returnValue());
|
||||
data->config.classCode = htole(ClassCode.returnValue());
|
||||
data->config.cacheLineSize = htole(CacheLineSize.returnValue());
|
||||
data->config.latencyTimer = htole(LatencyTimer.returnValue());
|
||||
data->config.headerType = htole(HeaderType.returnValue());
|
||||
data->config.bist = htole(BIST.returnValue());
|
||||
data->config.vendor = htole(VendorID);
|
||||
data->config.device = htole(DeviceID);
|
||||
data->config.command = htole(Command);
|
||||
data->config.status = htole(Status);
|
||||
data->config.revision = htole(Revision);
|
||||
data->config.progIF = htole(ProgIF);
|
||||
data->config.subClassCode = htole(SubClassCode);
|
||||
data->config.classCode = htole(ClassCode);
|
||||
data->config.cacheLineSize = htole(CacheLineSize);
|
||||
data->config.latencyTimer = htole(LatencyTimer);
|
||||
data->config.headerType = htole(HeaderType);
|
||||
data->config.bist = htole(BIST);
|
||||
|
||||
data->config.baseAddr[0] = htole(BAR0.returnValue());
|
||||
data->config.baseAddr[1] = htole(BAR1.returnValue());
|
||||
data->config.baseAddr[2] = htole(BAR2.returnValue());
|
||||
data->config.baseAddr[3] = htole(BAR3.returnValue());
|
||||
data->config.baseAddr[4] = htole(BAR4.returnValue());
|
||||
data->config.baseAddr[5] = htole(BAR5.returnValue());
|
||||
data->config.cardbusCIS = htole(CardbusCIS.returnValue());
|
||||
data->config.subsystemVendorID = htole(SubsystemVendorID.returnValue());
|
||||
data->config.subsystemID = htole(SubsystemID.returnValue());
|
||||
data->config.expansionROM = htole(ExpansionROM.returnValue());
|
||||
data->config.interruptLine = htole(InterruptLine.returnValue());
|
||||
data->config.interruptPin = htole(InterruptPin.returnValue());
|
||||
data->config.minimumGrant = htole(MinimumGrant.returnValue());
|
||||
data->config.maximumLatency = htole(MaximumLatency.returnValue());
|
||||
data->config.baseAddr[0] = htole(BAR0);
|
||||
data->config.baseAddr[1] = htole(BAR1);
|
||||
data->config.baseAddr[2] = htole(BAR2);
|
||||
data->config.baseAddr[3] = htole(BAR3);
|
||||
data->config.baseAddr[4] = htole(BAR4);
|
||||
data->config.baseAddr[5] = htole(BAR5);
|
||||
data->config.cardbusCIS = htole(CardbusCIS);
|
||||
data->config.subsystemVendorID = htole(SubsystemVendorID);
|
||||
data->config.subsystemID = htole(SubsystemID);
|
||||
data->config.expansionROM = htole(ExpansionROM);
|
||||
data->config.interruptLine = htole(InterruptLine);
|
||||
data->config.interruptPin = htole(InterruptPin);
|
||||
data->config.minimumGrant = htole(MinimumGrant);
|
||||
data->config.maximumLatency = htole(MaximumLatency);
|
||||
|
||||
data->BARSize[0] = BAR0Size;
|
||||
data->BARSize[1] = BAR1Size;
|
||||
|
@ -426,13 +350,9 @@ CREATE_SIM_OBJECT(PciConfigData)
|
|||
uint32_t barsize = data->BARSize[i];
|
||||
if (barsize != 0 && !isPowerOf2(barsize)) {
|
||||
fatal("%s: BAR %d size %d is not a power of 2\n",
|
||||
getInstanceName(), i, data->BARSize[i]);
|
||||
name, i, data->BARSize[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("PciConfigData", PciConfigData)
|
||||
|
||||
#endif // DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include "dev/io_device.hh"
|
||||
#include "dev/pcireg.h"
|
||||
#include "dev/platform.hh"
|
||||
#include "params/PciDevice.hh"
|
||||
#include "sim/byteswap.hh"
|
||||
|
||||
#define BAR_IO_MASK 0x3
|
||||
|
@ -105,32 +106,12 @@ class PciDev : public DmaDevice
|
|||
};
|
||||
|
||||
public:
|
||||
struct Params : public DmaDevice::Params
|
||||
typedef PciDeviceParams Params;
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
/**
|
||||
* A pointer to the object that contains the first 64 bytes of
|
||||
* config space
|
||||
*/
|
||||
PciConfigData *configData;
|
||||
|
||||
/** The bus number we are on */
|
||||
uint32_t busNum;
|
||||
|
||||
/** The device number we have */
|
||||
uint32_t deviceNum;
|
||||
|
||||
/** The function number */
|
||||
uint32_t functionNum;
|
||||
|
||||
/** The latency for pio accesses. */
|
||||
Tick pio_delay;
|
||||
|
||||
/** The latency for a config access. */
|
||||
Tick config_delay;
|
||||
};
|
||||
|
||||
public:
|
||||
const Params *params() const { return (const Params *)_params; }
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
protected:
|
||||
/** The current config space. Unlike the PciConfigData this is
|
||||
|
@ -266,8 +247,8 @@ class PciDev : public DmaDevice
|
|||
if (if_name == "config") {
|
||||
if (configPort != NULL)
|
||||
panic("pciconfig port already connected to.");
|
||||
configPort = new PciConfigPort(this, params()->busNum,
|
||||
params()->deviceNum, params()->functionNum,
|
||||
configPort = new PciConfigPort(this, params()->pci_bus,
|
||||
params()->pci_dev, params()->pci_func,
|
||||
params()->platform);
|
||||
return configPort;
|
||||
}
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
|
||||
#include "base/misc.hh"
|
||||
#include "dev/platform.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/sim_exit.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -79,7 +78,3 @@ Platform::registerPciDevice(uint8_t bus, uint8_t dev, uint8_t func, uint8_t intr
|
|||
|
||||
intLines.set(intr);
|
||||
}
|
||||
|
||||
|
||||
DEFINE_SIM_OBJECT_CLASS_NAME("Platform", Platform)
|
||||
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
#include "dev/platform.hh"
|
||||
#include "dev/simconsole.hh"
|
||||
#include "dev/uart.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/SimConsole.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -325,38 +325,17 @@ SimConsole::out(char c)
|
|||
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(SimConsole)
|
||||
|
||||
SimObjectParam<IntrControl *> intr_control;
|
||||
Param<string> output;
|
||||
Param<int> port;
|
||||
Param<bool> append_name;
|
||||
Param<int> number;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(SimConsole)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(SimConsole)
|
||||
|
||||
INIT_PARAM(intr_control, "interrupt controller"),
|
||||
INIT_PARAM(output, "file to dump output to"),
|
||||
INIT_PARAM(port, ""),
|
||||
INIT_PARAM_DFLT(append_name, "append name() to filename", true),
|
||||
INIT_PARAM_DFLT(number, "console number", 0)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(SimConsole)
|
||||
|
||||
CREATE_SIM_OBJECT(SimConsole)
|
||||
SimConsole *
|
||||
SimConsoleParams::create()
|
||||
{
|
||||
string filename = output;
|
||||
ostream *stream = NULL;
|
||||
|
||||
if (!filename.empty()) {
|
||||
if (append_name)
|
||||
filename += "." + getInstanceName();
|
||||
filename += "." + name;
|
||||
stream = simout.find(filename);
|
||||
}
|
||||
|
||||
return new SimConsole(getInstanceName(), stream, number, port);
|
||||
return new SimConsole(name, stream, number, port);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("SimConsole", SimConsole)
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
#include "dev/disk_image.hh"
|
||||
#include "dev/simple_disk.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/SimpleDisk.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -91,23 +91,8 @@ SimpleDisk::write(Addr addr, baddr_t block, int count)
|
|||
#endif
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(SimpleDisk)
|
||||
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<DiskImage *> disk;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(SimpleDisk)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(SimpleDisk)
|
||||
|
||||
INIT_PARAM(system, "System pointer"),
|
||||
INIT_PARAM(disk, "Disk Image")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(SimpleDisk)
|
||||
|
||||
CREATE_SIM_OBJECT(SimpleDisk)
|
||||
SimpleDisk *
|
||||
SimpleDiskParams::create()
|
||||
{
|
||||
return new SimpleDisk(getInstanceName(), system, disk);
|
||||
return new SimpleDisk(name, system, disk);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("SimpleDisk", SimpleDisk)
|
||||
|
|
176
src/dev/sinic.cc
176
src/dev/sinic.cc
|
@ -32,6 +32,7 @@
|
|||
#include <limits>
|
||||
#include <string>
|
||||
|
||||
#include "arch/vtophys.hh"
|
||||
#include "base/inet.hh"
|
||||
#include "cpu/thread_context.hh"
|
||||
#include "cpu/intr_control.hh"
|
||||
|
@ -39,12 +40,10 @@
|
|||
#include "dev/sinic.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/debug.hh"
|
||||
#include "sim/eventq.hh"
|
||||
#include "sim/host.hh"
|
||||
#include "sim/stats.hh"
|
||||
#include "arch/vtophys.hh"
|
||||
|
||||
using namespace Net;
|
||||
using namespace TheISA;
|
||||
|
@ -754,7 +753,7 @@ Device::reset()
|
|||
regs.TxFifoSize = params()->tx_fifo_size;
|
||||
regs.RxFifoMark = params()->rx_fifo_threshold;
|
||||
regs.TxFifoMark = params()->tx_fifo_threshold;
|
||||
regs.HwAddr = params()->eaddr;
|
||||
regs.HwAddr = params()->hardware_address;
|
||||
|
||||
rxList.clear();
|
||||
rxBusy.clear();
|
||||
|
@ -1596,172 +1595,23 @@ Device::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
|
||||
/* namespace Sinic */ }
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS_WNS(Sinic, SinicInterface)
|
||||
|
||||
SimObjectParam<EtherInt *> peer;
|
||||
SimObjectParam<Sinic::Device *> device;
|
||||
END_DECLARE_SIM_OBJECT_PARAMS_WNS(Sinic, SinicInterface)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS_WNS(Sinic, SinicInterface)
|
||||
|
||||
INIT_PARAM_DFLT(peer, "peer interface", NULL),
|
||||
INIT_PARAM(device, "Ethernet device of this interface")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS_WNS(Sinic, SinicInterface)
|
||||
|
||||
CREATE_SIM_OBJECT_WNS(Sinic, SinicInterface)
|
||||
Sinic::Interface *
|
||||
SinicIntParams::create()
|
||||
{
|
||||
Sinic::Interface *dev_int = new Sinic::Interface(getInstanceName(), device);
|
||||
using namespace Sinic;
|
||||
|
||||
EtherInt *p = (EtherInt *)peer;
|
||||
if (p) {
|
||||
dev_int->setPeer(p);
|
||||
p->setPeer(dev_int);
|
||||
Interface *dev_int = new Interface(name, device);
|
||||
|
||||
if (peer) {
|
||||
dev_int->setPeer(peer);
|
||||
peer->setPeer(dev_int);
|
||||
}
|
||||
|
||||
return dev_int;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT_WNS(Sinic, "SinicInt", SinicInterface)
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS_WNS(Sinic, SinicDevice)
|
||||
|
||||
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<Platform *> platform;
|
||||
Param<Tick> min_backoff_delay;
|
||||
Param<Tick> max_backoff_delay;
|
||||
SimObjectParam<PciConfigData *> configdata;
|
||||
Param<uint32_t> pci_bus;
|
||||
Param<uint32_t> pci_dev;
|
||||
Param<uint32_t> pci_func;
|
||||
Param<Tick> pio_latency;
|
||||
Param<Tick> config_latency;
|
||||
Param<Tick> intr_delay;
|
||||
|
||||
Param<Tick> clock;
|
||||
Param<Tick> dma_read_delay;
|
||||
Param<Tick> dma_read_factor;
|
||||
Param<Tick> dma_write_delay;
|
||||
Param<Tick> dma_write_factor;
|
||||
|
||||
Param<Tick> rx_delay;
|
||||
Param<Tick> tx_delay;
|
||||
Param<uint32_t> rx_max_copy;
|
||||
Param<uint32_t> tx_max_copy;
|
||||
Param<uint32_t> rx_max_intr;
|
||||
Param<uint32_t> rx_fifo_size;
|
||||
Param<uint32_t> tx_fifo_size;
|
||||
Param<uint32_t> rx_fifo_threshold;
|
||||
Param<uint32_t> rx_fifo_low_mark;
|
||||
Param<uint32_t> tx_fifo_high_mark;
|
||||
Param<uint32_t> tx_fifo_threshold;
|
||||
|
||||
Param<bool> rx_filter;
|
||||
Param<std::string> hardware_address;
|
||||
Param<bool> rx_thread;
|
||||
Param<bool> tx_thread;
|
||||
Param<bool> rss;
|
||||
Param<uint32_t> virtual_count;
|
||||
Param<bool> zero_copy;
|
||||
Param<bool> delay_copy;
|
||||
Param<bool> virtual_addr;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS_WNS(Sinic, SinicDevice)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS_WNS(Sinic, SinicDevice)
|
||||
|
||||
|
||||
INIT_PARAM(system, "System pointer"),
|
||||
INIT_PARAM(platform, "Platform pointer"),
|
||||
INIT_PARAM(min_backoff_delay, "Minimum delay after receving a nack packed"),
|
||||
INIT_PARAM(max_backoff_delay, "Maximum delay after receving a nack packed"),
|
||||
INIT_PARAM(configdata, "PCI Config data"),
|
||||
INIT_PARAM(pci_bus, "PCI bus ID"),
|
||||
INIT_PARAM(pci_dev, "PCI device number"),
|
||||
INIT_PARAM(pci_func, "PCI function code"),
|
||||
INIT_PARAM_DFLT(pio_latency, "Programmed IO latency in bus cycles", 1),
|
||||
INIT_PARAM(config_latency, "Number of cycles for a config read or write"),
|
||||
INIT_PARAM(intr_delay, "Interrupt Delay"),
|
||||
INIT_PARAM(clock, "State machine cycle time"),
|
||||
|
||||
INIT_PARAM(dma_read_delay, "fixed delay for dma reads"),
|
||||
INIT_PARAM(dma_read_factor, "multiplier for dma reads"),
|
||||
INIT_PARAM(dma_write_delay, "fixed delay for dma writes"),
|
||||
INIT_PARAM(dma_write_factor, "multiplier for dma writes"),
|
||||
|
||||
INIT_PARAM(rx_delay, "Receive Delay"),
|
||||
INIT_PARAM(tx_delay, "Transmit Delay"),
|
||||
INIT_PARAM(rx_max_copy, "rx max copy"),
|
||||
INIT_PARAM(tx_max_copy, "rx max copy"),
|
||||
INIT_PARAM(rx_max_intr, "rx max intr"),
|
||||
INIT_PARAM(rx_fifo_size, "max size in bytes of rxFifo"),
|
||||
INIT_PARAM(tx_fifo_size, "max size in bytes of txFifo"),
|
||||
INIT_PARAM(rx_fifo_threshold, "max size in bytes of rxFifo"),
|
||||
INIT_PARAM(rx_fifo_low_mark, "max size in bytes of rxFifo"),
|
||||
INIT_PARAM(tx_fifo_high_mark, "max size in bytes of txFifo"),
|
||||
INIT_PARAM(tx_fifo_threshold, "max size in bytes of txFifo"),
|
||||
|
||||
INIT_PARAM(rx_filter, "Enable Receive Filter"),
|
||||
INIT_PARAM(hardware_address, "Ethernet Hardware Address"),
|
||||
INIT_PARAM(rx_thread, ""),
|
||||
INIT_PARAM(tx_thread, ""),
|
||||
INIT_PARAM(rss, ""),
|
||||
INIT_PARAM(virtual_count, ""),
|
||||
INIT_PARAM(zero_copy, ""),
|
||||
INIT_PARAM(delay_copy, ""),
|
||||
INIT_PARAM(virtual_addr, "")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS_WNS(Sinic, SinicDevice)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT_WNS(Sinic, SinicDevice)
|
||||
Sinic::Device *
|
||||
SinicParams::create()
|
||||
{
|
||||
Sinic::Sinic::Device::Params *params = new Device::Params;
|
||||
params->name = getInstanceName();
|
||||
params->platform = platform;
|
||||
params->system = system;
|
||||
params->min_backoff_delay = min_backoff_delay;
|
||||
params->max_backoff_delay = max_backoff_delay;
|
||||
params->configData = configdata;
|
||||
params->busNum = pci_bus;
|
||||
params->deviceNum = pci_dev;
|
||||
params->functionNum = pci_func;
|
||||
params->pio_delay = pio_latency;
|
||||
params->config_delay = config_latency;
|
||||
params->intr_delay = intr_delay;
|
||||
params->clock = clock;
|
||||
|
||||
params->dma_read_delay = dma_read_delay;
|
||||
params->dma_read_factor = dma_read_factor;
|
||||
params->dma_write_delay = dma_write_delay;
|
||||
params->dma_write_factor = dma_write_factor;
|
||||
|
||||
params->tx_delay = tx_delay;
|
||||
params->rx_delay = rx_delay;
|
||||
params->rx_max_copy = rx_max_copy;
|
||||
params->tx_max_copy = tx_max_copy;
|
||||
params->rx_max_intr = rx_max_intr;
|
||||
params->rx_fifo_size = rx_fifo_size;
|
||||
params->tx_fifo_size = tx_fifo_size;
|
||||
params->rx_fifo_threshold = rx_fifo_threshold;
|
||||
params->rx_fifo_low_mark = rx_fifo_low_mark;
|
||||
params->tx_fifo_high_mark = tx_fifo_high_mark;
|
||||
params->tx_fifo_threshold = tx_fifo_threshold;
|
||||
|
||||
params->rx_filter = rx_filter;
|
||||
params->eaddr = hardware_address;
|
||||
params->rx_thread = rx_thread;
|
||||
params->tx_thread = tx_thread;
|
||||
params->rss = rss;
|
||||
params->virtual_count = virtual_count;
|
||||
params->zero_copy = zero_copy;
|
||||
params->delay_copy = delay_copy;
|
||||
params->virtual_addr = virtual_addr;
|
||||
|
||||
return new Sinic::Device(params);
|
||||
return new Sinic::Device(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT_WNS(Sinic, "Sinic", SinicDevice)
|
||||
|
||||
|
|
|
@ -39,6 +39,8 @@
|
|||
#include "dev/pcidev.hh"
|
||||
#include "dev/pktfifo.hh"
|
||||
#include "dev/sinicreg.hh"
|
||||
#include "params/Sinic.hh"
|
||||
#include "params/SinicInt.hh"
|
||||
#include "sim/eventq.hh"
|
||||
|
||||
namespace Sinic {
|
||||
|
@ -80,12 +82,8 @@ class Base : public PciDev
|
|||
* Construction/Destruction/Parameters
|
||||
*/
|
||||
public:
|
||||
struct Params : public PciDev::Params
|
||||
{
|
||||
Tick clock;
|
||||
Tick intr_delay;
|
||||
};
|
||||
|
||||
typedef SinicParams Params;
|
||||
const Params *params() const { return (const Params *)_params; }
|
||||
Base(Params *p);
|
||||
};
|
||||
|
||||
|
@ -313,43 +311,8 @@ class Device : public Base
|
|||
virtual void serialize(std::ostream &os);
|
||||
virtual void unserialize(Checkpoint *cp, const std::string §ion);
|
||||
|
||||
/**
|
||||
* Construction/Destruction/Parameters
|
||||
*/
|
||||
public:
|
||||
struct Params : public Base::Params
|
||||
{
|
||||
Tick tx_delay;
|
||||
Tick rx_delay;
|
||||
bool rx_filter;
|
||||
Net::EthAddr eaddr;
|
||||
uint32_t rx_max_copy;
|
||||
uint32_t tx_max_copy;
|
||||
uint32_t rx_max_intr;
|
||||
uint32_t rx_fifo_size;
|
||||
uint32_t tx_fifo_size;
|
||||
uint32_t rx_fifo_threshold;
|
||||
uint32_t rx_fifo_low_mark;
|
||||
uint32_t tx_fifo_high_mark;
|
||||
uint32_t tx_fifo_threshold;
|
||||
Tick dma_read_delay;
|
||||
Tick dma_read_factor;
|
||||
Tick dma_write_delay;
|
||||
Tick dma_write_factor;
|
||||
bool rx_thread;
|
||||
bool tx_thread;
|
||||
bool rss;
|
||||
uint32_t virtual_count;
|
||||
bool zero_copy;
|
||||
bool delay_copy;
|
||||
bool virtual_addr;
|
||||
};
|
||||
|
||||
protected:
|
||||
const Params *params() const { return (const Params *)_params; }
|
||||
|
||||
public:
|
||||
Device(Params *params);
|
||||
Device(Params *p);
|
||||
~Device();
|
||||
};
|
||||
|
||||
|
|
|
@ -37,26 +37,25 @@
|
|||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "base/time.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "dev/sparc/dtod.hh"
|
||||
#include "dev/platform.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
using namespace TheISA;
|
||||
|
||||
DumbTOD::DumbTOD(Params *p)
|
||||
DumbTOD::DumbTOD(const Params *p)
|
||||
: BasicPioDevice(p)
|
||||
{
|
||||
struct tm tm;
|
||||
struct tm tm = p->time;
|
||||
char *tz;
|
||||
|
||||
pioSize = 0x08;
|
||||
|
||||
parseTime(p->init_time, &tm);
|
||||
tz = getenv("TZ");
|
||||
setenv("TZ", "", 1);
|
||||
tzset();
|
||||
|
@ -104,37 +103,8 @@ DumbTOD::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
UNSERIALIZE_SCALAR(todTime);
|
||||
}
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(DumbTOD)
|
||||
|
||||
Param<Addr> pio_addr;
|
||||
Param<Tick> pio_latency;
|
||||
SimObjectParam<Platform *> platform;
|
||||
SimObjectParam<System *> system;
|
||||
VectorParam<int> time;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(DumbTOD)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(DumbTOD)
|
||||
|
||||
INIT_PARAM(pio_addr, "Device Address"),
|
||||
INIT_PARAM(pio_latency, "Programmed IO latency"),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(time, "")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(DumbTOD)
|
||||
|
||||
CREATE_SIM_OBJECT(DumbTOD)
|
||||
DumbTOD *
|
||||
DumbTODParams::create()
|
||||
{
|
||||
DumbTOD::Params *p = new DumbTOD::Params;
|
||||
p->name =getInstanceName();
|
||||
p->pio_addr = pio_addr;
|
||||
p->pio_delay = pio_latency;
|
||||
p->platform = platform;
|
||||
p->system = system;
|
||||
p->init_time = time;
|
||||
return new DumbTOD(p);
|
||||
return new DumbTOD(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("DumbTOD", DumbTOD)
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
#include "base/range.hh"
|
||||
#include "dev/io_device.hh"
|
||||
|
||||
#include "params/DumbTOD.hh"
|
||||
|
||||
/**
|
||||
* DumbTOD simply returns some idea of time when read. Until we finish with
|
||||
|
@ -52,15 +52,14 @@ class DumbTOD : public BasicPioDevice
|
|||
uint64_t todTime;
|
||||
|
||||
public:
|
||||
struct Params : public BasicPioDevice::Params
|
||||
{
|
||||
std::vector<int> init_time;
|
||||
};
|
||||
protected:
|
||||
const Params *params() const { return (const Params *)_params; }
|
||||
typedef DumbTODParams Params;
|
||||
DumbTOD(const Params *p);
|
||||
|
||||
public:
|
||||
DumbTOD(Params *p);
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
virtual Tick read(PacketPtr pkt);
|
||||
virtual Tick write(PacketPtr pkt);
|
||||
|
|
|
@ -45,11 +45,10 @@
|
|||
#include "dev/platform.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/faults.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
Iob::Iob(Params *p)
|
||||
Iob::Iob(const Params *p)
|
||||
: PioDevice(p), ic(p->platform->intrctrl)
|
||||
{
|
||||
iobManAddr = ULL(0x9800000000);
|
||||
|
@ -372,31 +371,8 @@ Iob::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(Iob)
|
||||
Param<Tick> pio_latency;
|
||||
SimObjectParam<Platform *> platform;
|
||||
SimObjectParam<System *> system;
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(Iob)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(Iob)
|
||||
|
||||
INIT_PARAM(pio_latency, "Programmed IO latency"),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM(system, "system object")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(Iob)
|
||||
|
||||
CREATE_SIM_OBJECT(Iob)
|
||||
Iob *
|
||||
IobParams::create()
|
||||
{
|
||||
Iob::Params *p = new Iob::Params;
|
||||
p->name = getInstanceName();
|
||||
p->pio_delay = pio_latency;
|
||||
p->platform = platform;
|
||||
p->system = system;
|
||||
return new Iob(p);
|
||||
return new Iob(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("Iob", Iob)
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "base/range.hh"
|
||||
#include "dev/io_device.hh"
|
||||
#include "dev/disk_image.hh"
|
||||
#include "params/Iob.hh"
|
||||
|
||||
class IntrControl;
|
||||
|
||||
|
@ -123,24 +124,22 @@ class Iob : public PioDevice
|
|||
void readIob(PacketPtr pkt);
|
||||
void readJBus(PacketPtr pkt);
|
||||
|
||||
|
||||
public:
|
||||
struct Params : public PioDevice::Params
|
||||
typedef IobParams Params;
|
||||
Iob(const Params *p);
|
||||
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
Tick pio_delay;
|
||||
};
|
||||
protected:
|
||||
const Params *params() const { return (const Params*)_params; }
|
||||
|
||||
public:
|
||||
Iob(Params *p);
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
virtual Tick read(PacketPtr pkt);
|
||||
virtual Tick write(PacketPtr pkt);
|
||||
void generateIpi(Type type, int cpu_id, int vector);
|
||||
void receiveDeviceInterrupt(DeviceId devid);
|
||||
bool receiveJBusInterrupt(int cpu_id, int source, uint64_t d0, uint64_t d1);
|
||||
|
||||
bool receiveJBusInterrupt(int cpu_id, int source, uint64_t d0,
|
||||
uint64_t d1);
|
||||
|
||||
void addressRanges(AddrRangeList &range_list);
|
||||
|
||||
|
|
|
@ -40,11 +40,10 @@
|
|||
#include "dev/platform.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "sim/byteswap.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
MmDisk::MmDisk(Params *p)
|
||||
MmDisk::MmDisk(const Params *p)
|
||||
: BasicPioDevice(p), image(p->image), curSector((off_t)-1), dirty(false)
|
||||
{
|
||||
std::memset(&diskData, 0, SectorSize);
|
||||
|
@ -173,39 +172,8 @@ MmDisk::serialize(std::ostream &os)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(MmDisk)
|
||||
Param<Addr> pio_addr;
|
||||
Param<Tick> pio_latency;
|
||||
Param<Addr> pio_size;
|
||||
SimObjectParam<Platform *> platform;
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<DiskImage *> image;
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(MmDisk)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(MmDisk)
|
||||
|
||||
INIT_PARAM(pio_addr, "Device Address"),
|
||||
INIT_PARAM(pio_latency, "Programmed IO latency"),
|
||||
INIT_PARAM(pio_size, "Size of address range"),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM(system, "system object"),
|
||||
INIT_PARAM(image, "disk image")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(MmDisk)
|
||||
|
||||
CREATE_SIM_OBJECT(MmDisk)
|
||||
MmDisk *
|
||||
MmDiskParams::create()
|
||||
{
|
||||
MmDisk::Params *p = new MmDisk::Params;
|
||||
p->name = getInstanceName();
|
||||
p->pio_addr = pio_addr;
|
||||
p->pio_delay = pio_latency;
|
||||
p->platform = platform;
|
||||
p->system = system;
|
||||
p->image = image;
|
||||
return new MmDisk(p);
|
||||
return new MmDisk(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("MmDisk", MmDisk)
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include "base/range.hh"
|
||||
#include "dev/io_device.hh"
|
||||
#include "dev/disk_image.hh"
|
||||
#include "params/MmDisk.hh"
|
||||
|
||||
class MmDisk : public BasicPioDevice
|
||||
{
|
||||
|
@ -49,15 +50,14 @@ class MmDisk : public BasicPioDevice
|
|||
uint8_t diskData[SectorSize];
|
||||
|
||||
public:
|
||||
struct Params : public BasicPioDevice::Params
|
||||
{
|
||||
DiskImage *image;
|
||||
};
|
||||
protected:
|
||||
const Params *params() const { return (const Params*)_params; }
|
||||
typedef MmDiskParams Params;
|
||||
MmDisk(const Params *p);
|
||||
|
||||
public:
|
||||
MmDisk(Params *p);
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
virtual Tick read(PacketPtr pkt);
|
||||
virtual Tick write(PacketPtr pkt);
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#include "cpu/intr_control.hh"
|
||||
#include "dev/simconsole.hh"
|
||||
#include "dev/sparc/t1000.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/T1000.hh"
|
||||
#include "sim/system.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -101,23 +101,8 @@ T1000::calcConfigAddr(int bus, int dev, int func)
|
|||
M5_DUMMY_RETURN
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(T1000)
|
||||
|
||||
SimObjectParam<System *> system;
|
||||
SimObjectParam<IntrControl *> intrctrl;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(T1000)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(T1000)
|
||||
|
||||
INIT_PARAM(system, "system"),
|
||||
INIT_PARAM(intrctrl, "interrupt controller")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(T1000)
|
||||
|
||||
CREATE_SIM_OBJECT(T1000)
|
||||
T1000 *
|
||||
T1000Params::create()
|
||||
{
|
||||
return new T1000(getInstanceName(), system, intrctrl);
|
||||
return new T1000(name, system, intrctrl);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("T1000", T1000)
|
||||
|
|
|
@ -35,19 +35,14 @@
|
|||
#include "dev/simconsole.hh"
|
||||
#include "dev/uart.hh"
|
||||
#include "dev/platform.hh"
|
||||
#include "sim/builder.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
Uart::Uart(Params *p)
|
||||
: BasicPioDevice(p), platform(p->platform), cons(p->cons)
|
||||
Uart::Uart(const Params *p)
|
||||
: BasicPioDevice(p), platform(p->platform), cons(p->sim_console)
|
||||
{
|
||||
|
||||
status = 0;
|
||||
|
||||
// set back pointers
|
||||
cons->uart = this;
|
||||
}
|
||||
|
||||
DEFINE_SIM_OBJECT_CLASS_NAME("Uart", Uart)
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
|
||||
#include "base/range.hh"
|
||||
#include "dev/io_device.hh"
|
||||
#include "params/Uart.hh"
|
||||
|
||||
class SimConsole;
|
||||
class Platform;
|
||||
|
@ -44,7 +45,6 @@ class Platform;
|
|||
const int RX_INT = 0x1;
|
||||
const int TX_INT = 0x2;
|
||||
|
||||
|
||||
class Uart : public BasicPioDevice
|
||||
{
|
||||
|
||||
|
@ -54,28 +54,25 @@ class Uart : public BasicPioDevice
|
|||
SimConsole *cons;
|
||||
|
||||
public:
|
||||
struct Params : public BasicPioDevice::Params
|
||||
{
|
||||
SimConsole *cons;
|
||||
};
|
||||
typedef UartParams Params;
|
||||
Uart(const Params *p);
|
||||
|
||||
Uart(Params *p);
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Inform the uart that there is data available.
|
||||
*/
|
||||
virtual void dataAvailable() = 0;
|
||||
|
||||
|
||||
/**
|
||||
* Return if we have an interrupt pending
|
||||
* @return interrupt status
|
||||
*/
|
||||
bool intStatus() { return status ? true : false; }
|
||||
|
||||
protected:
|
||||
const Params *params() const {return (const Params *)_params; }
|
||||
|
||||
};
|
||||
|
||||
#endif // __UART_HH__
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
#include "dev/platform.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/packet_access.hh"
|
||||
#include "sim/builder.hh"
|
||||
|
||||
using namespace std;
|
||||
using namespace TheISA;
|
||||
|
@ -100,12 +99,11 @@ Uart8250::IntrEvent::scheduleIntr()
|
|||
}
|
||||
|
||||
|
||||
Uart8250::Uart8250(Params *p)
|
||||
Uart8250::Uart8250(const Params *p)
|
||||
: Uart(p), IER(0), DLAB(0), LCR(0), MCR(0), lastTxInt(0),
|
||||
txIntrEvent(this, TX_INT), rxIntrEvent(this, RX_INT)
|
||||
{
|
||||
pioSize = 8;
|
||||
|
||||
}
|
||||
|
||||
Tick
|
||||
|
@ -338,37 +336,8 @@ Uart8250::unserialize(Checkpoint *cp, const std::string §ion)
|
|||
txIntrEvent.schedule(txintrwhen);
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(Uart8250)
|
||||
|
||||
Param<Addr> pio_addr;
|
||||
Param<Tick> pio_latency;
|
||||
SimObjectParam<Platform *> platform;
|
||||
SimObjectParam<SimConsole *> sim_console;
|
||||
SimObjectParam<System *> system;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(Uart8250)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(Uart8250)
|
||||
|
||||
INIT_PARAM(pio_addr, "Device Address"),
|
||||
INIT_PARAM_DFLT(pio_latency, "Programmed IO latency", 1000),
|
||||
INIT_PARAM(platform, "platform"),
|
||||
INIT_PARAM(sim_console, "The Simulator Console"),
|
||||
INIT_PARAM(system, "system object")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(Uart8250)
|
||||
|
||||
CREATE_SIM_OBJECT(Uart8250)
|
||||
Uart8250 *
|
||||
Uart8250Params::create()
|
||||
{
|
||||
Uart8250::Params *p = new Uart8250::Params;
|
||||
p->name = getInstanceName();
|
||||
p->pio_addr = pio_addr;
|
||||
p->pio_delay = pio_latency;
|
||||
p->platform = platform;
|
||||
p->cons = sim_console;
|
||||
p->system = system;
|
||||
return new Uart8250(p);
|
||||
return new Uart8250(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("Uart8250", Uart8250)
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
#include "base/range.hh"
|
||||
#include "dev/io_device.hh"
|
||||
#include "dev/uart.hh"
|
||||
|
||||
#include "params/Uart8250.hh"
|
||||
|
||||
/* UART8250 Interrupt ID Register
|
||||
* bit 0 Interrupt Pending 0 = true, 1 = false
|
||||
|
@ -70,8 +70,6 @@ class Platform;
|
|||
|
||||
class Uart8250 : public Uart
|
||||
{
|
||||
|
||||
|
||||
protected:
|
||||
uint8_t IER, DLAB, LCR, MCR;
|
||||
Tick lastTxInt;
|
||||
|
@ -92,13 +90,18 @@ class Uart8250 : public Uart
|
|||
IntrEvent rxIntrEvent;
|
||||
|
||||
public:
|
||||
Uart8250(Params *p);
|
||||
typedef Uart8250Params Params;
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
Uart8250(const Params *p);
|
||||
|
||||
virtual Tick read(PacketPtr pkt);
|
||||
virtual Tick write(PacketPtr pkt);
|
||||
virtual void addressRanges(AddrRangeList &range_list);
|
||||
|
||||
|
||||
/**
|
||||
* Inform the uart that there is data available.
|
||||
*/
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#
|
||||
# Authors: Ron Dreslinski
|
||||
|
||||
from m5.SimObject import SimObject
|
||||
from m5.SimObject import SimObject
|
||||
|
||||
class MemObject(SimObject):
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
|
||||
#include "base/trace.hh"
|
||||
#include "mem/bridge.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/Bridge.hh"
|
||||
|
||||
Bridge::BridgePort::BridgePort(const std::string &_name,
|
||||
Bridge *_bridge, BridgePort *_otherPort,
|
||||
|
@ -367,50 +367,8 @@ Bridge::BridgePort::getDeviceAddressRanges(AddrRangeList &resp,
|
|||
otherPort->getPeerAddressRanges(resp, snoop);
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(Bridge)
|
||||
|
||||
Param<int> req_size_a;
|
||||
Param<int> req_size_b;
|
||||
Param<int> resp_size_a;
|
||||
Param<int> resp_size_b;
|
||||
Param<Tick> delay;
|
||||
Param<Tick> nack_delay;
|
||||
Param<bool> write_ack;
|
||||
Param<bool> fix_partial_write_a;
|
||||
Param<bool> fix_partial_write_b;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(Bridge)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(Bridge)
|
||||
|
||||
INIT_PARAM(req_size_a, "The size of the queue for requests coming into side a"),
|
||||
INIT_PARAM(req_size_b, "The size of the queue for requests coming into side b"),
|
||||
INIT_PARAM(resp_size_a, "The size of the queue for responses coming into side a"),
|
||||
INIT_PARAM(resp_size_b, "The size of the queue for responses coming into side b"),
|
||||
INIT_PARAM(delay, "The miminum delay to cross this bridge"),
|
||||
INIT_PARAM(nack_delay, "The minimum delay to nack a packet"),
|
||||
INIT_PARAM(write_ack, "Acknowledge any writes that are received."),
|
||||
INIT_PARAM(fix_partial_write_a, "Fixup any partial block writes that are received"),
|
||||
INIT_PARAM(fix_partial_write_b, "Fixup any partial block writes that are received")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(Bridge)
|
||||
|
||||
CREATE_SIM_OBJECT(Bridge)
|
||||
Bridge *
|
||||
BridgeParams::create()
|
||||
{
|
||||
Bridge::Params *p = new Bridge::Params;
|
||||
p->name = getInstanceName();
|
||||
p->req_size_a = req_size_a;
|
||||
p->req_size_b = req_size_b;
|
||||
p->resp_size_a = resp_size_a;
|
||||
p->resp_size_b = resp_size_b;
|
||||
p->delay = delay;
|
||||
p->nack_delay = nack_delay;
|
||||
p->write_ack = write_ack;
|
||||
p->fix_partial_write_a = fix_partial_write_a;
|
||||
p->fix_partial_write_b = fix_partial_write_b;
|
||||
return new Bridge(p);
|
||||
return new Bridge(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("Bridge", Bridge)
|
||||
|
||||
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#include "mem/mem_object.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/port.hh"
|
||||
#include "params/Bridge.hh"
|
||||
#include "sim/eventq.hh"
|
||||
|
||||
class Bridge : public MemObject
|
||||
|
@ -191,19 +192,7 @@ class Bridge : public MemObject
|
|||
bool ackWrites;
|
||||
|
||||
public:
|
||||
struct Params
|
||||
{
|
||||
std::string name;
|
||||
int req_size_a;
|
||||
int req_size_b;
|
||||
int resp_size_a;
|
||||
int resp_size_b;
|
||||
Tick delay;
|
||||
Tick nack_delay;
|
||||
bool write_ack;
|
||||
bool fix_partial_write_a;
|
||||
bool fix_partial_write_b;
|
||||
};
|
||||
typedef BridgeParams Params;
|
||||
|
||||
protected:
|
||||
Params *_params;
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#include "base/misc.hh"
|
||||
#include "base/trace.hh"
|
||||
#include "mem/bus.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/Bus.hh"
|
||||
|
||||
Port *
|
||||
Bus::getPort(const std::string &if_name, int idx)
|
||||
|
@ -612,28 +612,8 @@ Bus::startup()
|
|||
tickNextIdle = (curTick / clock) * clock + clock;
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(Bus)
|
||||
|
||||
Param<int> bus_id;
|
||||
Param<int> clock;
|
||||
Param<int> width;
|
||||
Param<bool> responder_set;
|
||||
Param<int> block_size;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(Bus)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(Bus)
|
||||
INIT_PARAM(bus_id, "a globally unique bus id"),
|
||||
INIT_PARAM(clock, "bus clock speed"),
|
||||
INIT_PARAM(width, "width of the bus (bits)"),
|
||||
INIT_PARAM(responder_set, "Is a default responder set by the user"),
|
||||
INIT_PARAM(block_size, "Default blocksize if no device has one")
|
||||
END_INIT_SIM_OBJECT_PARAMS(Bus)
|
||||
|
||||
CREATE_SIM_OBJECT(Bus)
|
||||
Bus *
|
||||
BusParams::create()
|
||||
{
|
||||
return new Bus(getInstanceName(), bus_id, clock, width, responder_set,
|
||||
block_size);
|
||||
return new Bus(name, bus_id, clock, width, responder_set, block_size);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("Bus", Bus)
|
||||
|
|
157
src/mem/cache/cache_builder.cc
vendored
157
src/mem/cache/cache_builder.cc
vendored
|
@ -36,14 +36,14 @@
|
|||
#include <vector>
|
||||
|
||||
// Must be included first to determine which caches we want
|
||||
#include "enums/Prefetch.hh"
|
||||
#include "mem/config/cache.hh"
|
||||
#include "mem/config/prefetch.hh"
|
||||
|
||||
#include "mem/cache/base_cache.hh"
|
||||
#include "mem/cache/cache.hh"
|
||||
#include "mem/bus.hh"
|
||||
#include "mem/cache/coherence/coherence_protocol.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/BaseCache.hh"
|
||||
|
||||
// Tag Templates
|
||||
#if defined(USE_CACHE_LRU)
|
||||
|
@ -93,123 +93,23 @@
|
|||
using namespace std;
|
||||
using namespace TheISA;
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(BaseCache)
|
||||
|
||||
Param<int> size;
|
||||
Param<int> assoc;
|
||||
Param<int> block_size;
|
||||
Param<int> latency;
|
||||
Param<int> mshrs;
|
||||
Param<int> tgts_per_mshr;
|
||||
Param<int> write_buffers;
|
||||
Param<bool> prioritizeRequests;
|
||||
SimObjectParam<CoherenceProtocol *> protocol;
|
||||
Param<Addr> trace_addr;
|
||||
Param<int> hash_delay;
|
||||
#if defined(USE_CACHE_IIC)
|
||||
SimObjectParam<Repl *> repl;
|
||||
#endif
|
||||
Param<bool> compressed_bus;
|
||||
Param<bool> store_compressed;
|
||||
Param<bool> adaptive_compression;
|
||||
Param<int> compression_latency;
|
||||
Param<int> subblock_size;
|
||||
Param<Counter> max_miss_count;
|
||||
VectorParam<Range<Addr> > addr_range;
|
||||
// SimObjectParam<MemTraceWriter *> mem_trace;
|
||||
Param<bool> split;
|
||||
Param<int> split_size;
|
||||
Param<bool> lifo;
|
||||
Param<bool> two_queue;
|
||||
Param<bool> prefetch_miss;
|
||||
Param<bool> prefetch_access;
|
||||
Param<int> prefetcher_size;
|
||||
Param<bool> prefetch_past_page;
|
||||
Param<bool> prefetch_serial_squash;
|
||||
Param<Tick> prefetch_latency;
|
||||
Param<int> prefetch_degree;
|
||||
Param<string> prefetch_policy;
|
||||
Param<bool> prefetch_cache_check_push;
|
||||
Param<bool> prefetch_use_cpu_id;
|
||||
Param<bool> prefetch_data_accesses_only;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(BaseCache)
|
||||
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(BaseCache)
|
||||
|
||||
INIT_PARAM(size, "capacity in bytes"),
|
||||
INIT_PARAM(assoc, "associativity"),
|
||||
INIT_PARAM(block_size, "block size in bytes"),
|
||||
INIT_PARAM(latency, "hit latency in CPU cycles"),
|
||||
INIT_PARAM(mshrs, "number of MSHRs (max outstanding requests)"),
|
||||
INIT_PARAM(tgts_per_mshr, "max number of accesses per MSHR"),
|
||||
INIT_PARAM_DFLT(write_buffers, "number of write buffers", 8),
|
||||
INIT_PARAM_DFLT(prioritizeRequests, "always service demand misses first",
|
||||
false),
|
||||
INIT_PARAM_DFLT(protocol, "coherence protocol to use in the cache", NULL),
|
||||
INIT_PARAM_DFLT(trace_addr, "address to trace", 0),
|
||||
|
||||
INIT_PARAM_DFLT(hash_delay, "time in cycles of hash access",1),
|
||||
#if defined(USE_CACHE_IIC)
|
||||
INIT_PARAM_DFLT(repl, "replacement policy",NULL),
|
||||
#endif
|
||||
INIT_PARAM_DFLT(compressed_bus,
|
||||
"This cache connects to a compressed memory",
|
||||
false),
|
||||
INIT_PARAM_DFLT(store_compressed, "Store compressed data in the cache",
|
||||
false),
|
||||
INIT_PARAM_DFLT(adaptive_compression, "Use an adaptive compression scheme",
|
||||
false),
|
||||
INIT_PARAM_DFLT(compression_latency,
|
||||
"Latency in cycles of compression algorithm",
|
||||
0),
|
||||
INIT_PARAM_DFLT(subblock_size,
|
||||
"Size of subblock in IIC used for compression",
|
||||
0),
|
||||
INIT_PARAM_DFLT(max_miss_count,
|
||||
"The number of misses to handle before calling exit",
|
||||
0),
|
||||
INIT_PARAM_DFLT(addr_range, "The address range in bytes",
|
||||
vector<Range<Addr> >(1,RangeIn((Addr)0, MaxAddr))),
|
||||
// INIT_PARAM_DFLT(mem_trace, "Memory trace to write accesses to", NULL),
|
||||
INIT_PARAM_DFLT(split, "Whether this is a partitioned cache", false),
|
||||
INIT_PARAM_DFLT(split_size, "the number of \"ways\" belonging to the LRU partition", 0),
|
||||
INIT_PARAM_DFLT(lifo, "whether you are using a LIFO repl. policy", false),
|
||||
INIT_PARAM_DFLT(two_queue, "whether the lifo should have two queue replacement", false),
|
||||
INIT_PARAM_DFLT(prefetch_miss, "wheter you are using the hardware prefetcher from Miss stream", false),
|
||||
INIT_PARAM_DFLT(prefetch_access, "wheter you are using the hardware prefetcher from Access stream", false),
|
||||
INIT_PARAM_DFLT(prefetcher_size, "Number of entries in the harware prefetch queue", 100),
|
||||
INIT_PARAM_DFLT(prefetch_past_page, "Allow prefetches to cross virtual page boundaries", false),
|
||||
INIT_PARAM_DFLT(prefetch_serial_squash, "Squash prefetches with a later time on a subsequent miss", false),
|
||||
INIT_PARAM_DFLT(prefetch_latency, "Latency of the prefetcher", 10),
|
||||
INIT_PARAM_DFLT(prefetch_degree, "Degree of the prefetch depth", 1),
|
||||
INIT_PARAM_DFLT(prefetch_policy, "Type of prefetcher to use", "none"),
|
||||
INIT_PARAM_DFLT(prefetch_cache_check_push, "Check if in cash on push or pop of prefetch queue", true),
|
||||
INIT_PARAM_DFLT(prefetch_use_cpu_id, "Use the CPU ID to seperate calculations of prefetches", true),
|
||||
INIT_PARAM_DFLT(prefetch_data_accesses_only, "Only prefetch on data not on instruction accesses", false)
|
||||
END_INIT_SIM_OBJECT_PARAMS(BaseCache)
|
||||
|
||||
|
||||
#define BUILD_CACHE(TAGS, tags, c) \
|
||||
do { \
|
||||
BasePrefetcher *pf; \
|
||||
if (pf_policy == "tagged") { \
|
||||
BasePrefetcher *pf; \
|
||||
if (prefetch_policy == Enums::tagged) { \
|
||||
BUILD_TAGGED_PREFETCHER(TAGS); \
|
||||
} \
|
||||
else if (pf_policy == "stride") { \
|
||||
else if (prefetch_policy == Enums::stride) { \
|
||||
BUILD_STRIDED_PREFETCHER(TAGS); \
|
||||
} \
|
||||
else if (pf_policy == "ghb") { \
|
||||
else if (prefetch_policy == Enums::ghb) { \
|
||||
BUILD_GHB_PREFETCHER(TAGS); \
|
||||
} \
|
||||
else { \
|
||||
BUILD_NULL_PREFETCHER(TAGS); \
|
||||
} \
|
||||
Cache<TAGS, c>::Params params(tags, mq, coh, base_params, \
|
||||
pf, prefetch_access, latency, \
|
||||
pf, prefetch_access, latency, \
|
||||
true, \
|
||||
store_compressed, \
|
||||
adaptive_compression, \
|
||||
|
@ -217,7 +117,7 @@ END_INIT_SIM_OBJECT_PARAMS(BaseCache)
|
|||
compAlg, compression_latency, \
|
||||
prefetch_miss); \
|
||||
Cache<TAGS, c> *retval = \
|
||||
new Cache<TAGS, c>(getInstanceName(), params); \
|
||||
new Cache<TAGS, c>(name, params); \
|
||||
return retval; \
|
||||
} while (0)
|
||||
|
||||
|
@ -365,11 +265,10 @@ END_INIT_SIM_OBJECT_PARAMS(BaseCache)
|
|||
#define BUILD_NULL_PREFETCHER(t) BUILD_CACHE_PANIC("NULL Prefetcher (uses Tagged)")
|
||||
#endif
|
||||
|
||||
CREATE_SIM_OBJECT(BaseCache)
|
||||
BaseCache *
|
||||
BaseCacheParams::create()
|
||||
{
|
||||
string name = getInstanceName();
|
||||
int numSets = size / (assoc * block_size);
|
||||
string pf_policy = prefetch_policy;
|
||||
if (subblock_size == 0) {
|
||||
subblock_size = block_size;
|
||||
}
|
||||
|
@ -379,24 +278,21 @@ CREATE_SIM_OBJECT(BaseCache)
|
|||
block_size, max_miss_count);
|
||||
|
||||
//Warnings about prefetcher policy
|
||||
if (pf_policy == "none" && (prefetch_miss || prefetch_access)) {
|
||||
panic("With no prefetcher, you shouldn't prefetch from"
|
||||
" either miss or access stream\n");
|
||||
if (prefetch_policy == Enums::none) {
|
||||
if (prefetch_miss || prefetch_access)
|
||||
panic("With no prefetcher, you shouldn't prefetch from"
|
||||
" either miss or access stream\n");
|
||||
}
|
||||
if ((pf_policy == "tagged" || pf_policy == "stride" ||
|
||||
pf_policy == "ghb") && !(prefetch_miss || prefetch_access)) {
|
||||
warn("With this prefetcher you should chose a prefetch"
|
||||
" stream (miss or access)\nNo Prefetching will occur\n");
|
||||
}
|
||||
if ((pf_policy == "tagged" || pf_policy == "stride" ||
|
||||
pf_policy == "ghb") && prefetch_miss && prefetch_access) {
|
||||
panic("Can't do prefetches from both miss and access"
|
||||
" stream\n");
|
||||
}
|
||||
if (pf_policy != "tagged" && pf_policy != "stride" &&
|
||||
pf_policy != "ghb" && pf_policy != "none") {
|
||||
panic("Unrecognized form of a prefetcher: %s, try using"
|
||||
"['none','stride','tagged','ghb']\n", pf_policy);
|
||||
|
||||
if (prefetch_policy == Enums::tagged || prefetch_policy == Enums::stride ||
|
||||
prefetch_policy == Enums::ghb) {
|
||||
|
||||
if (!prefetch_miss && !prefetch_access)
|
||||
warn("With this prefetcher you should chose a prefetch"
|
||||
" stream (miss or access)\nNo Prefetching will occur\n");
|
||||
|
||||
if (prefetch_miss && prefetch_access)
|
||||
panic("Can't do prefetches from both miss and access stream");
|
||||
}
|
||||
|
||||
#if defined(USE_CACHE_IIC)
|
||||
|
@ -424,8 +320,3 @@ CREATE_SIM_OBJECT(BaseCache)
|
|||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("BaseCache", BaseCache)
|
||||
|
||||
|
||||
#endif //DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
|
42
src/mem/cache/coherence/coherence_protocol.cc
vendored
42
src/mem/cache/coherence/coherence_protocol.cc
vendored
|
@ -41,7 +41,7 @@
|
|||
#include "mem/cache/miss/mshr.hh"
|
||||
#include "mem/cache/cache.hh"
|
||||
#include "mem/cache/coherence/coherence_protocol.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/CoherenceProtocol.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -258,18 +258,12 @@ CoherenceProtocol::assertShared(BaseCache *cache, PacketPtr &pkt,
|
|||
}
|
||||
|
||||
CoherenceProtocol::CoherenceProtocol(const string &name,
|
||||
const string &protocol,
|
||||
Enums::Coherence protocol,
|
||||
const bool doUpgrades)
|
||||
: SimObject(name)
|
||||
{
|
||||
// Python should catch this, but in case it doesn't...
|
||||
if (!(protocol == "msi" || protocol == "mesi" ||
|
||||
protocol == "mosi" || protocol == "moesi")) {
|
||||
fatal("CoherenceProtocol: unrecognized protocol %s\n", protocol);
|
||||
}
|
||||
|
||||
bool hasOwned = (protocol == "mosi" || protocol == "moesi");
|
||||
bool hasExclusive = (protocol == "mesi" || protocol == "moesi");
|
||||
bool hasOwned = (protocol == Enums::mosi || protocol == Enums::moesi);
|
||||
bool hasExclusive = (protocol == Enums::mesi || protocol == Enums::moesi);
|
||||
|
||||
if (hasOwned && !doUpgrades) {
|
||||
fatal("CoherenceProtocol: ownership protocols require upgrade "
|
||||
|
@ -466,30 +460,8 @@ CoherenceProtocol::invalidTransition(BaseCache *cache, PacketPtr &pkt,
|
|||
return false;
|
||||
}
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(CoherenceProtocol)
|
||||
|
||||
Param<string> protocol;
|
||||
Param<bool> do_upgrades;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(CoherenceProtocol)
|
||||
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(CoherenceProtocol)
|
||||
|
||||
INIT_PARAM(protocol, "name of coherence protocol"),
|
||||
INIT_PARAM_DFLT(do_upgrades, "use upgrade transactions?", true)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(CoherenceProtocol)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(CoherenceProtocol)
|
||||
CoherenceProtocol *
|
||||
CoherenceProtocolParams::create()
|
||||
{
|
||||
return new CoherenceProtocol(getInstanceName(), protocol,
|
||||
do_upgrades);
|
||||
return new CoherenceProtocol(name, protocol, do_upgrades);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("CoherenceProtocol", CoherenceProtocol)
|
||||
|
||||
#endif // DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
|
|
@ -39,10 +39,11 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#include "sim/sim_object.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "mem/cache/cache_blk.hh"
|
||||
#include "base/statistics.hh"
|
||||
#include "enums/Coherence.hh"
|
||||
#include "mem/cache/cache_blk.hh"
|
||||
#include "mem/packet.hh"
|
||||
#include "sim/sim_object.hh"
|
||||
|
||||
class BaseCache;
|
||||
class MSHR;
|
||||
|
@ -60,7 +61,7 @@ class CoherenceProtocol : public SimObject
|
|||
* @param protocol The string representation of the protocol to use.
|
||||
* @param doUpgrades True if bus upgrades should be used.
|
||||
*/
|
||||
CoherenceProtocol(const std::string &name, const std::string &protocol,
|
||||
CoherenceProtocol(const std::string &name, Enums::Coherence protocol,
|
||||
const bool doUpgrades);
|
||||
|
||||
/**
|
||||
|
|
1
src/mem/cache/tags/SConscript
vendored
1
src/mem/cache/tags/SConscript
vendored
|
@ -40,4 +40,3 @@ Source('split_lru.cc')
|
|||
|
||||
SimObject('Repl.py')
|
||||
Source('repl/gen.cc')
|
||||
Source('repl/repl.cc')
|
||||
|
|
31
src/mem/cache/tags/repl/gen.cc
vendored
31
src/mem/cache/tags/repl/gen.cc
vendored
|
@ -39,7 +39,7 @@
|
|||
#include "base/misc.hh"
|
||||
#include "mem/cache/tags/iic.hh"
|
||||
#include "mem/cache/tags/repl/gen.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include "params/GenRepl.hh"
|
||||
#include "sim/host.hh"
|
||||
|
||||
using namespace std;
|
||||
|
@ -247,31 +247,8 @@ GenRepl::findTagPtr(unsigned long index)
|
|||
return false;
|
||||
}
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(GenRepl)
|
||||
|
||||
Param<int> num_pools;
|
||||
Param<int> fresh_res;
|
||||
Param<int> pool_res;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(GenRepl)
|
||||
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(GenRepl)
|
||||
|
||||
INIT_PARAM(num_pools, "capacity in bytes"),
|
||||
INIT_PARAM(fresh_res, "associativity"),
|
||||
INIT_PARAM(pool_res, "block size in bytes")
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(GenRepl)
|
||||
|
||||
|
||||
CREATE_SIM_OBJECT(GenRepl)
|
||||
GenRepl *
|
||||
GenReplParams::create()
|
||||
{
|
||||
return new GenRepl(getInstanceName(), num_pools, fresh_res, pool_res);
|
||||
return new GenRepl(name, num_pools, fresh_res, pool_res);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("GenRepl", GenRepl)
|
||||
|
||||
#endif // DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
|
|
@ -99,11 +99,10 @@ Kluwer Academic, pages 291-310, March, 2000.
|
|||
* Definition of a DRAM like main memory.
|
||||
*/
|
||||
|
||||
#include <cstdlib>
|
||||
#include <string>
|
||||
|
||||
#include "mem/dram.hh"
|
||||
#include "sim/builder.hh"
|
||||
#include <stdlib.h>
|
||||
#include <string>
|
||||
|
||||
extern int maxThreadsPerCPU;
|
||||
|
||||
|
@ -174,7 +173,7 @@ extern int maxThreadsPerCPU;
|
|||
|
||||
|
||||
|
||||
DRAMMemory::DRAMMemory(Params *p)
|
||||
DRAMMemory::DRAMMemory(const Params *p)
|
||||
: PhysicalMemory(p), cpu_ratio(p->cpu_ratio), bus_width(p->bus_width),
|
||||
mem_type(p->mem_type), mem_actpolicy(p->mem_actpolicy),
|
||||
memctrladdr_type(p->memctrladdr_type), act_lat(p->act_lat),
|
||||
|
@ -197,7 +196,7 @@ DRAMMemory::DRAMMemory(Params *p)
|
|||
memctrlpipe_enable(false), time_last_access(0)
|
||||
{
|
||||
warn("This DRAM module has not been tested with the new memory system at all!");
|
||||
bank_size = (params()->addrRange.size() + 1) / num_banks;
|
||||
bank_size = (p->range.size() + 1) / num_banks;
|
||||
num_rows = bank_size / SD_ROW_SIZE; /* 0x1000 size of row 4Kbtye */
|
||||
active_row = new int[num_banks];
|
||||
last_bank = num_banks+1;
|
||||
|
@ -2666,81 +2665,8 @@ else
|
|||
return precharge;
|
||||
}
|
||||
|
||||
|
||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(DRAMMemory)
|
||||
|
||||
Param<std::string> file;
|
||||
Param<Range<Addr> > range;
|
||||
Param<Tick> latency;
|
||||
/* additional params for dram protocol*/
|
||||
Param<int> cpu_ratio;
|
||||
Param<std::string> mem_type;
|
||||
Param<std::string> mem_actpolicy;
|
||||
Param<std::string> memctrladdr_type;
|
||||
Param<int> bus_width;
|
||||
Param<int> act_lat;
|
||||
Param<int> cas_lat;
|
||||
Param<int> war_lat;
|
||||
Param<int> pre_lat;
|
||||
Param<int> dpl_lat;
|
||||
Param<int> trc_lat;
|
||||
Param<int> num_banks;
|
||||
Param<int> num_cpus;
|
||||
|
||||
END_DECLARE_SIM_OBJECT_PARAMS(DRAMMemory)
|
||||
|
||||
BEGIN_INIT_SIM_OBJECT_PARAMS(DRAMMemory)
|
||||
|
||||
INIT_PARAM_DFLT(file, "memory mapped file", ""),
|
||||
INIT_PARAM(range, "Device Address Range"),
|
||||
INIT_PARAM(latency, "Memory access latency"),
|
||||
|
||||
/* additional params for dram protocol*/
|
||||
INIT_PARAM_DFLT(cpu_ratio,"ratio between CPU speed and memory bus speed",5),
|
||||
INIT_PARAM_DFLT(mem_type,"type of DRAM","SDRAM"),
|
||||
INIT_PARAM_DFLT(mem_actpolicy,"open / closed page policy","open"),
|
||||
INIT_PARAM_DFLT(memctrladdr_type,"interleaved or direct mapping","interleaved"),
|
||||
INIT_PARAM_DFLT(bus_width,"memory access bus width",16),
|
||||
INIT_PARAM_DFLT(act_lat,"RAS to CAS delay",2),
|
||||
INIT_PARAM_DFLT(cas_lat,"CAS delay",1),
|
||||
INIT_PARAM_DFLT(war_lat,"write after read delay",2),
|
||||
INIT_PARAM_DFLT(pre_lat,"precharge delay",2),
|
||||
INIT_PARAM_DFLT(dpl_lat,"data in to precharge delay",2),
|
||||
INIT_PARAM_DFLT(trc_lat,"row cycle delay",6),
|
||||
INIT_PARAM_DFLT(num_banks,"Number of Banks",4),
|
||||
INIT_PARAM_DFLT(num_cpus,"Number of CPUs connected to DRAM",4)
|
||||
|
||||
END_INIT_SIM_OBJECT_PARAMS(DRAMMemory)
|
||||
|
||||
CREATE_SIM_OBJECT(DRAMMemory)
|
||||
DRAMMemory *
|
||||
DRAMMemoryParams::create()
|
||||
{
|
||||
DRAMMemory::Params *p = new DRAMMemory::Params;
|
||||
p->name = getInstanceName();
|
||||
p->addrRange = range;
|
||||
p->latency = latency;
|
||||
|
||||
/* additional params for dram */
|
||||
p->cpu_ratio = cpu_ratio;
|
||||
p->bus_width = bus_width;
|
||||
p->mem_type = mem_type;
|
||||
p->mem_actpolicy = mem_actpolicy;
|
||||
p->memctrladdr_type = memctrladdr_type;
|
||||
p->act_lat = act_lat;
|
||||
p->cas_lat = cas_lat;
|
||||
p->war_lat = war_lat;
|
||||
p->pre_lat = pre_lat;
|
||||
p->dpl_lat = dpl_lat;
|
||||
p->trc_lat = trc_lat;
|
||||
p->num_banks = num_banks;
|
||||
p->num_cpus = num_cpus;
|
||||
|
||||
return new DRAMMemory(p);
|
||||
return new DRAMMemory(this);
|
||||
}
|
||||
|
||||
REGISTER_SIM_OBJECT("DRAMMemory", DRAMMemory)
|
||||
|
||||
#endif // DOXYGEN_SHOULD_SKIP_THIS
|
||||
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
|
||||
#include "base/statistics.hh"
|
||||
#include "mem/physical.hh"
|
||||
#include "params/DRAMMemory.hh"
|
||||
|
||||
class DRAMMemory : public PhysicalMemory
|
||||
{
|
||||
|
@ -144,28 +145,16 @@ class DRAMMemory : public PhysicalMemory
|
|||
int prechargeBanksAround(int bank);
|
||||
|
||||
public:
|
||||
struct Params : public PhysicalMemory::Params
|
||||
typedef DRAMMemoryParams Params;
|
||||
DRAMMemory(const Params *p);
|
||||
|
||||
const Params *
|
||||
params() const
|
||||
{
|
||||
/* additional params for dram protocol*/
|
||||
int cpu_ratio;
|
||||
int bus_width;
|
||||
return dynamic_cast<const Params *>(_params);
|
||||
}
|
||||
|
||||
std::string mem_type; /* DRDRAM, SDRAM */
|
||||
std::string mem_actpolicy; /* closed, open */
|
||||
std::string memctrladdr_type; /* interleaved, anythingelse */
|
||||
|
||||
int act_lat;
|
||||
int cas_lat;
|
||||
int war_lat;
|
||||
int pre_lat;
|
||||
int dpl_lat;
|
||||
int trc_lat;
|
||||
int num_banks;
|
||||
int num_cpus;
|
||||
|
||||
};
|
||||
virtual void regStats();
|
||||
DRAMMemory(Params *p);
|
||||
};
|
||||
|
||||
#endif// __MEM_DRAM_HH__
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue