gem5  v21.2.1.1
thread_context.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010-2012, 2016-2017, 2019 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) 2004-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 #include "cpu/o3/thread_context.hh"
43 
44 #include "arch/vecregs.hh"
45 #include "config/the_isa.hh"
46 #include "debug/O3CPU.hh"
47 
48 namespace gem5
49 {
50 
51 namespace o3
52 {
53 
54 void
56 {
57  gem5::takeOverFrom(*this, *old_context);
58 
59  getIsaPtr()->takeOverFrom(this, old_context);
60 
61  InstDecoder *newDecoder = getDecoderPtr();
62  InstDecoder *oldDecoder = old_context->getDecoderPtr();
63  newDecoder->takeOverFrom(oldDecoder);
64 
65  thread->noSquashFromTC = false;
66  thread->trapPending = false;
67 }
68 
69 void
71 {
72  DPRINTF(O3CPU, "Calling activate on Thread Context %d\n",
73  threadId());
74 
76  return;
77 
80 
81  // status() == Suspended
83 }
84 
85 void
87 {
88  DPRINTF(O3CPU, "Calling suspend on Thread Context %d\n",
89  threadId());
90 
92  return;
93 
94  if (cpu->isDraining()) {
95  DPRINTF(O3CPU, "Ignoring suspend on TC due to pending drain\n");
96  return;
97  }
98 
101 
104 }
105 
106 void
108 {
109  DPRINTF(O3CPU, "Calling halt on Thread Context %d\n", threadId());
110 
113  return;
114 
115  // the thread is not going to halt/terminate immediately in this cycle.
116  // The thread will be removed after an exit trap is processed
117  // (e.g., after trapLatency cycles). Until then, the thread's status
118  // will be Halting.
120 
121  // add this thread to the exiting list to mark that it is trying to exit.
123 }
124 
125 Tick
127 {
128  return thread->lastActivate;
129 }
130 
131 Tick
133 {
134  return thread->lastSuspend;
135 }
136 
137 void
139 {
140  // Prevent squashing
141  thread->noSquashFromTC = true;
142  getIsaPtr()->copyRegsFrom(tc);
143  thread->noSquashFromTC = false;
144 }
145 
146 void
148 {
149  cpu->isa[thread->threadId()]->clear();
150 }
151 
152 RegVal
154 {
155  return cpu->readArchIntReg(reg_idx, thread->threadId());
156 }
157 
158 RegVal
160 {
161  return cpu->readArchFloatReg(reg_idx, thread->threadId());
162 }
163 
166 {
167  return cpu->readArchVecReg(reg_id, thread->threadId());
168 }
169 
172 {
173  return cpu->getWritableArchVecReg(reg_id, thread->threadId());
174 }
175 
176 RegVal
178 {
179  return cpu->readArchVecElem(idx, elemIndex, thread->threadId());
180 }
181 
184 {
185  return cpu->readArchVecPredReg(reg_id, thread->threadId());
186 }
187 
190 {
191  return cpu->getWritableArchVecPredReg(reg_id, thread->threadId());
192 }
193 
194 RegVal
196 {
197  return cpu->readArchCCReg(reg_idx, thread->threadId());
198 }
199 
200 void
202 {
203  cpu->setArchIntReg(reg_idx, val, thread->threadId());
204 
206 }
207 
208 void
210 {
211  cpu->setArchFloatReg(reg_idx, val, thread->threadId());
212 
214 }
215 
216 void
218  RegIndex reg_idx, const TheISA::VecRegContainer& val)
219 {
220  cpu->setArchVecReg(reg_idx, val, thread->threadId());
221 
223 }
224 
225 void
227  const ElemIndex& elemIndex, RegVal val)
228 {
229  cpu->setArchVecElem(idx, elemIndex, val, thread->threadId());
231 }
232 
233 void
236 {
237  cpu->setArchVecPredReg(reg_idx, val, thread->threadId());
238 
240 }
241 
242 void
244 {
245  cpu->setArchCCReg(reg_idx, val, thread->threadId());
246 
248 }
249 
250 void
252 {
253  cpu->pcState(val, thread->threadId());
254 
256 }
257 
258 void
260 {
261  cpu->pcState(val, thread->threadId());
262 
264 }
265 
266 RegId
268 {
269  return cpu->isa[thread->threadId()]->flattenRegId(regId);
270 }
271 
272 void
274 {
275  cpu->setMiscRegNoEffect(misc_reg, val, thread->threadId());
276 
278 }
279 
280 void
282 {
283  cpu->setMiscReg(misc_reg, val, thread->threadId());
284 
286 }
287 
288 // hardware transactional memory
289 void
291  HtmFailureFaultCause cause)
292 {
293  cpu->htmSendAbortSignal(thread->threadId(), htmUid, cause);
294 
296 }
297 
300 {
301  return thread->htmCheckpoint;
302 }
303 
304 void
306 {
307  thread->htmCheckpoint = std::move(new_cpt);
308 }
309 
310 } // namespace o3
311 } // namespace gem5
gem5::curTick
Tick curTick()
The universal simulation clock.
Definition: cur_tick.hh:46
gem5::o3::CPU::setArchIntReg
void setArchIntReg(int reg_idx, RegVal val, ThreadID tid)
Architectural register accessors.
Definition: cpu.cc:1257
gem5::o3::CPU::addThreadToExitingList
void addThreadToExitingList(ThreadID tid)
Insert tid to the list of threads trying to exit.
Definition: cpu.cc:1575
gem5::o3::ThreadContext::thread
ThreadState * thread
Pointer to the thread state that this TC corrseponds to.
Definition: thread_context.hh:102
gem5::ThreadContext::Active
@ Active
Running.
Definition: thread_context.hh:109
gem5::BaseHTMCheckpointPtr
std::unique_ptr< BaseHTMCheckpoint > BaseHTMCheckpointPtr
Definition: htm.hh:125
gem5::o3::ThreadContext::htmAbortTransaction
void htmAbortTransaction(uint64_t htm_uid, HtmFailureFaultCause cause) override
Definition: thread_context.cc:290
gem5::o3::ThreadContext::activate
void activate() override
Set the status to Active.
Definition: thread_context.cc:70
gem5::o3::ThreadContext::takeOverFrom
void takeOverFrom(gem5::ThreadContext *old_context) override
Takes over execution of a thread from another CPU.
Definition: thread_context.cc:55
gem5::RegVal
uint64_t RegVal
Definition: types.hh:173
gem5::o3::ThreadContext::getHtmCheckpointPtr
BaseHTMCheckpointPtr & getHtmCheckpointPtr() override
Definition: thread_context.cc:299
gem5::ArmISA::VecPredRegContainer
VecPredReg::Container VecPredRegContainer
Definition: vec.hh:68
gem5::BaseISA::copyRegsFrom
virtual void copyRegsFrom(ThreadContext *src)=0
gem5::ThreadContext::Halted
@ Halted
Permanently shut down.
Definition: thread_context.hh:122
gem5::HtmFailureFaultCause
HtmFailureFaultCause
Definition: htm.hh:47
gem5::InstDecoder::takeOverFrom
virtual void takeOverFrom(InstDecoder *old)
Take over the state from an old decoder when switching CPUs.
Definition: decoder.hh:89
gem5::o3::ThreadContext::getWritableVecRegFlat
TheISA::VecRegContainer & getWritableVecRegFlat(RegIndex idx) override
Read vector register operand for modification, flat indexing.
Definition: thread_context.cc:171
gem5::o3::ThreadContext::threadId
int threadId() const override
Returns this thread's ID number.
Definition: thread_context.hh:135
gem5::o3::CPU::readArchFloatReg
RegVal readArchFloatReg(int reg_idx, ThreadID tid)
Definition: cpu.cc:1198
gem5::o3::CPU::htmSendAbortSignal
void htmSendAbortSignal(ThreadID tid, uint64_t htm_uid, HtmFailureFaultCause cause) override
Definition: cpu.cc:1643
gem5::o3::CPU::readArchCCReg
RegVal readArchCCReg(int reg_idx, ThreadID tid)
Definition: cpu.cc:1248
gem5::X86ISA::val
Bitfield< 63 > val
Definition: misc.hh:775
gem5::o3::ThreadContext::setCCRegFlat
void setCCRegFlat(RegIndex idx, RegVal val) override
Definition: thread_context.cc:243
gem5::o3::CPU::setMiscReg
void setMiscReg(int misc_reg, RegVal val, ThreadID tid)
Sets a misc.
Definition: cpu.cc:1083
gem5::BaseISA::takeOverFrom
virtual void takeOverFrom(ThreadContext *new_tc, ThreadContext *old_tc)
Definition: isa.hh:71
gem5::o3::ThreadContext::readVecPredRegFlat
const TheISA::VecPredRegContainer & readVecPredRegFlat(RegIndex idx) const override
Definition: thread_context.cc:183
gem5::o3::ThreadContext::conditionalSquash
void conditionalSquash()
check if the cpu is currently in state update mode and squash if not.
Definition: thread_context.hh:336
gem5::takeOverFrom
void takeOverFrom(ThreadContext &ntc, ThreadContext &otc)
Copy state between thread contexts in preparation for CPU handover.
Definition: thread_context.cc:254
gem5::o3::ThreadContext::getDecoderPtr
InstDecoder * getDecoderPtr() override
Definition: thread_context.hh:116
gem5::o3::ThreadContext::setFloatRegFlat
void setFloatRegFlat(RegIndex idx, RegVal val) override
Definition: thread_context.cc:209
gem5::o3::ThreadState::htmCheckpoint
std::unique_ptr< BaseHTMCheckpoint > htmCheckpoint
Pointer to the hardware transactional memory checkpoint.
Definition: thread_state.hh:92
gem5::o3::ThreadContext::readFloatRegFlat
RegVal readFloatRegFlat(RegIndex idx) const override
Definition: thread_context.cc:159
gem5::o3::CPU::setArchFloatReg
void setArchFloatReg(int reg_idx, RegVal val, ThreadID tid)
Definition: cpu.cc:1266
gem5::o3::CPU::setArchCCReg
void setArchCCReg(int reg_idx, RegVal val, ThreadID tid)
Definition: cpu.cc:1302
gem5::ThreadState::lastSuspend
Tick lastSuspend
Last time suspend was called on this thread.
Definition: thread_state.hh:128
gem5::o3::CPU::setArchVecReg
void setArchVecReg(int reg_idx, const TheISA::VecRegContainer &val, ThreadID tid)
Definition: cpu.cc:1275
gem5::o3::CPU::readArchVecPredReg
const TheISA::VecPredRegContainer & readArchVecPredReg(int reg_idx, ThreadID tid) const
Definition: cpu.cc:1232
gem5::o3::ThreadContext::suspend
void suspend() override
Set the status to Suspended.
Definition: thread_context.cc:86
gem5::ThreadContext
ThreadContext is the external interface to all thread state for anything outside of the CPU.
Definition: thread_context.hh:94
gem5::o3::ThreadContext::flattenRegId
RegId flattenRegId(const RegId &regId) const override
Definition: thread_context.cc:267
gem5::o3::CPU::suspendContext
void suspendContext(ThreadID tid) override
Remove Thread from Active Threads List.
Definition: cpu.cc:678
gem5::InstDecoder
Definition: decoder.hh:42
gem5::ThreadContext::Suspended
@ Suspended
Temporarily inactive.
Definition: thread_context.hh:113
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:186
gem5::ThreadContext::getDecoderPtr
virtual InstDecoder * getDecoderPtr()=0
gem5::o3::ThreadContext::setVecRegFlat
void setVecRegFlat(RegIndex idx, const TheISA::VecRegContainer &val) override
Definition: thread_context.cc:217
gem5::Tick
uint64_t Tick
Tick count type.
Definition: types.hh:58
gem5::o3::CPU::pcState
void pcState(const PCStateBase &new_pc_state, ThreadID tid)
Sets the commit PC state of a specific thread.
Definition: cpu.cc:1317
gem5::o3::ThreadContext::setVecElemFlat
void setVecElemFlat(RegIndex idx, const ElemIndex &elemIdx, RegVal val) override
Definition: thread_context.cc:226
gem5::o3::ThreadContext::getWritableVecPredRegFlat
TheISA::VecPredRegContainer & getWritableVecPredRegFlat(RegIndex idx) override
Definition: thread_context.cc:189
gem5::o3::ThreadContext::setMiscRegNoEffect
void setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
Sets a misc.
Definition: thread_context.cc:273
gem5::o3::CPU::setArchVecPredReg
void setArchVecPredReg(int reg_idx, const TheISA::VecPredRegContainer &val, ThreadID tid)
Definition: cpu.cc:1293
gem5::o3::ThreadContext::setHtmCheckpointPtr
void setHtmCheckpointPtr(BaseHTMCheckpointPtr new_cpt) override
Definition: thread_context.cc:305
gem5::ArmISA::VecRegContainer
gem5::VecRegContainer< NumVecElemPerVecReg *sizeof(VecElem)> VecRegContainer
Definition: vec.hh:62
gem5::o3::CPU::setArchVecElem
void setArchVecElem(const RegIndex &reg_idx, const ElemIndex &ldx, RegVal val, ThreadID tid)
Definition: cpu.cc:1284
gem5::o3::CPU::setMiscRegNoEffect
void setMiscRegNoEffect(int misc_reg, RegVal val, ThreadID tid)
Sets a miscellaneous register.
Definition: cpu.cc:1077
gem5::ThreadState::threadId
ThreadID threadId() const
Definition: thread_state.hh:69
gem5::ElemIndex
uint16_t ElemIndex
Logical vector register elem index type.
Definition: types.hh:179
gem5::o3::ThreadContext::readVecRegFlat
const TheISA::VecRegContainer & readVecRegFlat(RegIndex idx) const override
Definition: thread_context.cc:165
gem5::ThreadState::setStatus
void setStatus(Status new_status)
Sets the status of this thread.
Definition: thread_state.hh:83
gem5::o3::CPU::getWritableArchVecReg
TheISA::VecRegContainer & getWritableArchVecReg(int reg_idx, ThreadID tid)
Read architectural vector register for modification.
Definition: cpu.cc:1215
gem5::o3::CPU::readArchVecElem
RegVal readArchVecElem(const RegIndex &reg_idx, const ElemIndex &ldx, ThreadID tid) const
Definition: cpu.cc:1223
gem5::o3::ThreadState::noSquashFromTC
bool noSquashFromTC
Definition: thread_state.hh:84
gem5::ThreadState::lastActivate
Tick lastActivate
Last time activate was called on this thread.
Definition: thread_state.hh:125
gem5::o3::CPU::getWritableArchVecPredReg
TheISA::VecPredRegContainer & getWritableArchVecPredReg(int reg_idx, ThreadID tid)
Definition: cpu.cc:1240
gem5::o3::ThreadContext::halt
void halt() override
Set the status to Halted.
Definition: thread_context.cc:107
gem5::o3::ThreadContext::clearArchRegs
void clearArchRegs() override
Resets all architectural registers to 0.
Definition: thread_context.cc:147
gem5::o3::ThreadContext::readCCRegFlat
RegVal readCCRegFlat(RegIndex idx) const override
Definition: thread_context.cc:195
gem5::o3::ThreadContext::copyArchRegs
void copyArchRegs(gem5::ThreadContext *tc) override
Copies the architectural registers from another TC into this TC.
Definition: thread_context.cc:138
gem5::o3::ThreadContext::getIsaPtr
BaseISA * getIsaPtr() override
Definition: thread_context.hh:110
gem5::o3::ThreadContext::readLastSuspend
Tick readLastSuspend() override
Reads the last tick that this thread was suspended on.
Definition: thread_context.cc:132
gem5::ThreadState::status
Status status() const
Returns the status of this thread.
Definition: thread_state.hh:80
gem5::ThreadContext::Halting
@ Halting
Trying to exit and waiting for an event to completely exit.
Definition: thread_context.hh:117
gem5::o3::CPU::isDraining
bool isDraining() const
Is the CPU draining?
Definition: cpu.hh:236
gem5::o3::ThreadContext::pcState
const PCStateBase & pcState() const override
Reads this thread's PC state.
Definition: thread_context.hh:281
thread_context.hh
gem5::o3::CPU::readArchIntReg
RegVal readArchIntReg(int reg_idx, ThreadID tid)
Definition: cpu.cc:1189
gem5::o3::ThreadContext::readVecElemFlat
RegVal readVecElemFlat(RegIndex idx, const ElemIndex &elemIndex) const override
Definition: thread_context.cc:177
gem5::PCStateBase
Definition: pcstate.hh:57
gem5::o3::ThreadContext::cpu
CPU * cpu
Pointer to the CPU.
Definition: thread_context.hh:72
gem5::o3::ThreadContext::setIntRegFlat
void setIntRegFlat(RegIndex idx, RegVal val) override
Definition: thread_context.cc:201
gem5::RegIndex
uint16_t RegIndex
Definition: types.hh:176
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: tlb.cc:60
gem5::o3::ThreadContext::setVecPredRegFlat
void setVecPredRegFlat(RegIndex idx, const TheISA::VecPredRegContainer &val) override
Definition: thread_context.cc:234
gem5::o3::ThreadContext::pcStateNoRecord
void pcStateNoRecord(const PCStateBase &val) override
Definition: thread_context.cc:259
gem5::o3::CPU::activateContext
void activateContext(ThreadID tid) override
Add Thread to Active Threads List.
Definition: cpu.cc:640
gem5::o3::ThreadContext::readLastActivate
Tick readLastActivate() override
Reads the last tick that this thread was activated on.
Definition: thread_context.cc:126
gem5::o3::ThreadState::trapPending
bool trapPending
Whether or not the thread is currently waiting on a trap, and thus able to be externally updated with...
Definition: thread_state.hh:89
gem5::o3::ThreadContext::setMiscReg
void setMiscReg(RegIndex misc_reg, RegVal val) override
Sets a misc.
Definition: thread_context.cc:281
gem5::o3::CPU::isa
std::vector< TheISA::ISA * > isa
Definition: cpu.hh:498
gem5::o3::ThreadContext::readIntRegFlat
RegVal readIntRegFlat(RegIndex idx) const override
Flat register interfaces.
Definition: thread_context.cc:153
gem5::RegId
Register ID: describe an architectural register with its class and index.
Definition: reg_class.hh:113
gem5::o3::CPU::readArchVecReg
const TheISA::VecRegContainer & readArchVecReg(int reg_idx, ThreadID tid) const
Definition: cpu.cc:1207

Generated on Wed May 4 2022 12:13:46 for gem5 by doxygen 1.8.17