Merge ktlim@zizzer:/bk/newmem
authorKevin Lim <ktlim@umich.edu>
Fri, 2 Jun 2006 22:19:50 +0000 (18:19 -0400)
committerKevin Lim <ktlim@umich.edu>
Fri, 2 Jun 2006 22:19:50 +0000 (18:19 -0400)
into  zizzer.eecs.umich.edu:/.automount/zamp/z/ktlim2/clean/newmem

--HG--
extra : convert_revision : 1d2f499bdc6e21c658a9262da1c8d27d6b74cafe

81 files changed:
1  2 
SConstruct
src/SConscript
src/arch/alpha/ev5.cc
src/arch/alpha/isa/decoder.isa
src/arch/alpha/isa/pal.isa
src/base/traceflags.py
src/cpu/SConscript
src/cpu/base.cc
src/cpu/base.hh
src/cpu/base_dyn_inst.cc
src/cpu/base_dyn_inst.hh
src/cpu/cpu_exec_context.cc
src/cpu/cpu_exec_context.hh
src/cpu/cpu_models.py
src/cpu/exec_context.hh
src/cpu/exetrace.cc
src/cpu/exetrace.hh
src/cpu/inst_seq.hh
src/cpu/o3/2bit_local_pred.cc
src/cpu/o3/2bit_local_pred.hh
src/cpu/o3/alpha_cpu.hh
src/cpu/o3/alpha_cpu_builder.cc
src/cpu/o3/alpha_cpu_impl.hh
src/cpu/o3/alpha_dyn_inst.hh
src/cpu/o3/alpha_dyn_inst_impl.hh
src/cpu/o3/alpha_impl.hh
src/cpu/o3/alpha_params.hh
src/cpu/o3/bpred_unit.cc
src/cpu/o3/bpred_unit.hh
src/cpu/o3/bpred_unit_impl.hh
src/cpu/o3/btb.cc
src/cpu/o3/btb.hh
src/cpu/o3/comm.hh
src/cpu/o3/commit.cc
src/cpu/o3/commit.hh
src/cpu/o3/commit_impl.hh
src/cpu/o3/cpu.cc
src/cpu/o3/cpu.hh
src/cpu/o3/cpu_policy.hh
src/cpu/o3/decode.cc
src/cpu/o3/decode.hh
src/cpu/o3/decode_impl.hh
src/cpu/o3/fetch.cc
src/cpu/o3/fetch.hh
src/cpu/o3/fetch_impl.hh
src/cpu/o3/free_list.cc
src/cpu/o3/free_list.hh
src/cpu/o3/iew.cc
src/cpu/o3/iew.hh
src/cpu/o3/iew_impl.hh
src/cpu/o3/inst_queue.cc
src/cpu/o3/inst_queue.hh
src/cpu/o3/inst_queue_impl.hh
src/cpu/o3/mem_dep_unit.cc
src/cpu/o3/mem_dep_unit.hh
src/cpu/o3/mem_dep_unit_impl.hh
src/cpu/o3/ras.cc
src/cpu/o3/ras.hh
src/cpu/o3/regfile.hh
src/cpu/o3/rename.cc
src/cpu/o3/rename.hh
src/cpu/o3/rename_impl.hh
src/cpu/o3/rename_map.cc
src/cpu/o3/rename_map.hh
src/cpu/o3/rob.hh
src/cpu/o3/rob_impl.hh
src/cpu/o3/sat_counter.cc
src/cpu/o3/sat_counter.hh
src/cpu/o3/store_set.cc
src/cpu/o3/store_set.hh
src/cpu/o3/tournament_pred.cc
src/cpu/o3/tournament_pred.hh
src/cpu/op_class.hh
src/cpu/ozone/cpu.cc
src/cpu/ozone/cpu.hh
src/cpu/ozone/cpu_impl.hh
src/cpu/static_inst.hh
src/kern/system_events.cc
src/kern/tru64/tru64.hh
src/mem/request.hh
src/sim/pseudo_inst.cc

diff --cc SConstruct
Simple merge
diff --cc src/SConscript
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc src/cpu/base.cc
Simple merge
diff --cc src/cpu/base.hh
Simple merge
index 1b743e044874b70b7be98984ed7926c72185564f,53b2e354e1012b6c2bf8c95e0f31f500973db23f..7eb974d36698bc4938e4d5f05514995b4f703e36
   * 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_BASE_DYN_INST_CC__
 -#define __CPU_BASE_DYN_INST_CC__
 -
  #include <iostream>
 +#include <set>
  #include <string>
  #include <sstream>
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 2f768fd341a3732f29d51f7e63dc80133be8c863,2ed2de1f9dabea4a7e7c610e2ecdb975131f1d04..3d6a78bedf5bd1285f4ec01fffcee405b9bfb5b7
   * 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
   */
  
 +#include "base/intmath.hh"
 +#include "base/misc.hh"
  #include "base/trace.hh"
  #include "cpu/o3/2bit_local_pred.hh"
  
index cd65978ca3488a3cfbbc668b2f364db6ef08cdf4,808f3e96e625a96eb788f89ca42909b7f6977a80..6e02a49be6191724459393198475999c18064b36
   * 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_CPU_2BIT_LOCAL_PRED_HH__
 -#define __CPU_O3_CPU_2BIT_LOCAL_PRED_HH__
 +#ifndef __CPU_O3_2BIT_LOCAL_PRED_HH__
 +#define __CPU_O3_2BIT_LOCAL_PRED_HH__
  
  // For Addr type.
  #include "arch/isa_traits.hh"
