2006-04-28 21:34:03 +02:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2002-2006 The Regents of The University of Michigan
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are
|
|
|
|
* met: redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer;
|
|
|
|
* redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution;
|
|
|
|
* neither the name of the copyright holders nor the names of its
|
|
|
|
* contributors may be used to endorse or promote products derived from
|
|
|
|
* this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2006-06-01 01:26:56 +02:00
|
|
|
*
|
|
|
|
* Authors: Ali Saidi
|
2006-04-28 21:34:03 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "arch/sparc/system.hh"
|
|
|
|
#include "arch/vtophys.hh"
|
|
|
|
#include "base/remote_gdb.hh"
|
|
|
|
#include "base/loader/object_file.hh"
|
|
|
|
#include "base/loader/symtab.hh"
|
|
|
|
#include "base/trace.hh"
|
|
|
|
#include "mem/physical.hh"
|
|
|
|
#include "sim/byteswap.hh"
|
|
|
|
#include "sim/builder.hh"
|
|
|
|
|
|
|
|
|
|
|
|
using namespace BigEndianGuest;
|
|
|
|
|
|
|
|
SparcSystem::SparcSystem(Params *p)
|
split off fullsystem and se iprs into two functions to remove lots of #ifs
setup all initialization stuff for UA2005
Setup fullsys build options
Start to make fullsystem compile
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
RCS to BitKeeper
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Add support for doing virtual to physical translation using the in-memory
page table
src/arch/sparc/vtophys.cc:
a tad bit of error checking
src/arch/sparc/vtophys.hh:
Cleanup of full-system global variables, primarily in simple_cpu.cc,
to allow multi-system simulations. (Multiple systems not yet yested
though.) Also changes to build sim_smt in full-system mode (though
with only SimpleCPU and not the full timing CPU for now).
Still to do: minimize changes in SimpleCPU code between full-system
and application modes... way too many ifdefs there. Much of the
full-system stuff moved into SimpleCPU should be put in a new System
object to allow multiprocessor simulations.
Converted last remaining modules from C to C++ (mostly in /old).
Renamed all .c files to .cc and a few .h files to .hh.
Renamed architecture-specific files in arch/$TARGET from
$TARGET.{cc,hh,def} to machine.{cc,hh,def} to get rid of pointless
intermediate files in object directory. Split exo-specific
definitions out of machine.hh into machine_exo.h.
Specifics:
In machine.def, null resource descriptors must be FUClamd_NA (and not
NA) to pass C++ type checking.
Enhanced error checking/reporting in bas
src/arch/sparc/vtophys.cc:
- Get rid of my String class, the Vector class, the bitvector class, and my
doubly linked list class.
- Convert tokenize, to_number (formerly StringToNumber) and eat_white to
function on stl strings.
- Change most cases of char * and const char * to string, or const string &
- Some formatting and style nits, but not too many.
src/arch/sparc/vtophys.cc:
simplify
src/arch/sparc/vtophys.cc:
Renamed SimpleCPU::(read|write)_(byte|half|word|qword) to just read &
write, overloaded on the type of the 'data' argument. Merged the
full-system and non-full-system implementations of these eight
original functions into two common template functions.
To support this, also renamed (read|write)[1248] on memory_object and
derivatives to just read & write, again overloaded on the type of the
'data' argument. Many of these functions could now be condensed into
a few template functions (though with a level of indirection so that
the interface can remain virtual). I did not do that though.
src/arch/sparc/vtophys.cc:
First pass at compiling with gcc 3.x. Lots of "std::" in header files,
"using namespace std" in source files. (Note policy of not putting "using"
statements in headers or before includes in sources.)
Still not able to compile with gcc 3.2.
Errors:
- Can't create an ifstream from a file descriptor anymore (breaks IniFile).
- "`class MSHR::MSHRegister' is private" errors in mshr.cc and prefetch_cache.cc:
not clear why since it's in the public part of the class declaration.
- cpu.cc:879: can't match a reference and 0 (specifically "no match for `bool ?
SimObjectParam<PipeTrace*>& : int' operator")
- pipetrace.cc: "invalid conversion from `int' to `std::_Ios_Fmtflags'"
Warnings:
- strstream now deprecated... needs some rewriting in sat_counter.hh
and hybrid_pred.hh (need to get all that code out of the headers anyway)
- trace.hh macro problem: cpp now says 'pasting "::" and "Event" does not
give a valid preprocessing token'
- major "implicit typename" issues in base/sized.hh
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Implement some interval statistics for full system mode.
Create a callpal function that is called when a callpal occurs so it's easier
to manipulate the statics.
Rework the vtophys stuff to make it a bit cleaner.
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Get rid of almost all old-style object names. This commit is equivalent
to running the following script on the current head:
#! /bin/sh
find \( -name '*.cc' -o -name '*.hh' \) -exec perl -pi -e '\
s/\bmemory_object\b(?!\.hh)/FunctionalMemory/g;\
s/\bvirtual_memory\b(?!\.hh)/VirtualMemory/g;\
s/\bmain_memory\b(?!\.hh)/MainMemory/g;\
s/\bphysical_memory\b(?!\.hh)/PhysicalMemory/g;\
s/\bspec_memory\b(?!\.hh)/SpeculativeMemory/g;\
s/\bMemObj\b(?!\.hh)/TimingMemObj/g;\
s/\bmemory_translation\b(?!\.hh)/AddressTranslator/g;\
s/\balpha_tlb\b(?!\.hh)/AlphaTlb/g;\
s/\balpha_itb\b(?!\.hh)/AlphaItb/g;\
s/\balpha_dtb\b(?!\.hh)/AlphaDtb/g;\
s/\bmemory_controller\b(?!\.hh)/MemoryController/g;\
s/\bstorebuffer_t\b(?!\.hh)/StoreBuffer/g;\
s/\bstorebuffer_entry_t\b(?!\.hh)/StoreBufferEntry/g;\
s/\bcreate_vector_t\b(?!\.hh)/CreateVector/g;\
s/\bcv_spec_state\b(?!\.hh)/CreateVecSpecState/g;\
s/\bspec_state_list\b(?!\.hh)/SpecStateList/g;\
s/\bdyn_inst_t\b(?!\.hh)/DynInst/g;' {} \;
src/arch/sparc/vtophys.cc:
since cprintf properly deals with 64-bit types, stop using FMT* as much as
possible
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Change byte_t etc. to C99 standard int8_t etc.
Other than old/host.h, all other changes were produced by this script:
#! /bin/sh
find \( -name '*.cc' -o -name '*.hh' -o -name '*.c' -o -name '*.h' -o -name 'machine.def' \) -exec perl -pi -e '\
s/\bbyte_t\b(?!\.hh)/uint8_t/g;\
s/\bsbyte_t\b(?!\.hh)/int8_t/g;\
s/\bhalf_t\b(?!\.hh)/uint16_t/g;\
s/\bshalf_t\b(?!\.hh)/int16_t/g;\
s/\bword_t\b(?!\.hh)/uint32_t/g;\
s/\bsword_t\b(?!\.hh)/int32_t/g;\
s/\bqword_t\b(?!\.hh)/uint64_t/g;\
s/\bsqword_t\b(?!\.hh)/int64_t/g;\
s/\bbool_t\b(?!\.hh)/bool/g;\
s/\bdfloat_t\b(?!\.hh)/double/g;\
s/\bsfloat_t\b(?!\.hh)/float/g;' {} \;
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Add CVS Id tags
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Massive renaming to (almost) eliminate all md_* and MD_* names
in preparation for total exorcism of machine.def.
Most of the changes in this commit were performed with the
following perl script (perl -pi <script> <files>). A small
amount of manual fixup was needed to (mostly getting rid of
the Addr typedefs in the various memory objects now that
the former md_addr_t has that name).
# rename machine-dependent types and constants (will be moving into ISA traits object)
s/md_addr_t/Addr/g;
s/md_intreg_t/IntReg/g;
s/md_gpr_t/IntRegFile/g;
s/md_fpreg_t/FloatReg/g;
s/md_fpr_t/FloatRegFile/g;
s/md_ctrlreg_t/MiscReg/g;
s/md_ctrl_t/MiscRegFile/g;
s/md_ipr_t/InternalProcReg/g;
s/md_anyreg_t/AnyReg/g;
s/md_inst_t/MachInst/g;
s/regs_t/RegFile/g;
# manually fix declaration in old/regs.h and a few forward decls
s/struct RegFile/RegFile/g;
s/MD_NUM_IREGS/NumIntRegs/g;
s/MD_NUM_FREGS/NumFloatRegs/g;
s/MD_NUM_CREGS/NumMiscRegs/g;
s/MD_IPR_NUM/NumInternalProcRegs/g;
s/MD_TOTAL_REGS/TotalNumRegs/g;
s/MD_REG_ZERO/ZeroReg/g;
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
New ISA description system. No more machine.def!
Instructions are now decoded into StaticInst objects, and all static
instruction properties (including execution behavior) are associated
with those objects. Extended documentation in progress.
Currently supports Alpha only; PISA will not compile.
Use END_OF_MACHINE_DOT_DEF tag to extract previous version.
src/arch/sparc/vtophys.cc:
get rid of MD_IPR_foo and call it IPR_foo
add some comments to describe what the various PALtemp registers do
formatting
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
license
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
a little style
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Add attribution to license.
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Make include paths explicit.
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
CopyData and CopyString moved from kernel.cc to vtophys.cc
kernel.cc and kernel.hh moved to kern/tru64
src/arch/sparc/vtophys.hh:
Include isa_traits.hh for Addr
src/arch/sparc/vtophys.cc:
formatting fixes
src/arch/sparc/vtophys.cc:
fix up vtophys to deal with translations if there
is no ptbr, and to deal with PAL addresses
add ptomem which is just a wrapper for dma_addr
src/arch/sparc/vtophys.hh:
add ptomem which is a wrapper for dma_addr with the
same usage as vtomem
src/arch/sparc/vtophys.cc:
Fix to remote debugger while in PAL code
src/arch/sparc/vtophys.cc:
Remote an old hack that is now unnecessary
src/arch/sparc/vtophys.cc:
Removed buggy code that tries to fix PAL addresses (may cause problems
while trying to debug in PAL code, but that should do this fix outside
of vtophys)
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Updated Copyright
src/arch/sparc/vtophys.cc:
added back some code andrew removed and couldn't remember why.
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
rename CopyData to CopyOut and implement CopyIn to copy data
from the simulator into the simulatee
src/arch/sparc/vtophys.cc:
fixed a bad merge from linux<->tru64
src/arch/sparc/vtophys.cc:
Check max address pal can be at so we don't do the wrong conversion
if gdb asks for an unaligned access.
src/arch/sparc/vtophys.cc:
PGOFSET -> ALPHA_PGOFSET to avoid include file problems
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
in the arch/alpha directory we should use arch/alpha, not
targetarch. sort includes while we're here.
src/arch/sparc/vtophys.cc:
use new constants, functions and structs to clean up the
vtophys code.
src/arch/sparc/vtophys.hh:
Clean up a little bit and make the protypes match new changes.
src/arch/sparc/vtophys.cc:
deal with isa addition
src/arch/sparc/vtophys.cc:
shuffle files around for new directory structure
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Remove RCS Id string
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
Update copyright dates and author list
src/arch/sparc/vtophys.cc:
Added a using directive for AlphaISA
src/arch/sparc/vtophys.hh:
Added the AlphaISA namespace specifier where needed
src/arch/sparc/vtophys.hh:
Made Addr a global type
src/arch/sparc/vtophys.cc:
Change access to the IPR to go through the XC.
src/arch/sparc/vtophys.cc:
Avoid directly accessing objects within the XC.
src/arch/sparc/vtophys.cc:
src/arch/sparc/vtophys.hh:
fixed for new memory system
put in namespace AlphaISA
src/arch/alpha/vtophys.cc:
src/arch/alpha/vtophys.hh:
Remove authors from copyright.
src/arch/sparc/vtophys.cc:
bk cp alpha/vtophys.cc sparc/vtophys.cc
src/arch/sparc/vtophys.hh:
bk cp alpha/vtophys.hh sparc/vtophys.hh
src/arch/sparc/SConscript:
remove fullsystem files that don't exist
src/arch/sparc/isa_traits.hh:
split off fullsystem and se iprs into two functions to remove lots of #ifs
src/arch/sparc/regfile.hh:
split off fullsystem and se iprs into two functions to remove lots of #ifs
setup all initialization stuff for UA2005
src/arch/sparc/system.cc:
src/arch/sparc/system.hh:
Add system level tick storage to make stick be syncronized across multiple processors
src/arch/sparc/vtophys.hh:
start to create a vtophys for Sparc
src/base/loader/symtab.hh:
Addr is defined in sim/host.hh
--HG--
extra : convert_revision : ae4658e6bc2e2b51d7fb1c711d069ffe99e1377d
2006-05-29 22:53:47 +02:00
|
|
|
: System(p), sysTick(0)
|
|
|
|
|
2006-04-28 21:34:03 +02:00
|
|
|
{
|
|
|
|
resetSymtab = new SymbolTable;
|
|
|
|
hypervisorSymtab = new SymbolTable;
|
|
|
|
openbootSymtab = new SymbolTable;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load the boot code, and hypervisor into memory.
|
|
|
|
*/
|
|
|
|
// Read the reset binary
|
|
|
|
reset = createObjectFile(params()->reset_bin);
|
|
|
|
if (reset == NULL)
|
|
|
|
fatal("Could not load reset binary %s", params()->reset_bin);
|
|
|
|
|
|
|
|
// Read the openboot binary
|
|
|
|
openboot = createObjectFile(params()->openboot_bin);
|
|
|
|
if (openboot == NULL)
|
|
|
|
fatal("Could not load openboot bianry %s", params()->openboot_bin);
|
|
|
|
|
|
|
|
// Read the hypervisor binary
|
|
|
|
hypervisor = createObjectFile(params()->hypervisor_bin);
|
|
|
|
if (hypervisor == NULL)
|
|
|
|
fatal("Could not load hypervisor binary %s", params()->hypervisor_bin);
|
|
|
|
|
|
|
|
|
|
|
|
// Load reset binary into memory
|
|
|
|
reset->loadSections(&functionalPort, SparcISA::LoadAddrMask);
|
|
|
|
// Load the openboot binary
|
|
|
|
openboot->loadSections(&functionalPort, SparcISA::LoadAddrMask);
|
|
|
|
// Load the hypervisor binary
|
|
|
|
hypervisor->loadSections(&functionalPort, SparcISA::LoadAddrMask);
|
|
|
|
|
|
|
|
// load symbols
|
|
|
|
if (!reset->loadGlobalSymbols(reset))
|
|
|
|
panic("could not load reset symbols\n");
|
|
|
|
|
|
|
|
if (!openboot->loadGlobalSymbols(openbootSymtab))
|
|
|
|
panic("could not load openboot symbols\n");
|
|
|
|
|
|
|
|
if (!hypervisor->loadLocalSymbols(hypervisorSymtab))
|
|
|
|
panic("could not load hypervisor symbols\n");
|
|
|
|
|
|
|
|
// load symbols into debug table
|
|
|
|
if (!reset->loadGlobalSymbols(debugSymbolTable))
|
|
|
|
panic("could not load reset symbols\n");
|
|
|
|
|
|
|
|
if (!openboot->loadGlobalSymbols(debugSymbolTable))
|
|
|
|
panic("could not load openboot symbols\n");
|
|
|
|
|
|
|
|
if (!hypervisor->loadLocalSymbols(debugSymbolTable))
|
|
|
|
panic("could not load hypervisor symbols\n");
|
|
|
|
|
|
|
|
|
|
|
|
// @todo any fixup code over writing data in binaries on setting break
|
|
|
|
// events on functions should happen here.
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
SparcSystem::~SparcSystem()
|
|
|
|
{
|
|
|
|
delete resetSymtab;
|
|
|
|
delete hypervisorSymtab;
|
|
|
|
delete openbootSymtab;
|
|
|
|
delete reset;
|
|
|
|
delete openboot;
|
|
|
|
delete hypervisor;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
SparcSystem::breakpoint()
|
|
|
|
{
|
|
|
|
panic("Need to implement");
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
SparcSystem::serialize(std::ostream &os)
|
|
|
|
{
|
|
|
|
System::serialize(os);
|
|
|
|
resetSymtab->serialize("reset_symtab", os);
|
|
|
|
hypervisorSymtab->serialize("hypervisor_symtab", os);
|
|
|
|
openbootSymtab->serialize("openboot_symtab", os);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
SparcSystem::unserialize(Checkpoint *cp, const std::string §ion)
|
|
|
|
{
|
|
|
|
System::unserialize(cp,section);
|
|
|
|
resetSymtab->unserialize("reset_symtab", cp, section);
|
|
|
|
hypervisorSymtab->unserialize("hypervisor_symtab", cp, section);
|
|
|
|
openbootSymtab->unserialize("openboot_symtab", cp, section);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BEGIN_DECLARE_SIM_OBJECT_PARAMS(SparcSystem)
|
|
|
|
|
|
|
|
SimObjectParam<PhysicalMemory *> physmem;
|
|
|
|
|
|
|
|
Param<std::string> kernel;
|
|
|
|
Param<std::string> reset_bin;
|
|
|
|
Param<std::string> hypervisor_bin;
|
|
|
|
Param<std::string> openboot_bin;
|
|
|
|
|
|
|
|
Param<std::string> boot_osflags;
|
|
|
|
Param<std::string> readfile;
|
|
|
|
Param<unsigned int> init_param;
|
|
|
|
|
|
|
|
Param<bool> bin;
|
|
|
|
VectorParam<std::string> binned_fns;
|
|
|
|
Param<bool> bin_int;
|
|
|
|
|
|
|
|
END_DECLARE_SIM_OBJECT_PARAMS(SparcSystem)
|
|
|
|
|
|
|
|
BEGIN_INIT_SIM_OBJECT_PARAMS(SparcSystem)
|
|
|
|
|
|
|
|
INIT_PARAM(boot_cpu_frequency, "Frequency of the boot CPU"),
|
|
|
|
INIT_PARAM(physmem, "phsyical memory"),
|
|
|
|
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_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),
|
|
|
|
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),
|
|
|
|
INIT_PARAM_DFLT(bin, "is this system to be binned", false),
|
|
|
|
INIT_PARAM(binned_fns, "functions to be broken down and binned"),
|
|
|
|
INIT_PARAM_DFLT(bin_int, "is interrupt code binned seperately?", true)
|
|
|
|
|
|
|
|
END_INIT_SIM_OBJECT_PARAMS(SparcSystem)
|
|
|
|
|
|
|
|
CREATE_SIM_OBJECT(SparcSystem)
|
|
|
|
{
|
|
|
|
SparcSystem::Params *p = new SparcSystem::Params;
|
|
|
|
p->name = getInstanceName();
|
|
|
|
p->boot_cpu_frequency = boot_cpu_frequency;
|
|
|
|
p->physmem = physmem;
|
|
|
|
p->kernel_path = kernel;
|
|
|
|
p->reset_bin = reset_bin;
|
|
|
|
p->hypervisor_bin = hypervisor_bin;
|
|
|
|
p->openboot_bin = openboot_bin;
|
|
|
|
p->boot_osflags = boot_osflags;
|
|
|
|
p->init_param = init_param;
|
|
|
|
p->readfile = readfile;
|
|
|
|
p->system_type = system_type;
|
|
|
|
p->system_rev = system_rev;
|
|
|
|
p->bin = bin;
|
|
|
|
p->binned_fns = binned_fns;
|
|
|
|
p->bin_int = bin_int;
|
|
|
|
return new SparcSystem(p);
|
|
|
|
}
|
|
|
|
|
|
|
|
REGISTER_SIM_OBJECT("SparcSystem", SparcSystem)
|
|
|
|
|
|
|
|
|