gem5  v21.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
tlb_coalescer.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2015 Advanced Micro Devices, Inc.
3  * All rights reserved.
4  *
5  * For use for simulation and test purposes only
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  * this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright notice,
14  * this list of conditions and the following disclaimer in the documentation
15  * and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of the copyright holder nor the names of its
18  * contributors may be used to endorse or promote products derived from this
19  * software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
35 
36 #include <cstring>
37 
38 #include "arch/x86/isa_traits.hh"
39 #include "base/logging.hh"
40 #include "debug/GPUTLB.hh"
41 #include "sim/process.hh"
42 
44  : ClockedObject(p),
45  TLBProbesPerCycle(p.probesPerCycle),
46  coalescingWindow(p.coalescingWindow),
47  disableCoalescing(p.disableCoalescing),
48  probeTLBEvent([this]{ processProbeTLBEvent(); },
49  "Probe the TLB below",
50  false, Event::CPU_Tick_Pri),
51  cleanupEvent([this]{ processCleanupEvent(); },
52  "Cleanup issuedTranslationsTable hashmap",
53  false, Event::Maximum_Pri),
54  stats(this)
55 {
56  // create the response ports based on the number of connected ports
57  for (size_t i = 0; i < p.port_cpu_side_ports_connection_count; ++i) {
58  cpuSidePort.push_back(new CpuSidePort(csprintf("%s-port%d", name(), i),
59  this, i));
60  }
61 
62  // create the request ports based on the number of connected ports
63  for (size_t i = 0; i < p.port_mem_side_ports_connection_count; ++i) {
64  memSidePort.push_back(new MemSidePort(csprintf("%s-port%d", name(), i),
65  this, i));
66  }
67 }
68 
69 Port &
70 TLBCoalescer::getPort(const std::string &if_name, PortID idx)
71 {
72  if (if_name == "cpu_side_ports") {
73  if (idx >= static_cast<PortID>(cpuSidePort.size())) {
74  panic("TLBCoalescer::getPort: unknown index %d\n", idx);
75  }
76 
77  return *cpuSidePort[idx];
78  } else if (if_name == "mem_side_ports") {
79  if (idx >= static_cast<PortID>(memSidePort.size())) {
80  panic("TLBCoalescer::getPort: unknown index %d\n", idx);
81  }
82 
83  return *memSidePort[idx];
84  } else {
85  panic("TLBCoalescer::getPort: unknown port %s\n", if_name);
86  }
87 }
88 
89 /*
90  * This method returns true if the <incoming_pkt>
91  * can be coalesced with <coalesced_pkt> and false otherwise.
92  * A given set of rules is checked.
93  * The rules can potentially be modified based on the TLB level.
94  */
95 bool
96 TLBCoalescer::canCoalesce(PacketPtr incoming_pkt, PacketPtr coalesced_pkt)
97 {
99  return false;
100 
101  TheISA::GpuTLB::TranslationState *incoming_state =
102  safe_cast<TheISA::GpuTLB::TranslationState*>(incoming_pkt->senderState);
103 
104  TheISA::GpuTLB::TranslationState *coalesced_state =
105  safe_cast<TheISA::GpuTLB::TranslationState*>(coalesced_pkt->senderState);
106 
107  // Rule 1: Coalesce requests only if they
108  // fall within the same virtual page
109  Addr incoming_virt_page_addr = roundDown(incoming_pkt->req->getVaddr(),
111 
112  Addr coalesced_virt_page_addr = roundDown(coalesced_pkt->req->getVaddr(),
114 
115  if (incoming_virt_page_addr != coalesced_virt_page_addr)
116  return false;
117 
118  //* Rule 2: Coalesce requests only if they
119  // share a TLB Mode, i.e. they are both read
120  // or write requests.
121  BaseTLB::Mode incoming_mode = incoming_state->tlbMode;
122  BaseTLB::Mode coalesced_mode = coalesced_state->tlbMode;
123 
124  if (incoming_mode != coalesced_mode)
125  return false;
126 
127  // when we can coalesce a packet update the reqCnt
128  // that is the number of packets represented by
129  // this coalesced packet
130  if (!incoming_state->prefetch)
131  coalesced_state->reqCnt.back() += incoming_state->reqCnt.back();
132 
133  return true;
134 }
135 
136 /*
137  * We need to update the physical addresses of all the translation requests
138  * that were coalesced into the one that just returned.
139  */
140 void
142 {
143  Addr virt_page_addr = roundDown(pkt->req->getVaddr(), X86ISA::PageBytes);
144 
145  DPRINTF(GPUTLB, "Update phys. addr. for %d coalesced reqs for page %#x\n",
146  issuedTranslationsTable[virt_page_addr].size(), virt_page_addr);
147 
148  TheISA::GpuTLB::TranslationState *sender_state =
149  safe_cast<TheISA::GpuTLB::TranslationState*>(pkt->senderState);
150 
151  TheISA::TlbEntry *tlb_entry = sender_state->tlbEntry;
152  assert(tlb_entry);
153  Addr first_entry_vaddr = tlb_entry->vaddr;
154  Addr first_entry_paddr = tlb_entry->paddr;
155  int page_size = tlb_entry->size();
156  bool uncacheable = tlb_entry->uncacheable;
157  int first_hit_level = sender_state->hitLevel;
158 
159  // Get the physical page address of the translated request
160  // Using the page_size specified in the TLBEntry allows us
161  // to support different page sizes.
162  Addr phys_page_paddr = pkt->req->getPaddr();
163  phys_page_paddr &= ~(page_size - 1);
164 
165  for (int i = 0; i < issuedTranslationsTable[virt_page_addr].size(); ++i) {
166  PacketPtr local_pkt = issuedTranslationsTable[virt_page_addr][i];
167  TheISA::GpuTLB::TranslationState *sender_state =
168  safe_cast<TheISA::GpuTLB::TranslationState*>(
169  local_pkt->senderState);
170 
171  // we are sending the packet back, so pop the reqCnt associated
172  // with this level in the TLB hiearchy
173  if (!sender_state->prefetch)
174  sender_state->reqCnt.pop_back();
175 
176  /*
177  * Only the first packet from this coalesced request has been
178  * translated. Grab the translated phys. page addr and update the
179  * physical addresses of the remaining packets with the appropriate
180  * page offsets.
181  */
182  if (i) {
183  Addr paddr = phys_page_paddr;
184  paddr |= (local_pkt->req->getVaddr() & (page_size - 1));
185  local_pkt->req->setPaddr(paddr);
186 
187  if (uncacheable)
188  local_pkt->req->setFlags(Request::UNCACHEABLE);
189 
190  // update senderState->tlbEntry, so we can insert
191  // the correct TLBEentry in the TLBs above.
192  auto p = sender_state->tc->getProcessPtr();
193  sender_state->tlbEntry =
194  new TheISA::TlbEntry(p->pid(), first_entry_vaddr,
195  first_entry_paddr, false, false);
196 
197  // update the hitLevel for all uncoalesced reqs
198  // so that each packet knows where it hit
199  // (used for statistics in the CUs)
200  sender_state->hitLevel = first_hit_level;
201  }
202 
203  ResponsePort *return_port = sender_state->ports.back();
204  sender_state->ports.pop_back();
205 
206  // Translation is done - Convert to a response pkt if necessary and
207  // send the translation back
208  if (local_pkt->isRequest()) {
209  local_pkt->makeTimingResponse();
210  }
211 
212  return_port->sendTimingResp(local_pkt);
213  }
214 
215  // schedule clean up for end of this cycle
216  // This is a maximum priority event and must be on
217  // the same cycle as GPUTLB cleanup event to prevent
218  // race conditions with an IssueProbeEvent caused by
219  // MemSidePort::recvReqRetry
220  cleanupQueue.push(virt_page_addr);
221 
222  if (!cleanupEvent.scheduled())
224 }
225 
226 // Receive translation requests, create a coalesced request,
227 // and send them to the TLB (TLBProbesPerCycle)
228 bool
230 {
231  // first packet of a coalesced request
232  PacketPtr first_packet = nullptr;
233  // true if we are able to do coalescing
234  bool didCoalesce = false;
235  // number of coalesced reqs for a given window
236  int coalescedReq_cnt = 0;
237 
238  TheISA::GpuTLB::TranslationState *sender_state =
239  safe_cast<TheISA::GpuTLB::TranslationState*>(pkt->senderState);
240 
241  // push back the port to remember the path back
242  sender_state->ports.push_back(this);
243 
244  bool update_stats = !sender_state->prefetch;
245 
246  if (update_stats) {
247  // if reqCnt is empty then this packet does not represent
248  // multiple uncoalesced reqs(pkts) but just a single pkt.
249  // If it does though then the reqCnt for each level in the
250  // hierarchy accumulates the total number of reqs this packet
251  // represents
252  int req_cnt = 1;
253 
254  if (!sender_state->reqCnt.empty())
255  req_cnt = sender_state->reqCnt.back();
256 
257  sender_state->reqCnt.push_back(req_cnt);
258 
259  // update statistics
261  req_cnt = sender_state->reqCnt.back();
262  DPRINTF(GPUTLB, "receiving pkt w/ req_cnt %d\n", req_cnt);
263  coalescer->stats.queuingCycles -= (curTick() * req_cnt);
265  }
266 
267  // FIXME if you want to coalesce not based on the issueTime
268  // of the packets (i.e., from the compute unit's perspective)
269  // but based on when they reached this coalescer then
270  // remove the following if statement and use curTick() or
271  // coalescingWindow for the tick_index.
272  if (!sender_state->issueTime)
273  sender_state->issueTime = curTick();
274 
275  // The tick index is used as a key to the coalescerFIFO hashmap.
276  // It is shared by all candidates that fall within the
277  // given coalescingWindow.
278  int64_t tick_index = sender_state->issueTime / coalescer->coalescingWindow;
279 
280  if (coalescer->coalescerFIFO.count(tick_index)) {
281  coalescedReq_cnt = coalescer->coalescerFIFO[tick_index].size();
282  }
283 
284  // see if we can coalesce the incoming pkt with another
285  // coalesced request with the same tick_index
286  for (int i = 0; i < coalescedReq_cnt; ++i) {
287  first_packet = coalescer->coalescerFIFO[tick_index][i][0];
288 
289  if (coalescer->canCoalesce(pkt, first_packet)) {
290  coalescer->coalescerFIFO[tick_index][i].push_back(pkt);
291 
292  DPRINTF(GPUTLB, "Coalesced req %i w/ tick_index %d has %d reqs\n",
293  i, tick_index,
294  coalescer->coalescerFIFO[tick_index][i].size());
295 
296  didCoalesce = true;
297  break;
298  }
299  }
300 
301  // if this is the first request for this tick_index
302  // or we did not manage to coalesce, update stats
303  // and make necessary allocations.
304  if (!coalescedReq_cnt || !didCoalesce) {
305  if (update_stats)
307 
308  std::vector<PacketPtr> new_array;
309  new_array.push_back(pkt);
310  coalescer->coalescerFIFO[tick_index].push_back(new_array);
311 
312  DPRINTF(GPUTLB, "coalescerFIFO[%d] now has %d coalesced reqs after "
313  "push\n", tick_index,
314  coalescer->coalescerFIFO[tick_index].size());
315  }
316 
317  //schedule probeTLBEvent next cycle to send the
318  //coalesced requests to the TLB
321  curTick() + coalescer->clockPeriod());
322  }
323 
324  return true;
325 }
326 
327 void
329 {
330  panic("recvReqRetry called");
331 }
332 
333 void
335 {
336 
337  TheISA::GpuTLB::TranslationState *sender_state =
338  safe_cast<TheISA::GpuTLB::TranslationState*>(pkt->senderState);
339 
340  bool update_stats = !sender_state->prefetch;
341 
342  if (update_stats)
343  coalescer->stats.uncoalescedAccesses++;
344 
345  // If there is a pending timing request for this virtual address
346  // print a warning message. This is a temporary caveat of
347  // the current simulator where atomic and timing requests can
348  // coexist. FIXME remove this check/warning in the future.
349  Addr virt_page_addr = roundDown(pkt->req->getVaddr(), X86ISA::PageBytes);
350  int map_count = coalescer->issuedTranslationsTable.count(virt_page_addr);
351 
352  if (map_count) {
353  DPRINTF(GPUTLB, "Warning! Functional access to addr %#x sees timing "
354  "req. pending\n", virt_page_addr);
355  }
356 
357  coalescer->memSidePort[0]->sendFunctional(pkt);
358 }
359 
362 {
363  // currently not checked by the requestor
364  AddrRangeList ranges;
365 
366  return ranges;
367 }
368 
369 bool
371 {
372  // a translation completed and returned
373  coalescer->updatePhysAddresses(pkt);
374 
375  return true;
376 }
377 
378 void
380 {
381  //we've receeived a retry. Schedule a probeTLBEvent
382  if (!coalescer->probeTLBEvent.scheduled())
383  coalescer->schedule(coalescer->probeTLBEvent,
384  curTick() + coalescer->clockPeriod());
385 }
386 
387 void
389 {
390  fatal("Memory side recvFunctional() not implemented in TLB coalescer.\n");
391 }
392 
393 /*
394  * Here we scan the coalescer FIFO and issue the max
395  * number of permitted probes to the TLB below. We
396  * permit bypassing of coalesced requests for the same
397  * tick_index.
398  *
399  * We do not access the next tick_index unless we've
400  * drained the previous one. The coalesced requests
401  * that are successfully sent are moved to the
402  * issuedTranslationsTable table (the table which keeps
403  * track of the outstanding reqs)
404  */
405 void
407 {
408  // number of TLB probes sent so far
409  int sent_probes = 0;
410  // rejected denotes a blocking event
411  bool rejected = false;
412 
413  // It is set to true either when the recvTiming of the TLB below
414  // returns false or when there is another outstanding request for the
415  // same virt. page.
416 
417  DPRINTF(GPUTLB, "triggered TLBCoalescer %s\n", __func__);
418 
419  for (auto iter = coalescerFIFO.begin();
420  iter != coalescerFIFO.end() && !rejected; ) {
421  int coalescedReq_cnt = iter->second.size();
422  int i = 0;
423  int vector_index = 0;
424 
425  DPRINTF(GPUTLB, "coalescedReq_cnt is %d for tick_index %d\n",
426  coalescedReq_cnt, iter->first);
427 
428  while (i < coalescedReq_cnt) {
429  ++i;
430  PacketPtr first_packet = iter->second[vector_index][0];
431 
432  // compute virtual page address for this request
433  Addr virt_page_addr = roundDown(first_packet->req->getVaddr(),
435 
436  // is there another outstanding request for the same page addr?
437  int pending_reqs =
438  issuedTranslationsTable.count(virt_page_addr);
439 
440  if (pending_reqs) {
441  DPRINTF(GPUTLB, "Cannot issue - There are pending reqs for "
442  "page %#x\n", virt_page_addr);
443 
444  ++vector_index;
445  rejected = true;
446 
447  continue;
448  }
449 
450  // send the coalesced request for virt_page_addr
451  if (!memSidePort[0]->sendTimingReq(first_packet)) {
452  DPRINTF(GPUTLB, "Failed to send TLB request for page %#x\n",
453  virt_page_addr);
454 
455  // No need for a retries queue since we are already buffering
456  // the coalesced request in coalescerFIFO.
457  rejected = true;
458  ++vector_index;
459  } else {
460  TheISA::GpuTLB::TranslationState *tmp_sender_state =
461  safe_cast<TheISA::GpuTLB::TranslationState*>
462  (first_packet->senderState);
463 
464  bool update_stats = !tmp_sender_state->prefetch;
465 
466  if (update_stats) {
467  // req_cnt is total number of packets represented
468  // by the one we just sent counting all the way from
469  // the top of TLB hiearchy (i.e., from the CU)
470  int req_cnt = tmp_sender_state->reqCnt.back();
471  stats.queuingCycles += (curTick() * req_cnt);
472 
473  DPRINTF(GPUTLB, "%s sending pkt w/ req_cnt %d\n",
474  name(), req_cnt);
475 
476  // pkt_cnt is number of packets we coalesced into the one
477  // we just sent but only at this coalescer level
478  int pkt_cnt = iter->second[vector_index].size();
479  stats.localqueuingCycles += (curTick() * pkt_cnt);
480  }
481 
482  DPRINTF(GPUTLB, "Successfully sent TLB request for page %#x",
483  virt_page_addr);
484 
485  //copy coalescedReq to issuedTranslationsTable
486  issuedTranslationsTable[virt_page_addr]
487  = iter->second[vector_index];
488 
489  //erase the entry of this coalesced req
490  iter->second.erase(iter->second.begin() + vector_index);
491 
492  if (iter->second.empty())
493  assert(i == coalescedReq_cnt);
494 
495  sent_probes++;
496  if (sent_probes == TLBProbesPerCycle)
497  return;
498  }
499  }
500 
501  //if there are no more coalesced reqs for this tick_index
502  //erase the hash_map with the first iterator
503  if (iter->second.empty()) {
504  coalescerFIFO.erase(iter++);
505  } else {
506  ++iter;
507  }
508  }
509 }
510 
511 void
513 {
514  while (!cleanupQueue.empty()) {
515  Addr cleanup_addr = cleanupQueue.front();
516  cleanupQueue.pop();
517  issuedTranslationsTable.erase(cleanup_addr);
518 
519  DPRINTF(GPUTLB, "Cleanup - Delete coalescer entry with key %#x\n",
520  cleanup_addr);
521  }
522 }
523 
525  : Stats::Group(parent),
526  ADD_STAT(uncoalescedAccesses, "Number of uncoalesced TLB accesses"),
527  ADD_STAT(coalescedAccesses, "Number of coalesced TLB accesses"),
528  ADD_STAT(queuingCycles, "Number of cycles spent in queue"),
529  ADD_STAT(localqueuingCycles,
530  "Number of cycles spent in queue for all incoming reqs"),
531  ADD_STAT(localLatency, "Avg. latency over all incoming pkts")
532 {
534 }
fatal
#define fatal(...)
This implements a cprintf based fatal() function.
Definition: logging.hh:183
Event::scheduled
bool scheduled() const
Determine if the current event is scheduled.
Definition: eventq.hh:462
ResponsePort
A ResponsePort is a specialization of a port.
Definition: port.hh:265
roundDown
T roundDown(const T &val, const U &align)
This function is used to align addresses in memory.
Definition: intmath.hh:150
Packet::makeTimingResponse
void makeTimingResponse()
Definition: packet.hh:1023
TLBCoalescer::issuedTranslationsTable
CoalescingTable issuedTranslationsTable
Definition: tlb_coalescer.hh:116
EventBase::CPU_Tick_Pri
static const Priority CPU_Tick_Pri
CPU ticks must come after other associated CPU events (such as writebacks).
Definition: eventq.hh:201
TLBCoalescer::cleanupEvent
EventFunctionWrapper cleanupEvent
The cleanupEvent is scheduled after a TLBEvent triggers in order to free memory and do the required c...
Definition: tlb_coalescer.hh:191
TLBCoalescer::processCleanupEvent
void processCleanupEvent()
Definition: tlb_coalescer.cc:512
ResponsePort::sendTimingResp
bool sendTimingResp(PacketPtr pkt)
Attempt to send a timing response to the request port by calling its corresponding receive function.
Definition: port.hh:367
TLBCoalescer::coalescerFIFO
CoalescingFIFO coalescerFIFO
Definition: tlb_coalescer.hh:103
ArmISA::i
Bitfield< 7 > i
Definition: miscregs_types.hh:63
TLBCoalescer::TLBProbesPerCycle
int TLBProbesPerCycle
Definition: tlb_coalescer.hh:73
TLBCoalescer::Params
TLBCoalescerParams Params
Definition: tlb_coalescer.hh:68
TLBCoalescer::coalescingWindow
int coalescingWindow
Definition: tlb_coalescer.hh:77
BaseTLB::Mode
Mode
Definition: tlb.hh:57
TLBCoalescer::MemSidePort::recvFunctional
virtual void recvFunctional(PacketPtr pkt)
Definition: tlb_coalescer.cc:388
TLBCoalescer::canCoalesce
bool canCoalesce(PacketPtr pkt1, PacketPtr pkt2)
Definition: tlb_coalescer.cc:96
PortID
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:243
TLBCoalescer::CpuSidePort::getAddrRanges
virtual AddrRangeList getAddrRanges() const
Get a list of the non-overlapping address ranges the owner is responsible for.
Definition: tlb_coalescer.cc:361
Stats::Group::Group
Group()=delete
Packet::req
RequestPtr req
A pointer to the original request.
Definition: packet.hh:341
std::vector
STL vector class.
Definition: stl.hh:37
TLBCoalescer::stats
TLBCoalescer::TLBCoalescerStats stats
Packet::isRequest
bool isRequest() const
Definition: packet.hh:560
TLBCoalescer::CpuSidePort::recvReqRetry
virtual void recvReqRetry()
Definition: tlb_coalescer.cc:328
TLBCoalescer::getPort
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
Definition: tlb_coalescer.cc:70
ClockedObject
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
Definition: clocked_object.hh:231
TLBCoalescer::TLBCoalescerStats::localqueuingCycles
Stats::Scalar localqueuingCycles
Definition: tlb_coalescer.hh:215
EventManager::schedule
void schedule(Event &event, Tick when)
Definition: eventq.hh:1016
TLBCoalescer::MemSidePort::recvTimingResp
virtual bool recvTimingResp(PacketPtr pkt)
Receive a timing response from the peer.
Definition: tlb_coalescer.cc:370
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:237
ADD_STAT
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
Definition: group.hh:71
Port
Ports are used to interface objects to each other.
Definition: port.hh:56
TLBCoalescer::disableCoalescing
bool disableCoalescing
Definition: tlb_coalescer.hh:84
process.hh
TLBCoalescer::updatePhysAddresses
void updatePhysAddresses(PacketPtr pkt)
Definition: tlb_coalescer.cc:141
X86ISA::PageBytes
const Addr PageBytes
Definition: isa_traits.hh:49
TLBCoalescer::processProbeTLBEvent
void processProbeTLBEvent()
Definition: tlb_coalescer.cc:406
isa_traits.hh
EventBase::Maximum_Pri
static const Priority Maximum_Pri
Maximum priority.
Definition: eventq.hh:238
TLBCoalescer::CpuSidePort::recvTimingReq
virtual bool recvTimingReq(PacketPtr pkt)
Receive a timing request from the peer.
Definition: tlb_coalescer.cc:229
TLBCoalescer::TLBCoalescerStats::uncoalescedAccesses
Stats::Scalar uncoalescedAccesses
Definition: tlb_coalescer.hh:203
TLBCoalescer::CpuSidePort::coalescer
TLBCoalescer * coalescer
Definition: tlb_coalescer.hh:130
TLBCoalescer::CpuSidePort::recvFunctional
virtual void recvFunctional(PacketPtr pkt)
Receive a functional request packet from the peer.
Definition: tlb_coalescer.cc:334
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:148
TLBCoalescer::TLBCoalescerStats::TLBCoalescerStats
TLBCoalescerStats(Stats::Group *parent)
Definition: tlb_coalescer.cc:524
Clocked::clockPeriod
Tick clockPeriod() const
Definition: clocked_object.hh:214
SimObject::name
virtual const std::string name() const
Definition: sim_object.hh:182
TLBCoalescer::memSidePort
std::vector< MemSidePort * > memSidePort
Definition: tlb_coalescer.hh:179
TLBCoalescer::probeTLBEvent
EventFunctionWrapper probeTLBEvent
This event issues the TLB probes.
Definition: tlb_coalescer.hh:186
TLBCoalescer::TLBCoalescerStats::localLatency
Stats::Formula localLatency
Definition: tlb_coalescer.hh:217
Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:258
Request::UNCACHEABLE
@ UNCACHEABLE
The request is to an uncacheable address.
Definition: request.hh:118
Stats::Group
Statistics container.
Definition: group.hh:87
logging.hh
TLBCoalescer::cleanupQueue
std::queue< Addr > cleanupQueue
Definition: tlb_coalescer.hh:195
TLBCoalescer::TLBCoalescer
TLBCoalescer(const Params &p)
Definition: tlb_coalescer.cc:43
Stats
Definition: statistics.cc:53
TLBCoalescer::cpuSidePort
std::vector< CpuSidePort * > cpuSidePort
Definition: tlb_coalescer.hh:177
curTick
Tick curTick()
The universal simulation clock.
Definition: cur_tick.hh:43
Packet::senderState
SenderState * senderState
This packet's sender state.
Definition: packet.hh:509
MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:323
std::list< AddrRange >
TLBCoalescer::TLBCoalescerStats::coalescedAccesses
Stats::Scalar coalescedAccesses
Definition: tlb_coalescer.hh:205
tlb_coalescer.hh
csprintf
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:158
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:171
TLBCoalescer::MemSidePort::recvReqRetry
virtual void recvReqRetry()
Called by the peer if sendTimingReq was called on this peer (causing recvTimingReq to be called on th...
Definition: tlb_coalescer.cc:379
TLBCoalescer::TLBCoalescerStats::queuingCycles
Stats::Scalar queuingCycles
Definition: tlb_coalescer.hh:210

Generated on Tue Mar 23 2021 19:41:27 for gem5 by doxygen 1.8.17