index fe88a1acca1d6abdb2863edf3ec09fb7ccd4800e,04d923ce4b6764caf12e58df21a97525958a02e7..4d889866aa300c0e321096a58549a64c12c8fedd
   * 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
   */
  
 -// Todo: Find all the stuff in ExecContext and ev5 that needs to be
 -// specifically designed for this CPU.
 +#ifndef __CPU_O3_ALPHA_FULL_CPU_HH__
 +#define __CPU_O3_ALPHA_FULL_CPU_HH__
  
 -#ifndef __CPU_O3_CPU_ALPHA_FULL_CPU_HH__
 -#define __CPU_O3_CPU_ALPHA_FULL_CPU_HH__
 -
 -#include "cpu/o3/cpu.hh"
  #include "arch/isa_traits.hh"
 +#include "cpu/exec_context.hh"
 +#include "cpu/o3/cpu.hh"
  #include "sim/byteswap.hh"
  
 +class EndQuiesceEvent;
 +namespace Kernel {
 +    class Statistics;
 +};
 +
 +class TranslatingPort;
 +
  template <class Impl>
  class AlphaFullCPU : public FullO3CPU<Impl>
  {
index 6ac4083648b7425628cf4578ca59dd531c8ff1c8,8c7bea00343b0b8840516c732a2b5de850e54739..c91e2c7c931bc05241dd45e59640cbd5236928ea
   * 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
   */
  
 -#include "base/inifile.hh"
 -#include "base/loader/symtab.hh"
 -#include "base/misc.hh"
 +#include <string>
 +
  #include "cpu/base.hh"
 -#include "cpu/exetrace.hh"
  #include "cpu/o3/alpha_cpu.hh"
  #include "cpu/o3/alpha_impl.hh"
 -#include "mem/base_mem.hh"
 -#include "mem/cache/base_cache.hh"
 -#include "mem/mem_interface.hh"
 +#include "cpu/o3/alpha_params.hh"
 +#include "cpu/o3/fu_pool.hh"
  #include "sim/builder.hh"
 -#include "sim/debug.hh"
 -#include "sim/host.hh"
 -#include "sim/process.hh"
 -#include "sim/sim_events.hh"
 -#include "sim/sim_object.hh"
 -#include "sim/stats.hh"
 -
 -#if FULL_SYSTEM
 -#include "base/remote_gdb.hh"
 -#include "mem/functional/memory_control.hh"
 -#include "mem/functional/physical.hh"
 -#include "sim/system.hh"
 -#include "arch/tlb.hh"
 -#include "arch/vtophys.hh"
 -#else // !FULL_SYSTEM
 -#include "mem/functional/functional.hh"
 -#endif // FULL_SYSTEM
  
  class DerivAlphaFullCPU : public AlphaFullCPU<AlphaSimpleImpl>
  {
Simple merge
index f289bbf0db779c274131aa481c95e7bb0bfe53a4,a5453567a8a06b2025ddcc58d44f40e2d0eff9d3..af28588021acdaaa86c28460f3c8cac058565a6d
   * 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_CPU_ALPHA_DYN_INST_HH__
 -#define __CPU_O3_CPU_ALPHA_DYN_INST_HH__
 +#ifndef __CPU_O3_ALPHA_DYN_INST_HH__
 +#define __CPU_O3_ALPHA_DYN_INST_HH__
  
 +#include "arch/isa_traits.hh"
  #include "cpu/base_dyn_inst.hh"
 +#include "cpu/inst_seq.hh"
  #include "cpu/o3/alpha_cpu.hh"
  #include "cpu/o3/alpha_impl.hh"
 -#include "cpu/inst_seq.hh"
 +
 +class Packet;
  
  /**
 - * Mostly implementation specific AlphaDynInst.  It is templated in case there
 - * are other implementations that are similar enough to be able to use this
 - * class without changes.  This is mainly useful if there are multiple similar
 - * CPU implementations of the same ISA.
 + * Mostly implementation & ISA specific AlphaDynInst. As with most
 + * other classes in the new CPU model, it is templated on the Impl to
 + * allow for passing in of all types, such as the CPU type and the ISA
 + * type. The AlphaDynInst serves as the primary interface to the CPU
 + * for instructions that are executing.
   */
 -
  template <class Impl>
  class AlphaDynInst : public BaseDynInst<Impl>
  {
Simple merge
index f404bd3ec063b9e5e5aac8e31482632a4a59587e,cd9f6afc484d6b72a8bfa57e768b92a8811a2eb4..52f7c2394882224462081fef7b6f638b61f5e324
   * 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_CPU_ALPHA_IMPL_HH__
 -#define __CPU_O3_CPU_ALPHA_IMPL_HH__
 +#ifndef __CPU_O3_ALPHA_IMPL_HH__
 +#define __CPU_O3_ALPHA_IMPL_HH__
  
  #include "arch/alpha/isa_traits.hh"
  
index 04366e8dd9dd911474fb7a0c394516126a47e77b,bc48e09089f2270ae7d2a1bbc56df1a4b2f6d8de..8c6779495d58d701e380e9d8965aa1210ae57db0
   * 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_CPU_ALPHA_SIMPLE_PARAMS_HH__
 -#define __CPU_O3_CPU_ALPHA_SIMPLE_PARAMS_HH__
 +#ifndef __CPU_O3_ALPHA_PARAMS_HH__
 +#define __CPU_O3_ALPHA_PARAMS_HH__
  
  #include "cpu/o3/cpu.hh"
  
Simple merge
index b7814b2e904f3dd8b56b7f2838a6ab9205e878fb,e298f51ad0431eec7775ed05fe76aff004d35724..39a88a3ce112b1b737bd0e213ec4d638d4325526
   * 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 __BPRED_UNIT_HH__
 -#define __BPRED_UNIT_HH__
 +#ifndef __CPU_O3_BPRED_UNIT_HH__
 +#define __CPU_O3_BPRED_UNIT_HH__
  
  // For Addr type.
  #include "arch/isa_traits.hh"
index c37df606bdfa8a19186b011643876f76e33f4126,a6311527b8fadf5badf752e0337ca16cc0de88ca..cde9f28ab7134d60ce299fc16b151f2840478046
   * 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
   */
  
 +#include <list>
 +#include <vector>
 +
  #include "base/trace.hh"
  #include "base/traceflags.hh"
  #include "cpu/o3/bpred_unit.hh"
Simple merge
index c7dc1808ba034e7f14680b3b42a6777ba7960f7c,006fa4666fa5920ceb2e3a796f2832a7021e0fd7..dfa3b7b06e01dac5a0abf32ce981caa3e353f7e8
   * 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_CPU_BTB_HH__
 -#define __CPU_O3_CPU_BTB_HH__
 +#ifndef __CPU_O3_BTB_HH__
 +#define __CPU_O3_BTB_HH__
  
  // For Addr type.
  #include "arch/isa_traits.hh"
index c36c58d3d04bef8e17d661f8f2475d59dd979cb3,7ed92f5d70f27adc3aeec5e372b97150c64a9d94..84ad5f6b18df49f35fd52246858eb919f6dc829d
   * 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_CPU_COMM_HH__
 -#define __CPU_O3_CPU_COMM_HH__
 +#ifndef __CPU_O3_COMM_HH__
 +#define __CPU_O3_COMM_HH__
  
  #include <vector>
  
Simple merge
index c019ef4c795c99e91bceaf50e5fd542674ec7bb4,847459231a2867d8820c2645d02b27b604c1e8d5..ae2aa299619fc114c29135be7a3ad15638d94b37
   * 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
   */
  
 -// Todo: Maybe have a special method for handling interrupts/traps.
 -//
 -// Traps:  Have IEW send a signal to commit saying that there's a trap to
 -// be handled.  Have commit send the PC back to the fetch stage, along
 -// with the current commit PC.  Fetch will directly access the IPR and save
 -// off all the proper stuff.  Commit can send out a squash, or something
 -// close to it.
 -// Do the same for hwrei().  However, requires that commit be specifically
 -// built to support that kind of stuff.  Probably not horrible to have
 -// commit support having the CPU tell it to squash the other stages and
 -// restart at a given address.  The IPR register does become an issue.
 -// Probably not a big deal if the IPR stuff isn't cycle accurate.  Can just
 -// have the original function handle writing to the IPR register.
 -
 -#ifndef __CPU_O3_CPU_SIMPLE_COMMIT_HH__
 -#define __CPU_O3_CPU_SIMPLE_COMMIT_HH__
 +#ifndef __CPU_O3_COMMIT_HH__
 +#define __CPU_O3_COMMIT_HH__
  
 +#include "arch/faults.hh"
  #include "base/statistics.hh"
  #include "base/timebuf.hh"
 -#include "mem/memory_interface.hh"
 -
 +#include "cpu/exetrace.hh"
 +#include "cpu/inst_seq.hh"
 +
 +template <class>
 +class O3ThreadState;
 +
 +/**
 + * DefaultCommit handles single threaded and SMT commit. Its width is
 + * specified by the parameters; each cycle it tries to commit that
 + * many instructions. The SMT policy decides which thread it tries to
 + * commit instructions from. Non- speculative instructions must reach
 + * the head of the ROB before they are ready to execute; once they
 + * reach the head, commit will broadcast the instruction's sequence
 + * number to the previous stages so that they can issue/ execute the
 + * instruction. Only one non-speculative instruction is handled per
 + * cycle. Commit is responsible for handling all back-end initiated
 + * redirects.  It receives the redirect, and then broadcasts it to all
 + * stages, indicating the sequence number they should squash until,
 + * and any necessary branch misprediction information as well. It
 + * priortizes redirects by instruction's age, only broadcasting a
 + * redirect if it corresponds to an instruction that should currently
 + * be in the ROB. This is done by tracking the sequence number of the
 + * youngest instruction in the ROB, which gets updated to any
 + * squashing instruction's sequence number, and only broadcasting a
 + * redirect if it corresponds to an older instruction. Commit also
 + * supports multiple cycle squashing, to model a ROB that can only
 + * remove a certain number of instructions per cycle.
 + */
  template<class Impl>
 -class SimpleCommit
 +class DefaultCommit
  {
    public:
      // Typedefs from the Impl.
index 97703c430a5427eb27747fef52ed3f59d54f5caa,f315c9494d914f27a38fb1d5e75b90f42b993f3d..9efe30d24328390c4a059141cc85e9dce7a6c265
   * 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
   */
  
 +#include <algorithm>
 +#include <string>
 +
 +#include "base/loader/symtab.hh"
  #include "base/timebuf.hh"
 -#include "cpu/o3/commit.hh"
 +#include "cpu/checker/cpu.hh"
  #include "cpu/exetrace.hh"
 +#include "cpu/o3/commit.hh"
 +#include "cpu/o3/thread_state.hh"
 +
 +using namespace std;
  
  template <class Impl>
 -SimpleCommit<Impl>::SimpleCommit(Params &params)
 -    : dcacheInterface(params.dcacheInterface),
 -      iewToCommitDelay(params.iewToCommitDelay),
 -      renameToROBDelay(params.renameToROBDelay),
 -      renameWidth(params.renameWidth),
 -      iewWidth(params.executeWidth),
 -      commitWidth(params.commitWidth)
 +DefaultCommit<Impl>::TrapEvent::TrapEvent(DefaultCommit<Impl> *_commit,
 +                                          unsigned _tid)
 +    : Event(&mainEventQueue, CPU_Tick_Pri), commit(_commit), tid(_tid)
  {
 -    _status = Idle;
 +    this->setFlags(Event::AutoDelete);
  }
  
  template <class Impl>
Simple merge
index c791b29482f3841a9b7fa1f7ff9dd2f11e5757f6,fbb5f32d5ed759f651773ac24be46ce4e0622329..51fcb1adbb00587ff79de27d34f4ab1b921807b8
   * 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
   */
  
 -//Todo: Add in a lot of the functions that are ISA specific.  Also define
 -//the functions that currently exist within the base cpu class.  Define
 -//everything for the simobject stuff so it can be serialized and
 -//instantiated, add in debugging statements everywhere.  Have CPU schedule
 -//itself properly.  Threads!
 -// Avoid running stages and advancing queues if idle/stalled.
 -
 -#ifndef __CPU_O3_CPU_FULL_CPU_HH__
 -#define __CPU_O3_CPU_FULL_CPU_HH__
 +#ifndef __CPU_O3_CPU_HH__
 +#define __CPU_O3_CPU_HH__
  
  #include <iostream>
  #include <list>
index 52227013e69b6d3cf7be5c2b1b990fadef2454c5,a90cdcde020b478fdb47bb0693a00011b2c24b03..4ea4daee6b7cb7a51c3315536ee6647b83f477e3
   * 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_CPU_CPU_POLICY_HH__
 -#define __CPU_O3_CPU_CPU_POLICY_HH__
 +#ifndef __CPU_O3_CPU_POLICY_HH__
 +#define __CPU_O3_CPU_POLICY_HH__
  
  #include "cpu/o3/bpred_unit.hh"
  #include "cpu/o3/free_list.hh"
Simple merge
index 3035b3387b52ba6b6413fab0b61952641f40c014,1bea470450e8017f4c7b3b46588961f18d965650..8abe1d480d642f2dab6812fb75b42314a799d1ab
   * 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_CPU_SIMPLE_DECODE_HH__
 -#define __CPU_O3_CPU_SIMPLE_DECODE_HH__
 +#ifndef __CPU_O3_DECODE_HH__
 +#define __CPU_O3_DECODE_HH__
  
  #include <queue>
  
Simple merge
Simple merge
index 2b1d93cb7aa7002d218b9ac9809312371e6c6893,dd4a52d07706b690d091416e015539aa5c32a9e5..3c4fc7d93d172801d9a5c28facbe832b6e432bf6
   * 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
   */
  
 -// Todo: SMT fetch,
 -// Add a way to get a stage's current status.
 -
 -#ifndef __CPU_O3_CPU_SIMPLE_FETCH_HH__
 -#define __CPU_O3_CPU_SIMPLE_FETCH_HH__
 +#ifndef __CPU_O3_FETCH_HH__
 +#define __CPU_O3_FETCH_HH__
  
 +#include "arch/utility.hh"
  #include "base/statistics.hh"
  #include "base/timebuf.hh"
  #include "cpu/pc_event.hh"
index a80afbcf4accbf4848ef5e633ce063de6c9251c8,fb5748c97165314cfd3b4fbff274405ffb4cad5a..5d3164dbf963f8822926e6de8fd3351770276b61
   * 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
   */
  
 -// Remove this later; used only for debugging.
 -#define OPCODE(X)                       (X >> 26) & 0x3f
 -
  #include "arch/isa_traits.hh"
 -#include "sim/byteswap.hh"
 +#include "arch/utility.hh"
  #include "cpu/exetrace.hh"
 -#include "mem/base_mem.hh"
 -#include "mem/mem_interface.hh"
 -#include "mem/mem_req.hh"
  #include "cpu/o3/fetch.hh"
 -
 +#include "mem/packet.hh"
 +#include "mem/request.hh"
 +#include "sim/byteswap.hh"
 +#include "sim/host.hh"
  #include "sim/root.hh"
  
 +#if FULL_SYSTEM
 +#include "arch/tlb.hh"
 +#include "arch/vtophys.hh"
 +#include "base/remote_gdb.hh"
 +#include "mem/functional/memory_control.hh"
 +#include "mem/functional/physical.hh"
 +#include "sim/system.hh"
 +#endif // FULL_SYSTEM
 +
 +#include <algorithm>
 +
 +using namespace std;
 +using namespace TheISA;
 +
  template<class Impl>
 -SimpleFetch<Impl>::CacheCompletionEvent
 -::CacheCompletionEvent(SimpleFetch *_fetch)
 -    : Event(&mainEventQueue),
 -      fetch(_fetch)
 +Tick
 +DefaultFetch<Impl>::IcachePort::recvAtomic(PacketPtr pkt)
  {
 +    panic("DefaultFetch doesn't expect recvAtomic callback!");
 +    return curTick;
  }
  
  template<class Impl>
Simple merge
index daf1007c1765b66c7890099d0bdcb057a098424b,9aa1f08f6fdaff2ad6ce5d9b8e2b545f41e6830a..c669b0b34f6268b885b4377ff227f0b30133419d
   * 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_CPU_FREE_LIST_HH__
 -#define __CPU_O3_CPU_FREE_LIST_HH__
 +#ifndef __CPU_O3_FREE_LIST_HH__
 +#define __CPU_O3_FREE_LIST_HH__
  
  #include <iostream>
  #include <queue>
Simple merge
index c931669c6dc3bb3cb508c01e1f0ad9db5a4e4f88,88451f3cfef0651d1d0602c7fb86c434616c30fd..ae86536c92f9c3ba04ae6ed607e4e55989adfac8
   * 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
   */
  
 -//Todo: Update with statuses.
 -//Need to handle delaying writes to the writeback bus if it's full at the
 -//given time.
 -
 -#ifndef __CPU_O3_CPU_SIMPLE_IEW_HH__
 -#define __CPU_O3_CPU_SIMPLE_IEW_HH__
 +#ifndef __CPU_O3_IEW_HH__
 +#define __CPU_O3_IEW_HH__
  
  #include <queue>
  
Simple merge
Simple merge
index 843f6a8fe05ea437716674d804f700469751ed22,3de3cac271f193d9257b5b15599bb9a8e8f3163e..245601ccf2294a8124cd2f9ad07bcaa5b7ef0985
   * 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_CPU_INST_QUEUE_HH__
 -#define __CPU_O3_CPU_INST_QUEUE_HH__
 +#ifndef __CPU_O3_INST_QUEUE_HH__
 +#define __CPU_O3_INST_QUEUE_HH__
  
  #include <list>
  #include <map>
index 4fa756cb6bb0e4253c0559dc283d6eb3aba7c171,3a9db478850fc6fda05ab9f0c7ccb25f9a6c4a03..34af8c641adf87633206b12b2b51bf06b13df85e
   * 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
   */
  
 -// Todo:
 -// Current ordering allows for 0 cycle added-to-scheduled.  Could maybe fake
 -// it; either do in reverse order, or have added instructions put into a
 -// different ready queue that, in scheduleRreadyInsts(), gets put onto the
 -// normal ready queue.  This would however give only a one cycle delay,
 -// but probably is more flexible to actually add in a delay parameter than
 -// just running it backwards.
 -
  #include <limits>
  #include <vector>
  
Simple merge
index acbe08ec2dea8a09665b74301a6ef3187fa544e2,2c269b205be4a8a65586e0fce60b0d1246b05a43..4d763fca213ec0fe7f157264f361c4ad6e082048
   * 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_CPU_MEM_DEP_UNIT_HH__
 -#define __CPU_O3_CPU_MEM_DEP_UNIT_HH__
 +#ifndef __CPU_O3_MEM_DEP_UNIT_HH__
 +#define __CPU_O3_MEM_DEP_UNIT_HH__
  
 -#include <map>
 +#include <list>
  #include <set>
  
 +#include "base/hashmap.hh"
 +#include "base/refcnt.hh"
  #include "base/statistics.hh"
  #include "cpu/inst_seq.hh"
  
Simple merge
Simple merge
index 27e7c2df4e1ea6178d7127f5daad1d1ed51230e0,4e7dec8f3f2d9cec1876b0716075739bbed93df9..5c8a9328554181d1833c370d8943eb94217c8d16
   * 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_CPU_RAS_HH__
 -#define __CPU_O3_CPU_RAS_HH__
 +#ifndef __CPU_O3_RAS_HH__
 +#define __CPU_O3_RAS_HH__
  
  // For Addr type.
  #include "arch/isa_traits.hh"
index 45fe490d25275dd4b972919982ea3d819a674d22,f1f4880e03b7098f98782f6342d4c4ef0e6475e2..c2ad7506043cdd5171e45aeb11006fd948ddf6c0
   * 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
+  *          Gabe Black
   */
  
 -#ifndef __CPU_O3_CPU_REGFILE_HH__
 -#define __CPU_O3_CPU_REGFILE_HH__
 -
 -// @todo: Destructor
 +#ifndef __CPU_O3_REGFILE_HH__
 +#define __CPU_O3_REGFILE_HH__
  
  #include "arch/isa_traits.hh"
  #include "arch/faults.hh"
Simple merge
index 3f1a27bb526b670468e1ef52acb63ca10604142f,f81e9b2d72cc89b64b7cb9ae09ac107dcccfeb45..626d7cc758da67066e2383694efa8ea80afc8c7c
   * 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
   */
  
 -// Todo:
 -// Fix up trap and barrier handling.
 -// May want to have different statuses to differentiate the different stall
 -// conditions.
 -
 -#ifndef __CPU_O3_CPU_SIMPLE_RENAME_HH__
 -#define __CPU_O3_CPU_SIMPLE_RENAME_HH__
 +#ifndef __CPU_O3_RENAME_HH__
 +#define __CPU_O3_RENAME_HH__
  
  #include <list>
  
Simple merge
Simple merge
Simple merge
index e05eebe5a97bbf7d99cae8059815db3609c930a9,43ab66b9707f5994b59fd60696e3ba81e9aba1b3..3786a03556db41ba28b63c8150a27c752778c948
   * 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
   */
  
 -// Todo: Probably add in support for scheduling events (more than one as
 -// well) on the case of the ROB being empty or full.  Considering tracking
 -// free entries instead of insts in ROB.  Differentiate between squashing
 -// all instructions after the instruction, and all instructions after *and*
 -// including that instruction.
 -
 -#ifndef __CPU_O3_CPU_ROB_HH__
 -#define __CPU_O3_CPU_ROB_HH__
 +#ifndef __CPU_O3_ROB_HH__
 +#define __CPU_O3_ROB_HH__
  
 +#include <string>
  #include <utility>
  #include <vector>
  
index 25e0c80fd8743fc4e4d2e057487e9573cac087c0,5e7d573529553ffb9c519f3af2c5463944213cd0..97694e3717710fd78d17d29ddd2cb54aea48147c
   * 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_CPU_ROB_IMPL_HH__
 -#define __CPU_O3_CPU_ROB_IMPL_HH__
 -
  #include "config/full_system.hh"
  #include "cpu/o3/rob.hh"
  
Simple merge
index 6404454072e95dfd471d3a6f530babe5f2a94e9c,fdc20562c2bc658686f5da25c9630237dbaa42a7..7e15119b065d751cb9164cce2cb74e3899dc063c
   * 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_CPU_SAT_COUNTER_HH__
 -#define __CPU_O3_CPU_SAT_COUNTER_HH__
 +#ifndef __CPU_O3_SAT_COUNTER_HH__
 +#define __CPU_O3_SAT_COUNTER_HH__
  
 +#include "base/misc.hh"
  #include "sim/host.hh"
  
  /**
Simple merge
index 7189db3abe31acd3706814198022a0acb94c36d8,ef869fa0fd80a47689971c60a3ce42ad13dbe628..64255c51a749902058cbd11f2ae1f96ef727079e
   * 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_CPU_STORE_SET_HH__
 -#define __CPU_O3_CPU_STORE_SET_HH__
 +#ifndef __CPU_O3_STORE_SET_HH__
 +#define __CPU_O3_STORE_SET_HH__
  
 +#include <list>
 +#include <map>
 +#include <utility>
  #include <vector>
  
  #include "arch/isa_traits.hh"
Simple merge
index 7b600aa53697e410099442c578f9f1838ac841f3,d23142c70c9c0a372b77fa55f3327d274289eea4..e1660009099ab27d6f9ee143776627ca6eebaa8e
   * 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_CPU_TOURNAMENT_PRED_HH__
 -#define __CPU_O3_CPU_TOURNAMENT_PRED_HH__
 +#ifndef __CPU_O3_TOURNAMENT_PRED_HH__
 +#define __CPU_O3_TOURNAMENT_PRED_HH__
  
  // For Addr type.
  #include "arch/isa_traits.hh"
Simple merge
index d2ea0164c6c26e88844d69d60eae601150fab6da,134a8f3ab8ee914dec9e7c9368abf09d16214790..303c78eea23621c83f4e1e001e1e13bcf8fe444c
   * 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
+  *          Nathan Binkert
   */
  
 -#include "cpu/ooo_cpu/ooo_cpu_impl.hh"
 -#include "cpu/ooo_cpu/ooo_dyn_inst.hh"
 -#include "cpu/ooo_cpu/ooo_impl.hh"
 +#include "cpu/ozone/cpu_impl.hh"
 +#include "cpu/ozone/ozone_impl.hh"
 +#include "cpu/ozone/simple_impl.hh"
  
 -template class OoOCPU<OoOImpl>;
 +template class OzoneCPU<SimpleImpl>;
 +template class OzoneCPU<OzoneImpl>;
index c4626221e5e297f4d6cecd4f10b33f988ba7fc30,098f2fda9db87e5b5a33cd4688601ce4eb60c844..d82527c8d0b1f82ac4538fb107cba79000df654b
   * 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_OOO_CPU_OOO_CPU_HH__
 -#define __CPU_OOO_CPU_OOO_CPU_HH__
 +#ifndef __CPU_OZONE_CPU_HH__
 +#define __CPU_OZONE_CPU_HH__
 +
 +#include <set>
  
  #include "base/statistics.hh"
 +#include "base/timebuf.hh"
  #include "config/full_system.hh"
  #include "cpu/base.hh"
  #include "cpu/exec_context.hh"
index 1c869c486ee36aabaf0d05aab9b74818a801f80e,8adc238c844b9c4b845b6772437981192776a709..c8803813d2df7d9594a84b27068578012653276a
   * 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
+  *          Nathan Binkert
   */
  
 -#ifndef __CPU_OOO_CPU_OOO_IMPL_HH__
 -#define __CPU_OOO_CPU_OOO_IMPL_HH__
 +//#include <cstdio>
 +//#include <cstdlib>
  
 -#include "arch/isa_traits.hh"
 +#include "arch/isa_traits.hh" // For MachInst
 +#include "base/trace.hh"
 +#include "config/full_system.hh"
 +#include "cpu/base.hh"
 +#include "cpu/checker/exec_context.hh"
 +#include "cpu/exec_context.hh"
 +#include "cpu/exetrace.hh"
 +#include "cpu/ozone/cpu.hh"
 +#include "cpu/quiesce_event.hh"
 +#include "cpu/static_inst.hh"
 +//#include "mem/base_mem.hh"
 +#include "mem/mem_interface.hh"
 +#include "sim/sim_object.hh"
 +#include "sim/stats.hh"
 +
 +#if FULL_SYSTEM
 +#include "arch/faults.hh"
 +#include "arch/alpha/osfpal.hh"
 +#include "arch/alpha/tlb.hh"
 +#include "arch/vtophys.hh"
 +#include "base/callback.hh"
 +//#include "base/remote_gdb.hh"
 +#include "cpu/profile.hh"
 +#include "kern/kernel_stats.hh"
 +#include "mem/functional/memory_control.hh"
 +#include "mem/functional/physical.hh"
 +#include "sim/faults.hh"
 +#include "sim/sim_events.hh"
 +#include "sim/sim_exit.hh"
 +#include "sim/system.hh"
 +#else // !FULL_SYSTEM
 +#include "mem/functional/functional.hh"
 +#include "sim/process.hh"
 +#endif // FULL_SYSTEM
 +
 +using namespace TheISA;
 +
 +template <class Impl>
 +template<typename T>
 +void
 +OzoneCPU<Impl>::trace_data(T data) {
 +    if (traceData) {
 +        traceData->setData(data);
 +    }
 +}
 +
 +template <class Impl>
 +OzoneCPU<Impl>::TickEvent::TickEvent(OzoneCPU *c, int w)
 +    : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c), width(w)
 +{
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::TickEvent::process()
 +{
 +    cpu->tick();
 +}
 +
 +template <class Impl>
 +const char *
 +OzoneCPU<Impl>::TickEvent::description()
 +{
 +    return "OzoneCPU tick event";
 +}
 +
 +template <class Impl>
 +OzoneCPU<Impl>::OzoneCPU(Params *p)
 +#if FULL_SYSTEM
 +    : BaseCPU(p), thread(this, 0, p->mem), tickEvent(this, p->width),
 +      mem(p->mem),
 +#else
 +    : BaseCPU(p), thread(this, 0, p->workload[0], 0), tickEvent(this, p->width),
 +      mem(p->workload[0]->getMemory()),
 +#endif
 +      comm(5, 5)
 +{
 +    frontEnd = new FrontEnd(p);
 +    backEnd = new BackEnd(p);
 +
 +    _status = Idle;
 +
 +    if (p->checker) {
 +        BaseCPU *temp_checker = p->checker;
 +        checker = dynamic_cast<Checker<DynInstPtr> *>(temp_checker);
 +        checker->setMemory(mem);
 +#if FULL_SYSTEM
 +        checker->setSystem(p->system);
 +#endif
 +        checkerXC = new CheckerExecContext<OzoneXC>(&ozoneXC, checker);
 +        thread.xcProxy = checkerXC;
 +        xcProxy = checkerXC;
 +    } else {
 +        checker = NULL;
 +        thread.xcProxy = &ozoneXC;
 +        xcProxy = &ozoneXC;
 +    }
 +
 +    ozoneXC.cpu = this;
 +    ozoneXC.thread = &thread;
 +
 +    thread.inSyscall = false;
 +
 +    thread.setStatus(ExecContext::Suspended);
 +#if FULL_SYSTEM
 +    /***** All thread state stuff *****/
 +    thread.cpu = this;
 +    thread.tid = 0;
 +    thread.mem = p->mem;
 +
 +    thread.quiesceEvent = new EndQuiesceEvent(xcProxy);
 +
 +    system = p->system;
 +    itb = p->itb;
 +    dtb = p->dtb;
 +    memctrl = p->system->memctrl;
 +    physmem = p->system->physmem;
 +
 +    if (p->profile) {
 +        thread.profile = new FunctionProfile(p->system->kernelSymtab);
 +        // @todo: This might be better as an ExecContext instead of OzoneXC
 +        Callback *cb =
 +            new MakeCallback<OzoneXC,
 +            &OzoneXC::dumpFuncProfile>(&ozoneXC);
 +        registerExitCallback(cb);
 +    }
 +
 +    // let's fill with a dummy node for now so we don't get a segfault
 +    // on the first cycle when there's no node available.
 +    static ProfileNode dummyNode;
 +    thread.profileNode = &dummyNode;
 +    thread.profilePC = 3;
 +#else
 +    thread.cpu = this;
 +    thread.tid = 0;
 +    thread.process = p->workload[0];
 +    thread.asid = 0;
 +#endif // !FULL_SYSTEM
 +
 +    numInst = 0;
 +    startNumInst = 0;
 +
 +    execContexts.push_back(xcProxy);
 +
 +    frontEnd->setCPU(this);
 +    backEnd->setCPU(this);
 +
 +    frontEnd->setXC(xcProxy);
 +    backEnd->setXC(xcProxy);
 +
 +    frontEnd->setThreadState(&thread);
 +    backEnd->setThreadState(&thread);
 +
 +    frontEnd->setCommBuffer(&comm);
 +    backEnd->setCommBuffer(&comm);
 +
 +    frontEnd->setBackEnd(backEnd);
 +    backEnd->setFrontEnd(frontEnd);
 +
 +    decoupledFrontEnd = p->decoupledFrontEnd;
 +
 +    globalSeqNum = 1;
 +
 +    checkInterrupts = false;
 +
 +    for (int i = 0; i < TheISA::TotalNumRegs; ++i) {
 +        thread.renameTable[i] = new DynInst(this);
 +        thread.renameTable[i]->setResultReady();
 +    }
 +
 +    frontEnd->renameTable.copyFrom(thread.renameTable);
 +    backEnd->renameTable.copyFrom(thread.renameTable);
 +
 +#if !FULL_SYSTEM
 +//    pTable = p->pTable;
 +#endif
 +
 +    lockFlag = 0;
 +
 +    DPRINTF(OzoneCPU, "OzoneCPU: Created Ozone cpu object.\n");
 +}
 +
 +template <class Impl>
 +OzoneCPU<Impl>::~OzoneCPU()
 +{
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::switchOut(Sampler *_sampler)
 +{
 +    sampler = _sampler;
 +    switchCount = 0;
 +    // Front end needs state from back end, so switch out the back end first.
 +    backEnd->switchOut();
 +    frontEnd->switchOut();
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::signalSwitched()
 +{
 +    if (++switchCount == 2) {
 +        backEnd->doSwitchOut();
 +        frontEnd->doSwitchOut();
 +        if (checker)
 +            checker->switchOut(sampler);
 +        _status = SwitchedOut;
 +        if (tickEvent.scheduled())
 +            tickEvent.squash();
 +        sampler->signalSwitched();
 +    }
 +    assert(switchCount <= 2);
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::takeOverFrom(BaseCPU *oldCPU)
 +{
 +    BaseCPU::takeOverFrom(oldCPU);
 +
 +    backEnd->takeOverFrom();
 +    frontEnd->takeOverFrom();
 +    assert(!tickEvent.scheduled());
 +
 +    // @todo: Fix hardcoded number
 +    // Clear out any old information in time buffer.
 +    for (int i = 0; i < 6; ++i) {
 +        comm.advance();
 +    }
 +
 +    // if any of this CPU's ExecContexts are active, mark the CPU as
 +    // running and schedule its tick event.
 +    for (int i = 0; i < execContexts.size(); ++i) {
 +        ExecContext *xc = execContexts[i];
 +        if (xc->status() == ExecContext::Active &&
 +            _status != Running) {
 +            _status = Running;
 +            tickEvent.schedule(curTick);
 +        }
 +    }
 +    // Nothing running, change status to reflect that we're no longer
 +    // switched out.
 +    if (_status == SwitchedOut) {
 +        _status = Idle;
 +    }
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::activateContext(int thread_num, int delay)
 +{
 +    // Eventually change this in SMT.
 +    assert(thread_num == 0);
 +
 +    assert(_status == Idle);
 +    notIdleFraction++;
 +    scheduleTickEvent(delay);
 +    _status = Running;
 +    thread._status = ExecContext::Active;
 +    frontEnd->wakeFromQuiesce();
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::suspendContext(int thread_num)
 +{
 +    // Eventually change this in SMT.
 +    assert(thread_num == 0);
 +    // @todo: Figure out how to initially set the status properly so
 +    // this is running.
 +//    assert(_status == Running);
 +    notIdleFraction--;
 +    unscheduleTickEvent();
 +    _status = Idle;
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::deallocateContext(int thread_num)
 +{
 +    // for now, these are equivalent
 +    suspendContext(thread_num);
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::haltContext(int thread_num)
 +{
 +    // for now, these are equivalent
 +    suspendContext(thread_num);
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::regStats()
 +{
 +    using namespace Stats;
 +
 +    BaseCPU::regStats();
 +
 +    thread.numInsts
 +        .name(name() + ".num_insts")
 +        .desc("Number of instructions executed")
 +        ;
 +
 +    thread.numMemRefs
 +        .name(name() + ".num_refs")
 +        .desc("Number of memory references")
 +        ;
 +
 +    notIdleFraction
 +        .name(name() + ".not_idle_fraction")
 +        .desc("Percentage of non-idle cycles")
 +        ;
 +
 +    idleFraction
 +        .name(name() + ".idle_fraction")
 +        .desc("Percentage of idle cycles")
 +        ;
 +
 +    quiesceCycles
 +        .name(name() + ".quiesce_cycles")
 +        .desc("Number of cycles spent in quiesce")
 +        ;
 +
 +    idleFraction = constant(1.0) - notIdleFraction;
 +
 +    frontEnd->regStats();
 +    backEnd->regStats();
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::resetStats()
 +{
 +    startNumInst = numInst;
 +    notIdleFraction = (_status != Idle);
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::init()
 +{
 +    BaseCPU::init();
 +
 +    // Mark this as in syscall so it won't need to squash
 +    thread.inSyscall = true;
 +#if FULL_SYSTEM
 +    for (int i = 0; i < execContexts.size(); ++i) {
 +        ExecContext *xc = execContexts[i];
 +
 +        // initialize CPU, including PC
 +        TheISA::initCPU(xc, xc->readCpuId());
 +    }
 +#endif
 +    frontEnd->renameTable.copyFrom(thread.renameTable);
 +    backEnd->renameTable.copyFrom(thread.renameTable);
 +
 +    thread.inSyscall = false;
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::serialize(std::ostream &os)
 +{
 +    BaseCPU::serialize(os);
 +    SERIALIZE_ENUM(_status);
 +    nameOut(os, csprintf("%s.xc", name()));
 +    ozoneXC.serialize(os);
 +    nameOut(os, csprintf("%s.tickEvent", name()));
 +    tickEvent.serialize(os);
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::unserialize(Checkpoint *cp, const std::string &section)
 +{
 +    BaseCPU::unserialize(cp, section);
 +    UNSERIALIZE_ENUM(_status);
 +    ozoneXC.unserialize(cp, csprintf("%s.xc", section));
 +    tickEvent.unserialize(cp, csprintf("%s.tickEvent", section));
 +}
 +
 +template <class Impl>
 +Fault
 +OzoneCPU<Impl>::copySrcTranslate(Addr src)
 +{
 +    panic("Copy not implemented!\n");
 +    return NoFault;
 +#if 0
 +    static bool no_warn = true;
 +    int blk_size = (dcacheInterface) ? dcacheInterface->getBlockSize() : 64;
 +    // Only support block sizes of 64 atm.
 +    assert(blk_size == 64);
 +    int offset = src & (blk_size - 1);
 +
 +    // Make sure block doesn't span page
 +    if (no_warn &&
 +        (src & TheISA::PageMask) != ((src + blk_size) & TheISA::PageMask) &&
 +        (src >> 40) != 0xfffffc) {
 +        warn("Copied block source spans pages %x.", src);
 +        no_warn = false;
 +    }
 +
 +    memReq->reset(src & ~(blk_size - 1), blk_size);
 +
 +    // translate to physical address
 +    Fault fault = xc->translateDataReadReq(memReq);
 +
 +    assert(fault != Alignment_Fault);
 +
 +    if (fault == NoFault) {
 +        xc->copySrcAddr = src;
 +        xc->copySrcPhysAddr = memReq->paddr + offset;
 +    } else {
 +        xc->copySrcAddr = 0;
 +        xc->copySrcPhysAddr = 0;
 +    }
 +    return fault;
 +#endif
 +}
 +
 +template <class Impl>
 +Fault
 +OzoneCPU<Impl>::copy(Addr dest)
 +{
 +    panic("Copy not implemented!\n");
 +    return NoFault;
 +#if 0
 +    static bool no_warn = true;
 +    int blk_size = (dcacheInterface) ? dcacheInterface->getBlockSize() : 64;
 +    // Only support block sizes of 64 atm.
 +    assert(blk_size == 64);
 +    uint8_t data[blk_size];
 +    //assert(xc->copySrcAddr);
 +    int offset = dest & (blk_size - 1);
 +
 +    // Make sure block doesn't span page
 +    if (no_warn &&
 +        (dest & TheISA::PageMask) != ((dest + blk_size) & TheISA::PageMask) &&
 +        (dest >> 40) != 0xfffffc) {
 +        no_warn = false;
 +        warn("Copied block destination spans pages %x. ", dest);
 +    }
 +
 +    memReq->reset(dest & ~(blk_size -1), blk_size);
 +    // translate to physical address
 +    Fault fault = xc->translateDataWriteReq(memReq);
 +
 +    assert(fault != Alignment_Fault);
 +
 +    if (fault == NoFault) {
 +        Addr dest_addr = memReq->paddr + offset;
 +        // Need to read straight from memory since we have more than 8 bytes.
 +        memReq->paddr = xc->copySrcPhysAddr;
 +        xc->mem->read(memReq, data);
 +        memReq->paddr = dest_addr;
 +        xc->mem->write(memReq, data);
 +        if (dcacheInterface) {
 +            memReq->cmd = Copy;
 +            memReq->completionEvent = NULL;
 +            memReq->paddr = xc->copySrcPhysAddr;
 +            memReq->dest = dest_addr;
 +            memReq->size = 64;
 +            memReq->time = curTick;
 +            dcacheInterface->access(memReq);
 +        }
 +    }
 +    return fault;
 +#endif
 +}
 +
 +#if FULL_SYSTEM
 +template <class Impl>
 +Addr
 +OzoneCPU<Impl>::dbg_vtophys(Addr addr)
 +{
 +    return vtophys(xcProxy, addr);
 +}
 +#endif // FULL_SYSTEM
 +
 +#if FULL_SYSTEM
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::post_interrupt(int int_num, int index)
 +{
 +    BaseCPU::post_interrupt(int_num, index);
 +
 +    if (_status == Idle) {
 +        DPRINTF(IPI,"Suspended Processor awoke\n");
 +//    thread.activate();
 +        // Hack for now.  Otherwise might have to go through the xcProxy, or
 +        // I need to figure out what's the right thing to call.
 +        activateContext(thread.tid, 1);
 +    }
 +}
 +#endif // FULL_SYSTEM
 +
 +/* start simulation, program loaded, processor precise state initialized */
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::tick()
 +{
 +    DPRINTF(OzoneCPU, "\n\nOzoneCPU: Ticking cpu.\n");
 +
 +    _status = Running;
 +    thread.renameTable[ZeroReg]->setIntResult(0);
 +    thread.renameTable[ZeroReg+TheISA::FP_Base_DepTag]->
 +        setDoubleResult(0.0);
 +
 +    comm.advance();
 +    frontEnd->tick();
 +    backEnd->tick();
 +
 +    // check for instruction-count-based events
 +    comInstEventQueue[0]->serviceEvents(numInst);
 +
 +    if (!tickEvent.scheduled() && _status == Running)
 +        tickEvent.schedule(curTick + cycles(1));
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::squashFromXC()
 +{
 +    thread.inSyscall = true;
 +    backEnd->generateXCEvent();
 +}
 +
 +#if !FULL_SYSTEM
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::syscall()
 +{
 +    // Not sure this copy is needed, depending on how the XC proxy is made.
 +    thread.renameTable.copyFrom(backEnd->renameTable);
 +
 +    thread.inSyscall = true;
 +
 +    thread.funcExeInst++;
 +
 +    DPRINTF(OzoneCPU, "FuncExeInst: %i\n", thread.funcExeInst);
 +
 +    thread.process->syscall(xcProxy);
 +
 +    thread.funcExeInst--;
 +
 +    thread.inSyscall = false;
 +
 +    frontEnd->renameTable.copyFrom(thread.renameTable);
 +    backEnd->renameTable.copyFrom(thread.renameTable);
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::setSyscallReturn(SyscallReturn return_value, int tid)
 +{
 +    // check for error condition.  Alpha syscall convention is to
 +    // indicate success/failure in reg a3 (r19) and put the
 +    // return value itself in the standard return value reg (v0).
 +    if (return_value.successful()) {
 +        // no error
 +        thread.renameTable[SyscallSuccessReg]->setIntResult(0);
 +        thread.renameTable[ReturnValueReg]->setIntResult(
 +            return_value.value());
 +    } else {
 +        // got an error, return details
 +        thread.renameTable[SyscallSuccessReg]->setIntResult((IntReg) -1);
 +        thread.renameTable[ReturnValueReg]->setIntResult(
 +            -return_value.value());
 +    }
 +}
 +#else
 +template <class Impl>
 +Fault
 +OzoneCPU<Impl>::hwrei()
 +{
 +    // Need to move this to ISA code
 +    // May also need to make this per thread
 +
 +    lockFlag = false;
 +    lockAddrList.clear();
 +    thread.kernelStats->hwrei();
 +
 +    checkInterrupts = true;
 +
 +    // FIXME: XXX check for interrupts? XXX
 +    return NoFault;
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::processInterrupts()
 +{
 +    // Check for interrupts here.  For now can copy the code that
 +    // exists within isa_fullsys_traits.hh.  Also assume that thread 0
 +    // is the one that handles the interrupts.
 +
 +    // Check if there are any outstanding interrupts
 +    //Handle the interrupts
 +    int ipl = 0;
 +    int summary = 0;
 +
 +    checkInterrupts = false;
 +
 +    if (thread.readMiscReg(IPR_ASTRR))
 +        panic("asynchronous traps not implemented\n");
 +
 +    if (thread.readMiscReg(IPR_SIRR)) {
 +        for (int i = INTLEVEL_SOFTWARE_MIN;
 +             i < INTLEVEL_SOFTWARE_MAX; i++) {
 +            if (thread.readMiscReg(IPR_SIRR) & (ULL(1) << i)) {
 +                // See table 4-19 of the 21164 hardware reference
 +                ipl = (i - INTLEVEL_SOFTWARE_MIN) + 1;
 +                summary |= (ULL(1) << i);
 +            }
 +        }
 +    }
 +
 +    uint64_t interrupts = intr_status();
 +
 +    if (interrupts) {
 +        for (int i = INTLEVEL_EXTERNAL_MIN;
 +             i < INTLEVEL_EXTERNAL_MAX; i++) {
 +            if (interrupts & (ULL(1) << i)) {
 +                // See table 4-19 of the 21164 hardware reference
 +                ipl = i;
 +                summary |= (ULL(1) << i);
 +            }
 +        }
 +    }
 +
 +    if (ipl && ipl > thread.readMiscReg(IPR_IPLR)) {
 +        thread.setMiscReg(IPR_ISR, summary);
 +        thread.setMiscReg(IPR_INTID, ipl);
 +        // @todo: Make this more transparent
 +        if (checker) {
 +            checker->cpuXCBase()->setMiscReg(IPR_ISR, summary);
 +            checker->cpuXCBase()->setMiscReg(IPR_INTID, ipl);
 +        }
 +        Fault fault = new InterruptFault;
 +        fault->invoke(thread.getXCProxy());
 +        DPRINTF(Flow, "Interrupt! IPLR=%d ipl=%d summary=%x\n",
 +                thread.readMiscReg(IPR_IPLR), ipl, summary);
 +    }
 +}
 +
 +template <class Impl>
 +bool
 +OzoneCPU<Impl>::simPalCheck(int palFunc)
 +{
 +    // Need to move this to ISA code
 +    // May also need to make this per thread
 +    thread.kernelStats->callpal(palFunc, xcProxy);
 +
 +    switch (palFunc) {
 +      case PAL::halt:
 +        haltContext(thread.tid);
 +        if (--System::numSystemsRunning == 0)
 +            new SimExitEvent("all cpus halted");
 +        break;
 +
 +      case PAL::bpt:
 +      case PAL::bugchk:
 +        if (system->breakpoint())
 +            return false;
 +        break;
 +    }
 +
 +    return true;
 +}
 +#endif
 +
 +template <class Impl>
 +BaseCPU *
 +OzoneCPU<Impl>::OzoneXC::getCpuPtr()
 +{
 +    return cpu;
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::setCpuId(int id)
 +{
 +    cpu->cpuId = id;
 +    thread->cpuId = id;
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::setStatus(Status new_status)
 +{
 +    thread->_status = new_status;
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::activate(int delay)
 +{
 +    cpu->activateContext(thread->tid, delay);
 +}
 +
 +/// Set the status to Suspended.
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::suspend()
 +{
 +    cpu->suspendContext(thread->tid);
 +}
 +
 +/// Set the status to Unallocated.
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::deallocate()
 +{
 +    cpu->deallocateContext(thread->tid);
 +}
 +
 +/// Set the status to Halted.
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::halt()
 +{
 +    cpu->haltContext(thread->tid);
 +}
 +
 +#if FULL_SYSTEM
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::dumpFuncProfile()
 +{ }
 +#endif
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::takeOverFrom(ExecContext *old_context)
 +{
 +    // some things should already be set up
 +    assert(getMemPtr() == old_context->getMemPtr());
 +#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
 +    setFuncExeInst(old_context->readFuncExeInst());
 +#else
 +    EndQuiesceEvent *other_quiesce = old_context->getQuiesceEvent();
 +    if (other_quiesce) {
 +        // Point the quiesce event's XC at this XC so that it wakes up
 +        // the proper CPU.
 +        other_quiesce->xc = this;
 +    }
 +    if (thread->quiesceEvent) {
 +        thread->quiesceEvent->xc = this;
 +    }
 +
 +    thread->kernelStats = old_context->getKernelStats();
 +//    storeCondFailures = 0;
 +    cpu->lockFlag = false;
 +#endif
 +
 +    old_context->setStatus(ExecContext::Unallocated);
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::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
 +OzoneCPU<Impl>::OzoneXC::serialize(std::ostream &os)
 +{ }
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::unserialize(Checkpoint *cp, const std::string &section)
 +{ }
 +
 +#if FULL_SYSTEM
 +template <class Impl>
 +EndQuiesceEvent *
 +OzoneCPU<Impl>::OzoneXC::getQuiesceEvent()
 +{
 +    return thread->quiesceEvent;
 +}
 +
 +template <class Impl>
 +Tick
 +OzoneCPU<Impl>::OzoneXC::readLastActivate()
 +{
 +    return thread->lastActivate;
 +}
  
  template <class Impl>
 -class OoOCPU;
 +Tick
 +OzoneCPU<Impl>::OzoneXC::readLastSuspend()
 +{
 +    return thread->lastSuspend;
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::profileClear()
 +{
 +    if (thread->profile)
 +        thread->profile->clear();
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::profileSample()
 +{
 +    if (thread->profile)
 +        thread->profile->sample(thread->profileNode, thread->profilePC);
 +}
 +#endif
 +
 +template <class Impl>
 +int
 +OzoneCPU<Impl>::OzoneXC::getThreadNum()
 +{
 +    return thread->tid;
 +}
 +
 +// Also somewhat obnoxious.  Really only used for the TLB fault.
 +template <class Impl>
 +TheISA::MachInst
 +OzoneCPU<Impl>::OzoneXC::getInst()
 +{
 +    return thread->inst;
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::copyArchRegs(ExecContext *xc)
 +{
 +    thread->PC = xc->readPC();
 +    thread->nextPC = xc->readNextPC();
 +
 +    cpu->frontEnd->setPC(thread->PC);
 +    cpu->frontEnd->setNextPC(thread->nextPC);
 +
 +    for (int i = 0; i < TheISA::TotalNumRegs; ++i) {
 +        if (i < TheISA::FP_Base_DepTag) {
 +            thread->renameTable[i]->setIntResult(xc->readIntReg(i));
 +        } else if (i < (TheISA::FP_Base_DepTag + TheISA::NumFloatRegs)) {
 +            int fp_idx = i - TheISA::FP_Base_DepTag;
 +            thread->renameTable[i]->setDoubleResult(
 +                xc->readFloatRegDouble(fp_idx));
 +        }
 +    }
 +
 +#if !FULL_SYSTEM
 +    thread->funcExeInst = xc->readFuncExeInst();
 +#endif
 +
 +    // Need to copy the XC values into the current rename table,
 +    // copy the misc regs.
 +    thread->regs.miscRegs.copyMiscRegs(xc);
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::clearArchRegs()
 +{
 +    panic("Unimplemented!");
 +}
 +
 +template <class Impl>
 +uint64_t
 +OzoneCPU<Impl>::OzoneXC::readIntReg(int reg_idx)
 +{
 +    return thread->renameTable[reg_idx]->readIntResult();
 +}
 +
 +template <class Impl>
 +float
 +OzoneCPU<Impl>::OzoneXC::readFloatReg(int reg_idx, int width)
 +{
 +    int idx = reg_idx + TheISA::FP_Base_DepTag;
 +    switch(width) {
 +      case 32:
 +        return thread->renameTable[idx]->readFloatResult();
 +      case 64:
 +        return thread->renameTable[idx]->readDoubleResult();
 +      default:
 +        panic("Unsupported width!");
 +        return 0;
 +    }
 +}
 +
 +template <class Impl>
 +double
 +OzoneCPU<Impl>::OzoneXC::readFloatReg(int reg_idx)
 +{
 +    int idx = reg_idx + TheISA::FP_Base_DepTag;
 +    return thread->renameTable[idx]->readFloatResult();
 +}
 +
 +template <class Impl>
 +uint64_t
 +OzoneCPU<Impl>::OzoneXC::readFloatRegBits(int reg_idx, int width)
 +{
 +    int idx = reg_idx + TheISA::FP_Base_DepTag;
 +    return thread->renameTable[idx]->readIntResult();
 +}
 +
 +template <class Impl>
 +uint64_t
 +OzoneCPU<Impl>::OzoneXC::readFloatRegBits(int reg_idx)
 +{
 +    int idx = reg_idx + TheISA::FP_Base_DepTag;
 +    return thread->renameTable[idx]->readIntResult();
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::setIntReg(int reg_idx, uint64_t val)
 +{
 +    thread->renameTable[reg_idx]->setIntResult(val);
 +
 +    if (!thread->inSyscall) {
 +        cpu->squashFromXC();
 +    }
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::setFloatReg(int reg_idx, FloatReg val, int width)
 +{
 +    int idx = reg_idx + TheISA::FP_Base_DepTag;
 +    switch(width) {
 +      case 32:
 +        panic("Unimplemented!");
 +        break;
 +      case 64:
 +        thread->renameTable[idx]->setDoubleResult(val);
 +        break;
 +      default:
 +        panic("Unsupported width!");
 +    }
 +
 +    if (!thread->inSyscall) {
 +        cpu->squashFromXC();
 +    }
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::setFloatReg(int reg_idx, FloatReg val)
 +{
 +    int idx = reg_idx + TheISA::FP_Base_DepTag;
 +
 +    thread->renameTable[idx]->setDoubleResult(val);
 +
 +    if (!thread->inSyscall) {
 +        cpu->squashFromXC();
 +    }
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::setFloatRegBits(int reg_idx, FloatRegBits val,
 +                                         int width)
 +{
 +    panic("Unimplemented!");
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::setFloatRegBits(int reg_idx, FloatRegBits val)
 +{
 +    panic("Unimplemented!");
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::setPC(Addr val)
 +{
 +    thread->PC = val;
 +    cpu->frontEnd->setPC(val);
 +
 +    if (!thread->inSyscall) {
 +        cpu->squashFromXC();
 +    }
 +}
 +
 +template <class Impl>
 +void
 +OzoneCPU<Impl>::OzoneXC::setNextPC(Addr val)
 +{
 +    thread->nextPC = val;
 +    cpu->frontEnd->setNextPC(val);
 +
 +    if (!thread->inSyscall) {
 +        cpu->squashFromXC();
 +    }
 +}
 +
 +template <class Impl>
 +TheISA::MiscReg
 +OzoneCPU<Impl>::OzoneXC::readMiscReg(int misc_reg)
 +{
 +    return thread->regs.miscRegs.readReg(misc_reg);
 +}
 +
 +template <class Impl>
 +TheISA::MiscReg
 +OzoneCPU<Impl>::OzoneXC::readMiscRegWithEffect(int misc_reg, Fault &fault)
 +{
 +    return thread->regs.miscRegs.readRegWithEffect(misc_reg,
 +                                                   fault, this);
 +}
 +
 +template <class Impl>
 +Fault
 +OzoneCPU<Impl>::OzoneXC::setMiscReg(int misc_reg, const MiscReg &val)
 +{
 +    // Needs to setup a squash event unless we're in syscall mode
 +    Fault ret_fault = thread->regs.miscRegs.setReg(misc_reg, val);
 +
 +    if (!thread->inSyscall) {
 +        cpu->squashFromXC();
 +    }
 +
 +    return ret_fault;
 +}
  
  template <class Impl>
 -class OoODynInst;
 +Fault
 +OzoneCPU<Impl>::OzoneXC::setMiscRegWithEffect(int misc_reg, const MiscReg &val)
 +{
 +    // Needs to setup a squash event unless we're in syscall mode
 +    Fault ret_fault = thread->regs.miscRegs.setRegWithEffect(misc_reg, val,
 +                                                             this);
  
 -struct OoOImpl {
 -    typedef AlphaISA ISA;
 -    typedef OoOCPU<OoOImpl> OoOCPU;
 -    typedef OoOCPU FullCPU;
 -    typedef OoODynInst<OoOImpl> DynInst;
 -    typedef RefCountingPtr<DynInst> DynInstPtr;
 -};
 +    if (!thread->inSyscall) {
 +        cpu->squashFromXC();
 +    }
  
 -#endif // __CPU_OOO_CPU_OOO_IMPL_HH__
 +    return ret_fault;
 +}
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge