Get O3 CPU mostly working in full system, and fix an FP bug that showed up.
authorKevin Lim <ktlim@umich.edu>
Thu, 8 Jun 2006 20:58:50 +0000 (16:58 -0400)
committerKevin Lim <ktlim@umich.edu>
Thu, 8 Jun 2006 20:58:50 +0000 (16:58 -0400)
It still does not yet handle retries.

src/cpu/base_dyn_inst.hh:
    Get working in full-system mode and fix some FP bugs.
src/cpu/checker/cpu.cc:
src/cpu/checker/cpu.hh:
src/cpu/checker/thread_context.hh:
src/cpu/o3/alpha_cpu.hh:
src/cpu/o3/alpha_cpu_impl.hh:
src/cpu/o3/commit_impl.hh:
src/cpu/o3/cpu.cc:
src/cpu/o3/cpu.hh:
src/cpu/o3/fetch_impl.hh:
src/cpu/o3/thread_state.hh:
src/cpu/ozone/cpu.hh:
src/cpu/ozone/thread_state.hh:
src/cpu/thread_state.hh:
    Get working in full system.
src/cpu/checker/o3_cpu_builder.cc:
    Checker does not take a MemObject as a simobj parameter.
src/cpu/o3/alpha_dyn_inst.hh:
    Fix up float regs.
src/cpu/o3/regfile.hh:
    Fix up an fp error, print out more useful output messages.

--HG--
extra : convert_revision : d7cc152a051c697f18b7ee9e14050fbf3ffa5966

17 files changed:
src/cpu/base_dyn_inst.hh
src/cpu/checker/cpu.cc
src/cpu/checker/cpu.hh
src/cpu/checker/o3_cpu_builder.cc
src/cpu/checker/thread_context.hh
src/cpu/o3/alpha_cpu.hh
src/cpu/o3/alpha_cpu_impl.hh
src/cpu/o3/alpha_dyn_inst.hh
src/cpu/o3/commit_impl.hh
src/cpu/o3/cpu.cc
src/cpu/o3/cpu.hh
src/cpu/o3/fetch_impl.hh
src/cpu/o3/regfile.hh
src/cpu/o3/thread_state.hh
src/cpu/ozone/cpu.hh
src/cpu/ozone/thread_state.hh
src/cpu/thread_state.hh

index e69e00d6cc934abf75c6473c35b970e2dda8c913..263a245219bc31b760bd9ab7fb24de0ca5447a5e 100644 (file)
@@ -73,8 +73,10 @@ class BaseDynInst : public FastAlloc, public RefCounted
     typedef TheISA::ExtMachInst ExtMachInst;
     // Logical register index type.
     typedef TheISA::RegIndex RegIndex;
-    // Integer register index type.
+    // Integer register type.
     typedef TheISA::IntReg IntReg;
+    // Floating point register type.
+    typedef TheISA::FloatReg FloatReg;
 
     // The DynInstPtr type.
     typedef typename Impl::DynInstPtr DynInstPtr;
@@ -442,17 +444,27 @@ class BaseDynInst : public FastAlloc, public RefCounted
         instResult.integer = val;
     }
 
-    void setFloatRegSingle(const StaticInst *si, int idx, float val)
+    void setFloatReg(const StaticInst *si, int idx, FloatReg val, int width)
+    {
+        if (width == 32)
+            instResult.fp = val;
+        else if (width == 64)
+            instResult.dbl = val;
+        else
+            panic("Unsupported width!");
+    }
+
+    void setFloatReg(const StaticInst *si, int idx, FloatReg val)
     {
         instResult.fp = val;
     }
 
-    void setFloatRegDouble(const StaticInst *si, int idx, double val)
+    void setFloatRegBits(const StaticInst *si, int idx, uint64_t val, int width)
     {
-        instResult.dbl = val;
+        instResult.integer = val;
     }
 
-    void setFloatRegInt(const StaticInst *si, int idx, uint64_t val)
+    void setFloatRegBits(const StaticInst *si, int idx, uint64_t val)
     {
         instResult.integer = val;
     }
@@ -657,14 +669,14 @@ BaseDynInst<Impl>::read(Addr addr, T &data, unsigned flags)
         return TheISA::genAlignmentFault();
     }
 
