Make FullCPU schedule its TickEvent when one of its contexts becomes active.
authorSteve Reinhardt <stever@eecs.umich.edu>
Sat, 25 Oct 2003 06:02:36 +0000 (23:02 -0700)
committerSteve Reinhardt <stever@eecs.umich.edu>
Sat, 25 Oct 2003 06:02:36 +0000 (23:02 -0700)
This fixes detailed-mpboot, which was broken as of my last change.
Also clean up some of the ExecContext status initialization.

cpu/base_cpu.hh:
    CPU::execCtxStatusChg() now takes thread_num as an arg so the CPU knows
    which execContext had the status change.
    BaseCPU::registerExecContexts() no longer needs to be virtual.
cpu/exec_context.cc:
    Initialize _status directly... don't use setStatus() as this will notify the CPU
    of the change before it is ready.
    CPU::execCtxStatusChg() now takes thread_num as an arg so the CPU knows
    which execContext had the status change.
cpu/exec_context.hh:
    Don't need initStatus() any more.
cpu/simple_cpu/simple_cpu.cc:
    Move execCtxStatusChg() from header to .cc file.
    No longer need specialized version of registerExecContexts to schedule TickEvent.
cpu/simple_cpu/simple_cpu.hh:
    Move execCtxStatusChg() from header to .cc file.
    CPU::execCtxStatusChg() now takes thread_num as arg (must be 0 for SimpleCPU).
    No longer need specialized version of registerExecContexts to schedule TickEvent.
kern/tru64/tru64_system.cc:
    Don't need initRegs; the PC etc. get initialized in the CPU constructor.
    ExecContexts start out as Unallocated, so no need to set them to Unallocated here.
kern/tru64/tru64_system.hh:
    Don't need initRegs; the PC etc. get initialized in the CPU constructor.
sim/prog.cc:
    ExecContexts start out as Unallocated, so no need to set them to Unallocated here.

--HG--
extra : convert_revision : e960ebbeb845960344633798e251b6c8bf1c0378

cpu/base_cpu.hh
cpu/exec_context.cc
cpu/exec_context.hh
cpu/simple_cpu/simple_cpu.cc
cpu/simple_cpu/simple_cpu.hh
kern/tru64/tru64_system.cc
kern/tru64/tru64_system.hh
sim/prog.cc

index 5a20aaa5429d297c267d9b56a6c2cb6b51165a4a..143fc9662e998c72c5715abff4563e0cce461151 100644 (file)
@@ -73,7 +73,7 @@ class BaseCPU : public SimObject
     std::vector<ExecContext *> execContexts;
 
   public:
-    virtual void execCtxStatusChg() {}
+    virtual void execCtxStatusChg(int thread_num) {}
 
   public:
 
@@ -94,7 +94,7 @@ class BaseCPU : public SimObject
 
     virtual void regStats();
 
-    virtual void registerExecContexts();
+    void registerExecContexts();
 
     /// Prepare for another CPU to take over execution.  Called by
     /// takeOverFrom() on its argument.
index 6c24500cc615656f8564bbf361b1fb83dcaef707..a4670f2914178b63d75b45a3a076fbd5ca4d7c65 100644 (file)
@@ -44,24 +44,22 @@ using namespace std;
 ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, System *_sys,
                          AlphaItb *_itb, AlphaDtb *_dtb,
                          FunctionalMemory *_mem)
-    : kernelStats(this, _cpu), cpu(_cpu), thread_num(_thread_num),
+    : _status(ExecContext::Unallocated),
+      kernelStats(this, _cpu), cpu(_cpu), thread_num(_thread_num),
       cpu_id(-1), mem(_mem), itb(_itb), dtb(_dtb), system(_sys),
       memCtrl(_sys->memCtrl), physmem(_sys->physmem),
       func_exe_insn(0), storeCondFailures(0)
 {
     memset(&regs, 0, sizeof(RegFile));
-    setStatus(ExecContext::Unallocated);
 }
 #else
 ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num,
                          Process *_process, int _asid)
-    : cpu(_cpu), thread_num(_thread_num), cpu_id(-1),
-      process(_process), asid (_asid),
+    : _status(ExecContext::Unallocated),
+      cpu(_cpu), thread_num(_thread_num), cpu_id(-1),
+      process(_process), mem(process->getMemory()), asid(_asid),
       func_exe_insn(0), storeCondFailures(0)
 {
-    setStatus(ExecContext::Unallocated);
-
-    mem = process->getMemory();
 }
 
 ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num,
@@ -114,7 +112,7 @@ ExecContext::setStatus(Status new_status)
 #endif
 
     _status = new_status;
-    cpu->execCtxStatusChg();
+    cpu->execCtxStatusChg(thread_num);
 }
 
 void
