Make O3CPU model independent of the ISA
Use O3CPU when building instead of AlphaO3CPU. I could use some better python magic in the cpu_models.py file! AUTHORS: add middle initial SConstruct: change from AlphaO3CPU to O3CPU src/cpu/SConscript: edits to build O3CPU instead of AlphaO3CPU src/cpu/cpu_models.py: change substitution template to use proper CPU EXEC CONTEXT For O3CPU Model... Actually, some Python expertise could be used here. The 'env' variable is not passed to this file, so I had to parse through the ARGV to find the ISA... src/cpu/o3/base_dyn_inst.cc: src/cpu/o3/bpred_unit.cc: src/cpu/o3/commit.cc: src/cpu/o3/cpu.cc: src/cpu/o3/cpu.hh: src/cpu/o3/decode.cc: src/cpu/o3/fetch.cc: src/cpu/o3/iew.cc: src/cpu/o3/inst_queue.cc: src/cpu/o3/lsq.cc: src/cpu/o3/lsq_unit.cc: src/cpu/o3/mem_dep_unit.cc: src/cpu/o3/rename.cc: src/cpu/o3/rob.cc: use isa_specific.hh src/sim/process.cc: only initi NextNPC if not ALPHA src/cpu/o3/alpha/cpu.cc: alphao3cpu impl src/cpu/o3/alpha/cpu.hh: move AlphaTC to it's own file src/cpu/o3/alpha/cpu_impl.hh: Move AlphaTC to it's own file ... src/cpu/o3/alpha/dyn_inst.cc: src/cpu/o3/alpha/dyn_inst.hh: src/cpu/o3/alpha/dyn_inst_impl.hh: include paths src/cpu/o3/alpha/impl.hh: include paths, set default MaxThreads to 2 instead of 4 src/cpu/o3/alpha/params.hh: set Alpha Specific Params here src/python/m5/objects/O3CPU.py: add O3CPU class src/cpu/o3/SConscript: include isa-specific build files src/cpu/o3/alpha/thread_context.cc: NEW HOME of AlphaTC src/cpu/o3/alpha/thread_context.hh: new home of AlphaTC src/cpu/o3/isa_specific.hh: includes ISA specific files src/cpu/o3/params.hh: base o3 params src/cpu/o3/thread_context.hh: base o3 thread context src/cpu/o3/thread_context_impl.hh: base o3 thead context impl --HG-- rename : src/cpu/o3/alpha_cpu.cc => src/cpu/o3/alpha/cpu.cc rename : src/cpu/o3/alpha_cpu.hh => src/cpu/o3/alpha/cpu.hh rename : src/cpu/o3/alpha_cpu_builder.cc => src/cpu/o3/alpha/cpu_builder.cc rename : src/cpu/o3/alpha_cpu_impl.hh => src/cpu/o3/alpha/cpu_impl.hh rename : src/cpu/o3/alpha_dyn_inst.cc => src/cpu/o3/alpha/dyn_inst.cc rename : src/cpu/o3/alpha_dyn_inst.hh => src/cpu/o3/alpha/dyn_inst.hh rename : src/cpu/o3/alpha_dyn_inst_impl.hh => src/cpu/o3/alpha/dyn_inst_impl.hh rename : src/cpu/o3/alpha_impl.hh => src/cpu/o3/alpha/impl.hh rename : src/cpu/o3/alpha_params.hh => src/cpu/o3/alpha/params.hh rename : src/python/m5/objects/AlphaO3CPU.py => src/python/m5/objects/O3CPU.py extra : convert_revision : d377d6417452ac337bc502f28b2fde907d6b340e
This commit is contained in:
parent
0fbecab797
commit
d9ef772e8d
37 changed files with 1300 additions and 972 deletions
2
AUTHORS
2
AUTHORS
|
@ -28,7 +28,7 @@ Ronald G. Dreslinski Jr
|
||||||
Gabriel Black
|
Gabriel Black
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
Korey Sewell
|
Korey L. Sewell
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
David Green
|
David Green
|
||||||
|
|
|
@ -263,7 +263,7 @@ env['ALL_ISA_LIST'] = ['alpha', 'sparc', 'mips']
|
||||||
|
|
||||||
# Define the universe of supported CPU models
|
# Define the universe of supported CPU models
|
||||||
env['ALL_CPU_LIST'] = ['AtomicSimpleCPU', 'TimingSimpleCPU',
|
env['ALL_CPU_LIST'] = ['AtomicSimpleCPU', 'TimingSimpleCPU',
|
||||||
'FullCPU', 'AlphaO3CPU',
|
'FullCPU', 'O3CPU',
|
||||||
'OzoneCPU']
|
'OzoneCPU']
|
||||||
|
|
||||||
# Sticky options get saved in the options file so they persist from
|
# Sticky options get saved in the options file so they persist from
|
||||||
|
|
|
@ -104,7 +104,7 @@ env.Depends('static_inst_exec_sigs.hh', Value(env['CPU_MODELS']))
|
||||||
|
|
||||||
# List of suppported CPUs by the Checker. Errors out if USE_CHECKER=True
|
# List of suppported CPUs by the Checker. Errors out if USE_CHECKER=True
|
||||||
# and one of these are not being used.
|
# and one of these are not being used.
|
||||||
CheckerSupportedCPUList = ['AlphaO3CPU', 'OzoneCPU']
|
CheckerSupportedCPUList = ['O3CPU', 'OzoneCPU']
|
||||||
|
|
||||||
#################################################################
|
#################################################################
|
||||||
#
|
#
|
||||||
|
@ -130,12 +130,10 @@ if need_simple_base:
|
||||||
if 'FastCPU' in env['CPU_MODELS']:
|
if 'FastCPU' in env['CPU_MODELS']:
|
||||||
sources += Split('fast/cpu.cc')
|
sources += Split('fast/cpu.cc')
|
||||||
|
|
||||||
if 'AlphaO3CPU' in env['CPU_MODELS']:
|
if 'O3CPU' in env['CPU_MODELS']:
|
||||||
|
sources += SConscript('o3/SConscript', exports = 'env')
|
||||||
sources += Split('''
|
sources += Split('''
|
||||||
o3/2bit_local_pred.cc
|
o3/2bit_local_pred.cc
|
||||||
o3/alpha_dyn_inst.cc
|
|
||||||
o3/alpha_cpu.cc
|
|
||||||
o3/alpha_cpu_builder.cc
|
|
||||||
o3/base_dyn_inst.cc
|
o3/base_dyn_inst.cc
|
||||||
o3/bpred_unit.cc
|
o3/bpred_unit.cc
|
||||||
o3/btb.cc
|
o3/btb.cc
|
||||||
|
|
|
@ -26,6 +26,10 @@
|
||||||
#
|
#
|
||||||
# Authors: Steve Reinhardt
|
# Authors: Steve Reinhardt
|
||||||
|
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import sys
|
||||||
|
|
||||||
################
|
################
|
||||||
# CpuModel class
|
# CpuModel class
|
||||||
#
|
#
|
||||||
|
@ -47,7 +51,6 @@ class CpuModel:
|
||||||
# Add self to dict
|
# Add self to dict
|
||||||
CpuModel.dict[name] = self
|
CpuModel.dict[name] = self
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Define CPU models.
|
# Define CPU models.
|
||||||
#
|
#
|
||||||
|
@ -67,9 +70,6 @@ CpuModel('TimingSimpleCPU', 'timing_simple_cpu_exec.cc',
|
||||||
CpuModel('FullCPU', 'full_cpu_exec.cc',
|
CpuModel('FullCPU', 'full_cpu_exec.cc',
|
||||||
'#include "encumbered/cpu/full/dyn_inst.hh"',
|
'#include "encumbered/cpu/full/dyn_inst.hh"',
|
||||||
{ 'CPU_exec_context': 'DynInst' })
|
{ 'CPU_exec_context': 'DynInst' })
|
||||||
CpuModel('AlphaO3CPU', 'alpha_o3_exec.cc',
|
|
||||||
'#include "cpu/o3/alpha_dyn_inst.hh"',
|
|
||||||
{ 'CPU_exec_context': 'AlphaDynInst<AlphaSimpleImpl>' })
|
|
||||||
CpuModel('OzoneSimpleCPU', 'ozone_simple_exec.cc',
|
CpuModel('OzoneSimpleCPU', 'ozone_simple_exec.cc',
|
||||||
'#include "cpu/ozone/dyn_inst.hh"',
|
'#include "cpu/ozone/dyn_inst.hh"',
|
||||||
{ 'CPU_exec_context': 'OzoneDynInst<SimpleImpl>' })
|
{ 'CPU_exec_context': 'OzoneDynInst<SimpleImpl>' })
|
||||||
|
@ -80,3 +80,17 @@ CpuModel('CheckerCPU', 'checker_cpu_exec.cc',
|
||||||
'#include "cpu/checker/cpu.hh"',
|
'#include "cpu/checker/cpu.hh"',
|
||||||
{ 'CPU_exec_context': 'CheckerCPU' })
|
{ 'CPU_exec_context': 'CheckerCPU' })
|
||||||
|
|
||||||
|
# Maybe there is a more clever way to determine ISA
|
||||||
|
# here but since the environment variable isnt passed through
|
||||||
|
# here the easiest way is this...
|
||||||
|
sub_template = 'not found'
|
||||||
|
for argument in sys.argv:
|
||||||
|
if 'ALPHA' in argument:
|
||||||
|
sub_template = 'AlphaDynInst<AlphaSimpleImpl>'
|
||||||
|
|
||||||
|
if sub_template == 'not found':
|
||||||
|
sys.exit('NO CPU_exec_context substitution defined for this ISA')
|
||||||
|
|
||||||
|
CpuModel('O3CPU', 'o3_cpu_exec.cc',
|
||||||
|
'#include "cpu/o3/isa_specific.hh"',
|
||||||
|
{ 'CPU_exec_context': sub_template })
|
||||||
|
|
79
src/cpu/o3/SConscript
Executable file
79
src/cpu/o3/SConscript
Executable file
|
@ -0,0 +1,79 @@
|
||||||
|
# -*- mode:python -*-
|
||||||
|
|
||||||
|
# Copyright (c) 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.
|
||||||
|
#
|
||||||
|
# Authors: Korey Sewell
|
||||||
|
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Import build environment variable from SConstruct.
|
||||||
|
Import('env')
|
||||||
|
|
||||||
|
|
||||||
|
#################################################################
|
||||||
|
#
|
||||||
|
# Include ISA-specific files for the O3 CPU-model
|
||||||
|
#
|
||||||
|
#################################################################
|
||||||
|
|
||||||
|
sources = []
|
||||||
|
|
||||||
|
if env['TARGET_ISA'] == 'alpha':
|
||||||
|
sources += Split('''
|
||||||
|
alpha/dyn_inst.cc
|
||||||
|
alpha/cpu.cc
|
||||||
|
alpha/thread_context.cc
|
||||||
|
alpha/cpu_builder.cc
|
||||||
|
''')
|
||||||
|
elif env['TARGET_ISA'] == 'mips':
|
||||||
|
sys.exit('O3 CPU does not support MIPS')
|
||||||
|
#sources += Split('''
|
||||||
|
# mips/dyn_inst.cc
|
||||||
|
# mips/cpu.cc
|
||||||
|
# mips/thread_context.cc
|
||||||
|
# mips/cpu_builder.cc
|
||||||
|
# ''')
|
||||||
|
elif env['TARGET_ISA'] == 'sparc':
|
||||||
|
sys.exit('O3 CPU does not support MIPS')
|
||||||
|
#sources += Split('''
|
||||||
|
# sparc/dyn_inst.cc
|
||||||
|
# sparc/cpu.cc
|
||||||
|
# sparc/thread_context.cc
|
||||||
|
# sparc/cpu_builder.cc
|
||||||
|
# ''')
|
||||||
|
else:
|
||||||
|
sys.exit('O3 CPU does not support the \'%s\' ISA' % env['TARGET_ISA'])
|
||||||
|
|
||||||
|
|
||||||
|
# Convert file names to SCons File objects. This takes care of the
|
||||||
|
# path relative to the top of the directory tree.
|
||||||
|
sources = [File(s) for s in sources]
|
||||||
|
|
||||||
|
Return('sources')
|
||||||
|
|
|
@ -28,9 +28,9 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
#include "cpu/o3/alphaimpl.hh"
|
||||||
#include "cpu/o3/alpha_cpu_impl.hh"
|
#include "cpu/o3/alpha/cpu_impl.hh"
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/alpha/dyn_inst.hh"
|
||||||
|
|
||||||
// Force instantiation of AlphaO3CPU for all the implemntations that are
|
// Force instantiation of AlphaO3CPU for all the implemntations that are
|
||||||
// needed. Consider merging this and alpha_dyn_inst.cc, and maybe all
|
// needed. Consider merging this and alpha_dyn_inst.cc, and maybe all
|
204
src/cpu/o3/alpha/cpu.hh
Normal file
204
src/cpu/o3/alpha/cpu.hh
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2004-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.
|
||||||
|
*
|
||||||
|
* Authors: Kevin Lim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CPU_O3_ALPHA_CPU_HH__
|
||||||
|
#define __CPU_O3_ALPHA_CPU_HH__
|
||||||
|
|
||||||
|
#include "arch/isa_traits.hh"
|
||||||
|
#include "cpu/thread_context.hh"
|
||||||
|
#include "cpu/o3/cpu.hh"
|
||||||
|
#include "sim/byteswap.hh"
|
||||||
|
|
||||||
|
class EndQuiesceEvent;
|
||||||
|
namespace Kernel {
|
||||||
|
class Statistics;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TranslatingPort;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AlphaO3CPU class. Derives from the FullO3CPU class, and
|
||||||
|
* implements all ISA and implementation specific functions of the
|
||||||
|
* CPU. This is the CPU class that is used for the SimObjects, and is
|
||||||
|
* what is given to the DynInsts. Most of its state exists in the
|
||||||
|
* FullO3CPU; the state is has is mainly for ISA specific
|
||||||
|
* functionality.
|
||||||
|
*/
|
||||||
|
template <class Impl>
|
||||||
|
class AlphaO3CPU : public FullO3CPU<Impl>
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
typedef TheISA::IntReg IntReg;
|
||||||
|
typedef TheISA::FloatReg FloatReg;
|
||||||
|
typedef TheISA::FloatRegBits FloatRegBits;
|
||||||
|
typedef TheISA::MiscReg MiscReg;
|
||||||
|
typedef TheISA::RegFile RegFile;
|
||||||
|
typedef TheISA::MiscRegFile MiscRegFile;
|
||||||
|
|
||||||
|
public:
|
||||||
|
typedef O3ThreadState<Impl> ImplState;
|
||||||
|
typedef O3ThreadState<Impl> Thread;
|
||||||
|
typedef typename Impl::Params Params;
|
||||||
|
|
||||||
|
/** Constructs an AlphaO3CPU with the given parameters. */
|
||||||
|
AlphaO3CPU(Params *params);
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
/** ITB pointer. */
|
||||||
|
AlphaITB *itb;
|
||||||
|
/** DTB pointer. */
|
||||||
|
AlphaDTB *dtb;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Registers statistics. */
|
||||||
|
void regStats();
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
/** Translates instruction requestion. */
|
||||||
|
Fault translateInstReq(RequestPtr &req, Thread *thread)
|
||||||
|
{
|
||||||
|
return itb->translate(req, thread->getTC());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Translates data read request. */
|
||||||
|
Fault translateDataReadReq(RequestPtr &req, Thread *thread)
|
||||||
|
{
|
||||||
|
return dtb->translate(req, thread->getTC(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Translates data write request. */
|
||||||
|
Fault translateDataWriteReq(RequestPtr &req, Thread *thread)
|
||||||
|
{
|
||||||
|
return dtb->translate(req, thread->getTC(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
/** Translates instruction requestion in syscall emulation mode. */
|
||||||
|
Fault translateInstReq(RequestPtr &req, Thread *thread)
|
||||||
|
{
|
||||||
|
return thread->getProcessPtr()->pTable->translate(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Translates data read request in syscall emulation mode. */
|
||||||
|
Fault translateDataReadReq(RequestPtr &req, Thread *thread)
|
||||||
|
{
|
||||||
|
return thread->getProcessPtr()->pTable->translate(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Translates data write request in syscall emulation mode. */
|
||||||
|
Fault translateDataWriteReq(RequestPtr &req, Thread *thread)
|
||||||
|
{
|
||||||
|
return thread->getProcessPtr()->pTable->translate(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/** Reads a miscellaneous register. */
|
||||||
|
MiscReg readMiscReg(int misc_reg, unsigned tid);
|
||||||
|
|
||||||
|
/** Reads a misc. register, including any side effects the read
|
||||||
|
* might have as defined by the architecture.
|
||||||
|
*/
|
||||||
|
MiscReg readMiscRegWithEffect(int misc_reg, Fault &fault, unsigned tid);
|
||||||
|
|
||||||
|
/** Sets a miscellaneous register. */
|
||||||
|
Fault setMiscReg(int misc_reg, const MiscReg &val, unsigned tid);
|
||||||
|
|
||||||
|
/** Sets a misc. register, including any side effects the write
|
||||||
|
* might have as defined by the architecture.
|
||||||
|
*/
|
||||||
|
Fault setMiscRegWithEffect(int misc_reg, const MiscReg &val, unsigned tid);
|
||||||
|
|
||||||
|
/** Initiates a squash of all in-flight instructions for a given
|
||||||
|
* thread. The source of the squash is an external update of
|
||||||
|
* state through the TC.
|
||||||
|
*/
|
||||||
|
void squashFromTC(unsigned tid);
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
/** Posts an interrupt. */
|
||||||
|
void post_interrupt(int int_num, int index);
|
||||||
|
/** Reads the interrupt flag. */
|
||||||
|
int readIntrFlag();
|
||||||
|
/** Sets the interrupt flags. */
|
||||||
|
void setIntrFlag(int val);
|
||||||
|
/** HW return from error interrupt. */
|
||||||
|
Fault hwrei(unsigned tid);
|
||||||
|
/** Returns if a specific PC is a PAL mode PC. */
|
||||||
|
bool inPalMode(uint64_t PC)
|
||||||
|
{ return AlphaISA::PcPAL(PC); }
|
||||||
|
|
||||||
|
bool simPalCheck(int palFunc, unsigned tid);
|
||||||
|
|
||||||
|
/** Processes any interrupts. */
|
||||||
|
void processInterrupts();
|
||||||
|
|
||||||
|
/** Halts the CPU. */
|
||||||
|
void halt() { panic("Halt not implemented!\n"); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Traps to handle given fault. */
|
||||||
|
void trap(Fault fault, unsigned tid);
|
||||||
|
|
||||||
|
#if !FULL_SYSTEM
|
||||||
|
/** Executes a syscall.
|
||||||
|
* @todo: Determine if this needs to be virtual.
|
||||||
|
*/
|
||||||
|
void syscall(int64_t callnum, int tid);
|
||||||
|
/** Gets a syscall argument. */
|
||||||
|
IntReg getSyscallArg(int i, int tid);
|
||||||
|
|
||||||
|
/** Used to shift args for indirect syscall. */
|
||||||
|
void setSyscallArg(int i, IntReg val, int tid);
|
||||||
|
|
||||||
|
/** Sets the return value of a syscall. */
|
||||||
|
void setSyscallReturn(SyscallReturn return_value, int tid);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** CPU read function, forwards read to LSQ. */
|
||||||
|
template <class T>
|
||||||
|
Fault read(RequestPtr &req, T &data, int load_idx)
|
||||||
|
{
|
||||||
|
return this->iew.ldstQueue.read(req, data, load_idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** CPU write function, forwards write to LSQ. */
|
||||||
|
template <class T>
|
||||||
|
Fault write(RequestPtr &req, T &data, int store_idx)
|
||||||
|
{
|
||||||
|
return this->iew.ldstQueue.write(req, data, store_idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
Addr lockAddr;
|
||||||
|
|
||||||
|
/** Temporary fix for the lock flag, works in the UP case. */
|
||||||
|
bool lockFlag;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __CPU_O3_ALPHA_CPU_HH__
|
|
@ -38,8 +38,9 @@
|
||||||
#include "sim/sim_events.hh"
|
#include "sim/sim_events.hh"
|
||||||
#include "sim/stats.hh"
|
#include "sim/stats.hh"
|
||||||
|
|
||||||
#include "cpu/o3/alpha_cpu.hh"
|
#include "cpu/o3/alpha/cpu.hh"
|
||||||
#include "cpu/o3/alpha_params.hh"
|
#include "cpu/o3/alpha/params.hh"
|
||||||
|
#include "cpu/o3/alpha/tc.hh"
|
||||||
#include "cpu/o3/comm.hh"
|
#include "cpu/o3/comm.hh"
|
||||||
#include "cpu/o3/thread_state.hh"
|
#include "cpu/o3/thread_state.hh"
|
||||||
|
|
||||||
|
@ -110,7 +111,8 @@ AlphaO3CPU<Impl>::AlphaO3CPU(Params *params)
|
||||||
ThreadContext *tc;
|
ThreadContext *tc;
|
||||||
|
|
||||||
// Setup the TC that will serve as the interface to the threads/CPU.
|
// Setup the TC that will serve as the interface to the threads/CPU.
|
||||||
AlphaTC *alpha_tc = new AlphaTC;
|
AlphaTC<Impl> *alpha_tc =
|
||||||
|
new AlphaTC<Impl>;
|
||||||
|
|
||||||
tc = alpha_tc;
|
tc = alpha_tc;
|
||||||
|
|
||||||
|
@ -118,7 +120,7 @@ AlphaO3CPU<Impl>::AlphaO3CPU(Params *params)
|
||||||
// CheckerThreadContext.
|
// CheckerThreadContext.
|
||||||
#if USE_CHECKER
|
#if USE_CHECKER
|
||||||
if (params->checker) {
|
if (params->checker) {
|
||||||
tc = new CheckerThreadContext<AlphaTC>(
|
tc = new CheckerThreadContext<AlphaTC<Impl>>(
|
||||||
alpha_tc, this->checker);
|
alpha_tc, this->checker);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -187,465 +189,6 @@ AlphaO3CPU<Impl>::regStats()
|
||||||
this->commit.regStats();
|
this->commit.regStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
template <class Impl>
|
|
||||||
VirtualPort *
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::getVirtPort(ThreadContext *src_tc)
|
|
||||||
{
|
|
||||||
if (!src_tc)
|
|
||||||
return thread->getVirtPort();
|
|
||||||
|
|
||||||
VirtualPort *vp;
|
|
||||||
Port *mem_port;
|
|
||||||
|
|
||||||
vp = new VirtualPort("tc-vport", src_tc);
|
|
||||||
mem_port = cpu->system->physmem->getPort("functional");
|
|
||||||
mem_port->setPeer(vp);
|
|
||||||
vp->setPeer(mem_port);
|
|
||||||
return vp;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::dumpFuncProfile()
|
|
||||||
{
|
|
||||||
// Currently not supported
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::takeOverFrom(ThreadContext *old_context)
|
|
||||||
{
|
|
||||||
// some things should already be set up
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
assert(getSystemPtr() == old_context->getSystemPtr());
|
|
||||||
#else
|
|
||||||
assert(getProcessPtr() == old_context->getProcessPtr());
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// copy over functional state
|
|
||||||
setStatus(old_context->status());
|
|
||||||
copyArchRegs(old_context);
|
|
||||||
setCpuId(old_context->readCpuId());
|
|
||||||
|
|
||||||
#if !FULL_SYSTEM
|
|
||||||
thread->funcExeInst = old_context->readFuncExeInst();
|
|
||||||
#else
|
|
||||||
EndQuiesceEvent *other_quiesce = old_context->getQuiesceEvent();
|
|
||||||
if (other_quiesce) {
|
|
||||||
// Point the quiesce event's TC at this TC so that it wakes up
|
|
||||||
// the proper CPU.
|
|
||||||
other_quiesce->tc = this;
|
|
||||||
}
|
|
||||||
if (thread->quiesceEvent) {
|
|
||||||
thread->quiesceEvent->tc = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Transfer kernel stats from one CPU to the other.
|
|
||||||
thread->kernelStats = old_context->getKernelStats();
|
|
||||||
// storeCondFailures = 0;
|
|
||||||
cpu->lockFlag = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
old_context->setStatus(ThreadContext::Unallocated);
|
|
||||||
|
|
||||||
thread->inSyscall = false;
|
|
||||||
thread->trapPending = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::delVirtPort(VirtualPort *vp)
|
|
||||||
{
|
|
||||||
delete vp->getPeer();
|
|
||||||
delete vp;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::activate(int delay)
|
|
||||||
{
|
|
||||||
DPRINTF(O3CPU, "Calling activate on AlphaTC\n");
|
|
||||||
|
|
||||||
if (thread->status() == ThreadContext::Active)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
thread->lastActivate = curTick;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (thread->status() == ThreadContext::Unallocated) {
|
|
||||||
cpu->activateWhenReady(thread->readTid());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
thread->setStatus(ThreadContext::Active);
|
|
||||||
|
|
||||||
// status() == Suspended
|
|
||||||
cpu->activateContext(thread->readTid(), delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::suspend()
|
|
||||||
{
|
|
||||||
DPRINTF(O3CPU, "Calling suspend on AlphaTC\n");
|
|
||||||
|
|
||||||
if (thread->status() == ThreadContext::Suspended)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
thread->lastActivate = curTick;
|
|
||||||
thread->lastSuspend = curTick;
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
// Don't change the status from active if there are pending interrupts
|
|
||||||
if (cpu->check_interrupts()) {
|
|
||||||
assert(status() == ThreadContext::Active);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
thread->setStatus(ThreadContext::Suspended);
|
|
||||||
cpu->suspendContext(thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::deallocate()
|
|
||||||
{
|
|
||||||
DPRINTF(O3CPU, "Calling deallocate on AlphaTC\n");
|
|
||||||
|
|
||||||
if (thread->status() == ThreadContext::Unallocated)
|
|
||||||
return;
|
|
||||||
|
|
||||||
thread->setStatus(ThreadContext::Unallocated);
|
|
||||||
cpu->deallocateContext(thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::halt()
|
|
||||||
{
|
|
||||||
DPRINTF(O3CPU, "Calling halt on AlphaTC\n");
|
|
||||||
|
|
||||||
if (thread->status() == ThreadContext::Halted)
|
|
||||||
return;
|
|
||||||
|
|
||||||
thread->setStatus(ThreadContext::Halted);
|
|
||||||
cpu->haltContext(thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::regStats(const std::string &name)
|
|
||||||
{
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
thread->kernelStats = new Kernel::Statistics(cpu->system);
|
|
||||||
thread->kernelStats->regStats(name + ".kern");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::serialize(std::ostream &os)
|
|
||||||
{
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
if (thread->kernelStats)
|
|
||||||
thread->kernelStats->serialize(os);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::unserialize(Checkpoint *cp, const std::string §ion)
|
|
||||||
{
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
if (thread->kernelStats)
|
|
||||||
thread->kernelStats->unserialize(cp, section);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
template <class Impl>
|
|
||||||
EndQuiesceEvent *
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::getQuiesceEvent()
|
|
||||||
{
|
|
||||||
return thread->quiesceEvent;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
Tick
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::readLastActivate()
|
|
||||||
{
|
|
||||||
return thread->lastActivate;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
Tick
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::readLastSuspend()
|
|
||||||
{
|
|
||||||
return thread->lastSuspend;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::profileClear()
|
|
||||||
{}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::profileSample()
|
|
||||||
{}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
TheISA::MachInst
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC:: getInst()
|
|
||||||
{
|
|
||||||
return thread->getInst();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::copyArchRegs(ThreadContext *tc)
|
|
||||||
{
|
|
||||||
// This function will mess things up unless the ROB is empty and
|
|
||||||
// there are no instructions in the pipeline.
|
|
||||||
unsigned tid = thread->readTid();
|
|
||||||
PhysRegIndex renamed_reg;
|
|
||||||
|
|
||||||
// First loop through the integer registers.
|
|
||||||
for (int i = 0; i < AlphaISA::NumIntRegs; ++i) {
|
|
||||||
renamed_reg = cpu->renameMap[tid].lookup(i);
|
|
||||||
|
|
||||||
DPRINTF(O3CPU, "Copying over register %i, had data %lli, "
|
|
||||||
"now has data %lli.\n",
|
|
||||||
renamed_reg, cpu->readIntReg(renamed_reg),
|
|
||||||
tc->readIntReg(i));
|
|
||||||
|
|
||||||
cpu->setIntReg(renamed_reg, tc->readIntReg(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Then loop through the floating point registers.
|
|
||||||
for (int i = 0; i < AlphaISA::NumFloatRegs; ++i) {
|
|
||||||
renamed_reg = cpu->renameMap[tid].lookup(i + AlphaISA::FP_Base_DepTag);
|
|
||||||
cpu->setFloatRegBits(renamed_reg,
|
|
||||||
tc->readFloatRegBits(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Copy the misc regs.
|
|
||||||
copyMiscRegs(tc, this);
|
|
||||||
|
|
||||||
// Then finally set the PC and the next PC.
|
|
||||||
cpu->setPC(tc->readPC(), tid);
|
|
||||||
cpu->setNextPC(tc->readNextPC(), tid);
|
|
||||||
#if !FULL_SYSTEM
|
|
||||||
this->thread->funcExeInst = tc->readFuncExeInst();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::clearArchRegs()
|
|
||||||
{}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
uint64_t
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::readIntReg(int reg_idx)
|
|
||||||
{
|
|
||||||
return cpu->readArchIntReg(reg_idx, thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
FloatReg
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::readFloatReg(int reg_idx, int width)
|
|
||||||
{
|
|
||||||
switch(width) {
|
|
||||||
case 32:
|
|
||||||
return cpu->readArchFloatRegSingle(reg_idx, thread->readTid());
|
|
||||||
case 64:
|
|
||||||
return cpu->readArchFloatRegDouble(reg_idx, thread->readTid());
|
|
||||||
default:
|
|
||||||
panic("Unsupported width!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
FloatReg
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::readFloatReg(int reg_idx)
|
|
||||||
{
|
|
||||||
return cpu->readArchFloatRegSingle(reg_idx, thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
FloatRegBits
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::readFloatRegBits(int reg_idx, int width)
|
|
||||||
{
|
|
||||||
DPRINTF(Fault, "Reading floatint register through the TC!\n");
|
|
||||||
return cpu->readArchFloatRegInt(reg_idx, thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
FloatRegBits
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::readFloatRegBits(int reg_idx)
|
|
||||||
{
|
|
||||||
return cpu->readArchFloatRegInt(reg_idx, thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setIntReg(int reg_idx, uint64_t val)
|
|
||||||
{
|
|
||||||
cpu->setArchIntReg(reg_idx, val, thread->readTid());
|
|
||||||
|
|
||||||
// Squash if we're not already in a state update mode.
|
|
||||||
if (!thread->trapPending && !thread->inSyscall) {
|
|
||||||
cpu->squashFromTC(thread->readTid());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setFloatReg(int reg_idx, FloatReg val, int width)
|
|
||||||
{
|
|
||||||
switch(width) {
|
|
||||||
case 32:
|
|
||||||
cpu->setArchFloatRegSingle(reg_idx, val, thread->readTid());
|
|
||||||
break;
|
|
||||||
case 64:
|
|
||||||
cpu->setArchFloatRegDouble(reg_idx, val, thread->readTid());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Squash if we're not already in a state update mode.
|
|
||||||
if (!thread->trapPending && !thread->inSyscall) {
|
|
||||||
cpu->squashFromTC(thread->readTid());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setFloatReg(int reg_idx, FloatReg val)
|
|
||||||
{
|
|
||||||
cpu->setArchFloatRegSingle(reg_idx, val, thread->readTid());
|
|
||||||
|
|
||||||
if (!thread->trapPending && !thread->inSyscall) {
|
|
||||||
cpu->squashFromTC(thread->readTid());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setFloatRegBits(int reg_idx, FloatRegBits val,
|
|
||||||
int width)
|
|
||||||
{
|
|
||||||
DPRINTF(Fault, "Setting floatint register through the TC!\n");
|
|
||||||
cpu->setArchFloatRegInt(reg_idx, val, thread->readTid());
|
|
||||||
|
|
||||||
// Squash if we're not already in a state update mode.
|
|
||||||
if (!thread->trapPending && !thread->inSyscall) {
|
|
||||||
cpu->squashFromTC(thread->readTid());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setFloatRegBits(int reg_idx, FloatRegBits val)
|
|
||||||
{
|
|
||||||
cpu->setArchFloatRegInt(reg_idx, val, thread->readTid());
|
|
||||||
|
|
||||||
// Squash if we're not already in a state update mode.
|
|
||||||
if (!thread->trapPending && !thread->inSyscall) {
|
|
||||||
cpu->squashFromTC(thread->readTid());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setPC(uint64_t val)
|
|
||||||
{
|
|
||||||
cpu->setPC(val, thread->readTid());
|
|
||||||
|
|
||||||
// Squash if we're not already in a state update mode.
|
|
||||||
if (!thread->trapPending && !thread->inSyscall) {
|
|
||||||
cpu->squashFromTC(thread->readTid());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setNextPC(uint64_t val)
|
|
||||||
{
|
|
||||||
cpu->setNextPC(val, thread->readTid());
|
|
||||||
|
|
||||||
// Squash if we're not already in a state update mode.
|
|
||||||
if (!thread->trapPending && !thread->inSyscall) {
|
|
||||||
cpu->squashFromTC(thread->readTid());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
Fault
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setMiscReg(int misc_reg, const MiscReg &val)
|
|
||||||
{
|
|
||||||
Fault ret_fault = cpu->setMiscReg(misc_reg, val, thread->readTid());
|
|
||||||
|
|
||||||
// Squash if we're not already in a state update mode.
|
|
||||||
if (!thread->trapPending && !thread->inSyscall) {
|
|
||||||
cpu->squashFromTC(thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret_fault;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
Fault
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setMiscRegWithEffect(int misc_reg,
|
|
||||||
const MiscReg &val)
|
|
||||||
{
|
|
||||||
Fault ret_fault = cpu->setMiscRegWithEffect(misc_reg, val,
|
|
||||||
thread->readTid());
|
|
||||||
|
|
||||||
// Squash if we're not already in a state update mode.
|
|
||||||
if (!thread->trapPending && !thread->inSyscall) {
|
|
||||||
cpu->squashFromTC(thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret_fault;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if !FULL_SYSTEM
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
TheISA::IntReg
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::getSyscallArg(int i)
|
|
||||||
{
|
|
||||||
return cpu->getSyscallArg(i, thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setSyscallArg(int i, IntReg val)
|
|
||||||
{
|
|
||||||
cpu->setSyscallArg(i, val, thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Impl>
|
|
||||||
void
|
|
||||||
AlphaO3CPU<Impl>::AlphaTC::setSyscallReturn(SyscallReturn return_value)
|
|
||||||
{
|
|
||||||
cpu->setSyscallReturn(return_value, thread->readTid());
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // FULL_SYSTEM
|
|
||||||
|
|
||||||
template <class Impl>
|
template <class Impl>
|
||||||
MiscReg
|
MiscReg
|
|
@ -28,8 +28,8 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst_impl.hh"
|
#include "cpu/o3/alpha/dyn_inst_impl.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
#include "cpu/o3/alpha/impl.hh"
|
||||||
|
|
||||||
// Force instantiation of AlphaDynInst for all the implementations that
|
// Force instantiation of AlphaDynInst for all the implementations that
|
||||||
// are needed.
|
// are needed.
|
|
@ -34,8 +34,8 @@
|
||||||
#include "arch/isa_traits.hh"
|
#include "arch/isa_traits.hh"
|
||||||
#include "cpu/base_dyn_inst.hh"
|
#include "cpu/base_dyn_inst.hh"
|
||||||
#include "cpu/inst_seq.hh"
|
#include "cpu/inst_seq.hh"
|
||||||
#include "cpu/o3/alpha_cpu.hh"
|
#include "cpu/o3/alpha/cpu.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
#include "cpu/o3/alpha/impl.hh"
|
||||||
|
|
||||||
class Packet;
|
class Packet;
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/alpha/dyn_inst.hh"
|
||||||
|
|
||||||
template <class Impl>
|
template <class Impl>
|
||||||
AlphaDynInst<Impl>::AlphaDynInst(ExtMachInst inst, Addr PC, Addr Pred_PC,
|
AlphaDynInst<Impl>::AlphaDynInst(ExtMachInst inst, Addr PC, Addr Pred_PC,
|
|
@ -33,7 +33,7 @@
|
||||||
|
|
||||||
#include "arch/alpha/isa_traits.hh"
|
#include "arch/alpha/isa_traits.hh"
|
||||||
|
|
||||||
#include "cpu/o3/alpha_params.hh"
|
#include "cpu/o3/alpha/params.hh"
|
||||||
#include "cpu/o3/cpu_policy.hh"
|
#include "cpu/o3/cpu_policy.hh"
|
||||||
|
|
||||||
// Forward declarations.
|
// Forward declarations.
|
||||||
|
@ -81,7 +81,7 @@ struct AlphaSimpleImpl
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
MaxWidth = 8,
|
MaxWidth = 8,
|
||||||
MaxThreads = 4
|
MaxThreads = 2
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
69
src/cpu/o3/alpha/params.hh
Normal file
69
src/cpu/o3/alpha/params.hh
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2004-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.
|
||||||
|
*
|
||||||
|
* Authors: Kevin Lim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CPU_O3_ALPHA_PARAMS_HH__
|
||||||
|
#define __CPU_O3_ALPHA_PARAMS_HH__
|
||||||
|
|
||||||
|
#include "cpu/o3/cpu.hh"
|
||||||
|
#include "cpu/o3/params.hh"
|
||||||
|
|
||||||
|
//Forward declarations
|
||||||
|
class AlphaDTB;
|
||||||
|
class AlphaITB;
|
||||||
|
class MemObject;
|
||||||
|
class Process;
|
||||||
|
class System;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file defines the parameters that will be used for the AlphaO3CPU.
|
||||||
|
* This must be defined externally so that the Impl can have a params class
|
||||||
|
* defined that it can pass to all of the individual stages.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class AlphaSimpleParams : public O3Params
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
AlphaITB *itb;
|
||||||
|
AlphaDTB *dtb;
|
||||||
|
#else
|
||||||
|
std::vector<Process *> workload;
|
||||||
|
Process *process;
|
||||||
|
#endif // FULL_SYSTEM
|
||||||
|
|
||||||
|
MemObject *mem;
|
||||||
|
|
||||||
|
BaseCPU *checker;
|
||||||
|
|
||||||
|
unsigned decodeToFetchDelay;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __CPU_O3_ALPHA_PARAMS_HH__
|
36
src/cpu/o3/alpha/thread_context.cc
Executable file
36
src/cpu/o3/alpha/thread_context.cc
Executable file
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2004-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.
|
||||||
|
*
|
||||||
|
* Authors: Kevin Lim
|
||||||
|
* Korey Sewell
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cpu/o3/thread_context.hh"
|
||||||
|
#include "cpu/o3/thread_context_impl.hh"
|
||||||
|
|
||||||
|
template class O3ThreadContext<AlphaSimpleImpl>;
|
||||||
|
|
70
src/cpu/o3/alpha/thread_context.hh
Normal file
70
src/cpu/o3/alpha/thread_context.hh
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2004-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.
|
||||||
|
*
|
||||||
|
* Authors: Kevin Lim
|
||||||
|
* Korey Sewell
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cpu/o3/thread_context.hh"
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
class AlphaTC : public O3ThreadContext<Impl>
|
||||||
|
{
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
/** Returns a pointer to the ITB. */
|
||||||
|
virtual AlphaITB *getITBPtr() { return cpu->itb; }
|
||||||
|
|
||||||
|
/** Returns a pointer to the DTB. */
|
||||||
|
virtual AlphaDTB *getDTBPtr() { return cpu->dtb; }
|
||||||
|
|
||||||
|
/** Returns pointer to the quiesce event. */
|
||||||
|
virtual EndQuiesceEvent *getQuiesceEvent()
|
||||||
|
{
|
||||||
|
return thread->quiesceEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns if the thread is currently in PAL mode, based on
|
||||||
|
* the PC's value. */
|
||||||
|
virtual bool inPalMode()
|
||||||
|
{ return TheISA::PcPAL(cpu->readPC(thread->readTid())); }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
virtual uint64_t readNextNPC()
|
||||||
|
{
|
||||||
|
panic("Alpha has no NextNPC!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void setNextNPC(uint64_t val)
|
||||||
|
{
|
||||||
|
panic("Alpha has no NextNPC!");
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void changeRegFileContext(TheISA::RegFile::ContextParam param,
|
||||||
|
TheISA::RegFile::ContextVal val)
|
||||||
|
{ panic("Not supported on Alpha!"); }
|
||||||
|
};
|
|
@ -1,434 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2004-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.
|
|
||||||
*
|
|
||||||
* Authors: Kevin Lim
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __CPU_O3_ALPHA_CPU_HH__
|
|
||||||
#define __CPU_O3_ALPHA_CPU_HH__
|
|
||||||
|
|
||||||
#include "arch/isa_traits.hh"
|
|
||||||
#include "cpu/thread_context.hh"
|
|
||||||
#include "cpu/o3/cpu.hh"
|
|
||||||
#include "sim/byteswap.hh"
|
|
||||||
|
|
||||||
class EndQuiesceEvent;
|
|
||||||
namespace Kernel {
|
|
||||||
class Statistics;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TranslatingPort;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AlphaO3CPU class. Derives from the FullO3CPU class, and
|
|
||||||
* implements all ISA and implementation specific functions of the
|
|
||||||
* CPU. This is the CPU class that is used for the SimObjects, and is
|
|
||||||
* what is given to the DynInsts. Most of its state exists in the
|
|
||||||
* FullO3CPU; the state is has is mainly for ISA specific
|
|
||||||
* functionality.
|
|
||||||
*/
|
|
||||||
template <class Impl>
|
|
||||||
class AlphaO3CPU : public FullO3CPU<Impl>
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
typedef TheISA::IntReg IntReg;
|
|
||||||
typedef TheISA::FloatReg FloatReg;
|
|
||||||
typedef TheISA::FloatRegBits FloatRegBits;
|
|
||||||
typedef TheISA::MiscReg MiscReg;
|
|
||||||
typedef TheISA::RegFile RegFile;
|
|
||||||
typedef TheISA::MiscRegFile MiscRegFile;
|
|
||||||
|
|
||||||
public:
|
|
||||||
typedef O3ThreadState<Impl> ImplState;
|
|
||||||
typedef O3ThreadState<Impl> Thread;
|
|
||||||
typedef typename Impl::Params Params;
|
|
||||||
|
|
||||||
/** Constructs an AlphaO3CPU with the given parameters. */
|
|
||||||
AlphaO3CPU(Params *params);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Derived ThreadContext class for use with the AlphaO3CPU. It
|
|
||||||
* provides the interface for any external objects to access a
|
|
||||||
* single thread's state and some general CPU state. Any time
|
|
||||||
* external objects try to update state through this interface,
|
|
||||||
* the CPU will create an event to squash all in-flight
|
|
||||||
* instructions in order to ensure state is maintained correctly.
|
|
||||||
* It must be defined specifically for the AlphaO3CPU because
|
|
||||||
* not all architectural state is located within the O3ThreadState
|
|
||||||
* (such as the commit PC, and registers), and specific actions
|
|
||||||
* must be taken when using this interface (such as squashing all
|
|
||||||
* in-flight instructions when doing a write to this interface).
|
|
||||||
*/
|
|
||||||
class AlphaTC : public ThreadContext
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** Pointer to the CPU. */
|
|
||||||
AlphaO3CPU<Impl> *cpu;
|
|
||||||
|
|
||||||
/** Pointer to the thread state that this TC corrseponds to. */
|
|
||||||
O3ThreadState<Impl> *thread;
|
|
||||||
|
|
||||||
/** Returns a pointer to this CPU. */
|
|
||||||
virtual BaseCPU *getCpuPtr() { return cpu; }
|
|
||||||
|
|
||||||
/** Sets this CPU's ID. */
|
|
||||||
virtual void setCpuId(int id) { cpu->cpu_id = id; }
|
|
||||||
|
|
||||||
/** Reads this CPU's ID. */
|
|
||||||
virtual int readCpuId() { return cpu->cpu_id; }
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
/** Returns a pointer to the system. */
|
|
||||||
virtual System *getSystemPtr() { return cpu->system; }
|
|
||||||
|
|
||||||
/** Returns a pointer to physical memory. */
|
|
||||||
virtual PhysicalMemory *getPhysMemPtr() { return cpu->physmem; }
|
|
||||||
|
|
||||||
/** Returns a pointer to the ITB. */
|
|
||||||
virtual AlphaITB *getITBPtr() { return cpu->itb; }
|
|
||||||
|
|
||||||
/** Returns a pointer to the DTB. */
|
|
||||||
virtual AlphaDTB *getDTBPtr() { return cpu->dtb; }
|
|
||||||
|
|
||||||
/** Returns a pointer to this thread's kernel statistics. */
|
|
||||||
virtual Kernel::Statistics *getKernelStats()
|
|
||||||
{ return thread->kernelStats; }
|
|
||||||
|
|
||||||
virtual FunctionalPort *getPhysPort() { return thread->getPhysPort(); }
|
|
||||||
|
|
||||||
virtual VirtualPort *getVirtPort(ThreadContext *src_tc = NULL);
|
|
||||||
|
|
||||||
void delVirtPort(VirtualPort *vp);
|
|
||||||
#else
|
|
||||||
virtual TranslatingPort *getMemPort() { return thread->getMemPort(); }
|
|
||||||
|
|
||||||
/** Returns a pointer to this thread's process. */
|
|
||||||
virtual Process *getProcessPtr() { return thread->getProcessPtr(); }
|
|
||||||
#endif
|
|
||||||
/** Returns this thread's status. */
|
|
||||||
virtual Status status() const { return thread->status(); }
|
|
||||||
|
|
||||||
/** Sets this thread's status. */
|
|
||||||
virtual void setStatus(Status new_status)
|
|
||||||
{ thread->setStatus(new_status); }
|
|
||||||
|
|
||||||
/** Set the status to Active. Optional delay indicates number of
|
|
||||||
* cycles to wait before beginning execution. */
|
|
||||||
virtual void activate(int delay = 1);
|
|
||||||
|
|
||||||
/** Set the status to Suspended. */
|
|
||||||
virtual void suspend();
|
|
||||||
|
|
||||||
/** Set the status to Unallocated. */
|
|
||||||
virtual void deallocate();
|
|
||||||
|
|
||||||
/** Set the status to Halted. */
|
|
||||||
virtual void halt();
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
/** Dumps the function profiling information.
|
|
||||||
* @todo: Implement.
|
|
||||||
*/
|
|
||||||
virtual void dumpFuncProfile();
|
|
||||||
#endif
|
|
||||||
/** Takes over execution of a thread from another CPU. */
|
|
||||||
virtual void takeOverFrom(ThreadContext *old_context);
|
|
||||||
|
|
||||||
/** Registers statistics associated with this TC. */
|
|
||||||
virtual void regStats(const std::string &name);
|
|
||||||
|
|
||||||
/** Serializes state. */
|
|
||||||
virtual void serialize(std::ostream &os);
|
|
||||||
/** Unserializes state. */
|
|
||||||
virtual void unserialize(Checkpoint *cp, const std::string §ion);
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
/** Returns pointer to the quiesce event. */
|
|
||||||
virtual EndQuiesceEvent *getQuiesceEvent();
|
|
||||||
|
|
||||||
/** Reads the last tick that this thread was activated on. */
|
|
||||||
virtual Tick readLastActivate();
|
|
||||||
/** Reads the last tick that this thread was suspended on. */
|
|
||||||
virtual Tick readLastSuspend();
|
|
||||||
|
|
||||||
/** Clears the function profiling information. */
|
|
||||||
virtual void profileClear();
|
|
||||||
/** Samples the function profiling information. */
|
|
||||||
virtual void profileSample();
|
|
||||||
#endif
|
|
||||||
/** Returns this thread's ID number. */
|
|
||||||
virtual int getThreadNum() { return thread->readTid(); }
|
|
||||||
|
|
||||||
/** Returns the instruction this thread is currently committing.
|
|
||||||
* Only used when an instruction faults.
|
|
||||||
*/
|
|
||||||
virtual TheISA::MachInst getInst();
|
|
||||||
|
|
||||||
/** Copies the architectural registers from another TC into this TC. */
|
|
||||||
virtual void copyArchRegs(ThreadContext *tc);
|
|
||||||
|
|
||||||
/** Resets all architectural registers to 0. */
|
|
||||||
virtual void clearArchRegs();
|
|
||||||
|
|
||||||
/** Reads an integer register. */
|
|
||||||
virtual uint64_t readIntReg(int reg_idx);
|
|
||||||
|
|
||||||
virtual FloatReg readFloatReg(int reg_idx, int width);
|
|
||||||
|
|
||||||
virtual FloatReg readFloatReg(int reg_idx);
|
|
||||||
|
|
||||||
virtual FloatRegBits readFloatRegBits(int reg_idx, int width);
|
|
||||||
|
|
||||||
virtual FloatRegBits readFloatRegBits(int reg_idx);
|
|
||||||
|
|
||||||
/** Sets an integer register to a value. */
|
|
||||||
virtual void setIntReg(int reg_idx, uint64_t val);
|
|
||||||
|
|
||||||
virtual void setFloatReg(int reg_idx, FloatReg val, int width);
|
|
||||||
|
|
||||||
virtual void setFloatReg(int reg_idx, FloatReg val);
|
|
||||||
|
|
||||||
virtual void setFloatRegBits(int reg_idx, FloatRegBits val, int width);
|
|
||||||
|
|
||||||
virtual void setFloatRegBits(int reg_idx, FloatRegBits val);
|
|
||||||
|
|
||||||
/** Reads this thread's PC. */
|
|
||||||
virtual uint64_t readPC()
|
|
||||||
{ return cpu->readPC(thread->readTid()); }
|
|
||||||
|
|
||||||
/** Sets this thread's PC. */
|
|
||||||
virtual void setPC(uint64_t val);
|
|
||||||
|
|
||||||
/** Reads this thread's next PC. */
|
|
||||||
virtual uint64_t readNextPC()
|
|
||||||
{ return cpu->readNextPC(thread->readTid()); }
|
|
||||||
|
|
||||||
/** Sets this thread's next PC. */
|
|
||||||
virtual void setNextPC(uint64_t val);
|
|
||||||
|
|
||||||
virtual uint64_t readNextNPC()
|
|
||||||
{
|
|
||||||
panic("Alpha has no NextNPC!");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void setNextNPC(uint64_t val)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
/** Reads a miscellaneous register. */
|
|
||||||
virtual MiscReg readMiscReg(int misc_reg)
|
|
||||||
{ return cpu->readMiscReg(misc_reg, thread->readTid()); }
|
|
||||||
|
|
||||||
/** Reads a misc. register, including any side-effects the
|
|
||||||
* read might have as defined by the architecture. */
|
|
||||||
virtual MiscReg readMiscRegWithEffect(int misc_reg, Fault &fault)
|
|
||||||
{ return cpu->readMiscRegWithEffect(misc_reg, fault, thread->readTid()); }
|
|
||||||
|
|
||||||
/** Sets a misc. register. */
|
|
||||||
virtual Fault setMiscReg(int misc_reg, const MiscReg &val);
|
|
||||||
|
|
||||||
/** Sets a misc. register, including any side-effects the
|
|
||||||
* write might have as defined by the architecture. */
|
|
||||||
virtual Fault setMiscRegWithEffect(int misc_reg, const MiscReg &val);
|
|
||||||
|
|
||||||
/** Returns the number of consecutive store conditional failures. */
|
|
||||||
// @todo: Figure out where these store cond failures should go.
|
|
||||||
virtual unsigned readStCondFailures()
|
|
||||||
{ return thread->storeCondFailures; }
|
|
||||||
|
|
||||||
/** Sets the number of consecutive store conditional failures. */
|
|
||||||
virtual void setStCondFailures(unsigned sc_failures)
|
|
||||||
{ thread->storeCondFailures = sc_failures; }
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
/** Returns if the thread is currently in PAL mode, based on
|
|
||||||
* the PC's value. */
|
|
||||||
virtual bool inPalMode()
|
|
||||||
{ return TheISA::PcPAL(cpu->readPC(thread->readTid())); }
|
|
||||||
#endif
|
|
||||||
// Only really makes sense for old CPU model. Lots of code
|
|
||||||
// outside the CPU still checks this function, so it will
|
|
||||||
// always return false to keep everything working.
|
|
||||||
/** Checks if the thread is misspeculating. Because it is
|
|
||||||
* very difficult to determine if the thread is
|
|
||||||
* misspeculating, this is set as false. */
|
|
||||||
virtual bool misspeculating() { return false; }
|
|
||||||
|
|
||||||
#if !FULL_SYSTEM
|
|
||||||
/** Gets a syscall argument by index. */
|
|
||||||
virtual IntReg getSyscallArg(int i);
|
|
||||||
|
|
||||||
/** Sets a syscall argument. */
|
|
||||||
virtual void setSyscallArg(int i, IntReg val);
|
|
||||||
|
|
||||||
/** Sets the syscall return value. */
|
|
||||||
virtual void setSyscallReturn(SyscallReturn return_value);
|
|
||||||
|
|
||||||
/** Executes a syscall in SE mode. */
|
|
||||||
virtual void syscall(int64_t callnum)
|
|
||||||
{ return cpu->syscall(callnum, thread->readTid()); }
|
|
||||||
|
|
||||||
/** Reads the funcExeInst counter. */
|
|
||||||
virtual Counter readFuncExeInst() { return thread->funcExeInst; }
|
|
||||||
#endif
|
|
||||||
virtual void changeRegFileContext(TheISA::RegFile::ContextParam param,
|
|
||||||
TheISA::RegFile::ContextVal val)
|
|
||||||
{ panic("Not supported on Alpha!"); }
|
|
||||||
};
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
/** ITB pointer. */
|
|
||||||
AlphaITB *itb;
|
|
||||||
/** DTB pointer. */
|
|
||||||
AlphaDTB *dtb;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Registers statistics. */
|
|
||||||
void regStats();
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
/** Translates instruction requestion. */
|
|
||||||
Fault translateInstReq(RequestPtr &req, Thread *thread)
|
|
||||||
{
|
|
||||||
return itb->translate(req, thread->getTC());
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Translates data read request. */
|
|
||||||
Fault translateDataReadReq(RequestPtr &req, Thread *thread)
|
|
||||||
{
|
|
||||||
return dtb->translate(req, thread->getTC(), false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Translates data write request. */
|
|
||||||
Fault translateDataWriteReq(RequestPtr &req, Thread *thread)
|
|
||||||
{
|
|
||||||
return dtb->translate(req, thread->getTC(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
/** Translates instruction requestion in syscall emulation mode. */
|
|
||||||
Fault translateInstReq(RequestPtr &req, Thread *thread)
|
|
||||||
{
|
|
||||||
return thread->getProcessPtr()->pTable->translate(req);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Translates data read request in syscall emulation mode. */
|
|
||||||
Fault translateDataReadReq(RequestPtr &req, Thread *thread)
|
|
||||||
{
|
|
||||||
return thread->getProcessPtr()->pTable->translate(req);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Translates data write request in syscall emulation mode. */
|
|
||||||
Fault translateDataWriteReq(RequestPtr &req, Thread *thread)
|
|
||||||
{
|
|
||||||
return thread->getProcessPtr()->pTable->translate(req);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
/** Reads a miscellaneous register. */
|
|
||||||
MiscReg readMiscReg(int misc_reg, unsigned tid);
|
|
||||||
|
|
||||||
/** Reads a misc. register, including any side effects the read
|
|
||||||
* might have as defined by the architecture.
|
|
||||||
*/
|
|
||||||
MiscReg readMiscRegWithEffect(int misc_reg, Fault &fault, unsigned tid);
|
|
||||||
|
|
||||||
/** Sets a miscellaneous register. */
|
|
||||||
Fault setMiscReg(int misc_reg, const MiscReg &val, unsigned tid);
|
|
||||||
|
|
||||||
/** Sets a misc. register, including any side effects the write
|
|
||||||
* might have as defined by the architecture.
|
|
||||||
*/
|
|
||||||
Fault setMiscRegWithEffect(int misc_reg, const MiscReg &val, unsigned tid);
|
|
||||||
|
|
||||||
/** Initiates a squash of all in-flight instructions for a given
|
|
||||||
* thread. The source of the squash is an external update of
|
|
||||||
* state through the TC.
|
|
||||||
*/
|
|
||||||
void squashFromTC(unsigned tid);
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
/** Posts an interrupt. */
|
|
||||||
void post_interrupt(int int_num, int index);
|
|
||||||
/** Reads the interrupt flag. */
|
|
||||||
int readIntrFlag();
|
|
||||||
/** Sets the interrupt flags. */
|
|
||||||
void setIntrFlag(int val);
|
|
||||||
/** HW return from error interrupt. */
|
|
||||||
Fault hwrei(unsigned tid);
|
|
||||||
/** Returns if a specific PC is a PAL mode PC. */
|
|
||||||
bool inPalMode(uint64_t PC)
|
|
||||||
{ return AlphaISA::PcPAL(PC); }
|
|
||||||
|
|
||||||
bool simPalCheck(int palFunc, unsigned tid);
|
|
||||||
|
|
||||||
/** Processes any interrupts. */
|
|
||||||
void processInterrupts();
|
|
||||||
|
|
||||||
/** Halts the CPU. */
|
|
||||||
void halt() { panic("Halt not implemented!\n"); }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Traps to handle given fault. */
|
|
||||||
void trap(Fault fault, unsigned tid);
|
|
||||||
|
|
||||||
#if !FULL_SYSTEM
|
|
||||||
/** Executes a syscall.
|
|
||||||
* @todo: Determine if this needs to be virtual.
|
|
||||||
*/
|
|
||||||
void syscall(int64_t callnum, int tid);
|
|
||||||
/** Gets a syscall argument. */
|
|
||||||
IntReg getSyscallArg(int i, int tid);
|
|
||||||
|
|
||||||
/** Used to shift args for indirect syscall. */
|
|
||||||
void setSyscallArg(int i, IntReg val, int tid);
|
|
||||||
|
|
||||||
/** Sets the return value of a syscall. */
|
|
||||||
void setSyscallReturn(SyscallReturn return_value, int tid);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** CPU read function, forwards read to LSQ. */
|
|
||||||
template <class T>
|
|
||||||
Fault read(RequestPtr &req, T &data, int load_idx)
|
|
||||||
{
|
|
||||||
return this->iew.ldstQueue.read(req, data, load_idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** CPU write function, forwards write to LSQ. */
|
|
||||||
template <class T>
|
|
||||||
Fault write(RequestPtr &req, T &data, int store_idx)
|
|
||||||
{
|
|
||||||
return this->iew.ldstQueue.write(req, data, store_idx);
|
|
||||||
}
|
|
||||||
|
|
||||||
Addr lockAddr;
|
|
||||||
|
|
||||||
/** Temporary fix for the lock flag, works in the UP case. */
|
|
||||||
bool lockFlag;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // __CPU_O3_ALPHA_CPU_HH__
|
|
|
@ -29,8 +29,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/base_dyn_inst_impl.hh"
|
#include "cpu/base_dyn_inst_impl.hh"
|
||||||
#include "cpu/o3/alpha_cpu.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
|
|
||||||
// Explicit instantiation
|
// Explicit instantiation
|
||||||
template class BaseDynInst<AlphaSimpleImpl>;
|
template class BaseDynInst<AlphaSimpleImpl>;
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/bpred_unit_impl.hh"
|
#include "cpu/o3/bpred_unit_impl.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
|
||||||
|
|
||||||
template class BPredUnit<AlphaSimpleImpl>;
|
template class BPredUnit<AlphaSimpleImpl>;
|
||||||
|
|
|
@ -28,8 +28,7 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/commit_impl.hh"
|
#include "cpu/o3/commit_impl.hh"
|
||||||
|
|
||||||
template class DefaultCommit<AlphaSimpleImpl>;
|
template class DefaultCommit<AlphaSimpleImpl>;
|
||||||
|
|
|
@ -41,8 +41,7 @@
|
||||||
#include "cpu/activity.hh"
|
#include "cpu/activity.hh"
|
||||||
#include "cpu/simple_thread.hh"
|
#include "cpu/simple_thread.hh"
|
||||||
#include "cpu/thread_context.hh"
|
#include "cpu/thread_context.hh"
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/cpu.hh"
|
#include "cpu/o3/cpu.hh"
|
||||||
|
|
||||||
#include "sim/root.hh"
|
#include "sim/root.hh"
|
||||||
|
|
|
@ -49,11 +49,14 @@
|
||||||
#include "cpu/o3/cpu_policy.hh"
|
#include "cpu/o3/cpu_policy.hh"
|
||||||
#include "cpu/o3/scoreboard.hh"
|
#include "cpu/o3/scoreboard.hh"
|
||||||
#include "cpu/o3/thread_state.hh"
|
#include "cpu/o3/thread_state.hh"
|
||||||
|
//#include "cpu/o3/thread_context.hh"
|
||||||
#include "sim/process.hh"
|
#include "sim/process.hh"
|
||||||
|
|
||||||
template <class>
|
template <class>
|
||||||
class Checker;
|
class Checker;
|
||||||
class ThreadContext;
|
class ThreadContext;
|
||||||
|
template <class>
|
||||||
|
class O3ThreadContext;
|
||||||
class MemObject;
|
class MemObject;
|
||||||
class Process;
|
class Process;
|
||||||
|
|
||||||
|
@ -67,6 +70,10 @@ class BaseO3CPU : public BaseCPU
|
||||||
|
|
||||||
void regStats();
|
void regStats();
|
||||||
|
|
||||||
|
/** Sets this CPU's ID. */
|
||||||
|
void setCpuId(int id) { cpu_id = id; }
|
||||||
|
|
||||||
|
/** Reads this CPU's ID. */
|
||||||
int readCpuId() { return cpu_id; }
|
int readCpuId() { return cpu_id; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -94,6 +101,7 @@ class FullO3CPU : public BaseO3CPU
|
||||||
|
|
||||||
typedef typename std::list<DynInstPtr>::iterator ListIt;
|
typedef typename std::list<DynInstPtr>::iterator ListIt;
|
||||||
|
|
||||||
|
friend class O3ThreadContext<Impl>;
|
||||||
public:
|
public:
|
||||||
enum Status {
|
enum Status {
|
||||||
Running,
|
Running,
|
||||||
|
|
|
@ -28,8 +28,7 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/decode_impl.hh"
|
#include "cpu/o3/decode_impl.hh"
|
||||||
|
|
||||||
template class DefaultDecode<AlphaSimpleImpl>;
|
template class DefaultDecode<AlphaSimpleImpl>;
|
||||||
|
|
|
@ -28,8 +28,7 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/fetch_impl.hh"
|
#include "cpu/o3/fetch_impl.hh"
|
||||||
|
|
||||||
template class DefaultFetch<AlphaSimpleImpl>;
|
template class DefaultFetch<AlphaSimpleImpl>;
|
||||||
|
|
|
@ -28,8 +28,7 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/iew_impl.hh"
|
#include "cpu/o3/iew_impl.hh"
|
||||||
#include "cpu/o3/inst_queue.hh"
|
#include "cpu/o3/inst_queue.hh"
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,7 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/inst_queue_impl.hh"
|
#include "cpu/o3/inst_queue_impl.hh"
|
||||||
|
|
||||||
// Force instantiation of InstructionQueue.
|
// Force instantiation of InstructionQueue.
|
||||||
|
|
40
src/cpu/o3/isa_specific.hh
Executable file
40
src/cpu/o3/isa_specific.hh
Executable file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 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.
|
||||||
|
*
|
||||||
|
* Authors: Korey Sewell
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cpu/base.hh"
|
||||||
|
|
||||||
|
#if THE_ISA == ALPHA_ISA
|
||||||
|
#include "cpu/o3/alpha/cpu.hh"
|
||||||
|
#include "cpu/o3/alpha/impl.hh"
|
||||||
|
#include "cpu/o3/alpha/params.hh"
|
||||||
|
#include "cpu/o3/alpha/dyn_inst.hh"
|
||||||
|
#else
|
||||||
|
#error "O3CPU doesnt support this ISA"
|
||||||
|
#endif
|
|
@ -28,9 +28,7 @@
|
||||||
* Authors: Korey Sewell
|
* Authors: Korey Sewell
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_cpu.hh"
|
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/lsq_impl.hh"
|
#include "cpu/o3/lsq_impl.hh"
|
||||||
|
|
||||||
// Force the instantiation of LDSTQ for all the implementations we care about.
|
// Force the instantiation of LDSTQ for all the implementations we care about.
|
||||||
|
|
|
@ -29,9 +29,7 @@
|
||||||
* Korey Sewell
|
* Korey Sewell
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_cpu.hh"
|
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/lsq_unit_impl.hh"
|
#include "cpu/o3/lsq_unit_impl.hh"
|
||||||
|
|
||||||
// Force the instantiation of LDSTQ for all the implementations we care about.
|
// Force the instantiation of LDSTQ for all the implementations we care about.
|
||||||
|
|
|
@ -28,8 +28,7 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/store_set.hh"
|
#include "cpu/o3/store_set.hh"
|
||||||
#include "cpu/o3/mem_dep_unit_impl.hh"
|
#include "cpu/o3/mem_dep_unit_impl.hh"
|
||||||
|
|
||||||
|
|
26
src/cpu/o3/alpha_params.hh → src/cpu/o3/params.hh
Normal file → Executable file
26
src/cpu/o3/alpha_params.hh → src/cpu/o3/params.hh
Normal file → Executable file
|
@ -28,40 +28,22 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CPU_O3_ALPHA_PARAMS_HH__
|
#ifndef __CPU_O3_PARAMS_HH__
|
||||||
#define __CPU_O3_ALPHA_PARAMS_HH__
|
#define __CPU_O3_PARAMS_HH__
|
||||||
|
|
||||||
#include "cpu/o3/cpu.hh"
|
#include "cpu/o3/cpu.hh"
|
||||||
|
|
||||||
//Forward declarations
|
//Forward declarations
|
||||||
class AlphaDTB;
|
|
||||||
class AlphaITB;
|
|
||||||
class FUPool;
|
class FUPool;
|
||||||
class MemObject;
|
|
||||||
class Process;
|
|
||||||
class System;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This file defines the parameters that will be used for the AlphaO3CPU.
|
* This file defines the parameters that will be used for the O3CPU.
|
||||||
* This must be defined externally so that the Impl can have a params class
|
* This must be defined externally so that the Impl can have a params class
|
||||||
* defined that it can pass to all of the individual stages.
|
* defined that it can pass to all of the individual stages.
|
||||||
*/
|
*/
|
||||||
|
class O3Params : public BaseO3CPU::Params
|
||||||
class AlphaSimpleParams : public BaseO3CPU::Params
|
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
|
||||||
AlphaITB *itb; AlphaDTB *dtb;
|
|
||||||
#else
|
|
||||||
std::vector<Process *> workload;
|
|
||||||
Process *process;
|
|
||||||
#endif // FULL_SYSTEM
|
|
||||||
|
|
||||||
MemObject *mem;
|
|
||||||
|
|
||||||
BaseCPU *checker;
|
|
||||||
|
|
||||||
unsigned activity;
|
unsigned activity;
|
||||||
|
|
||||||
//
|
//
|
|
@ -28,8 +28,7 @@
|
||||||
* Authors: Kevin Lim
|
* Authors: Kevin Lim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/rename_impl.hh"
|
#include "cpu/o3/rename_impl.hh"
|
||||||
|
|
||||||
template class DefaultRename<AlphaSimpleImpl>;
|
template class DefaultRename<AlphaSimpleImpl>;
|
||||||
|
|
|
@ -29,8 +29,7 @@
|
||||||
* Nathan Binkert
|
* Nathan Binkert
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "cpu/o3/alpha_dyn_inst.hh"
|
#include "cpu/o3/isa_specific.hh"
|
||||||
#include "cpu/o3/alpha_impl.hh"
|
|
||||||
#include "cpu/o3/rob_impl.hh"
|
#include "cpu/o3/rob_impl.hh"
|
||||||
|
|
||||||
// Force instantiation of InstructionQueue.
|
// Force instantiation of InstructionQueue.
|
||||||
|
|
243
src/cpu/o3/thread_context.hh
Executable file
243
src/cpu/o3/thread_context.hh
Executable file
|
@ -0,0 +1,243 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2004-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.
|
||||||
|
*
|
||||||
|
* Authors: Kevin Lim
|
||||||
|
* Korey Sewell
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CPU_O3_THREAD_CONTEXT_HH__
|
||||||
|
#define __CPU_O3_THREAD_CONTEXT_HH__
|
||||||
|
|
||||||
|
#include "cpu/o3/isa_specific.hh"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Derived ThreadContext class for use with the O3CPU. It
|
||||||
|
* provides the interface for any external objects to access a
|
||||||
|
* single thread's state and some general CPU state. Any time
|
||||||
|
* external objects try to update state through this interface,
|
||||||
|
* the CPU will create an event to squash all in-flight
|
||||||
|
* instructions in order to ensure state is maintained correctly.
|
||||||
|
* It must be defined specifically for the O3CPU because
|
||||||
|
* not all architectural state is located within the O3ThreadState
|
||||||
|
* (such as the commit PC, and registers), and specific actions
|
||||||
|
* must be taken when using this interface (such as squashing all
|
||||||
|
* in-flight instructions when doing a write to this interface).
|
||||||
|
*/
|
||||||
|
template <class Impl>
|
||||||
|
class O3ThreadContext : public ThreadContext
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef typename Impl::O3CPU O3CPU;
|
||||||
|
|
||||||
|
/** Pointer to the CPU. */
|
||||||
|
O3CPU *cpu;
|
||||||
|
|
||||||
|
/** Pointer to the thread state that this TC corrseponds to. */
|
||||||
|
O3ThreadState<Impl> *thread;
|
||||||
|
|
||||||
|
/** Returns a pointer to this CPU. */
|
||||||
|
virtual BaseCPU *getCpuPtr() { return cpu; }
|
||||||
|
|
||||||
|
/** Sets this CPU's ID. */
|
||||||
|
virtual void setCpuId(int id) { cpu->setCpuId(id); }
|
||||||
|
|
||||||
|
/** Reads this CPU's ID. */
|
||||||
|
virtual int readCpuId() { return cpu->readCpuId(); }
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
/** Returns a pointer to the system. */
|
||||||
|
virtual System *getSystemPtr() { return cpu->system; }
|
||||||
|
|
||||||
|
/** Returns a pointer to physical memory. */
|
||||||
|
virtual PhysicalMemory *getPhysMemPtr() { return cpu->physmem; }
|
||||||
|
|
||||||
|
/** Returns a pointer to this thread's kernel statistics. */
|
||||||
|
virtual Kernel::Statistics *getKernelStats()
|
||||||
|
{ return thread->kernelStats; }
|
||||||
|
|
||||||
|
virtual FunctionalPort *getPhysPort() { return thread->getPhysPort(); }
|
||||||
|
|
||||||
|
virtual VirtualPort *getVirtPort(ThreadContext *src_tc = NULL);
|
||||||
|
|
||||||
|
void delVirtPort(VirtualPort *vp);
|
||||||
|
#else
|
||||||
|
virtual TranslatingPort *getMemPort() { return thread->getMemPort(); }
|
||||||
|
|
||||||
|
/** Returns a pointer to this thread's process. */
|
||||||
|
virtual Process *getProcessPtr() { return thread->getProcessPtr(); }
|
||||||
|
#endif
|
||||||
|
/** Returns this thread's status. */
|
||||||
|
virtual Status status() const { return thread->status(); }
|
||||||
|
|
||||||
|
/** Sets this thread's status. */
|
||||||
|
virtual void setStatus(Status new_status)
|
||||||
|
{ thread->setStatus(new_status); }
|
||||||
|
|
||||||
|
/** Set the status to Active. Optional delay indicates number of
|
||||||
|
* cycles to wait before beginning execution. */
|
||||||
|
virtual void activate(int delay = 1);
|
||||||
|
|
||||||
|
/** Set the status to Suspended. */
|
||||||
|
virtual void suspend();
|
||||||
|
|
||||||
|
/** Set the status to Unallocated. */
|
||||||
|
virtual void deallocate();
|
||||||
|
|
||||||
|
/** Set the status to Halted. */
|
||||||
|
virtual void halt();
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
/** Dumps the function profiling information.
|
||||||
|
* @todo: Implement.
|
||||||
|
*/
|
||||||
|
virtual void dumpFuncProfile();
|
||||||
|
#endif
|
||||||
|
/** Takes over execution of a thread from another CPU. */
|
||||||
|
virtual void takeOverFrom(ThreadContext *old_context);
|
||||||
|
|
||||||
|
/** Registers statistics associated with this TC. */
|
||||||
|
virtual void regStats(const std::string &name);
|
||||||
|
|
||||||
|
/** Serializes state. */
|
||||||
|
virtual void serialize(std::ostream &os);
|
||||||
|
/** Unserializes state. */
|
||||||
|
virtual void unserialize(Checkpoint *cp, const std::string §ion);
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
/** Reads the last tick that this thread was activated on. */
|
||||||
|
virtual Tick readLastActivate();
|
||||||
|
/** Reads the last tick that this thread was suspended on. */
|
||||||
|
virtual Tick readLastSuspend();
|
||||||
|
|
||||||
|
/** Clears the function profiling information. */
|
||||||
|
virtual void profileClear();
|
||||||
|
/** Samples the function profiling information. */
|
||||||
|
virtual void profileSample();
|
||||||
|
#endif
|
||||||
|
/** Returns this thread's ID number. */
|
||||||
|
virtual int getThreadNum() { return thread->readTid(); }
|
||||||
|
|
||||||
|
/** Returns the instruction this thread is currently committing.
|
||||||
|
* Only used when an instruction faults.
|
||||||
|
*/
|
||||||
|
virtual TheISA::MachInst getInst();
|
||||||
|
|
||||||
|
/** Copies the architectural registers from another TC into this TC. */
|
||||||
|
virtual void copyArchRegs(ThreadContext *tc);
|
||||||
|
|
||||||
|
/** Resets all architectural registers to 0. */
|
||||||
|
virtual void clearArchRegs();
|
||||||
|
|
||||||
|
/** Reads an integer register. */
|
||||||
|
virtual uint64_t readIntReg(int reg_idx);
|
||||||
|
|
||||||
|
virtual FloatReg readFloatReg(int reg_idx, int width);
|
||||||
|
|
||||||
|
virtual FloatReg readFloatReg(int reg_idx);
|
||||||
|
|
||||||
|
virtual FloatRegBits readFloatRegBits(int reg_idx, int width);
|
||||||
|
|
||||||
|
virtual FloatRegBits readFloatRegBits(int reg_idx);
|
||||||
|
|
||||||
|
/** Sets an integer register to a value. */
|
||||||
|
virtual void setIntReg(int reg_idx, uint64_t val);
|
||||||
|
|
||||||
|
virtual void setFloatReg(int reg_idx, FloatReg val, int width);
|
||||||
|
|
||||||
|
virtual void setFloatReg(int reg_idx, FloatReg val);
|
||||||
|
|
||||||
|
virtual void setFloatRegBits(int reg_idx, FloatRegBits val, int width);
|
||||||
|
|
||||||
|
virtual void setFloatRegBits(int reg_idx, FloatRegBits val);
|
||||||
|
|
||||||
|
/** Reads this thread's PC. */
|
||||||
|
virtual uint64_t readPC()
|
||||||
|
{ return cpu->readPC(thread->readTid()); }
|
||||||
|
|
||||||
|
/** Sets this thread's PC. */
|
||||||
|
virtual void setPC(uint64_t val);
|
||||||
|
|
||||||
|
/** Reads this thread's next PC. */
|
||||||
|
virtual uint64_t readNextPC()
|
||||||
|
{ return cpu->readNextPC(thread->readTid()); }
|
||||||
|
|
||||||
|
/** Sets this thread's next PC. */
|
||||||
|
virtual void setNextPC(uint64_t val);
|
||||||
|
|
||||||
|
/** Reads a miscellaneous register. */
|
||||||
|
virtual MiscReg readMiscReg(int misc_reg)
|
||||||
|
{ return cpu->readMiscReg(misc_reg, thread->readTid()); }
|
||||||
|
|
||||||
|
/** Reads a misc. register, including any side-effects the
|
||||||
|
* read might have as defined by the architecture. */
|
||||||
|
virtual MiscReg readMiscRegWithEffect(int misc_reg, Fault &fault)
|
||||||
|
{ return cpu->readMiscRegWithEffect(misc_reg, fault, thread->readTid()); }
|
||||||
|
|
||||||
|
/** Sets a misc. register. */
|
||||||
|
virtual Fault setMiscReg(int misc_reg, const MiscReg &val);
|
||||||
|
|
||||||
|
/** Sets a misc. register, including any side-effects the
|
||||||
|
* write might have as defined by the architecture. */
|
||||||
|
virtual Fault setMiscRegWithEffect(int misc_reg, const MiscReg &val);
|
||||||
|
|
||||||
|
/** Returns the number of consecutive store conditional failures. */
|
||||||
|
// @todo: Figure out where these store cond failures should go.
|
||||||
|
virtual unsigned readStCondFailures()
|
||||||
|
{ return thread->storeCondFailures; }
|
||||||
|
|
||||||
|
/** Sets the number of consecutive store conditional failures. */
|
||||||
|
virtual void setStCondFailures(unsigned sc_failures)
|
||||||
|
{ thread->storeCondFailures = sc_failures; }
|
||||||
|
|
||||||
|
// Only really makes sense for old CPU model. Lots of code
|
||||||
|
// outside the CPU still checks this function, so it will
|
||||||
|
// always return false to keep everything working.
|
||||||
|
/** Checks if the thread is misspeculating. Because it is
|
||||||
|
* very difficult to determine if the thread is
|
||||||
|
* misspeculating, this is set as false. */
|
||||||
|
virtual bool misspeculating() { return false; }
|
||||||
|
|
||||||
|
#if !FULL_SYSTEM
|
||||||
|
/** Gets a syscall argument by index. */
|
||||||
|
virtual IntReg getSyscallArg(int i);
|
||||||
|
|
||||||
|
/** Sets a syscall argument. */
|
||||||
|
virtual void setSyscallArg(int i, IntReg val);
|
||||||
|
|
||||||
|
/** Sets the syscall return value. */
|
||||||
|
virtual void setSyscallReturn(SyscallReturn return_value);
|
||||||
|
|
||||||
|
/** Executes a syscall in SE mode. */
|
||||||
|
virtual void syscall(int64_t callnum)
|
||||||
|
{ return cpu->syscall(callnum, thread->readTid()); }
|
||||||
|
|
||||||
|
/** Reads the funcExeInst counter. */
|
||||||
|
virtual Counter readFuncExeInst() { return thread->funcExeInst; }
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
488
src/cpu/o3/thread_context_impl.hh
Executable file
488
src/cpu/o3/thread_context_impl.hh
Executable file
|
@ -0,0 +1,488 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2004-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.
|
||||||
|
*
|
||||||
|
* Authors: Kevin Lim
|
||||||
|
* Korey Sewell
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cpu/o3/thread_context.hh"
|
||||||
|
|
||||||
|
using namespace TheISA;
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
template <class Impl>
|
||||||
|
VirtualPort *
|
||||||
|
O3ThreadContext<Impl>::getVirtPort(ThreadContext *src_tc)
|
||||||
|
{
|
||||||
|
if (!src_tc)
|
||||||
|
return thread->getVirtPort();
|
||||||
|
|
||||||
|
VirtualPort *vp;
|
||||||
|
Port *mem_port;
|
||||||
|
|
||||||
|
vp = new VirtualPort("tc-vport", src_tc);
|
||||||
|
mem_port = cpu->system->physmem->getPort("functional");
|
||||||
|
mem_port->setPeer(vp);
|
||||||
|
vp->setPeer(mem_port);
|
||||||
|
return vp;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::dumpFuncProfile()
|
||||||
|
{
|
||||||
|
// Currently not supported
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::takeOverFrom(ThreadContext *old_context)
|
||||||
|
{
|
||||||
|
// some things should already be set up
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
assert(getSystemPtr() == old_context->getSystemPtr());
|
||||||
|
#else
|
||||||
|
assert(getProcessPtr() == old_context->getProcessPtr());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// copy over functional state
|
||||||
|
setStatus(old_context->status());
|
||||||
|
copyArchRegs(old_context);
|
||||||
|
setCpuId(old_context->readCpuId());
|
||||||
|
|
||||||
|
#if !FULL_SYSTEM
|
||||||
|
thread->funcExeInst = old_context->readFuncExeInst();
|
||||||
|
#else
|
||||||
|
EndQuiesceEvent *other_quiesce = old_context->getQuiesceEvent();
|
||||||
|
if (other_quiesce) {
|
||||||
|
// Point the quiesce event's TC at this TC so that it wakes up
|
||||||
|
// the proper CPU.
|
||||||
|
other_quiesce->tc = this;
|
||||||
|
}
|
||||||
|
if (thread->quiesceEvent) {
|
||||||
|
thread->quiesceEvent->tc = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transfer kernel stats from one CPU to the other.
|
||||||
|
thread->kernelStats = old_context->getKernelStats();
|
||||||
|
// storeCondFailures = 0;
|
||||||
|
cpu->lockFlag = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
old_context->setStatus(ThreadContext::Unallocated);
|
||||||
|
|
||||||
|
thread->inSyscall = false;
|
||||||
|
thread->trapPending = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::delVirtPort(VirtualPort *vp)
|
||||||
|
{
|
||||||
|
delete vp->getPeer();
|
||||||
|
delete vp;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::activate(int delay)
|
||||||
|
{
|
||||||
|
DPRINTF(O3CPU, "Calling activate on AlphaTC\n");
|
||||||
|
|
||||||
|
if (thread->status() == ThreadContext::Active)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
thread->lastActivate = curTick;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (thread->status() == ThreadContext::Unallocated) {
|
||||||
|
cpu->activateWhenReady(thread->readTid());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
thread->setStatus(ThreadContext::Active);
|
||||||
|
|
||||||
|
// status() == Suspended
|
||||||
|
cpu->activateContext(thread->readTid(), delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::suspend()
|
||||||
|
{
|
||||||
|
DPRINTF(O3CPU, "Calling suspend on AlphaTC\n");
|
||||||
|
|
||||||
|
if (thread->status() == ThreadContext::Suspended)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
thread->lastActivate = curTick;
|
||||||
|
thread->lastSuspend = curTick;
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
// Don't change the status from active if there are pending interrupts
|
||||||
|
if (cpu->check_interrupts()) {
|
||||||
|
assert(status() == ThreadContext::Active);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
thread->setStatus(ThreadContext::Suspended);
|
||||||
|
cpu->suspendContext(thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::deallocate()
|
||||||
|
{
|
||||||
|
DPRINTF(O3CPU, "Calling deallocate on AlphaTC\n");
|
||||||
|
|
||||||
|
if (thread->status() == ThreadContext::Unallocated)
|
||||||
|
return;
|
||||||
|
|
||||||
|
thread->setStatus(ThreadContext::Unallocated);
|
||||||
|
cpu->deallocateContext(thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::halt()
|
||||||
|
{
|
||||||
|
DPRINTF(O3CPU, "Calling halt on AlphaTC\n");
|
||||||
|
|
||||||
|
if (thread->status() == ThreadContext::Halted)
|
||||||
|
return;
|
||||||
|
|
||||||
|
thread->setStatus(ThreadContext::Halted);
|
||||||
|
cpu->haltContext(thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::regStats(const std::string &name)
|
||||||
|
{
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
thread->kernelStats = new Kernel::Statistics(cpu->system);
|
||||||
|
thread->kernelStats->regStats(name + ".kern");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::serialize(std::ostream &os)
|
||||||
|
{
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
if (thread->kernelStats)
|
||||||
|
thread->kernelStats->serialize(os);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::unserialize(Checkpoint *cp, const std::string §ion)
|
||||||
|
{
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
if (thread->kernelStats)
|
||||||
|
thread->kernelStats->unserialize(cp, section);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#if FULL_SYSTEM
|
||||||
|
template <class Impl>
|
||||||
|
Tick
|
||||||
|
O3ThreadContext<Impl>::readLastActivate()
|
||||||
|
{
|
||||||
|
return thread->lastActivate;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
Tick
|
||||||
|
O3ThreadContext<Impl>::readLastSuspend()
|
||||||
|
{
|
||||||
|
return thread->lastSuspend;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::profileClear()
|
||||||
|
{}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::profileSample()
|
||||||
|
{}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
TheISA::MachInst
|
||||||
|
O3ThreadContext<Impl>:: getInst()
|
||||||
|
{
|
||||||
|
return thread->getInst();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::copyArchRegs(ThreadContext *tc)
|
||||||
|
{
|
||||||
|
// This function will mess things up unless the ROB is empty and
|
||||||
|
// there are no instructions in the pipeline.
|
||||||
|
unsigned tid = thread->readTid();
|
||||||
|
PhysRegIndex renamed_reg;
|
||||||
|
|
||||||
|
// First loop through the integer registers.
|
||||||
|
for (int i = 0; i < TheISA::NumIntRegs; ++i) {
|
||||||
|
renamed_reg = cpu->renameMap[tid].lookup(i);
|
||||||
|
|
||||||
|
DPRINTF(O3CPU, "Copying over register %i, had data %lli, "
|
||||||
|
"now has data %lli.\n",
|
||||||
|
renamed_reg, cpu->readIntReg(renamed_reg),
|
||||||
|
tc->readIntReg(i));
|
||||||
|
|
||||||
|
cpu->setIntReg(renamed_reg, tc->readIntReg(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then loop through the floating point registers.
|
||||||
|
for (int i = 0; i < TheISA::NumFloatRegs; ++i) {
|
||||||
|
renamed_reg = cpu->renameMap[tid].lookup(i + TheISA::FP_Base_DepTag);
|
||||||
|
cpu->setFloatRegBits(renamed_reg,
|
||||||
|
tc->readFloatRegBits(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy the misc regs.
|
||||||
|
copyMiscRegs(tc, this);
|
||||||
|
|
||||||
|
// Then finally set the PC and the next PC.
|
||||||
|
cpu->setPC(tc->readPC(), tid);
|
||||||
|
cpu->setNextPC(tc->readNextPC(), tid);
|
||||||
|
#if !FULL_SYSTEM
|
||||||
|
this->thread->funcExeInst = tc->readFuncExeInst();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::clearArchRegs()
|
||||||
|
{}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
uint64_t
|
||||||
|
O3ThreadContext<Impl>::readIntReg(int reg_idx)
|
||||||
|
{
|
||||||
|
return cpu->readArchIntReg(reg_idx, thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
FloatReg
|
||||||
|
O3ThreadContext<Impl>::readFloatReg(int reg_idx, int width)
|
||||||
|
{
|
||||||
|
switch(width) {
|
||||||
|
case 32:
|
||||||
|
return cpu->readArchFloatRegSingle(reg_idx, thread->readTid());
|
||||||
|
case 64:
|
||||||
|
return cpu->readArchFloatRegDouble(reg_idx, thread->readTid());
|
||||||
|
default:
|
||||||
|
panic("Unsupported width!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
FloatReg
|
||||||
|
O3ThreadContext<Impl>::readFloatReg(int reg_idx)
|
||||||
|
{
|
||||||
|
return cpu->readArchFloatRegSingle(reg_idx, thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
FloatRegBits
|
||||||
|
O3ThreadContext<Impl>::readFloatRegBits(int reg_idx, int width)
|
||||||
|
{
|
||||||
|
DPRINTF(Fault, "Reading floatint register through the TC!\n");
|
||||||
|
return cpu->readArchFloatRegInt(reg_idx, thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
FloatRegBits
|
||||||
|
O3ThreadContext<Impl>::readFloatRegBits(int reg_idx)
|
||||||
|
{
|
||||||
|
return cpu->readArchFloatRegInt(reg_idx, thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::setIntReg(int reg_idx, uint64_t val)
|
||||||
|
{
|
||||||
|
cpu->setArchIntReg(reg_idx, val, thread->readTid());
|
||||||
|
|
||||||
|
// Squash if we're not already in a state update mode.
|
||||||
|
if (!thread->trapPending && !thread->inSyscall) {
|
||||||
|
cpu->squashFromTC(thread->readTid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::setFloatReg(int reg_idx, FloatReg val, int width)
|
||||||
|
{
|
||||||
|
switch(width) {
|
||||||
|
case 32:
|
||||||
|
cpu->setArchFloatRegSingle(reg_idx, val, thread->readTid());
|
||||||
|
break;
|
||||||
|
case 64:
|
||||||
|
cpu->setArchFloatRegDouble(reg_idx, val, thread->readTid());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Squash if we're not already in a state update mode.
|
||||||
|
if (!thread->trapPending && !thread->inSyscall) {
|
||||||
|
cpu->squashFromTC(thread->readTid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::setFloatReg(int reg_idx, FloatReg val)
|
||||||
|
{
|
||||||
|
cpu->setArchFloatRegSingle(reg_idx, val, thread->readTid());
|
||||||
|
|
||||||
|
if (!thread->trapPending && !thread->inSyscall) {
|
||||||
|
cpu->squashFromTC(thread->readTid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::setFloatRegBits(int reg_idx, FloatRegBits val,
|
||||||
|
int width)
|
||||||
|
{
|
||||||
|
DPRINTF(Fault, "Setting floatint register through the TC!\n");
|
||||||
|
cpu->setArchFloatRegInt(reg_idx, val, thread->readTid());
|
||||||
|
|
||||||
|
// Squash if we're not already in a state update mode.
|
||||||
|
if (!thread->trapPending && !thread->inSyscall) {
|
||||||
|
cpu->squashFromTC(thread->readTid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::setFloatRegBits(int reg_idx, FloatRegBits val)
|
||||||
|
{
|
||||||
|
cpu->setArchFloatRegInt(reg_idx, val, thread->readTid());
|
||||||
|
|
||||||
|
// Squash if we're not already in a state update mode.
|
||||||
|
if (!thread->trapPending && !thread->inSyscall) {
|
||||||
|
cpu->squashFromTC(thread->readTid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::setPC(uint64_t val)
|
||||||
|
{
|
||||||
|
cpu->setPC(val, thread->readTid());
|
||||||
|
|
||||||
|
// Squash if we're not already in a state update mode.
|
||||||
|
if (!thread->trapPending && !thread->inSyscall) {
|
||||||
|
cpu->squashFromTC(thread->readTid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::setNextPC(uint64_t val)
|
||||||
|
{
|
||||||
|
cpu->setNextPC(val, thread->readTid());
|
||||||
|
|
||||||
|
// Squash if we're not already in a state update mode.
|
||||||
|
if (!thread->trapPending && !thread->inSyscall) {
|
||||||
|
cpu->squashFromTC(thread->readTid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
Fault
|
||||||
|
O3ThreadContext<Impl>::setMiscReg(int misc_reg, const MiscReg &val)
|
||||||
|
{
|
||||||
|
Fault ret_fault = cpu->setMiscReg(misc_reg, val, thread->readTid());
|
||||||
|
|
||||||
|
// Squash if we're not already in a state update mode.
|
||||||
|
if (!thread->trapPending && !thread->inSyscall) {
|
||||||
|
cpu->squashFromTC(thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret_fault;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
Fault
|
||||||
|
O3ThreadContext<Impl>::setMiscRegWithEffect(int misc_reg,
|
||||||
|
const MiscReg &val)
|
||||||
|
{
|
||||||
|
Fault ret_fault = cpu->setMiscRegWithEffect(misc_reg, val,
|
||||||
|
thread->readTid());
|
||||||
|
|
||||||
|
// Squash if we're not already in a state update mode.
|
||||||
|
if (!thread->trapPending && !thread->inSyscall) {
|
||||||
|
cpu->squashFromTC(thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret_fault;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !FULL_SYSTEM
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
TheISA::IntReg
|
||||||
|
O3ThreadContext<Impl>::getSyscallArg(int i)
|
||||||
|
{
|
||||||
|
return cpu->getSyscallArg(i, thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::setSyscallArg(int i, IntReg val)
|
||||||
|
{
|
||||||
|
cpu->setSyscallArg(i, val, thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Impl>
|
||||||
|
void
|
||||||
|
O3ThreadContext<Impl>::setSyscallReturn(SyscallReturn return_value)
|
||||||
|
{
|
||||||
|
cpu->setSyscallReturn(return_value, thread->readTid());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // FULL_SYSTEM
|
||||||
|
|
|
@ -2,8 +2,8 @@ from m5 import build_env
|
||||||
from m5.config import *
|
from m5.config import *
|
||||||
from BaseCPU import BaseCPU
|
from BaseCPU import BaseCPU
|
||||||
|
|
||||||
class DerivAlphaO3CPU(BaseCPU):
|
class DerivO3CPU(BaseCPU):
|
||||||
type = 'DerivAlphaO3CPU'
|
type = 'DerivO3CPU'
|
||||||
activity = Param.Unsigned("Initial count")
|
activity = Param.Unsigned("Initial count")
|
||||||
numThreads = Param.Unsigned("number of HW thread contexts")
|
numThreads = Param.Unsigned("number of HW thread contexts")
|
||||||
|
|
|
@ -358,7 +358,10 @@ LiveProcess::argsInit(int intSize, int pageSize)
|
||||||
Addr prog_entry = objFile->entryPoint();
|
Addr prog_entry = objFile->entryPoint();
|
||||||
threadContexts[0]->setPC(prog_entry);
|
threadContexts[0]->setPC(prog_entry);
|
||||||
threadContexts[0]->setNextPC(prog_entry + sizeof(MachInst));
|
threadContexts[0]->setNextPC(prog_entry + sizeof(MachInst));
|
||||||
|
|
||||||
|
#if THE_ISA != ALPHA_ISA //e.g. MIPS or Sparc
|
||||||
threadContexts[0]->setNextNPC(prog_entry + (2 * sizeof(MachInst)));
|
threadContexts[0]->setNextNPC(prog_entry + (2 * sizeof(MachInst)));
|
||||||
|
#endif
|
||||||
|
|
||||||
num_processes++;
|
num_processes++;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue