X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=cpu%2Fbase_cpu.hh;h=f38a6c9391e59289aede44877db914c157742438;hb=87d27637aa2e99d5218e2e5dd5b728a3d650a2e7;hp=9e55d5d3cf9fe4ec797ca66c30cdf33097931f9c;hpb=caf5cad959d8c75095590e0e6e1a9ed1f243366e;p=gem5.git diff --git a/cpu/base_cpu.hh b/cpu/base_cpu.hh index 9e55d5d3c..f38a6c939 100644 --- a/cpu/base_cpu.hh +++ b/cpu/base_cpu.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003 The Regents of The University of Michigan + * Copyright (c) 2002-2004 The Regents of The University of Michigan * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,6 +32,7 @@ #include #include "base/statistics.hh" +#include "cpu/sampling_cpu/sampling_cpu.hh" #include "sim/eventq.hh" #include "sim/sim_object.hh" #include "targetarch/isa_traits.hh" @@ -45,9 +46,17 @@ class ExecContext; class BaseCPU : public SimObject { + protected: + // CPU's clock period in terms of the number of ticks of curTime. + Tick clock; + + public: + inline Tick frequency() const { return Clock::Frequency / clock; } + inline Tick cycles(int numCycles) const { return clock * numCycles; } + inline Tick curCycle() const { return curTick / clock; } + #ifdef FULL_SYSTEM protected: - Tick frequency; uint64_t interrupts[NumInterruptLevels]; uint64_t intstatus; @@ -55,6 +64,7 @@ class BaseCPU : public SimObject virtual void post_interrupt(int int_num, int index); virtual void clear_interrupt(int int_num, int index); virtual void clear_interrupts(); + bool checkInterrupts; bool check_interrupt(int int_num) const { if (int_num > NumInterruptLevels) @@ -65,8 +75,6 @@ class BaseCPU : public SimObject bool check_interrupts() const { return intstatus != 0; } uint64_t intr_status() const { return intstatus; } - - Tick getFreq() const { return frequency; } #endif protected: @@ -89,29 +97,36 @@ class BaseCPU : public SimObject virtual void haltContext(int thread_num) {} public: - + struct Params + { + std::string name; + int numberOfThreads; + bool deferRegistration; + Counter max_insts_any_thread; + Counter max_insts_all_threads; + Counter max_loads_any_thread; + Counter max_loads_all_threads; + Tick clock; + bool functionTrace; + Tick functionTraceStart; #ifdef FULL_SYSTEM - BaseCPU(const std::string &_name, int _number_of_threads, - Counter max_insts_any_thread, Counter max_insts_all_threads, - Counter max_loads_any_thread, Counter max_loads_all_threads, - System *_system, Tick freq); -#else - BaseCPU(const std::string &_name, int _number_of_threads, - Counter max_insts_any_thread = 0, - Counter max_insts_all_threads = 0, - Counter max_loads_any_thread = 0, - Counter max_loads_all_threads = 0); + System *system; #endif + }; + + const Params *params; - virtual ~BaseCPU() {} + BaseCPU(Params *params); + virtual ~BaseCPU(); + virtual void init(); virtual void regStats(); void registerExecContexts(); - /// Prepare for another CPU to take over execution. Called by - /// takeOverFrom() on its argument. - virtual void switchOut(); + /// Prepare for another CPU to take over execution. When it is + /// is ready (drained pipe) it signals the sampler. + virtual void switchOut(SamplingCPU *); /// Take over execution from the given CPU. Used for warm-up and /// sampling. @@ -139,6 +154,20 @@ class BaseCPU : public SimObject #ifdef FULL_SYSTEM System *system; + + /** + * Serialize this object to the given output stream. + * @param os The stream to serialize to. + */ + virtual void serialize(std::ostream &os); + + /** + * Reconstruct the state of this object from a checkpoint. + * @param cp The checkpoint use. + * @param section The section name of this object + */ + virtual void unserialize(Checkpoint *cp, const std::string §ion); + #endif /** @@ -149,6 +178,23 @@ class BaseCPU : public SimObject virtual Counter totalInstructions() const { return 0; } + // Function tracing + private: + bool functionTracingEnabled; + std::ostream *functionTraceStream; + Addr currentFunctionStart; + Addr currentFunctionEnd; + Tick functionEntryTick; + void enableFunctionTrace(); + void traceFunctionsInternal(Addr pc); + + protected: + void traceFunctions(Addr pc) + { + if (functionTracingEnabled) + traceFunctionsInternal(pc); + } + private: static std::vector cpuList; //!< Static global cpu list