base.hh revision 393
14519Sgblack@eecs.umich.edu/*
24519Sgblack@eecs.umich.edu * Copyright (c) 2003 The Regents of The University of Michigan
34519Sgblack@eecs.umich.edu * All rights reserved.
44519Sgblack@eecs.umich.edu *
54519Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
64519Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
74519Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
84519Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
94519Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
104519Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
114519Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
124519Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
134519Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
144519Sgblack@eecs.umich.edu * this software without specific prior written permission.
154519Sgblack@eecs.umich.edu *
164519Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
174519Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
184519Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
194519Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
204519Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
214519Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
224519Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234519Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244519Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254519Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
264519Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274519Sgblack@eecs.umich.edu */
284519Sgblack@eecs.umich.edu
294519Sgblack@eecs.umich.edu#ifndef __SIMPLE_CPU_HH__
304519Sgblack@eecs.umich.edu#define __SIMPLE_CPU_HH__
314519Sgblack@eecs.umich.edu
324519Sgblack@eecs.umich.edu#include "cpu/base_cpu.hh"
334519Sgblack@eecs.umich.edu#include "sim/eventq.hh"
344519Sgblack@eecs.umich.edu#include "base/loader/symtab.hh"
354519Sgblack@eecs.umich.edu#include "cpu/pc_event.hh"
364519Sgblack@eecs.umich.edu#include "base/statistics.hh"
374519Sgblack@eecs.umich.edu
384519Sgblack@eecs.umich.edu
394519Sgblack@eecs.umich.edu// forward declarations
404519Sgblack@eecs.umich.edu#ifdef FULL_SYSTEM
414519Sgblack@eecs.umich.educlass Processor;
424519Sgblack@eecs.umich.educlass Kernel;
434519Sgblack@eecs.umich.educlass AlphaItb;
444519Sgblack@eecs.umich.educlass AlphaDtb;
454519Sgblack@eecs.umich.educlass PhysicalMemory;
464519Sgblack@eecs.umich.edu
474519Sgblack@eecs.umich.educlass RemoteGDB;
484519Sgblack@eecs.umich.educlass GDBListener;
494519Sgblack@eecs.umich.edu#endif // FULL_SYSTEM
504519Sgblack@eecs.umich.edu
514519Sgblack@eecs.umich.educlass MemInterface;
524519Sgblack@eecs.umich.educlass Checkpoint;
534519Sgblack@eecs.umich.edu
544519Sgblack@eecs.umich.edunamespace Trace {
554519Sgblack@eecs.umich.edu    class InstRecord;
564519Sgblack@eecs.umich.edu}
574519Sgblack@eecs.umich.edu
584519Sgblack@eecs.umich.educlass SimpleCPU : public BaseCPU
594519Sgblack@eecs.umich.edu{
604519Sgblack@eecs.umich.edu  public:
614519Sgblack@eecs.umich.edu    // main simulation loop (one cycle)
624590Sgblack@eecs.umich.edu    void tick();
634679Sgblack@eecs.umich.edu
644590Sgblack@eecs.umich.edu  private:
654590Sgblack@eecs.umich.edu    class TickEvent : public Event
664590Sgblack@eecs.umich.edu    {
674590Sgblack@eecs.umich.edu      private:
684590Sgblack@eecs.umich.edu        SimpleCPU *cpu;
694590Sgblack@eecs.umich.edu
704590Sgblack@eecs.umich.edu      public:
714590Sgblack@eecs.umich.edu        TickEvent(SimpleCPU *c);
724590Sgblack@eecs.umich.edu        void process();
734590Sgblack@eecs.umich.edu        const char *description();
744590Sgblack@eecs.umich.edu    };
754590Sgblack@eecs.umich.edu
764590Sgblack@eecs.umich.edu    TickEvent tickEvent;
774590Sgblack@eecs.umich.edu
784696Sgblack@eecs.umich.edu    /// Schedule tick event, regardless of its current state.
794696Sgblack@eecs.umich.edu    void scheduleTickEvent(int delay)
804696Sgblack@eecs.umich.edu    {
814590Sgblack@eecs.umich.edu        if (tickEvent.squashed())
824590Sgblack@eecs.umich.edu            tickEvent.reschedule(curTick + delay);
834590Sgblack@eecs.umich.edu        else if (!tickEvent.scheduled())
844590Sgblack@eecs.umich.edu            tickEvent.schedule(curTick + delay);
854590Sgblack@eecs.umich.edu    }
864519Sgblack@eecs.umich.edu
874519Sgblack@eecs.umich.edu    /// Unschedule tick event, regardless of its current state.
884519Sgblack@eecs.umich.edu    void unscheduleTickEvent()
894519Sgblack@eecs.umich.edu    {
904519Sgblack@eecs.umich.edu        if (tickEvent.scheduled())
914519Sgblack@eecs.umich.edu            tickEvent.squash();
924519Sgblack@eecs.umich.edu    }
934590Sgblack@eecs.umich.edu
944590Sgblack@eecs.umich.edu  private:
954590Sgblack@eecs.umich.edu    Trace::InstRecord *traceData;
964590Sgblack@eecs.umich.edu    template<typename T>
974590Sgblack@eecs.umich.edu    void trace_data(T data) {
984519Sgblack@eecs.umich.edu      if (traceData) {
994519Sgblack@eecs.umich.edu        traceData->setData(data);
1004519Sgblack@eecs.umich.edu      }
1014590Sgblack@eecs.umich.edu    };
1024519Sgblack@eecs.umich.edu
1034519Sgblack@eecs.umich.edu  public:
1044519Sgblack@eecs.umich.edu    //
1054590Sgblack@eecs.umich.edu    enum Status {
1064590Sgblack@eecs.umich.edu        Running,
1074519Sgblack@eecs.umich.edu        Idle,
1084519Sgblack@eecs.umich.edu        IcacheMissStall,
1094519Sgblack@eecs.umich.edu        IcacheMissComplete,
1104519Sgblack@eecs.umich.edu        DcacheMissStall,
1114519Sgblack@eecs.umich.edu        SwitchedOut
1124696Sgblack@eecs.umich.edu    };
1134696Sgblack@eecs.umich.edu
1144696Sgblack@eecs.umich.edu  private:
1154696Sgblack@eecs.umich.edu    Status _status;
1164696Sgblack@eecs.umich.edu
1174696Sgblack@eecs.umich.edu  public:
1184696Sgblack@eecs.umich.edu    void post_interrupt(int int_num, int index);
1194696Sgblack@eecs.umich.edu
1204696Sgblack@eecs.umich.edu    void zero_fill_64(Addr addr) {
1214696Sgblack@eecs.umich.edu      static int warned = 0;
1224696Sgblack@eecs.umich.edu      if (!warned) {
1234696Sgblack@eecs.umich.edu        warn ("WH64 is not implemented");
1244696Sgblack@eecs.umich.edu        warned = 1;
1254696Sgblack@eecs.umich.edu      }
1264696Sgblack@eecs.umich.edu    };
1274696Sgblack@eecs.umich.edu
1284519Sgblack@eecs.umich.edu#ifdef FULL_SYSTEM
1294590Sgblack@eecs.umich.edu
1304590Sgblack@eecs.umich.edu    SimpleCPU(const std::string &_name,
1314590Sgblack@eecs.umich.edu              System *_system,
1324590Sgblack@eecs.umich.edu              Counter max_insts_any_thread, Counter max_insts_all_threads,
1334590Sgblack@eecs.umich.edu              Counter max_loads_any_thread, Counter max_loads_all_threads,
1344590Sgblack@eecs.umich.edu              AlphaItb *itb, AlphaDtb *dtb, FunctionalMemory *mem,
1354590Sgblack@eecs.umich.edu              MemInterface *icache_interface, MemInterface *dcache_interface,
1364590Sgblack@eecs.umich.edu              Tick freq);
1374590Sgblack@eecs.umich.edu
1384590Sgblack@eecs.umich.edu#else
1394590Sgblack@eecs.umich.edu
1404519Sgblack@eecs.umich.edu    SimpleCPU(const std::string &_name, Process *_process,
141              Counter max_insts_any_thread,
142              Counter max_insts_all_threads,
143              Counter max_loads_any_thread,
144              Counter max_loads_all_threads,
145              MemInterface *icache_interface, MemInterface *dcache_interface);
146
147#endif
148
149    virtual ~SimpleCPU();
150
151    // execution context
152    ExecContext *xc;
153
154    void switchOut();
155    void takeOverFrom(BaseCPU *oldCPU);
156
157#ifdef FULL_SYSTEM
158    Addr dbg_vtophys(Addr addr);
159
160    bool interval_stats;
161#endif
162
163    // L1 instruction cache
164    MemInterface *icacheInterface;
165
166    // L1 data cache
167    MemInterface *dcacheInterface;
168
169    // current instruction
170    MachInst inst;
171
172    // Refcounted pointer to the one memory request.
173    MemReqPtr memReq;
174
175    class CacheCompletionEvent : public Event
176    {
177      private:
178        SimpleCPU *cpu;
179
180      public:
181        CacheCompletionEvent(SimpleCPU *_cpu);
182
183        virtual void process();
184        virtual const char *description();
185    };
186
187    CacheCompletionEvent cacheCompletionEvent;
188
189    Status status() const { return _status; }
190
191    virtual void activateContext(int thread_num, int delay);
192    virtual void suspendContext(int thread_num);
193    virtual void deallocateContext(int thread_num);
194    virtual void haltContext(int thread_num);
195
196    // statistics
197    virtual void regStats();
198    virtual void resetStats();
199
200    // number of simulated instructions
201    Counter numInst;
202    Counter startNumInst;
203    Statistics::Formula numInsts;
204
205    // number of simulated memory references
206    Statistics::Scalar<> numMemRefs;
207
208    // number of simulated loads
209    Counter numLoad;
210    Counter startNumLoad;
211
212    // number of idle cycles
213    Statistics::Average<> notIdleFraction;
214    Statistics::Formula idleFraction;
215
216    // number of cycles stalled for I-cache misses
217    Statistics::Scalar<> icacheStallCycles;
218    Counter lastIcacheStall;
219
220    // number of cycles stalled for D-cache misses
221    Statistics::Scalar<> dcacheStallCycles;
222    Counter lastDcacheStall;
223
224    void processCacheCompletion();
225
226    virtual void serialize(std::ostream &os);
227    virtual void unserialize(Checkpoint *cp, const std::string &section);
228
229    template <class T>
230    Fault read(Addr addr, T& data, unsigned flags);
231
232    template <class T>
233    Fault write(T data, Addr addr, unsigned flags,
234                        uint64_t *res);
235
236    Fault prefetch(Addr addr, unsigned flags)
237    {
238        // need to do this...
239        return No_Fault;
240    }
241
242    void writeHint(Addr addr, int size)
243    {
244        // need to do this...
245    }
246};
247
248#endif // __SIMPLE_CPU_HH__
249