gem5  v22.0.0.2
thread_context.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2012, 2016-2018, 2020-2021 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 
42 #ifndef __CPU_CHECKER_THREAD_CONTEXT_HH__
43 #define __CPU_CHECKER_THREAD_CONTEXT_HH__
44 
45 #include "arch/generic/pcstate.hh"
46 #include "config/the_isa.hh"
47 #include "cpu/checker/cpu.hh"
48 #include "cpu/simple_thread.hh"
49 #include "cpu/thread_context.hh"
50 #include "debug/Checker.hh"
51 
52 namespace gem5
53 {
54 
55 namespace TheISA
56 {
57  class Decoder;
58 } // namespace TheISA
59 
68 template <class TC>
70 {
71  public:
72  CheckerThreadContext(TC *actual_tc,
73  CheckerCPU *checker_cpu)
74  : actualTC(actual_tc), checkerTC(checker_cpu->thread),
75  checkerCPU(checker_cpu)
76  { }
77 
78  private:
81  TC *actualTC;
88 
89  public:
90  bool
91  schedule(PCEvent *e) override
92  {
93  [[maybe_unused]] bool check_ret = checkerTC->schedule(e);
94  bool actual_ret = actualTC->schedule(e);
95  assert(actual_ret == check_ret);
96  return actual_ret;
97  }
98 
99  bool
100  remove(PCEvent *e) override
101  {
102  [[maybe_unused]] bool check_ret = checkerTC->remove(e);
103  bool actual_ret = actualTC->remove(e);
104  assert(actual_ret == check_ret);
105  return actual_ret;
106  }
107 
108  void
110  {
111  actualTC->scheduleInstCountEvent(event, count);
112  }
113  void
115  {
116  actualTC->descheduleInstCountEvent(event);
117  }
118  Tick
120  {
121  return actualTC->getCurrentInstCount();
122  }
123 
124  BaseCPU *getCpuPtr() override { return actualTC->getCpuPtr(); }
125 
126  uint32_t socketId() const override { return actualTC->socketId(); }
127 
128  int cpuId() const override { return actualTC->cpuId(); }
129 
130  ContextID contextId() const override { return actualTC->contextId(); }
131 
132  void
133  setContextId(ContextID id) override
134  {
135  actualTC->setContextId(id);
136  checkerTC->setContextId(id);
137  }
138 
140  int threadId() const override { return actualTC->threadId(); }
141  void
142  setThreadId(int id) override
143  {
144  checkerTC->setThreadId(id);
145  actualTC->setThreadId(id);
146  }
147 
148  BaseMMU *getMMUPtr() override { return actualTC->getMMUPtr(); }
149 
150  CheckerCPU *
151  getCheckerCpuPtr() override
152  {
153  return checkerCPU;
154  }
155 
156  BaseISA *getIsaPtr() const override { return actualTC->getIsaPtr(); }
157 
158  InstDecoder *
159  getDecoderPtr() override
160  {
161  return actualTC->getDecoderPtr();
162  }
163 
164  System *getSystemPtr() override { return actualTC->getSystemPtr(); }
165 
166  Process *getProcessPtr() override { return actualTC->getProcessPtr(); }
167 
168  void setProcessPtr(Process *p) override { actualTC->setProcessPtr(p); }
169 
170  void
172  {
173  actualTC->connectMemPorts(tc);
174  }
175 
176  Status status() const override { return actualTC->status(); }
177 
178  void
179  setStatus(Status new_status) override
180  {
181  actualTC->setStatus(new_status);
182  checkerTC->setStatus(new_status);
183  }
184 
186  void activate() override { actualTC->activate(); }
187 
189  void suspend() override { actualTC->suspend(); }
190 
192  void halt() override { actualTC->halt(); }
193 
194  void
195  takeOverFrom(ThreadContext *oldContext) override
196  {
197  actualTC->takeOverFrom(oldContext);
198  checkerTC->copyState(oldContext);
199  }
200 
201  void
202  regStats(const std::string &name) override
203  {
204  actualTC->regStats(name);
206  }
207 
208  Tick readLastActivate() override { return actualTC->readLastActivate(); }
209  Tick readLastSuspend() override { return actualTC->readLastSuspend(); }
210 
211  // @todo: Do I need this?
212  void
214  {
215  actualTC->copyArchRegs(tc);
216  checkerTC->copyArchRegs(tc);
217  }
218 
219  void
220  clearArchRegs() override
221  {
222  actualTC->clearArchRegs();
224  }
225 
226  //
227  // New accessors for new decoder.
228  //
229  RegVal
230  getReg(const RegId &reg) const override
231  {
232  return actualTC->getReg(reg);
233  }
234 
235  void
236  getReg(const RegId &reg, void *val) const override
237  {
238  actualTC->getReg(reg, val);
239  }
240 
241  void *
242  getWritableReg(const RegId &reg) override
243  {
244  return actualTC->getWritableReg(reg);
245  }
246 
247  void
248  setReg(const RegId &reg, RegVal val) override
249  {
250  actualTC->setReg(reg, val);
251  checkerTC->setReg(reg, val);
252  }
253 
254  void
255  setReg(const RegId &reg, const void *val) override
256  {
257  actualTC->setReg(reg, val);
258  checkerTC->setReg(reg, val);
259  }
260 
262  const PCStateBase &pcState() const override { return actualTC->pcState(); }
263 
265  void
266  pcState(const PCStateBase &val) override
267  {
268  DPRINTF(Checker, "Changing PC to %s, old PC %s\n",
269  val, checkerTC->pcState());
272  return actualTC->pcState(val);
273  }
274 
275  void
276  pcStateNoRecord(const PCStateBase &val) override
277  {
278  return actualTC->pcState(val);
279  }
280 
281  RegVal
282  readMiscRegNoEffect(RegIndex misc_reg) const override
283  {
284  return actualTC->readMiscRegNoEffect(misc_reg);
285  }
286 
287  RegVal
288  readMiscReg(RegIndex misc_reg) override
289  {
290  return actualTC->readMiscReg(misc_reg);
291  }
292 
293  void
294  setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
295  {
296  DPRINTF(Checker, "Setting misc reg with no effect: %d to both Checker"
297  " and O3..\n", misc_reg);
298  checkerTC->setMiscRegNoEffect(misc_reg, val);
299  actualTC->setMiscRegNoEffect(misc_reg, val);
300  }
301 
302  void
303  setMiscReg(RegIndex misc_reg, RegVal val) override
304  {
305  DPRINTF(Checker, "Setting misc reg with effect: %d to both Checker"
306  " and O3..\n", misc_reg);
307  checkerTC->setMiscReg(misc_reg, val);
308  actualTC->setMiscReg(misc_reg, val);
309  }
310 
311  RegId
312  flattenRegId(const RegId& regId) const override
313  {
314  return actualTC->flattenRegId(regId);
315  }
316 
317  unsigned
318  readStCondFailures() const override
319  {
320  return actualTC->readStCondFailures();
321  }
322 
323  void
324  setStCondFailures(unsigned sc_failures) override
325  {
326  actualTC->setStCondFailures(sc_failures);
327  }
328 
329  RegVal
330  getRegFlat(const RegId &reg) const override
331  {
332  return actualTC->getRegFlat(reg);
333  }
334 
335  void
336  getRegFlat(const RegId &reg, void *val) const override
337  {
338  actualTC->getRegFlat(reg, val);
339  }
340 
341  void *
342  getWritableRegFlat(const RegId &reg) override
343  {
344  return actualTC->getWritableRegFlat(reg);
345  }
346 
347  void
348  setRegFlat(const RegId &reg, RegVal val) override
349  {
350  actualTC->setRegFlat(reg, val);
352  }
353 
354  void
355  setRegFlat(const RegId &reg, const void *val) override
356  {
357  actualTC->setRegFlat(reg, val);
359  }
360 
361  // hardware transactional memory
362  void
363  htmAbortTransaction(uint64_t htm_uid, HtmFailureFaultCause cause) override
364  {
365  panic("function not implemented");
366  }
367 
370  {
371  return actualTC->getHtmCheckpointPtr();
372  }
373 
374  void
376  {
377  panic("function not implemented");
378  }
379 
380 };
381 
382 } // namespace gem5
383 
384 #endif // __CPU_CHECKER_EXEC_CONTEXT_HH__
gem5::CheckerThreadContext::cpuId
int cpuId() const override
Definition: thread_context.hh:128
gem5::CheckerThreadContext::CheckerThreadContext
CheckerThreadContext(TC *actual_tc, CheckerCPU *checker_cpu)
Definition: thread_context.hh:72
gem5::BaseHTMCheckpointPtr
std::unique_ptr< BaseHTMCheckpoint > BaseHTMCheckpointPtr
Definition: htm.hh:125
gem5::SimpleThread::setRegFlat
void setRegFlat(const RegId &reg, RegVal val) override
Definition: simple_thread.hh:417
gem5::RegVal
uint64_t RegVal
Definition: types.hh:173
gem5::CheckerThreadContext::setMiscReg
void setMiscReg(RegIndex misc_reg, RegVal val) override
Definition: thread_context.hh:303
gem5::CheckerThreadContext::setReg
void setReg(const RegId &reg, const void *val) override
Definition: thread_context.hh:255
gem5::CheckerThreadContext::getCurrentInstCount
Tick getCurrentInstCount() override
Definition: thread_context.hh:119
gem5::HtmFailureFaultCause
HtmFailureFaultCause
Definition: htm.hh:47
gem5::CheckerThreadContext::halt
void halt() override
Set the status to Halted.
Definition: thread_context.hh:192
gem5::CheckerThreadContext::descheduleInstCountEvent
void descheduleInstCountEvent(Event *event) override
Definition: thread_context.hh:114
gem5::CheckerThreadContext::pcState
const PCStateBase & pcState() const override
Reads this thread's PC state.
Definition: thread_context.hh:262
gem5::CheckerThreadContext::setRegFlat
void setRegFlat(const RegId &reg, const void *val) override
Definition: thread_context.hh:355
gem5::CheckerThreadContext::socketId
uint32_t socketId() const override
Definition: thread_context.hh:126
gem5::SimpleThread::copyArchRegs
void copyArchRegs(ThreadContext *tc) override
Definition: simple_thread.cc:167
gem5::CheckerThreadContext::getRegFlat
RegVal getRegFlat(const RegId &reg) const override
Flat register interfaces.
Definition: thread_context.hh:330
gem5::MipsISA::event
Bitfield< 10, 5 > event
Definition: pra_constants.hh:300
gem5::CheckerThreadContext::setRegFlat
void setRegFlat(const RegId &reg, RegVal val) override
Definition: thread_context.hh:348
gem5::CheckerThreadContext::checkerTC
SimpleThread * checkerTC
The checker's own SimpleThread.
Definition: thread_context.hh:85
gem5::ArmISA::e
Bitfield< 9 > e
Definition: misc_types.hh:65
gem5::X86ISA::val
Bitfield< 63 > val
Definition: misc.hh:769
gem5::SimpleThread::setMiscReg
void setMiscReg(RegIndex misc_reg, RegVal val) override
Definition: simple_thread.hh:289
gem5::ThreadContext::Status
Status
Definition: thread_context.hh:105
gem5::CheckerThreadContext::setMiscRegNoEffect
void setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
Definition: thread_context.hh:294
gem5::CheckerThreadContext::getReg
RegVal getReg(const RegId &reg) const override
Definition: thread_context.hh:230
gem5::SimpleThread::remove
bool remove(PCEvent *e) override
Definition: simple_thread.hh:180
gem5::SimpleThread::clearArchRegs
void clearArchRegs() override
Definition: simple_thread.hh:247
gem5::ThreadContext::regStats
virtual void regStats(const std::string &name)
Definition: thread_context.hh:178
gem5::SimpleThread::setContextId
void setContextId(ContextID id) override
Definition: simple_thread.hh:205
gem5::CheckerThreadContext::remove
bool remove(PCEvent *e) override
Definition: thread_context.hh:100
gem5::CheckerThreadContext::actualTC
TC * actualTC
The main CPU's ThreadContext, or class that implements the ThreadContext interface.
Definition: thread_context.hh:81
gem5::CheckerThreadContext
Derived ThreadContext class for use with the Checker.
Definition: thread_context.hh:69
gem5::CheckerThreadContext::scheduleInstCountEvent
void scheduleInstCountEvent(Event *event, Tick count) override
Definition: thread_context.hh:109
gem5::SimpleThread::setReg
void setReg(const RegId &arch_reg, RegVal val) override
Definition: simple_thread.hh:399
gem5::CheckerThreadContext::readMiscReg
RegVal readMiscReg(RegIndex misc_reg) override
Definition: thread_context.hh:288
gem5::SimpleThread
The SimpleThread object provides a combination of the ThreadState object and the ThreadContext interf...
Definition: simple_thread.hh:95
gem5::SimpleThread::setThreadId
void setThreadId(int id) override
Definition: simple_thread.hh:203
gem5::BaseMMU
Definition: mmu.hh:53
gem5::CheckerThreadContext::readLastActivate
Tick readLastActivate() override
Definition: thread_context.hh:208
gem5::CheckerThreadContext::getReg
void getReg(const RegId &reg, void *val) const override
Definition: thread_context.hh:236
gem5::CheckerThreadContext::getSystemPtr
System * getSystemPtr() override
Definition: thread_context.hh:164
gem5::CheckerThreadContext::flattenRegId
RegId flattenRegId(const RegId &regId) const override
Definition: thread_context.hh:312
gem5::CheckerThreadContext::getCpuPtr
BaseCPU * getCpuPtr() override
Definition: thread_context.hh:124
gem5::CheckerThreadContext::suspend
void suspend() override
Set the status to Suspended.
Definition: thread_context.hh:189
gem5::CheckerThreadContext::getCheckerCpuPtr
CheckerCPU * getCheckerCpuPtr() override
Definition: thread_context.hh:151
gem5::CheckerThreadContext::readLastSuspend
Tick readLastSuspend() override
Definition: thread_context.hh:209
gem5::System
Definition: system.hh:75
gem5::CheckerThreadContext::takeOverFrom
void takeOverFrom(ThreadContext *oldContext) override
Definition: thread_context.hh:195
gem5::SimpleThread::copyState
void copyState(ThreadContext *oldContext)
Definition: simple_thread.cc:107
gem5::ThreadContext
ThreadContext is the external interface to all thread state for anything outside of the CPU.
Definition: thread_context.hh:94
gem5::CheckerThreadContext::setReg
void setReg(const RegId &reg, RegVal val) override
Definition: thread_context.hh:248
gem5::VegaISA::p
Bitfield< 54 > p
Definition: pagetable.hh:70
gem5::CheckerThreadContext::clearArchRegs
void clearArchRegs() override
Definition: thread_context.hh:220
gem5::InstDecoder
Definition: decoder.hh:42
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:186
gem5::CheckerThreadContext::connectMemPorts
void connectMemPorts(ThreadContext *tc)
Definition: thread_context.hh:171
gem5::Event
Definition: eventq.hh:251
gem5::X86ISA::count
count
Definition: misc.hh:703
gem5::Tick
uint64_t Tick
Tick count type.
Definition: types.hh:58
gem5::PCEvent
Definition: pc_event.hh:45
gem5::CheckerCPU
CheckerCPU class.
Definition: cpu.hh:84
gem5::SimpleThread::setMiscRegNoEffect
void setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
Definition: simple_thread.hh:283
cpu.hh
gem5::CheckerThreadContext::getWritableReg
void * getWritableReg(const RegId &reg) override
Definition: thread_context.hh:242
gem5::ArmISA::Decoder
Definition: decoder.hh:63
gem5::CheckerThreadContext::setHtmCheckpointPtr
void setHtmCheckpointPtr(BaseHTMCheckpointPtr new_cpt) override
Definition: thread_context.hh:375
gem5::CheckerThreadContext::setProcessPtr
void setProcessPtr(Process *p) override
Definition: thread_context.hh:168
gem5::CheckerThreadContext::copyArchRegs
void copyArchRegs(ThreadContext *tc) override
Definition: thread_context.hh:213
gem5::SimpleThread::schedule
bool schedule(PCEvent *e) override
Definition: simple_thread.hh:179
gem5::CheckerThreadContext::contextId
ContextID contextId() const override
Definition: thread_context.hh:130
gem5::CheckerThreadContext::htmAbortTransaction
void htmAbortTransaction(uint64_t htm_uid, HtmFailureFaultCause cause) override
Definition: thread_context.hh:363
gem5::SimpleThread::pcState
const PCStateBase & pcState() const override
Definition: simple_thread.hh:258
gem5::CheckerCPU::recordPCChange
void recordPCChange(const PCStateBase &val)
Definition: cpu.hh:334
name
const std::string & name()
Definition: trace.cc:49
gem5::SimpleThread::setStatus
void setStatus(Status newStatus) override
Definition: simple_thread.hh:222
gem5::CheckerThreadContext::checkerCPU
CheckerCPU * checkerCPU
Pointer to the checker CPU.
Definition: thread_context.hh:87
gem5::CheckerThreadContext::pcStateNoRecord
void pcStateNoRecord(const PCStateBase &val) override
Definition: thread_context.hh:276
gem5::X86ISA::reg
Bitfield< 5, 3 > reg
Definition: types.hh:92
gem5::Process
Definition: process.hh:68
pcstate.hh
gem5::CheckerThreadContext::getIsaPtr
BaseISA * getIsaPtr() const override
Definition: thread_context.hh:156
simple_thread.hh
gem5::CheckerThreadContext::pcState
void pcState(const PCStateBase &val) override
Sets this thread's PC state.
Definition: thread_context.hh:266
gem5::CheckerThreadContext::schedule
bool schedule(PCEvent *e) override
Definition: thread_context.hh:91
gem5::ContextID
int ContextID
Globally unique thread context ID.
Definition: types.hh:239
gem5::CheckerThreadContext::status
Status status() const override
Definition: thread_context.hh:176
gem5::CheckerThreadContext::getHtmCheckpointPtr
BaseHTMCheckpointPtr & getHtmCheckpointPtr() override
Definition: thread_context.hh:369
gem5::CheckerThreadContext::activate
void activate() override
Set the status to Active.
Definition: thread_context.hh:186
gem5::CheckerThreadContext::setContextId
void setContextId(ContextID id) override
Definition: thread_context.hh:133
gem5::PCStateBase
Definition: pcstate.hh:57
gem5::BaseISA
Definition: isa.hh:57
gem5::RegIndex
uint16_t RegIndex
Definition: types.hh:176
gem5::CheckerThreadContext::setStCondFailures
void setStCondFailures(unsigned sc_failures) override
Definition: thread_context.hh:324
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: gpu_translation_state.hh:37
gem5::CheckerThreadContext::regStats
void regStats(const std::string &name) override
Definition: thread_context.hh:202
gem5::CheckerThreadContext::setStatus
void setStatus(Status new_status) override
Definition: thread_context.hh:179
gem5::CheckerThreadContext::getRegFlat
void getRegFlat(const RegId &reg, void *val) const override
Definition: thread_context.hh:336
gem5::CheckerThreadContext::readMiscRegNoEffect
RegVal readMiscRegNoEffect(RegIndex misc_reg) const override
Definition: thread_context.hh:282
gem5::Checker
Templated Checker class.
Definition: cpu.hh:445
gem5::CheckerThreadContext::getDecoderPtr
InstDecoder * getDecoderPtr() override
Definition: thread_context.hh:159
thread_context.hh
gem5::CheckerThreadContext::readStCondFailures
unsigned readStCondFailures() const override
Definition: thread_context.hh:318
gem5::CheckerThreadContext::threadId
int threadId() const override
Returns this thread's ID number.
Definition: thread_context.hh:140
gem5::CheckerThreadContext::getMMUPtr
BaseMMU * getMMUPtr() override
Definition: thread_context.hh:148
gem5::CheckerThreadContext::getWritableRegFlat
void * getWritableRegFlat(const RegId &reg) override
Definition: thread_context.hh:342
gem5::CheckerThreadContext::getProcessPtr
Process * getProcessPtr() override
Definition: thread_context.hh:166
gem5::RegId
Register ID: describe an architectural register with its class and index.
Definition: reg_class.hh:126
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:178
gem5::CheckerThreadContext::setThreadId
void setThreadId(int id) override
Definition: thread_context.hh:142

Generated on Thu Jul 28 2022 13:32:22 for gem5 by doxygen 1.8.17