-    fault = cpu->translateDataReadReq(req);
+    fault = cpu->translateDataReadReq(req, thread);
 
     if (fault == NoFault) {
         effAddr = req->getVaddr();
         physEffAddr = req->getPaddr();
         memReqFlags = req->getFlags();
 
-#if FULL_SYSTEM
+#if 0
         if (cpu->system->memctrl->badaddr(physEffAddr)) {
             fault = TheISA::genMachineCheckFault();
             data = (T)-1;
@@ -712,13 +724,13 @@ BaseDynInst<Impl>::write(T data, Addr addr, unsigned flags, uint64_t *res)
         return TheISA::genAlignmentFault();
     }
 
-    fault = cpu->translateDataWriteReq(req);
+    fault = cpu->translateDataWriteReq(req, thread);
 
     if (fault == NoFault) {
         effAddr = req->getVaddr();
         physEffAddr = req->getPaddr();
         memReqFlags = req->getFlags();
-#if FULL_SYSTEM
+#if 0
         if (cpu->system->memctrl->badaddr(physEffAddr)) {
             fault = TheISA::genMachineCheckFault();
         } else {
index b328a66c442036b436fc96107dc676876510d423..ebc02f7beb019d7363283ea78ac607ffab4df462 100644 (file)
@@ -81,7 +81,6 @@ CheckerCPU::CheckerCPU(Params *p)
     itb = p->itb;
     dtb = p->dtb;
     systemPtr = NULL;
-    memPtr = NULL;
 #else
     process = p->process;
 #endif
@@ -94,44 +93,32 @@ CheckerCPU::~CheckerCPU()
 void
 CheckerCPU::setMemory(MemObject *mem)
 {
-    memPtr = mem;
 #if !FULL_SYSTEM
+    memPtr = mem;
     thread = new SimpleThread(this, /* thread_num */ 0, process,
                               /* asid */ 0, mem);
 
     thread->setStatus(ThreadContext::Suspended);
     tc = thread->getTC();
     threadContexts.push_back(tc);
-#else
-    if (systemPtr) {
-        thread = new SimpleThread(this, 0, systemPtr, itb, dtb, memPtr, false);
-
-        thread->setStatus(ThreadContext::Suspended);
-        tc = thread->getTC();
-        threadContexts.push_back(tc);
-        delete thread->kernelStats;
-        thread->kernelStats = NULL;
-    }
 #endif
 }
 
-#if FULL_SYSTEM
 void
 CheckerCPU::setSystem(System *system)
 {
+#if FULL_SYSTEM
     systemPtr = system;
 
-    if (memPtr) {
-        thread = new SimpleThread(this, 0, systemPtr, itb, dtb, memPtr, false);
+    thread = new SimpleThread(this, 0, systemPtr, itb, dtb, false);
 
-        thread->setStatus(ThreadContext::Suspended);
-        tc = thread->getTC();
-        threadContexts.push_back(tc);
-        delete thread->kernelStats;
-        thread->kernelStats = NULL;
-    }
-}
+    thread->setStatus(ThreadContext::Suspended);
+    tc = thread->getTC();
+    threadContexts.push_back(tc);
+    delete thread->kernelStats;
+    thread->kernelStats = NULL;
 #endif
+}
 
 void
 CheckerCPU::setIcachePort(Port *icache_port)
@@ -350,7 +337,7 @@ CheckerCPU::write(int32_t data, Addr addr, unsigned flags, uint64_t *res)
 Addr
 CheckerCPU::dbg_vtophys(Addr addr)
 {
-    return vtophys(xcProxy, addr);
+    return vtophys(tc, addr);
 }
 #endif // FULL_SYSTEM
 
@@ -601,7 +588,7 @@ Checker<DynInstPtr>::tick(DynInstPtr &completed_inst)
 
         if (fault != NoFault) {
 #if FULL_SYSTEM
-            fault->invoke(xcProxy);
+            fault->invoke(tc);
             willChangePC = true;
             newPC = thread->readPC();
             DPRINTF(Checker, "Fault, PC is now %#x\n", newPC);
@@ -630,7 +617,7 @@ Checker<DynInstPtr>::tick(DynInstPtr &completed_inst)
         int count = 0;
         do {
             oldpc = thread->readPC();
-            system->pcEventQueue.service(xcProxy);
+            system->pcEventQueue.service(tc);
             count++;
         } while (oldpc != thread->readPC());
         if (count > 1) {
index d1a0ba684c5bcf604b8a37bf19b01d073812fe0a..c9986d228b451105d93d18c1ce451c650624070c 100644 (file)
@@ -99,7 +99,6 @@ class CheckerCPU : public BaseCPU
 #if FULL_SYSTEM
         AlphaITB *itb;
         AlphaDTB *dtb;
-        FunctionalMemory *mem;
 #else
         Process *process;
 #endif
@@ -116,11 +115,9 @@ class CheckerCPU : public BaseCPU
 
     MemObject *memPtr;
 
-#if FULL_SYSTEM
     void setSystem(System *system);
 
     System *systemPtr;
-#endif
 
     void setIcachePort(Port *icache_port);
 
@@ -327,7 +324,7 @@ class CheckerCPU : public BaseCPU
     int readIntrFlag() { return thread->readIntrFlag(); }
     void setIntrFlag(int val) { thread->setIntrFlag(val); }
     bool inPalMode() { return thread->inPalMode(); }
-    void ev5_trap(Fault fault) { fault->invoke(xcProxy); }
+    void ev5_trap(Fault fault) { fault->invoke(tc); }
     bool simPalCheck(int palFunc) { return thread->simPalCheck(palFunc); }
 #else
     // Assume that the normal CPU's call to syscall was successful.
index 5973ac58ec89571b964e7849fba89694ffb68717..59a6c71585f104d0036b3c1354c11ec7fe809a8c 100644 (file)
@@ -65,7 +65,6 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(O3Checker)
 #if FULL_SYSTEM
     SimObjectParam<AlphaITB *> itb;
     SimObjectParam<AlphaDTB *> dtb;
-    SimObjectParam<MemObject *> mem;
     SimObjectParam<System *> system;
     Param<int> cpu_id;
     Param<Tick> profile;
@@ -95,7 +94,6 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(O3Checker)
 #if FULL_SYSTEM
     INIT_PARAM(itb, "Instruction TLB"),
     INIT_PARAM(dtb, "Data TLB"),
-    INIT_PARAM(mem, "memory"),
     INIT_PARAM(system, "system object"),
     INIT_PARAM(cpu_id, "processor ID"),
     INIT_PARAM(profile, ""),
@@ -138,7 +136,6 @@ CREATE_SIM_OBJECT(O3Checker)
 #if FULL_SYSTEM
     params->itb = itb;
     params->dtb = dtb;
-    params->mem = mem;
     params->system = system;
     params->cpu_id = cpu_id;
     params->profile = profile;
index 4340bd516f42b409493a5814458147bc5d1b4bee..c0ac8f01d598b57c48cba707041d9f8929b01a3d 100644 (file)
@@ -81,8 +81,6 @@ class CheckerThreadContext : public ThreadContext
 
     int readCpuId() { return actualTC->readCpuId(); }
 
-    TranslatingPort *getMemPort() { return actualTC->getMemPort(); }
-
 #if FULL_SYSTEM
     System *getSystemPtr() { return actualTC->getSystemPtr(); }
 
@@ -93,7 +91,16 @@ class CheckerThreadContext : public ThreadContext
     AlphaDTB *getDTBPtr() { return actualTC->getDTBPtr(); }
 
     Kernel::Statistics *getKernelStats() { return actualTC->getKernelStats(); }
+
+    FunctionalPort *getPhysPort() { return actualTC->getPhysPort(); }
+
+    VirtualPort *getVirtPort(ThreadContext *tc = NULL)
+    { return actualTC->getVirtPort(); }
+
+    void delVirtPort(VirtualPort *vp) { actualTC->delVirtPort(vp); }
 #else
+    TranslatingPort *getMemPort() { return actualTC->getMemPort(); }
+
     Process *getProcessPtr() { return actualTC->getProcessPtr(); }
 #endif
 
index 3449454bd298aa9372a541c4fba23a07db3266ab..974b230f3e20cb668ba3e8687c8def5a678b49f4 100644 (file)
@@ -77,6 +77,11 @@ class AlphaFullCPU : public FullO3CPU<Impl>
      * 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 AlphaFullCPU 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
     {
@@ -96,8 +101,6 @@ class AlphaFullCPU : public FullO3CPU<Impl>
         /** Reads this CPU's ID. */
         virtual int readCpuId() { return cpu->cpu_id; }
 
-        virtual TranslatingPort *getMemPort() { return thread->getMemPort(); }
-
 #if FULL_SYSTEM
         /** Returns a pointer to the system. */
         virtual System *getSystemPtr() { return cpu->system; }
@@ -114,7 +117,15 @@ class AlphaFullCPU : public FullO3CPU<Impl>
         /** 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
@@ -301,43 +312,40 @@ class AlphaFullCPU : public FullO3CPU<Impl>
 
 #if FULL_SYSTEM
     /** Translates instruction requestion. */
-    Fault translateInstReq(RequestPtr &req)
+    Fault translateInstReq(RequestPtr &req, Thread *thread)
     {
-        return itb->translate(req);
+        return itb->translate(req, thread->getTC());
     }
 
     /** Translates data read request. */
-    Fault translateDataReadReq(RequestPtr &req)
+    Fault translateDataReadReq(RequestPtr &req, Thread *thread)
     {
-        return dtb->translate(req, false);
+        return dtb->translate(req, thread->getTC(), false);
     }
 
     /** Translates data write request. */
-    Fault translateDataWriteReq(RequestPtr &req)
+    Fault translateDataWriteReq(RequestPtr &req, Thread *thread)
     {
-        return dtb->translate(req, true);
+        return dtb->translate(req, thread->getTC(), true);
     }
 
 #else
     /** Translates instruction requestion in syscall emulation mode. */
-    Fault translateInstReq(RequestPtr &req)
+    Fault translateInstReq(RequestPtr &req, Thread *thread)
     {
-        int tid = req->getThreadNum();
-        return this->thread[tid]->getProcessPtr()->pTable->translate(req);
+        return thread->getProcessPtr()->pTable->translate(req);
     }
 
     /** Translates data read request in syscall emulation mode. */
-    Fault translateDataReadReq(RequestPtr &req)
+    Fault translateDataReadReq(RequestPtr &req, Thread *thread)
     {
-        int tid = req->getThreadNum();
-        return this->thread[tid]->getProcessPtr()->pTable->translate(req);
+        return thread->getProcessPtr()->pTable->translate(req);
     }
 
     /** Translates data write request in syscall emulation mode. */
-    Fault translateDataWriteReq(RequestPtr &req)
+    Fault translateDataWriteReq(RequestPtr &req, Thread *thread)
     {
-        int tid = req->getThreadNum();
-        return this->thread[tid]->getProcessPtr()->pTable->translate(req);
+        return thread->getProcessPtr()->pTable->translate(req);
     }
 
 #endif
index 2debe074b4fbede0825ee1f88afce1a796465639..fb2fea8e688a94a9fa1eea26a29db9dd17765922 100644 (file)
@@ -46,6 +46,7 @@
 #include "arch/isa_traits.hh"
 #include "cpu/quiesce_event.hh"
 #include "kern/kernel_stats.hh"
+#include "sim/system.hh"
 #endif
 
 using namespace TheISA;
@@ -67,7 +68,7 @@ AlphaFullCPU<Impl>::AlphaFullCPU(Params *params)
 #if FULL_SYSTEM
         // SMT is not supported in FS mode yet.
         assert(this->numThreads == 1);
-        this->thread[i] = new Thread(this, 0, params->mem);
+        this->thread[i] = new Thread(this, 0);
         this->thread[i]->setStatus(ThreadContext::Suspended);
 #else
         if (i < params->workload.size()) {
@@ -128,14 +129,14 @@ AlphaFullCPU<Impl>::AlphaFullCPU(Params *params)
         FunctionalPort *phys_port;
         VirtualPort *virt_port;
         phys_port = new FunctionalPort(csprintf("%s-%d-funcport",
-                                               cpu->name(), tid));
-        mem_port = system->physmem->getPort("functional");
+                                                name(), i));
+        mem_port = this->system->physmem->getPort("functional");
         mem_port->setPeer(phys_port);
         phys_port->setPeer(mem_port);
 
         virt_port = new VirtualPort(csprintf("%s-%d-vport",
-                                            cpu->name(), tid));
-        mem_port = system->physmem->getPort("functional");
+                                             name(), i));
+        mem_port = this->system->physmem->getPort("functional");
         mem_port->setPeer(virt_port);
         virt_port->setPeer(mem_port);
 
@@ -182,6 +183,23 @@ AlphaFullCPU<Impl>::regStats()
 }
 
 #if FULL_SYSTEM
+template <class Impl>
+VirtualPort *
+AlphaFullCPU<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
 AlphaFullCPU<Impl>::AlphaTC::dumpFuncProfile()
@@ -195,7 +213,6 @@ void
 AlphaFullCPU<Impl>::AlphaTC::takeOverFrom(ThreadContext *old_context)
 {
     // some things should already be set up
-    assert(getMemPort() == old_context->getMemPort());
 #if FULL_SYSTEM
     assert(getSystemPtr() == old_context->getSystemPtr());
 #else
@@ -232,6 +249,16 @@ AlphaFullCPU<Impl>::AlphaTC::takeOverFrom(ThreadContext *old_context)
     thread->trapPending = false;
 }
 
+#if FULL_SYSTEM
+template <class Impl>
+void
+AlphaFullCPU<Impl>::AlphaTC::delVirtPort(VirtualPort *vp)
+{
+    delete vp->getPeer();
+    delete vp;
+}
+#endif
+
 template <class Impl>
 void
 AlphaFullCPU<Impl>::AlphaTC::activate(int delay)
index 143ffe7e4f3d28b5e651146d58f91d1077a07b14..36a08c4a74559da236ad95bda0a05f31ad36a5bc 100644 (file)
@@ -207,26 +207,26 @@ class AlphaDynInst : public BaseDynInst<Impl>
     void setFloatReg(const StaticInst *si, int idx, FloatReg val, int width)
     {
         this->cpu->setFloatReg(_destRegIdx[idx], val, width);
-        BaseDynInst<Impl>::setFloatRegSingle(si, idx, val);
+        BaseDynInst<Impl>::setFloatReg(si, idx, val, width);
     }
 
     void setFloatReg(const StaticInst *si, int idx, FloatReg val)
     {
         this->cpu->setFloatReg(_destRegIdx[idx], val);
-        BaseDynInst<Impl>::setFloatRegDouble(si, idx, val);
+        BaseDynInst<Impl>::setFloatReg(si, idx, val);
     }
 
     void setFloatRegBits(const StaticInst *si, int idx,
             FloatRegBits val, int width)
     {
         this->cpu->setFloatRegBits(_destRegIdx[idx], val, width);
-        this->instResult.integer = val;
+        BaseDynInst<Impl>::setFloatRegBits(si, idx, val);
     }
 
     void setFloatRegBits(const StaticInst *si, int idx, FloatRegBits val)
     {
         this->cpu->setFloatRegBits(_destRegIdx[idx], val);
-        BaseDynInst<Impl>::setFloatRegInt(si, idx, val);
+        BaseDynInst<Impl>::setFloatRegBits(si, idx, val);
     }
 
     /** Returns the physical register index of the i'th destination
index 8ee47e907edb8d37751b3390b5d4aa039505df63..ceb2918e06067cf8372c0c8ab7b2857fcb0bed78 100644 (file)
@@ -907,7 +907,7 @@ DefaultCommit<Impl>::commitInsts()
                                !thread[tid]->trapPending);
                     oldpc = PC[tid];
                     cpu->system->pcEventQueue.service(
-                        thread[tid]->getXCProxy());
+                        thread[tid]->getTC());
                     count++;
                 } while (oldpc != PC[tid]);
                 if (count > 1) {
index c5f78d63dd171299b9777c9a7fddc3075c25567c..788c6b1647dafb0044241e7fa00272b88d79e632 100644 (file)
@@ -122,7 +122,6 @@ FullO3CPU<Impl>::FullO3CPU(Params *params)
 
 #if FULL_SYSTEM
       system(params->system),
-      memCtrl(system->memctrl),
       physmem(system->physmem),
 #endif // FULL_SYSTEM
       mem(params->mem),
index 8e482f1e526f9f045f84bc6e93d181e45aa8e028..7c8729749aa60c4011a448e67d6bb7f4160269ac 100644 (file)
@@ -474,8 +474,6 @@ class FullO3CPU : public BaseFullCPU
     /** Pointer to the system. */
     System *system;
 
-    /** Pointer to the memory controller. */
-    MemoryController *memCtrl;
     /** Pointer to physical memory. */
     PhysicalMemory *physmem;
 #endif
index f3793db6d90ea40a7fe9ba9ac6e284767a82f84a..152b69788a02f8088df2e9d1a2854156452a0be9 100644 (file)
@@ -43,8 +43,6 @@
 #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
 
@@ -531,7 +529,7 @@ DefaultFetch<Impl>::fetchCacheLine(Addr fetch_PC, Fault &ret_fault, unsigned tid
 
     // Translate the instruction request.
 //#if FULL_SYSTEM
-    fault = cpu->translateInstReq(mem_req);
+    fault = cpu->translateInstReq(mem_req, cpu->thread[tid]);
 //#else
 //    fault = pTable->translate(memReq[tid]);
 //#endif
@@ -542,7 +540,7 @@ DefaultFetch<Impl>::fetchCacheLine(Addr fetch_PC, Fault &ret_fault, unsigned tid
     // If translation was successful, attempt to read the first
     // instruction.
     if (fault == NoFault) {
-#if FULL_SYSTEM
+#if 0
         if (cpu->system->memctrl->badaddr(memReq[tid]->paddr) ||
             memReq[tid]->flags & UNCACHEABLE) {
             DPRINTF(Fetch, "Fetch: Bad address %#x (hopefully on a "
index a142b71027801fd6779694e93d988249bd0bed49..ade5e4e56e168d1ecbd7e6414692c2d2a26314c9 100644 (file)
@@ -96,7 +96,7 @@ class PhysRegFile
         assert(reg_idx < numPhysicalIntRegs);
 
         DPRINTF(IEW, "RegFile: Access to int register %i, has data "
-                "%i\n", int(reg_idx), intRegFile[reg_idx]);
+                "%#x\n", int(reg_idx), intRegFile[reg_idx]);
         return intRegFile[reg_idx];
     }
 
@@ -110,7 +110,7 @@ class PhysRegFile
         FloatReg floatReg = floatRegFile[reg_idx].d;
 
         DPRINTF(IEW, "RegFile: Access to %d byte float register %i, has "
-                "data %8.8d\n", int(reg_idx), (double)floatReg);
+                "data %#x\n", int(reg_idx), floatRegFile[reg_idx].q);
 
         return floatReg;
     }
@@ -126,7 +126,7 @@ class PhysRegFile
         FloatReg floatReg = floatRegFile[reg_idx].d;
 
         DPRINTF(IEW, "RegFile: Access to float register %i, has "
-                "data %8.8d\n", int(reg_idx), (double)floatReg);
+                "data %#x\n", int(reg_idx), floatRegFile[reg_idx].q);
 
         return floatReg;
     }
