gem5  v19.0.0.0
thread_context.cc
Go to the documentation of this file.
1 /*
2  * Copyright 2019 Google, Inc.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met: redistributions of source code must retain the above copyright
7  * notice, this list of conditions and the following disclaimer;
8  * redistributions in binary form must reproduce the above copyright
9  * notice, this list of conditions and the following disclaimer in the
10  * documentation and/or other materials provided with the distribution;
11  * neither the name of the copyright holders nor the names of its
12  * contributors may be used to endorse or promote products derived from
13  * this software without specific prior written permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  *
27  * Authors: Gabe Black
28  */
29 
31 
32 #include <utility>
33 
34 #include "iris/detail/IrisCppAdapter.h"
35 #include "iris/detail/IrisObjects.h"
38 
39 namespace Iris
40 {
41 
42 void
44 {
45  bool enabled = false;
46  call().perInstanceExecution_getState(_instId, enabled);
47  _status = enabled ? Active : Suspended;
48 
49  suspend();
50 
51  call().memory_getMemorySpaces(_instId, memorySpaces);
52  call().memory_getUsefulAddressTranslations(_instId, translations);
53 
54  typedef ThreadContext Self;
55  iris::EventSourceInfo evSrcInfo;
56 
57  client.registerEventCallback<Self, &Self::breakpointHit>(
58  this, "ec_IRIS_BREAKPOINT_HIT",
59  "Handle hitting a breakpoint", "Iris::ThreadContext");
60  call().event_getEventSource(_instId, evSrcInfo, "IRIS_BREAKPOINT_HIT");
61  call().eventStream_create(_instId, breakpointEventStreamId,
62  evSrcInfo.evSrcId, client.getInstId());
63 
64  for (auto it = bps.begin(); it != bps.end(); it++)
65  installBp(it);
66 }
67 
68 iris::ResourceId
70  const ResourceMap &resources, const std::string &name)
71 {
72  return resources.at(name).rscId;
73 }
74 
75 void
77  ResourceIds &ids, const ResourceMap &resources,
78  const IdxNameMap &idx_names)
79 {
80  for (const auto &idx_name: idx_names) {
81  int idx = idx_name.first;
82  const std::string &name = idx_name.second;
83 
84  if (idx >= ids.size())
85  ids.resize(idx + 1, iris::IRIS_UINT64_MAX);
86 
87  ids[idx] = extractResourceId(resources, name);
88  }
89 }
90 
91 void
93 {
94  Tick now = 0;
95 
96  while (true) {
97  if (comInstEventQueue.empty()) {
98  // Set to 0 to deactivate stepping.
99  call().step_setup(_instId, 0, "instruction");
100  break;
101  }
102 
104  if (!now)
105  now = getCurrentInstCount();
106 
107  if (next <= now) {
109  // Start over now that comInstEventQueue has likely changed.
110  continue;
111  }
112 
113  // Set to the number of instructions still to step through.
114  Tick remaining = next - now;
115  call().step_setup(_instId, remaining, "instruction");
116  break;
117  }
118 }
119 
122 {
123  auto pc_it = bps.find(pc);
124 
125  if (pc_it != bps.end())
126  return pc_it;
127 
128  auto res = bps.emplace(std::make_pair(pc, new BpInfo(pc)));
129  panic_if(!res.second, "Inserting breakpoint failed.");
130  return res.first;
131 }
132 
133 void
135 {
136  BpId id;
137  Addr pc = it->second->pc;
138  auto space_id = getBpSpaceId(pc);
139  call().breakpoint_set_code(_instId, id, pc, space_id, 0, true);
140  it->second->id = id;
141 }
142 
143 void
145 {
146  call().breakpoint_delete(_instId, it->second->id);
147  it->second->clearId();
148 }
149 
150 void
152 {
153  panic_if(!it->second->empty(),
154  "BP info still had events associated with it.");
155 
156  if (it->second->validId())
157  uninstallBp(it);
158 
159  bps.erase(it);
160 }
161 
162 iris::IrisErrorCode
164  uint64_t esId, const iris::IrisValueMap &fields, uint64_t time,
165  uint64_t sInstId, bool syncEc, std::string &error_message_out)
166 {
167  const std::string &event = fields.at("EVENT").getString();
168  const iris::InstanceId id = fields.at("INST_ID").getU64();
169  const std::string &name = fields.at("INST_NAME").getString();
170 
171  if (name != "component." + _irisPath)
172  return iris::E_ok;
173 
174  if (event == "added")
175  _instId = id;
176  else if (event == "removed")
177  _instId = iris::IRIS_UINT64_MAX;
178  else
179  panic("Unrecognized event type %s", event);
180 
181  return iris::E_ok;
182 }
183 
184 iris::IrisErrorCode
186  uint64_t esId, const iris::IrisValueMap &fields, uint64_t time,
187  uint64_t sInstId, bool syncEc, std::string &error_message_out)
188 {
190  call().resource_getList(_instId, resources);
191 
192  ResourceMap resourceMap;
193  for (auto &resource: resources)
194  resourceMap[resource.name] = resource;
195 
196  initFromIrisInstance(resourceMap);
197 
198  return iris::E_ok;
199 }
200 
201 iris::IrisErrorCode
203  uint64_t esId, const iris::IrisValueMap &fields, uint64_t time,
204  uint64_t sInstId, bool syncEc, std::string &error_message_out)
205 {
206  if (fields.at("RUNNING").getAsBool()) {
207  // If this is just simulation time starting up, don't do anything.
208  return iris::E_ok;
209  }
210 
211  // If simulation time has stopped for any reason, IRIS helpfully clears
212  // all stepping counters and we need to set them back. We might also need
213  // to service events based on the current number of executed instructions.
215 
216  // Restart simulation time to make sure things progress once we give
217  // control back.
218  call().simulationTime_run(iris::IrisInstIdSimulationEngine);
219 
220  return iris::E_ok;
221 }
222 
223 iris::IrisErrorCode
225  uint64_t esId, const iris::IrisValueMap &fields, uint64_t time,
226  uint64_t sInstId, bool syncEc, std::string &error_message_out)
227 {
228  Addr pc = fields.at("PC").getU64();
229 
230  auto it = getOrAllocBp(pc);
231 
232  auto e_it = it->second->events.begin();
233  while (e_it != it->second->events.end()) {
234  PCEvent *e = *e_it;
235  // Advance e_it here since e might remove itself from the list.
236  e_it++;
237  e->process(this);
238  }
239 
240  return iris::E_ok;
241 }
242 
244  BaseCPU *cpu, int id, System *system, ::BaseTLB *dtb, ::BaseTLB *itb,
245  iris::IrisConnectionInterface *iris_if, const std::string &iris_path) :
246  _cpu(cpu), _threadId(id), _system(system), _dtb(dtb), _itb(itb),
247  _irisPath(iris_path), vecRegs(ArmISA::NumVecRegs),
249  comInstEventQueue("instruction-based event queue"),
250  client(iris_if, "client." + iris_path)
251 {
252  iris::InstanceInfo info;
253  auto ret_code = noThrow().instanceRegistry_getInstanceInfoByName(
254  info, "component." + iris_path);
255  if (ret_code == iris::E_ok) {
256  // The iris instance registry already new about this path.
257  _instId = info.instId;
258  } else {
259  // This path doesn't (yet) exist. Set the ID to something invalid.
260  _instId = iris::IRIS_UINT64_MAX;
261  }
262 
263  typedef ThreadContext Self;
264  iris::EventSourceInfo evSrcInfo;
265 
266  client.registerEventCallback<Self, &Self::instanceRegistryChanged>(
267  this, "ec_IRIS_INSTANCE_REGISTRY_CHANGED",
268  "Install the iris instance ID", "Iris::ThreadContext");
269  call().event_getEventSource(iris::IrisInstIdGlobalInstance, evSrcInfo,
270  "IRIS_INSTANCE_REGISTRY_CHANGED");
271  regEventStreamId = iris::IRIS_UINT64_MAX;
272  static const std::vector<std::string> fields =
273  { "EVENT", "INST_ID", "INST_NAME" };
274  call().eventStream_create(iris::IrisInstIdGlobalInstance, regEventStreamId,
275  evSrcInfo.evSrcId, client.getInstId(), &fields);
276 
277  client.registerEventCallback<Self, &Self::phaseInitLeave>(
278  this, "ec_IRIS_SIM_PHASE_INIT_LEAVE",
279  "Initialize register contexts", "Iris::ThreadContext");
280  call().event_getEventSource(iris::IrisInstIdSimulationEngine, evSrcInfo,
281  "IRIS_SIM_PHASE_INIT_LEAVE");
282  initEventStreamId = iris::IRIS_UINT64_MAX;
283  call().eventStream_create(
284  iris::IrisInstIdSimulationEngine, initEventStreamId,
285  evSrcInfo.evSrcId, client.getInstId());
286 
287  client.registerEventCallback<Self, &Self::simulationTimeEvent>(
288  this, "ec_IRIS_SIMULATION_TIME_EVENT",
289  "Handle simulation time stopping for breakpoints or stepping",
290  "Iris::ThreadContext");
291  call().event_getEventSource(iris::IrisInstIdSimulationEngine, evSrcInfo,
292  "IRIS_SIMULATION_TIME_EVENT");
293  timeEventStreamId = iris::IRIS_UINT64_MAX;
294  call().eventStream_create(
295  iris::IrisInstIdSimulationEngine, timeEventStreamId,
296  evSrcInfo.evSrcId, client.getInstId());
297 
298  breakpointEventStreamId = iris::IRIS_UINT64_MAX;
299 }
300 
302 {
303  call().eventStream_destroy(
304  iris::IrisInstIdSimulationEngine, initEventStreamId);
305  initEventStreamId = iris::IRIS_UINT64_MAX;
306  client.unregisterEventCallback("ec_IRIS_SIM_PHASE_INIT_LEAVE");
307 
308  call().eventStream_destroy(
309  iris::IrisInstIdGlobalInstance, regEventStreamId);
310  regEventStreamId = iris::IRIS_UINT64_MAX;
311  client.unregisterEventCallback("ec_IRIS_INSTANCE_REGISTRY_CHANGED");
312 
313  call().eventStream_destroy(
314  iris::IrisInstIdGlobalInstance, timeEventStreamId);
315  timeEventStreamId = iris::IRIS_UINT64_MAX;
316  client.unregisterEventCallback("ec_IRIS_SIMULATION_TIME_EVENT");
317 }
318 
319 bool
321 {
322  auto it = getOrAllocBp(e->pc());
323  it->second->events.push_back(e);
324 
325  if (_instId != iris::IRIS_UINT64_MAX && !it->second->validId())
326  installBp(it);
327 
328  return true;
329 }
330 
331 bool
333 {
334  auto it = getOrAllocBp(e->pc());
335  it->second->events.remove(e);
336 
337  if (it->second->empty())
338  delBp(it);
339 
340  return true;
341 }
342 
343 bool
344 ThreadContext::translateAddress(Addr &paddr, iris::MemorySpaceId p_space,
345  Addr vaddr, iris::MemorySpaceId v_space)
346 {
347  iris::MemoryAddressTranslationResult result;
348  auto ret = noThrow().memory_translateAddress(
349  _instId, result, v_space, vaddr, p_space);
350 
351  if (ret != iris::E_ok) {
352  // Check if there was a legal translation between these two spaces.
353  // If so, something else went wrong.
354  for (auto &trans: translations)
355  if (trans.inSpaceId == v_space && trans.outSpaceId == p_space)
356  return false;
357 
358  panic("No legal translation IRIS address translation found.");
359  }
360 
361  if (result.address.empty())
362  return false;
363 
364  if (result.address.size() > 1) {
365  warn("Multiple mappings for address %#x.", vaddr);
366  return false;
367  }
368 
369  paddr = result.address[0];
370  return true;
371 }
372 
373 void
375 {
376  Tick now = getCurrentInstCount();
377  comInstEventQueue.schedule(event, count);
378  if (count <= now)
379  call().simulationTime_stop(iris::IrisInstIdSimulationEngine);
380  else
382 }
383 
384 void
386 {
389 }
390 
391 Tick
393 {
394  uint64_t count;
395  auto ret = call().step_getStepCounterValue(_instId, count, "instruction");
396  panic_if(ret != iris::E_ok, "Failed to get instruction count.");
397  return count;
398 }
399 
400 void
402 {
403  if (FullSystem) {
404  assert(!physProxy && !virtProxy);
406  _cpu->cacheLineSize()));
407  virtProxy.reset(new FSTranslatingPortProxy(tc));
408  } else {
409  assert(!virtProxy);
413  }
414 }
415 
418 {
419  return _status;
420 }
421 
422 void
424 {
425  if (new_status == Active) {
426  if (_status != Active)
427  call().perInstanceExecution_setState(_instId, true);
428  } else {
429  if (_status == Active)
430  call().perInstanceExecution_setState(_instId, false);
431  }
432  _status = new_status;
433 }
434 
437 {
438  ArmISA::CPSR cpsr = readMiscRegNoEffect(ArmISA::MISCREG_CPSR);
440 
441  pc.thumb(cpsr.t);
442  pc.nextThumb(pc.thumb());
443  pc.jazelle(cpsr.j);
444  pc.nextJazelle(cpsr.j);
445  pc.aarch64(!cpsr.width);
446  pc.nextAArch64(!cpsr.width);
447  pc.illegalExec(false);
448 
449  iris::ResourceReadResult result;
450  call().resource_read(_instId, result, pcRscId);
451  Addr addr = result.data.at(0);
452  if (cpsr.width && cpsr.t)
453  addr = addr & ~0x1;
454  pc.set(addr);
455 
456  return pc;
457 }
458 void
460 {
461  Addr pc = val.pc();
462 
463  ArmISA::CPSR cpsr = readMiscRegNoEffect(ArmISA::MISCREG_CPSR);
464  if (cpsr.width && cpsr.t)
465  pc = pc | 0x1;
466 
467  iris::ResourceWriteResult result;
468  call().resource_write(_instId, result, pcRscId, pc);
469 }
470 
471 Addr
473 {
474  return pcState().instAddr();
475 }
476 
477 Addr
479 {
480  return pcState().nextInstAddr();
481 }
482 
483 RegVal
485 {
486  iris::ResourceReadResult result;
487  call().resource_read(_instId, result, miscRegIds.at(misc_reg));
488  return result.data.at(0);
489 }
490 
491 void
493 {
494  iris::ResourceWriteResult result;
495  call().resource_write(_instId, result, miscRegIds.at(misc_reg), val);
496 }
497 
498 RegVal
500 {
501  ArmISA::CPSR cpsr = readMiscRegNoEffect(ArmISA::MISCREG_CPSR);
502 
503  iris::ResourceReadResult result;
504  if (cpsr.width)
505  call().resource_read(_instId, result, intReg32Ids.at(reg_idx));
506  else
507  call().resource_read(_instId, result, intReg64Ids.at(reg_idx));
508  return result.data.at(0);
509 }
510 
511 void
513 {
514  ArmISA::CPSR cpsr = readMiscRegNoEffect(ArmISA::MISCREG_CPSR);
515 
516  iris::ResourceWriteResult result;
517  if (cpsr.width)
518  call().resource_write(_instId, result, intReg32Ids.at(reg_idx), val);
519  else
520  call().resource_write(_instId, result, intReg64Ids.at(reg_idx), val);
521 }
522 
523 /*
524  * The 64 bit version of registers gives us a pre-flattened view of the reg
525  * file, no matter what mode we're in or if we're currently 32 or 64 bit.
526  */
527 RegVal
529 {
530  if (idx >= flattenedIntIds.size())
531  return 0;
532  iris::ResourceId res_id = flattenedIntIds.at(idx);
533  if (res_id == iris::IRIS_UINT64_MAX)
534  return 0;
535  iris::ResourceReadResult result;
536  call().resource_read(_instId, result, res_id);
537  return result.data.at(0);
538 }
539 
540 void
542 {
543  iris::ResourceId res_id =
544  (idx >= flattenedIntIds.size()) ? iris::IRIS_UINT64_MAX :
545  flattenedIntIds.at(idx);
546  panic_if(res_id == iris::IRIS_UINT64_MAX,
547  "Int reg %d is not supported by fast model.", idx);
548  iris::ResourceWriteResult result;
549  call().resource_write(_instId, result, flattenedIntIds.at(idx), val);
550 }
551 
552 RegVal
554 {
555  if (idx >= ccRegIds.size())
556  return 0;
557  iris::ResourceReadResult result;
558  call().resource_read(_instId, result, ccRegIds.at(idx));
559  return result.data.at(0);
560 }
561 
562 void
564 {
565  panic_if(idx >= ccRegIds.size(),
566  "CC reg %d is not supported by fast model.", idx);
567  iris::ResourceWriteResult result;
568  call().resource_write(_instId, result, ccRegIds.at(idx), val);
569 }
570 
572 ThreadContext::readVecReg(const RegId &reg_id) const
573 {
574  const RegIndex idx = reg_id.index();
576  reg.zero();
577 
578  // Ignore accesses to registers which aren't architected. gem5 defines a
579  // few extra registers which it uses internally in the implementation of
580  // some instructions.
581  if (idx >= vecRegIds.size())
582  return reg;
583 
584  iris::ResourceReadResult result;
585  call().resource_read(_instId, result, vecRegIds.at(idx));
586  size_t data_size = result.data.size() * (sizeof(*result.data.data()));
587  size_t size = std::min(data_size, reg.SIZE);
588  memcpy(reg.raw_ptr<void>(), (void *)result.data.data(), size);
589 
590  return reg;
591 }
592 
595 {
596  return readVecReg(RegId(VecRegClass, idx));
597 }
598 
601 {
602  RegIndex idx = reg_id.index();
603 
605  reg.reset();
606 
607  if (idx >= vecPredRegIds.size())
608  return reg;
609 
610  iris::ResourceReadResult result;
611  call().resource_read(_instId, result, vecPredRegIds.at(idx));
612 
613  size_t offset = 0;
614  size_t num_bits = reg.NUM_BITS;
615  uint8_t *bytes = (uint8_t *)result.data.data();
616  while (num_bits > 8) {
617  reg.set_bits(offset, 8, *bytes);
618  offset += 8;
619  num_bits -= 8;
620  bytes++;
621  }
622  if (num_bits)
623  reg.set_bits(offset, num_bits, *bytes);
624 
625  return reg;
626 }
627 
630 {
631  return readVecPredReg(RegId(VecPredRegClass, idx));
632 }
633 
634 } // namespace Iris
count
Definition: misc.hh:705
void setStatus(Status new_status) override
void setCCRegFlat(RegIndex idx, RegVal val) override
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:167
A TranslatingPortProxy in FS mode translates a virtual address to a physical address and then calls t...
bool remove(PCEvent *e) override
Bitfield< 5, 3 > reg
Definition: types.hh:89
Addr instAddr() const override
RegVal readCCRegFlat(RegIndex idx) const override
ResourceIds intReg64Ids
const std::string & name()
Definition: trace.cc:54
std::vector< iris::MemorySpaceInfo > memorySpaces
void deschedule(Event *event)
Deschedule the specified event.
Definition: eventq_impl.hh:69
iris::EventStreamId initEventStreamId
std::vector< ArmISA::VecPredRegContainer > vecPredRegs
const VecPredRegContainer & readVecPredRegFlat(RegIndex idx) const override
Addr pc() const
Definition: pc_event.hh:61
iris::InstanceId _instId
ip6_addr_t addr
Definition: inet.hh:335
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
Definition: root.cc:136
iris::IrisCppAdapter & noThrow() const
uint64_t RegVal
Definition: types.hh:168
std::vector< iris::MemorySupportedAddressTranslationResult > translations
BpInfoIt getOrAllocBp(Addr pc)
Definition: system.hh:77
Bitfield< 23, 0 > offset
Definition: types.hh:154
Definition: ccregs.hh:42
const VecRegContainer & readVecReg(const RegId &reg) const override
ArmISA::PCState pcState() const override
std::unique_ptr< PortProxy > physProxy
void setMiscRegNoEffect(RegIndex misc_reg, const RegVal val) override
RegVal readIntRegFlat(RegIndex idx) const override
Flat register interfaces.
std::map< std::string, iris::ResourceInfo > ResourceMap
iris::ResourceId pcRscId
const int NumVecPredRegs
Definition: registers.hh:97
void setIntReg(RegIndex reg_idx, RegVal val) override
ResourceIds miscRegIds
iris::EventStreamId timeEventStreamId
bool empty() const
Definition: eventq.hh:654
Bitfield< 33 > id
PortProxy::SendFunctionalFunc getSendFunctional() override
Returns a sendFunctional delegate for use with port proxies.
Definition: cpu.hh:90
Bitfield< 63 > val
Definition: misc.hh:771
RegVal readMiscRegNoEffect(RegIndex misc_reg) const override
ResourceIds intReg32Ids
void setIntRegFlat(RegIndex idx, uint64_t val) override
void descheduleInstCountEvent(Event *event) override
RegVal readIntReg(RegIndex reg_idx) const override
Definition: tlb.hh:52
Bitfield< 4 > pc
EventQueue comInstEventQueue
std::unique_ptr< PortProxy > virtProxy
uint16_t RegIndex
Definition: types.hh:42
const VecRegContainer & readVecRegFlat(RegIndex idx) const override
Bitfield< 39, 36 > ids
virtual void initFromIrisInstance(const ResourceMap &resources)
iris::IrisErrorCode phaseInitLeave(uint64_t esId, const iris::IrisValueMap &fields, uint64_t time, uint64_t sInstId, bool syncEc, std::string &error_message_out)
uint64_t Tick
Tick count type.
Definition: types.hh:63
VecPredReg::Container VecPredRegContainer
Definition: registers.hh:79
virtual iris::MemorySpaceId getBpSpaceId(Addr pc) const =0
iris::ResourceId extractResourceId(const ResourceMap &resources, const std::string &name)
iris::EventStreamId regEventStreamId
void serviceEvents(Tick when)
Definition: eventq.hh:636
iris::IrisCppAdapter & call() const
iris::IrisErrorCode breakpointHit(uint64_t esId, const iris::IrisValueMap &fields, uint64_t time, uint64_t sInstId, bool syncEc, std::string &error_message_out)
iris::IrisErrorCode simulationTimeEvent(uint64_t esId, const iris::IrisValueMap &fields, uint64_t time, uint64_t sInstId, bool syncEc, std::string &error_message_out)
bool schedule(PCEvent *e) override
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
Tick nextTick() const
Definition: eventq.hh:625
Bitfield< 10, 5 > event
BpInfoMap::iterator BpInfoIt
bool enabled()
Definition: statistics.cc:546
Tick getCurrentInstCount() override
void delBp(BpInfoIt it)
Bitfield< 15 > system
Definition: misc.hh:999
virtual void process(ThreadContext *tc)=0
void initMemProxies(::ThreadContext *tc) 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
const VecPredRegContainer & readVecPredReg(const RegId &reg) const override
unsigned int cacheLineSize() const
Get the cache line size of the system.
Definition: base.hh:391
VecReg::Container VecRegContainer
Definition: registers.hh:73
std::map< int, std::string > IdxNameMap
Definition: eventq.hh:189
GenericISA::SimplePCState< MachInst > PCState
Definition: types.hh:43
ResourceIds vecPredRegIds
std::vector< ArmISA::VecRegContainer > vecRegs
void schedule(Event *event, Tick when, bool global=false)
Schedule the given event on this queue.
Definition: eventq_impl.hh:42
ResourceIds flattenedIntIds
Process * getProcessPtr() override
TranslatingPortProxy Object Declaration for FS.
TranslatingPortProxy Object Declaration for SE.
const RegIndex & index() const
Index accessors.
Definition: reg_class.hh:179
void uninstallBp(BpInfoIt it)
Status status() const override
ThreadContext(::BaseCPU *cpu, int id, System *system, ::BaseTLB *dtb, ::BaseTLB *itb, iris::IrisConnectionInterface *iris_if, const std::string &iris_path)
Register ID: describe an architectural register with its class and index.
Definition: reg_class.hh:79
Addr nextInstAddr() const override
iris::IrisInstance client
Temporarily inactive.
void suspend() override
Set the status to Suspended.
Vector Register.
Definition: reg_class.hh:60
#define warn(...)
Definition: logging.hh:212
iris::EventStreamId breakpointEventStreamId
iris::IrisErrorCode instanceRegistryChanged(uint64_t esId, const iris::IrisValueMap &fields, uint64_t time, uint64_t sInstId, bool syncEc, std::string &error_message_out)
void extractResourceMap(ResourceIds &ids, const ResourceMap &resources, const IdxNameMap &idx_names)
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
Definition: logging.hh:185
const int NumVecRegs
Definition: registers.hh:95
void installBp(BpInfoIt it)
Definition: cpu.cc:36
void scheduleInstCountEvent(Event *event, Tick count) override
bool translateAddress(Addr &paddr, iris::MemorySpaceId p_space, Addr vaddr, iris::MemorySpaceId v_space)

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