gem5  v19.0.0.0
thread_context.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2012, 2016-2018 ARM Limited
3  * Copyright (c) 2013 Advanced Micro Devices, Inc.
4  * All rights reserved
5  *
6  * The license below extends only to copyright in the software and shall
7  * not be construed as granting a license to any other intellectual
8  * property including but not limited to intellectual property relating
9  * to a hardware implementation of the functionality of the software
10  * licensed hereunder. You may use the software subject to the license
11  * terms below provided that you ensure that this notice is replicated
12  * unmodified and in its entirety in all distributions of the software,
13  * modified or unmodified, in source code or in binary form.
14  *
15  * Copyright (c) 2006 The Regents of The University of Michigan
16  * All rights reserved.
17  *
18  * Redistribution and use in source and binary forms, with or without
19  * modification, are permitted provided that the following conditions are
20  * met: redistributions of source code must retain the above copyright
21  * notice, this list of conditions and the following disclaimer;
22  * redistributions in binary form must reproduce the above copyright
23  * notice, this list of conditions and the following disclaimer in the
24  * documentation and/or other materials provided with the distribution;
25  * neither the name of the copyright holders nor the names of its
26  * contributors may be used to endorse or promote products derived from
27  * this software without specific prior written permission.
28  *
29  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
31  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
32  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
34  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
35  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
36  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
39  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40  *
41  * Authors: Kevin Lim
42  */
43 
44 #ifndef __CPU_CHECKER_THREAD_CONTEXT_HH__
45 #define __CPU_CHECKER_THREAD_CONTEXT_HH__
46 
47 #include "arch/types.hh"
48 #include "config/the_isa.hh"
49 #include "cpu/checker/cpu.hh"
50 #include "cpu/simple_thread.hh"
51 #include "cpu/thread_context.hh"
52 #include "debug/Checker.hh"
53 
54 class EndQuiesceEvent;
55 namespace Kernel {
56  class Statistics;
57 };
58 namespace TheISA {
59  class Decoder;
60 };
61 
70 template <class TC>
72 {
73  public:
74  CheckerThreadContext(TC *actual_tc,
75  CheckerCPU *checker_cpu)
76  : actualTC(actual_tc), checkerTC(checker_cpu->thread),
77  checkerCPU(checker_cpu)
78  { }
79 
80  private:
83  TC *actualTC;
90 
91  public:
92  bool schedule(PCEvent *e) override { return actualTC->schedule(e); }
93  bool remove(PCEvent *e) override { return actualTC->remove(e); }
94 
95  void
97  {
98  actualTC->scheduleInstCountEvent(event, count);
99  }
100  void
102  {
103  actualTC->descheduleInstCountEvent(event);
104  }
105  Tick
107  {
108  return actualTC->getCurrentInstCount();
109  }
110 
111  BaseCPU *getCpuPtr() override { return actualTC->getCpuPtr(); }
112 
113  uint32_t socketId() const override { return actualTC->socketId(); }
114 
115  int cpuId() const override { return actualTC->cpuId(); }
116 
117  ContextID contextId() const override { return actualTC->contextId(); }
118 
119  void
120  setContextId(ContextID id) override
121  {
122  actualTC->setContextId(id);
123  checkerTC->setContextId(id);
124  }
125 
127  int threadId() const override { return actualTC->threadId(); }
128  void
129  setThreadId(int id) override
130  {
131  checkerTC->setThreadId(id);
132  actualTC->setThreadId(id);
133  }
134 
135  BaseTLB *getITBPtr() override { return actualTC->getITBPtr(); }
136 
137  BaseTLB *getDTBPtr() override { return actualTC->getDTBPtr(); }
138 
139  CheckerCPU *
140  getCheckerCpuPtr() override
141  {
142  return checkerCPU;
143  }
144 
145  BaseISA *getIsaPtr() override { return actualTC->getIsaPtr(); }
146 
147  TheISA::Decoder *
148  getDecoderPtr() override
149  {
150  return actualTC->getDecoderPtr();
151  }
152 
153  System *getSystemPtr() override { return actualTC->getSystemPtr(); }
154 
156  getKernelStats() override
157  {
158  return actualTC->getKernelStats();
159  }
160 
161  Process *getProcessPtr() override { return actualTC->getProcessPtr(); }
162 
163  void setProcessPtr(Process *p) override { actualTC->setProcessPtr(p); }
164 
165  PortProxy &getPhysProxy() override { return actualTC->getPhysProxy(); }
166 
167  PortProxy &
168  getVirtProxy() override
169  {
170  return actualTC->getVirtProxy();
171  }
172 
173  void
175  {
176  actualTC->initMemProxies(tc);
177  }
178 
179  void
181  {
182  actualTC->connectMemPorts(tc);
183  }
184 
186  void
187  syscall(Fault *fault) override
188  {
189  return actualTC->syscall(fault);
190  }
191 
192  Status status() const override { return actualTC->status(); }
193 
194  void
195  setStatus(Status new_status) override
196  {
197  actualTC->setStatus(new_status);
198  checkerTC->setStatus(new_status);
199  }
200 
202  void activate() override { actualTC->activate(); }
203 
205  void suspend() override { actualTC->suspend(); }
206 
208  void halt() override { actualTC->halt(); }
209 
210  void dumpFuncProfile() override { actualTC->dumpFuncProfile(); }
211 
212  void
213  takeOverFrom(ThreadContext *oldContext) override
214  {
215  actualTC->takeOverFrom(oldContext);
216  checkerTC->copyState(oldContext);
217  }
218 
219  void
220  regStats(const std::string &name) override
221  {
222  actualTC->regStats(name);
223  checkerTC->regStats(name);
224  }
225 
227  getQuiesceEvent() override
228  {
229  return actualTC->getQuiesceEvent();
230  }
231 
232  Tick readLastActivate() override { return actualTC->readLastActivate(); }
233  Tick readLastSuspend() override { return actualTC->readLastSuspend(); }
234 
235  void profileClear() override { return actualTC->profileClear(); }
236  void profileSample() override { return actualTC->profileSample(); }
237 
238  // @todo: Do I need this?
239  void
241  {
242  actualTC->copyArchRegs(tc);
243  checkerTC->copyArchRegs(tc);
244  }
245 
246  void
247  clearArchRegs() override
248  {
249  actualTC->clearArchRegs();
250  checkerTC->clearArchRegs();
251  }
252 
253  //
254  // New accessors for new decoder.
255  //
256  RegVal
257  readIntReg(RegIndex reg_idx) const override
258  {
259  return actualTC->readIntReg(reg_idx);
260  }
261 
262  RegVal
263  readFloatReg(RegIndex reg_idx) const override
264  {
265  return actualTC->readFloatReg(reg_idx);
266  }
267 
268  const VecRegContainer &
269  readVecReg (const RegId &reg) const override
270  {
271  return actualTC->readVecReg(reg);
272  }
273 
278  getWritableVecReg (const RegId &reg) override
279  {
280  return actualTC->getWritableVecReg(reg);
281  }
282 
287  readVec8BitLaneReg(const RegId &reg) const override
288  {
289  return actualTC->readVec8BitLaneReg(reg);
290  }
291 
294  readVec16BitLaneReg(const RegId &reg) const override
295  {
296  return actualTC->readVec16BitLaneReg(reg);
297  }
298 
301  readVec32BitLaneReg(const RegId &reg) const override
302  {
303  return actualTC->readVec32BitLaneReg(reg);
304  }
305 
308  readVec64BitLaneReg(const RegId &reg) const override
309  {
310  return actualTC->readVec64BitLaneReg(reg);
311  }
312 
314  virtual void
316  const LaneData<LaneSize::Byte> &val) override
317  {
318  return actualTC->setVecLane(reg, val);
319  }
320  virtual void
322  const LaneData<LaneSize::TwoByte> &val) override
323  {
324  return actualTC->setVecLane(reg, val);
325  }
326  virtual void
328  const LaneData<LaneSize::FourByte> &val) override
329  {
330  return actualTC->setVecLane(reg, val);
331  }
332  virtual void
334  const LaneData<LaneSize::EightByte> &val) override
335  {
336  return actualTC->setVecLane(reg, val);
337  }
340  const VecElem &
341  readVecElem(const RegId& reg) const override
342  {
343  return actualTC->readVecElem(reg);
344  }
345 
346  const VecPredRegContainer &
347  readVecPredReg(const RegId& reg) const override
348  {
349  return actualTC->readVecPredReg(reg);
350  }
351 
353  getWritableVecPredReg(const RegId& reg) override
354  {
355  return actualTC->getWritableVecPredReg(reg);
356  }
357 
358  RegVal
359  readCCReg(RegIndex reg_idx) const override
360  {
361  return actualTC->readCCReg(reg_idx);
362  }
363 
364  void
365  setIntReg(RegIndex reg_idx, RegVal val) override
366  {
367  actualTC->setIntReg(reg_idx, val);
368  checkerTC->setIntReg(reg_idx, val);
369  }
370 
371  void
372  setFloatReg(RegIndex reg_idx, RegVal val) override
373  {
374  actualTC->setFloatReg(reg_idx, val);
375  checkerTC->setFloatReg(reg_idx, val);
376  }
377 
378  void
379  setVecReg(const RegId& reg, const VecRegContainer& val) override
380  {
381  actualTC->setVecReg(reg, val);
382  checkerTC->setVecReg(reg, val);
383  }
384 
385  void
386  setVecElem(const RegId& reg, const VecElem& val) override
387  {
388  actualTC->setVecElem(reg, val);
389  checkerTC->setVecElem(reg, val);
390  }
391 
392  void
393  setVecPredReg(const RegId& reg, const VecPredRegContainer& val) override
394  {
395  actualTC->setVecPredReg(reg, val);
396  checkerTC->setVecPredReg(reg, val);
397  }
398 
399  void
400  setCCReg(RegIndex reg_idx, RegVal val) override
401  {
402  actualTC->setCCReg(reg_idx, val);
403  checkerTC->setCCReg(reg_idx, val);
404  }
405 
407  TheISA::PCState pcState() const override { return actualTC->pcState(); }
408 
410  void
411  pcState(const TheISA::PCState &val) override
412  {
413  DPRINTF(Checker, "Changing PC to %s, old PC %s\n",
414  val, checkerTC->pcState());
415  checkerTC->pcState(val);
416  checkerCPU->recordPCChange(val);
417  return actualTC->pcState(val);
418  }
419 
420  void
422  {
423  checkerTC->setNPC(val);
424  actualTC->setNPC(val);
425  }
426 
427  void
429  {
430  return actualTC->pcState(val);
431  }
432 
434  Addr instAddr() const override { return actualTC->instAddr(); }
435 
437  Addr nextInstAddr() const override { return actualTC->nextInstAddr(); }
438 
440  MicroPC microPC() const override { return actualTC->microPC(); }
441 
442  RegVal
443  readMiscRegNoEffect(RegIndex misc_reg) const override
444  {
445  return actualTC->readMiscRegNoEffect(misc_reg);
446  }
447 
448  RegVal
449  readMiscReg(RegIndex misc_reg) override
450  {
451  return actualTC->readMiscReg(misc_reg);
452  }
453 
454  void
455  setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
456  {
457  DPRINTF(Checker, "Setting misc reg with no effect: %d to both Checker"
458  " and O3..\n", misc_reg);
459  checkerTC->setMiscRegNoEffect(misc_reg, val);
460  actualTC->setMiscRegNoEffect(misc_reg, val);
461  }
462 
463  void
464  setMiscReg(RegIndex misc_reg, RegVal val) override
465  {
466  DPRINTF(Checker, "Setting misc reg with effect: %d to both Checker"
467  " and O3..\n", misc_reg);
468  checkerTC->setMiscReg(misc_reg, val);
469  actualTC->setMiscReg(misc_reg, val);
470  }
471 
472  RegId
473  flattenRegId(const RegId& regId) const override
474  {
475  return actualTC->flattenRegId(regId);
476  }
477 
478  unsigned
479  readStCondFailures() const override
480  {
481  return actualTC->readStCondFailures();
482  }
483 
484  void
485  setStCondFailures(unsigned sc_failures) override
486  {
487  actualTC->setStCondFailures(sc_failures);
488  }
489 
490  Counter
491  readFuncExeInst() const override
492  {
493  return actualTC->readFuncExeInst();
494  }
495 
496  RegVal
497  readIntRegFlat(RegIndex idx) const override
498  {
499  return actualTC->readIntRegFlat(idx);
500  }
501 
502  void
504  {
505  actualTC->setIntRegFlat(idx, val);
506  }
507 
508  RegVal
509  readFloatRegFlat(RegIndex idx) const override
510  {
511  return actualTC->readFloatRegFlat(idx);
512  }
513 
514  void
516  {
517  actualTC->setFloatRegFlat(idx, val);
518  }
519 
520  const VecRegContainer &
521  readVecRegFlat(RegIndex idx) const override
522  {
523  return actualTC->readVecRegFlat(idx);
524  }
525 
531  {
532  return actualTC->getWritableVecRegFlat(idx);
533  }
534 
535  void
537  {
538  actualTC->setVecRegFlat(idx, val);
539  }
540 
541  const VecElem &
542  readVecElemFlat(RegIndex idx, const ElemIndex& elem_idx) const override
543  {
544  return actualTC->readVecElemFlat(idx, elem_idx);
545  }
546 
547  void
549  const ElemIndex& elem_idx, const VecElem& val) override
550  {
551  actualTC->setVecElemFlat(idx, elem_idx, val);
552  }
553 
554  const VecPredRegContainer &
555  readVecPredRegFlat(RegIndex idx) const override
556  {
557  return actualTC->readVecPredRegFlat(idx);
558  }
559 
562  {
563  return actualTC->getWritableVecPredRegFlat(idx);
564  }
565 
566  void
568  {
569  actualTC->setVecPredRegFlat(idx, val);
570  }
571 
572  RegVal
573  readCCRegFlat(RegIndex idx) const override
574  {
575  return actualTC->readCCRegFlat(idx);
576  }
577 
578  void
580  {
581  actualTC->setCCRegFlat(idx, val);
582  }
583 };
584 
585 #endif // __CPU_CHECKER_EXEC_CONTEXT_HH__
count
Definition: misc.hh:705
virtual void setVecLane(const RegId &reg, const LaneData< LaneSize::EightByte > &val) override
#define DPRINTF(x,...)
Definition: trace.hh:229
CheckerCPU * checkerCPU
Pointer to the checker CPU.
void setCCRegFlat(RegIndex idx, RegVal val) override
TheISA::VecElem VecElem
::Kernel::Statistics * getKernelStats() override
Bitfield< 5, 3 > reg
Definition: types.hh:89
RegVal readCCRegFlat(RegIndex idx) const override
void setIntRegFlat(RegIndex idx, RegVal val) override
const std::string & name()
Definition: trace.cc:54
CheckerCPU class.
Definition: cpu.hh:87
Tick readLastSuspend() override
void pcState(const TheISA::PCState &val) override
Sets this thread&#39;s PC state.
Vector Register Abstraction This generic class is the model in a particularization of MVC...
Definition: vec_reg.hh:160
uint32_t socketId() const override
const VecRegContainer & readVecRegFlat(RegIndex idx) const override
RegVal readFloatReg(RegIndex reg_idx) const override
ContextID contextId() const override
void setThreadId(int id) override
virtual void setVecLane(const RegId &reg, const LaneData< LaneSize::TwoByte > &val) override
Addr instAddr() const override
Reads this thread&#39;s PC.
void setMiscReg(RegIndex misc_reg, RegVal val) override
RegVal readIntReg(RegIndex reg_idx) const override
void setStCondFailures(unsigned sc_failures) override
void clearArchRegs() override
TheISA::PCState pcState() const override
void setProcessPtr(Process *p) override
TheISA::Decoder * getDecoderPtr() override
bool schedule(PCEvent *e) override
uint64_t RegVal
Definition: types.hh:168
void takeOverFrom(ThreadContext *oldContext) override
The SimpleThread object provides a combination of the ThreadState object and the ThreadContext interf...
void setStatus(Status newStatus) override
EndQuiesceEvent * getQuiesceEvent() override
Definition: system.hh:77
virtual void setVecLane(const RegId &reg, const LaneData< LaneSize::Byte > &val) override
Write a lane of the destination vector register.
void setContextId(ContextID id) override
ThreadContext is the external interface to all thread state for anything outside of the CPU...
Event for timing out quiesce instruction.
TC * actualTC
The main CPU&#39;s ThreadContext, or class that implements the ThreadContext interface.
void setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
void suspend() override
Set the status to Suspended.
const VecRegContainer & readVecReg(const RegId &reg) const override
Bitfield< 63 > val
Definition: misc.hh:771
Templated Checker class.
Definition: cpu.hh:622
void setVecElem(const RegId &reg, const VecElem &val) override
void setCCReg(RegIndex reg_idx, RegVal val) override
Derived ThreadContext class for use with the Checker.
void setIntReg(RegIndex reg_idx, RegVal val) override
void setVecPredReg(const RegId &reg, const VecPredRegContainer &val) override
Definition: tlb.hh:52
LaneSize is an abstraction of a LS byte value for the execution and thread contexts to handle values ...
Definition: vec_reg.hh:457
BaseCPU * getCpuPtr() override
VecRegContainer & getWritableVecReg(const RegId &reg) override
Read vector register for modification, hierarchical indexing.
BaseTLB * getDTBPtr() override
Tick readLastActivate() override
void setCCReg(RegIndex reg_idx, RegVal val) override
void descheduleInstCountEvent(Event *event) override
System * getSystemPtr() override
void setIntReg(RegIndex reg_idx, RegVal val) override
uint16_t RegIndex
Definition: types.hh:42
void setFloatReg(RegIndex reg_idx, RegVal val) override
virtual void setVecLane(const RegId &reg, const LaneData< LaneSize::FourByte > &val) override
void syscall(Fault *fault) override
Executes a syscall in SE mode.
uint64_t Tick
Tick count type.
Definition: types.hh:63
PortProxy & getPhysProxy() override
MicroPC microPC() const override
Reads this thread&#39;s next PC.
PortProxy & getVirtProxy() override
void setFloatReg(RegIndex reg_idx, RegVal val) override
void setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
VecPredRegContainer & getWritableVecPredReg(const RegId &reg) override
void copyArchRegs(ThreadContext *tc) override
void profileClear() override
uint16_t MicroPC
Definition: types.hh:144
void setNPC(Addr val)
void setMiscReg(RegIndex misc_reg, RegVal val) override
void regStats(const std::string &name) override
RegId flattenRegId(const RegId &regId) const override
VecPredRegContainer & getWritableVecPredRegFlat(RegIndex idx) override
CheckerCPU * getCheckerCpuPtr() override
void clearArchRegs() override
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
void dumpFuncProfile() override
RegVal readFloatRegFlat(RegIndex idx) const override
int64_t Counter
Statistics counter type.
Definition: types.hh:58
int cpuId() const override
Bitfield< 10, 5 > event
RegVal readMiscRegNoEffect(RegIndex misc_reg) const override
ConstVecLane32 readVec32BitLaneReg(const RegId &reg) const override
Reads source vector 32bit operand.
CheckerThreadContext(TC *actual_tc, CheckerCPU *checker_cpu)
const VecPredRegContainer & readVecPredRegFlat(RegIndex idx) const override
This object is a proxy for a port or other object which implements the functional response protocol...
Definition: port_proxy.hh:82
Bitfield< 9 > e
void setThreadId(int id) override
void setStatus(Status new_status) override
void setVecRegFlat(RegIndex idx, const VecRegContainer &val) override
void setVecReg(const RegId &reg, const VecRegContainer &val) override
RegVal readIntRegFlat(RegIndex idx) const override
Flat register interfaces.
void setContextId(ContextID id) override
unsigned readStCondFailures() const override
RegVal readCCReg(RegIndex reg_idx) const override
TheISA::PCState pcState() const override
Reads this thread&#39;s PC state.
uint16_t ElemIndex
Logical vector register elem index type.
Definition: types.hh:45
void setFloatRegFlat(RegIndex idx, RegVal val) override
void copyState(ThreadContext *oldContext)
Definition: eventq.hh:189
GenericISA::SimplePCState< MachInst > PCState
Definition: types.hh:43
int threadId() const override
Returns this thread&#39;s ID number.
void regStats(const std::string &name) override
Generic predicate register container.
Definition: vec_pred_reg.hh:51
void scheduleInstCountEvent(Event *event, Tick count) override
void copyArchRegs(ThreadContext *tc) override
VecRegContainer & getWritableVecRegFlat(RegIndex idx) override
Read vector register for modification, flat indexing.
void setVecPredReg(const RegId &reg, const VecPredRegContainer &val) override
Register ID: describe an architectural register with its class and index.
Definition: reg_class.hh:79
Definition: isa.hh:35
void pcStateNoRecord(const TheISA::PCState &val) override
Tick getCurrentInstCount() override
SimpleThread * checkerTC
The checker&#39;s own SimpleThread.
void recordPCChange(const TheISA::PCState &val)
Definition: cpu.hh:503
void profileSample() override
void activate() override
Set the status to Active.
void setVecPredRegFlat(RegIndex idx, const VecPredRegContainer &val) override
BaseISA * getIsaPtr() override
void setVecElemFlat(RegIndex idx, const ElemIndex &elem_idx, const VecElem &val) override
ConstVecLane16 readVec16BitLaneReg(const RegId &reg) const override
Reads source vector 16bit operand.
RegVal readMiscReg(RegIndex misc_reg) override
void setVecReg(const RegId &reg, const VecRegContainer &val) override
void initMemProxies(ThreadContext *tc) override
Initialise the physical and virtual port proxies and tie them to the data port of the CPU...
Vector Lane abstraction Another view of a container.
Definition: vec_reg.hh:262
ConstVecLane64 readVec64BitLaneReg(const RegId &reg) const override
Reads source vector 64bit operand.
Process * getProcessPtr() override
const VecElem & readVecElemFlat(RegIndex idx, const ElemIndex &elem_idx) const override
Status status() const override
Bitfield< 0 > p
void halt() override
Set the status to Halted.
std::shared_ptr< FaultBase > Fault
Definition: types.hh:240
ConstVecLane8 readVec8BitLaneReg(const RegId &reg) const override
Vector Register Lane Interfaces.
int ContextID
Globally unique thread context ID.
Definition: types.hh:231
void setNPC(Addr val)
Counter readFuncExeInst() const override
BaseTLB * getITBPtr() override
Addr nextInstAddr() const override
Reads this thread&#39;s next PC.
void setVecElem(const RegId &reg, const VecElem &val) override
const VecElem & readVecElem(const RegId &reg) const override
const VecPredRegContainer & readVecPredReg(const RegId &reg) const override
void connectMemPorts(ThreadContext *tc)

Generated on Fri Feb 28 2020 16:26:56 for gem5 by doxygen 1.8.13