@@ -141,8 +141,8 @@ class PhysRegFile
 
         FloatRegBits floatRegBits = floatRegFile[reg_idx].q;
 
-        DPRINTF(IEW, "RegFile: Access to %d byte float register %i as int, "
-                "has data %lli\n", int(reg_idx), (uint64_t)floatRegBits);
+        DPRINTF(IEW, "RegFile: Access to float register %i as int, "
+                "has data %#x\n", int(reg_idx), (uint64_t)floatRegBits);
 
         return floatRegBits;
     }
@@ -157,7 +157,7 @@ class PhysRegFile
         FloatRegBits floatRegBits = floatRegFile[reg_idx].q;
 
         DPRINTF(IEW, "RegFile: Access to float register %i as int, "
-                "has data %lli\n", int(reg_idx), (uint64_t)floatRegBits);
+                "has data %#x\n", int(reg_idx), (uint64_t)floatRegBits);
 
         return floatRegBits;
     }
@@ -167,7 +167,7 @@ class PhysRegFile
     {
         assert(reg_idx < numPhysicalIntRegs);
 
-        DPRINTF(IEW, "RegFile: Setting int register %i to %lli\n",
+        DPRINTF(IEW, "RegFile: Setting int register %i to %#x\n",
                 int(reg_idx), val);
 
         if (reg_idx != TheISA::ZeroReg)
@@ -182,11 +182,11 @@ class PhysRegFile
 
         assert(reg_idx < numPhysicalFloatRegs + numPhysicalIntRegs);
 
-        DPRINTF(IEW, "RegFile: Setting float register %i to %8.8d\n",
-                int(reg_idx), (double)val);
+        DPRINTF(IEW, "RegFile: Setting float register %i to %#x\n",
+                int(reg_idx), (uint64_t)val);
 
         if (reg_idx != TheISA::ZeroReg)
-            floatRegFile[reg_idx].d = width;
+            floatRegFile[reg_idx].d = val;
     }
 
     /** Sets a double precision floating point register to the given value. */
@@ -197,8 +197,8 @@ class PhysRegFile
 
         assert(reg_idx < numPhysicalFloatRegs + numPhysicalIntRegs);
 
-        DPRINTF(IEW, "RegFile: Setting float register %i to %8.8d\n",
-                int(reg_idx), (double)val);
+        DPRINTF(IEW, "RegFile: Setting float register %i to %#x\n",
+                int(reg_idx), (uint64_t)val);
 
         if (reg_idx != TheISA::ZeroReg)
             floatRegFile[reg_idx].d = val;
@@ -212,7 +212,7 @@ class PhysRegFile
 
         assert(reg_idx < numPhysicalFloatRegs + numPhysicalIntRegs);
 
-        DPRINTF(IEW, "RegFile: Setting float register %i to %lli\n",
+        DPRINTF(IEW, "RegFile: Setting float register %i to %#x\n",
                 int(reg_idx), (uint64_t)val);
 
         floatRegFile[reg_idx].q = val;
@@ -225,7 +225,7 @@ class PhysRegFile
 
         assert(reg_idx < numPhysicalFloatRegs + numPhysicalIntRegs);
 
-        DPRINTF(IEW, "RegFile: Setting float register %i to %lli\n",
+        DPRINTF(IEW, "RegFile: Setting float register %i to %#x\n",
                 int(reg_idx), (uint64_t)val);
 
         floatRegFile[reg_idx].q = val;
@@ -263,10 +263,10 @@ class PhysRegFile
 
   public:
     /** (signed) integer register file. */
-    std::vector<IntReg> intRegFile;
+    IntReg *intRegFile;
 
     /** Floating point register file. */
-    std::vector<PhysFloatReg> floatRegFile;
+    PhysFloatReg *floatRegFile;
 
     /** Miscellaneous register file. */
     MiscRegFile miscRegs[Impl::MaxThreads];
@@ -296,15 +296,15 @@ PhysRegFile<Impl>::PhysRegFile(unsigned _numPhysicalIntRegs,
     : numPhysicalIntRegs(_numPhysicalIntRegs),
       numPhysicalFloatRegs(_numPhysicalFloatRegs)
 {
-    intRegFile.resize(numPhysicalIntRegs);
-    floatRegFile.resize(numPhysicalFloatRegs);
+    intRegFile = new IntReg[numPhysicalIntRegs];
+    floatRegFile = new PhysFloatReg[numPhysicalFloatRegs];
 
     for (int i = 0; i < Impl::MaxThreads; ++i) {
         miscRegs[i].clear();
     }
 
-    //memset(intRegFile, 0, sizeof(*intRegFile));
-    //memset(floatRegFile, 0, sizeof(*floatRegFile));
+    memset(intRegFile, 0, sizeof(IntReg) * numPhysicalIntRegs);
+    memset(floatRegFile, 0, sizeof(PhysFloatReg) * numPhysicalFloatRegs);
 }
 
 #endif
index 1fbf2493155b72c2d705c5f565898de614397118..b6535baa14ad3c877db108be54a5b15b37da465d 100644 (file)
@@ -75,7 +75,7 @@ struct O3ThreadState : public ThreadState {
     bool trapPending;
 
 #if FULL_SYSTEM
-    O3ThreadState(FullCPU *_cpu, int _thread_num)
+    O3ThreadState(FullCPU *_cpu, int _thread_num)
         : ThreadState(-1, _thread_num),
           inSyscall(0), trapPending(0)
     { }
index 55e3813ae1acf6f98ef7a6910e5029f92ab09b6e..e9550c39b8bff0497506ebb976ab64dda4de9cef 100644 (file)
@@ -113,8 +113,6 @@ class OzoneCPU : public BaseCPU
 
         int readCpuId() { return thread->cpuId; }
 
-        TranslatingPort *getMemPort() { return /*thread->port*/NULL; }
-
 #if FULL_SYSTEM
         System *getSystemPtr() { return cpu->system; }
 
@@ -125,7 +123,17 @@ class OzoneCPU : public BaseCPU
         AlphaDTB * getDTBPtr() { return cpu->dtb; }
 
         Kernel::Statistics *getKernelStats() { return thread->kernelStats; }
+
+        FunctionalPort *getPhysPort() { return thread->getPhysPort(); }
+
+        VirtualPort *getVirtPort(ThreadContext *tc = NULL)
+        { return thread->getVirtPort(tc); }
+
+        void delVirtPort(VirtualPort *vp)
+        { thread->delVirtPort(vp); }
 #else
+        TranslatingPort *getMemPort() { return thread->port; }
+
         Process *getProcessPtr() { return thread->process; }
 #endif
 
@@ -363,23 +371,9 @@ class OzoneCPU : public BaseCPU
     AlphaITB *itb;
     AlphaDTB *dtb;
     System *system;
-
-    // the following two fields are redundant, since we can always
-    // look them up through the system pointer, but we'll leave them
-    // here for now for convenience
-    MemoryController *memctrl;
     PhysicalMemory *physmem;
 #endif
 
-    // L1 instruction cache
-//    MemInterface *icacheInterface;
-
-    // L1 data cache
-//    MemInterface *dcacheInterface;
-
-    /** Pointer to memory. */
-    FunctionalMemory *mem;
-
     FrontEnd *frontEnd;
 
     BackEnd *backEnd;
@@ -424,19 +418,19 @@ class OzoneCPU : public BaseCPU
     bool validInstAddr(Addr addr) { return true; }
     bool validDataAddr(Addr addr) { return true; }
 
-    Fault translateInstReq(MemReqPtr &req)
+    Fault translateInstReq(Request *req)
     {
-        return itb->translate(req);
+        return itb->translate(req, tc);
     }
 
-    Fault translateDataReadReq(MemReqPtr &req)
+    Fault translateDataReadReq(Request *req)
     {
-        return dtb->translate(req, false);
+        return dtb->translate(req, tc, false);
     }
 
-    Fault translateDataWriteReq(MemReqPtr &req)
+    Fault translateDataWriteReq(Request *req)
     {
-        return dtb->translate(req, true);
+        return dtb->translate(req, tc, true);
     }
 
 #else
index d5fe7ef4845af78a320a91a6ccd1fc89fd74f272..299878c292a1173534e5807d846f51abbc7bccb8 100644 (file)
@@ -62,8 +62,8 @@ struct OzoneThreadState : public ThreadState {
     typedef TheISA::MiscReg MiscReg;
 
 #if FULL_SYSTEM
-    OzoneThreadState(FullCPU *_cpu, int _thread_num, FunctionalMemory *_mem)
-        : ThreadState(-1, _thread_num, _mem),
+    OzoneThreadState(FullCPU *_cpu, int _thread_num)
+        : ThreadState(-1, _thread_num),
           inSyscall(0), trapPending(0)
     {
         memset(&regs, 0, sizeof(TheISA::RegFile));
@@ -76,9 +76,9 @@ struct OzoneThreadState : public ThreadState {
         memset(&regs, 0, sizeof(TheISA::RegFile));
     }
 
-    OzoneThreadState(FullCPU *_cpu, int _thread_num, FunctionalMemory *_mem,
+    OzoneThreadState(FullCPU *_cpu, int _thread_num,
                      int _asid)
-        : ThreadState(-1, _thread_num, _mem, NULL, _asid),
+        : ThreadState(-1, _thread_num, NULL, NULL, _asid),
           cpu(_cpu), inSyscall(0), trapPending(0)
     {
         memset(&regs, 0, sizeof(TheISA::RegFile));
index 01ad4625c468688716cf9cb911d18590b3abc7b6..de9b2f14e4fc866dfcec2af3808f988f60dfd0b6 100644 (file)
@@ -88,8 +88,12 @@ struct ThreadState {
 
     Kernel::Statistics *getKernelStats() { return kernelStats; }
 
+    FunctionalPort *getPhysPort() { return physPort; }
+
     void setPhysPort(FunctionalPort *port) { physPort = port; }
 
+    VirtualPort *getVirtPort(ThreadContext *tc = NULL) { return virtPort; }
+
     void setVirtPort(VirtualPort *port) { virtPort = port; }
 #else
     Process *getProcessPtr() { return process; }
@@ -149,6 +153,7 @@ struct ThreadState {
     // Index of hardware thread context on the CPU that this represents.
     int tid;
 
+  public:
     /** Last time activate was called on this thread. */
     Tick lastActivate;
 
@@ -187,6 +192,7 @@ struct ThreadState {
      */
     TheISA::MachInst inst;
 
+  public:
     /**
      * Temporary storage to pass the source address from copy_load to
      * copy_store.
@@ -199,7 +205,6 @@ struct ThreadState {
      */
     Addr copySrcPhysAddr;
 
-  public:
     /*
      * number of executed instructions, for matching with syscall trace
      * points in EIO files.