index 5c6e84cee9d41d720a9d3d6766be88d0ab9185e2..f2afaa33479c241c0a560105065ed083f6f35e7c 100644 (file)
@@ -68,10 +68,6 @@ class ExecContext
   public:
     Status status() const { return _status; }
 
-    // Unlike setStatus(), initStatus() has no side effects other than
-    // setting the _status variable.
-    void initStatus(Status init_status) { _status = init_status; }
-
     void setStatus(Status new_status);
 
 #ifdef FULL_SYSTEM
index 41e3de24eff02c723350f813a8b85187835b76f3..891e6cdb3d48127f51e979896fe51f158e7eef95 100644 (file)
@@ -163,25 +163,6 @@ SimpleCPU::~SimpleCPU()
 }
 
 
-void
-SimpleCPU::registerExecContexts()
-{
-    BaseCPU::registerExecContexts();
-
-    // 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;
-            // this should only happen at initialization time
-            assert(curTick == 0);
-            tickEvent.schedule(0);
-        }
-    }
-}
-
-
 void
 SimpleCPU::switchOut()
 {
@@ -212,6 +193,18 @@ SimpleCPU::takeOverFrom(BaseCPU *oldCPU)
 }
 
 
+void
+SimpleCPU::execCtxStatusChg(int thread_num) {
+    assert(thread_num == 0);
+    assert(xc);
+
+    if (xc->status() == ExecContext::Active)
+        setStatus(Running);
+    else
+        setStatus(Idle);
+}
+
+
 void
 SimpleCPU::regStats()
 {
index e1b351cab12c213884be27cff520d4da8a99ea55..60c038163c93de5d98ba1b18e21063979db1cc64 100644 (file)
@@ -136,8 +136,6 @@ class SimpleCPU : public BaseCPU
     // execution context
     ExecContext *xc;
 
-    void registerExecContexts();
-
     void switchOut();
     void takeOverFrom(BaseCPU *oldCPU);
 
@@ -178,14 +176,7 @@ class SimpleCPU : public BaseCPU
 
     Status status() const { return _status; }
 
-    virtual void execCtxStatusChg() {
-        if (xc) {
-            if (xc->status() == ExecContext::Active)
-                setStatus(Running);
-            else
-                setStatus(Idle);
-        }
-    }
+    virtual void execCtxStatusChg(int thread_num);
 
     void setStatus(Status new_status) {
         Status old_status = status();
index 8b4ff668d499801f9437c1008efbb3992b6c9415..a7940ed1f655f4f67f2b098027205d3e4fdb5da9 100644 (file)
@@ -72,10 +72,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
         fatal("Could not load PALcode file %s", palcode);
     pal->loadSections(physmem, true);
 
-    // copy of initial reg file contents
-    initRegs = new RegFile;
-    memset(initRegs, 0, sizeof(RegFile));
-
     // Load console file
     console->loadSections(physmem, true);
 
@@ -90,10 +86,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
             "Kernel entry = %#x\n",
             kernelStart, kernelEnd, kernelEntry);
 
-    // Setup kernel boot parameters
-    initRegs->pc = 0x4001;
-    initRegs->npc = initRegs->pc + sizeof(MachInst);
-
     DPRINTF(Loader, "Kernel loaded...\n");
 
     kernelPanicEvent = new BreakPCEvent(&pcEventQueue, "kernel panic");
@@ -164,8 +156,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param,
 
 Tru64System::~Tru64System()
 {
-    delete initRegs;
-
     delete kernel;
     delete console;
 
@@ -190,11 +180,7 @@ Tru64System::registerExecContext(ExecContext *xc)
     int xcIndex = System::registerExecContext(xc);
 
     if (xcIndex == 0) {
-        // xc->regs = *initRegs;
-        xc->initStatus(ExecContext::Active);
-    }
-    else {
-        xc->initStatus(ExecContext::Unallocated);
+        xc->setStatus(ExecContext::Active);
     }
 
     RemoteGDB *rgdb = new RemoteGDB(this, xc);
index a67792aafd5a8f36f6d33776c1269d876bb0a5c9..e0d2bedf7f7734dd5c216408712d29e3e45d7caa 100644 (file)
@@ -67,7 +67,6 @@ class Tru64System : public System
     DumpMbufEvent *dumpMbufEvent;
 
   private:
-    RegFile *initRegs;
 
     Addr kernelStart;
     Addr kernelEnd;
index 599a0ca9a3d6d92bdf839cd5834dda1abf60413d..fca4b4505451a2ff63409c2df940cfd683745037 100644 (file)
@@ -148,10 +148,7 @@ Process::registerExecContext(ExecContext *xc)
         xc->regs = *init_regs;
 
         // mark this context as active
-        xc->initStatus(ExecContext::Active);
-    }
-    else {
-        xc->initStatus(ExecContext::Unallocated);
+        xc->setStatus(ExecContext::Active);
     }
 
     // return CPU number to caller and increment available CPU count