gem5  v21.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
table_walker.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010-2016, 2019 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37 
38 #ifndef __ARCH_ARM_TABLE_WALKER_HH__
39 #define __ARCH_ARM_TABLE_WALKER_HH__
40 
41 #include <list>
42 
43 #include "arch/arm/faults.hh"
44 #include "arch/arm/miscregs.hh"
45 #include "arch/arm/system.hh"
46 #include "arch/arm/tlb.hh"
47 #include "mem/request.hh"
48 #include "params/ArmTableWalker.hh"
49 #include "sim/clocked_object.hh"
50 #include "sim/eventq.hh"
51 
52 class ThreadContext;
53 
54 class DmaPort;
55 
56 namespace ArmISA {
57 class Translation;
58 class TLB;
59 class Stage2MMU;
60 
61 class TableWalker : public ClockedObject
62 {
63  public:
64  class WalkerState;
65 
67  public:
69 
72 
73  virtual Addr pfn() const = 0;
74  virtual TlbEntry::DomainType domain() const = 0;
75  virtual bool xn() const = 0;
76  virtual uint8_t ap() const = 0;
77  virtual bool global(WalkerState *currState) const = 0;
78  virtual uint8_t offsetBits() const = 0;
79  virtual bool secure(bool have_security, WalkerState *currState) const = 0;
80  virtual std::string dbgHeader() const = 0;
81  virtual uint64_t getRawData() const = 0;
82  virtual uint8_t texcb() const
83  {
84  panic("texcb() not implemented for this class\n");
85  }
86  virtual bool shareable() const
87  {
88  panic("shareable() not implemented for this class\n");
89  }
90  };
91 
92  class L1Descriptor : public DescriptorBase {
93  public:
95  enum EntryType {
100  };
101 
103  uint32_t data;
104 
107  bool _dirty;
108 
110  L1Descriptor() : data(0), _dirty(false)
111  {
112  lookupLevel = L1;
113  }
114 
115  virtual uint64_t getRawData() const
116  {
117  return (data);
118  }
119 
120  virtual std::string dbgHeader() const
121  {
122  return "Inserting Section Descriptor into TLB\n";
123  }
124 
125  virtual uint8_t offsetBits() const
126  {
127  return 20;
128  }
129 
130  EntryType type() const
131  {
132  return (EntryType)(data & 0x3);
133  }
134 
136  bool supersection() const
137  {
138  return bits(data, 18);
139  }
140 
142  Addr paddr() const
143  {
144  if (supersection())
145  panic("Super sections not implemented\n");
146  return mbits(data, 31, 20);
147  }
149  Addr paddr(Addr va) const
150  {
151  if (supersection())
152  panic("Super sections not implemented\n");
153  return mbits(data, 31, 20) | mbits(va, 19, 0);
154  }
155 
156 
158  Addr pfn() const
159  {
160  if (supersection())
161  panic("Super sections not implemented\n");
162  return bits(data, 31, 20);
163  }
164 
167  {
168  return !bits(data, 17);
169  }
170 
172  bool xn() const
173  {
174  return bits(data, 4);
175  }
176 
178  uint8_t ap() const
179  {
180  return (bits(data, 15) << 2) | bits(data, 11, 10);
181  }
182 
185  {
186  return static_cast<TlbEntry::DomainType>(bits(data, 8, 5));
187  }
188 
190  Addr l2Addr() const
191  {
192  return mbits(data, 31, 10);
193  }
194 
200  uint8_t texcb() const
201  {
202  return bits(data, 2) | bits(data, 3) << 1 | bits(data, 14, 12) << 2;
203  }
204 
206  bool shareable() const
207  {
208  return bits(data, 16);
209  }
210 
214  void setAp0()
215  {
216  data |= 1 << 10;
217  _dirty = true;
218  }
219 
221  bool dirty() const
222  {
223  return _dirty;
224  }
225 
230  bool secure(bool have_security, WalkerState *currState) const
231  {
232  if (have_security && currState->secureLookup) {
233  if (type() == PageTable)
234  return !bits(data, 3);
235  else
236  return !bits(data, 19);
237  }
238  return false;
239  }
240  };
241 
243  class L2Descriptor : public DescriptorBase {
244  public:
246  uint32_t data;
248 
251  bool _dirty;
252 
254  L2Descriptor() : data(0), l1Parent(nullptr), _dirty(false)
255  {
256  lookupLevel = L2;
257  }
258 
259  L2Descriptor(L1Descriptor &parent) : data(0), l1Parent(&parent),
260  _dirty(false)
261  {
262  lookupLevel = L2;
263  }
264 
265  virtual uint64_t getRawData() const
266  {
267  return (data);
268  }
269 
270  virtual std::string dbgHeader() const
271  {
272  return "Inserting L2 Descriptor into TLB\n";
273  }
274 
275  virtual TlbEntry::DomainType domain() const
276  {
277  return l1Parent->domain();
278  }
279 
280  bool secure(bool have_security, WalkerState *currState) const
281  {
282  return l1Parent->secure(have_security, currState);
283  }
284 
285  virtual uint8_t offsetBits() const
286  {
287  return large() ? 16 : 12;
288  }
289 
291  bool invalid() const
292  {
293  return bits(data, 1, 0) == 0;
294  }
295 
297  bool large() const
298  {
299  return bits(data, 1) == 0;
300  }
301 
303  bool xn() const
304  {
305  return large() ? bits(data, 15) : bits(data, 0);
306  }
307 
310  {
311  return !bits(data, 11);
312  }
313 
315  uint8_t ap() const
316  {
317  return bits(data, 5, 4) | (bits(data, 9) << 2);
318  }
319 
321  uint8_t texcb() const
322  {
323  return large() ?
324  (bits(data, 2) | (bits(data, 3) << 1) | (bits(data, 14, 12) << 2)) :
325  (bits(data, 2) | (bits(data, 3) << 1) | (bits(data, 8, 6) << 2));
326  }
327 
329  Addr pfn() const
330  {
331  return large() ? bits(data, 31, 16) : bits(data, 31, 12);
332  }
333 
335  Addr paddr(Addr va) const
336  {
337  if (large())
338  return mbits(data, 31, 16) | mbits(va, 15, 0);
339  else
340  return mbits(data, 31, 12) | mbits(va, 11, 0);
341  }
342 
344  bool shareable() const
345  {
346  return bits(data, 10);
347  }
348 
352  void setAp0()
353  {
354  data |= 1 << 4;
355  _dirty = true;
356  }
357 
359  bool dirty() const
360  {
361  return _dirty;
362  }
363 
364  };
365 
366  // Granule sizes for AArch64 long descriptors
367  enum GrainSize {
368  Grain4KB = 12,
369  Grain16KB = 14,
370  Grain64KB = 16,
372  };
373 
376  public:
378  enum EntryType {
383  };
384 
386  : data(0), _dirty(false), aarch64(false), grainSize(Grain4KB),
387  physAddrRange(0)
388  {}
389 
391  uint64_t data;
392 
395  bool _dirty;
396 
398  bool aarch64;
399 
402 
403  uint8_t physAddrRange;
404 
405 
406  virtual uint64_t getRawData() const
407  {
408  return (data);
409  }
410 
411  virtual std::string dbgHeader() const
412  {
413  if (type() == LongDescriptor::Page) {
414  assert(lookupLevel == L3);
415  return "Inserting Page descriptor into TLB\n";
416  } else {
417  assert(lookupLevel < L3);
418  return "Inserting Block descriptor into TLB\n";
419  }
420  }
421 
426  bool secure(bool have_security, WalkerState *currState) const
427  {
428  assert(type() == Block || type() == Page);
429  return have_security && (currState->secureLookup && !bits(data, 5));
430  }
431 
433  EntryType type() const
434  {
435  switch (bits(data, 1, 0)) {
436  case 0x1:
437  // In AArch64 blocks are not allowed at L0 for the
438  // 4 KiB granule and at L1 for 16/64 KiB granules
439  switch (grainSize) {
440  case Grain4KB:
441  if (lookupLevel == L0 || lookupLevel == L3)
442  return Invalid;
443  else
444  return Block;
445 
446  case Grain16KB:
447  if (lookupLevel == L2)
448  return Block;
449  else
450  return Invalid;
451 
452  case Grain64KB:
453  // With Armv8.2-LPA (52bit PA) L1 Block descriptors
454  // are allowed for 64KiB granule
455  if ((lookupLevel == L1 && physAddrRange == 52) ||
456  lookupLevel == L2)
457  return Block;
458  else
459  return Invalid;
460 
461  default:
462  return Invalid;
463  }
464  case 0x3:
465  return lookupLevel == L3 ? Page : Table;
466  default:
467  return Invalid;
468  }
469  }
470 
472  uint8_t offsetBits() const
473  {
474  if (type() == Block) {
475  switch (grainSize) {
476  case Grain4KB:
477  return lookupLevel == L1 ? 30 /* 1 GiB */
478  : 21 /* 2 MiB */;
479  case Grain16KB:
480  return 25 /* 32 MiB */;
481  case Grain64KB:
482  return lookupLevel == L1 ? 42 /* 4 TiB */
483  : 29 /* 512 MiB */;
484  default:
485  panic("Invalid AArch64 VM granule size\n");
486  }
487  } else if (type() == Page) {
488  switch (grainSize) {
489  case Grain4KB:
490  case Grain16KB:
491  case Grain64KB:
492  return grainSize; /* enum -> uint okay */
493  default:
494  panic("Invalid AArch64 VM granule size\n");
495  }
496  } else {
497  panic("AArch64 page table entry must be block or page\n");
498  }
499  }
500 
502  Addr pfn() const
503  {
504  return paddr() >> offsetBits();
505  }
506 
508  Addr paddr() const
509  {
510  Addr addr = 0;
511  if (aarch64) {
512  addr = mbits(data, 47, offsetBits());
513  if (physAddrRange == 52 && grainSize == Grain64KB) {
514  addr |= bits(data, 15, 12) << 48;
515  }
516  } else {
517  addr = mbits(data, 39, offsetBits());
518  }
519  return addr;
520  }
521 
524  {
525  assert(type() == Table);
526  Addr table_address = 0;
527  if (aarch64) {
528  table_address = mbits(data, 47, grainSize);
529  // Using 52bit if Armv8.2-LPA is implemented
530  if (physAddrRange == 52 && grainSize == Grain64KB)
531  table_address |= bits(data, 15, 12) << 48;
532  } else {
533  table_address = mbits(data, 39, 12);
534  }
535 
536  return table_address;
537  }
538 
541  {
542  assert(type() == Table);
543  Addr pa = 0;
544  if (aarch64) {
545  int stride = grainSize - 3;
546  int va_lo = stride * (3 - (lookupLevel + 1)) + grainSize;
547  int va_hi = va_lo + stride - 1;
548  pa = nextTableAddr() | (bits(va, va_hi, va_lo) << 3);
549  } else {
550  if (lookupLevel == L1)
551  pa = nextTableAddr() | (bits(va, 29, 21) << 3);
552  else // lookupLevel == L2
553  pa = nextTableAddr() | (bits(va, 20, 12) << 3);
554  }
555  return pa;
556  }
557 
559  bool xn() const
560  {
561  assert(type() == Block || type() == Page);
562  return bits(data, 54);
563  }
564 
566  bool pxn() const
567  {
568  assert(type() == Block || type() == Page);
569  return bits(data, 53);
570  }
571 
573  bool contiguousHint() const
574  {
575  assert(type() == Block || type() == Page);
576  return bits(data, 52);
577  }
578 
581  {
582  assert(currState && (type() == Block || type() == Page));
583  if (!currState->aarch64 && (currState->isSecure &&
584  !currState->secureLookup)) {
585  return false; // ARM ARM issue C B3.6.3
586  } else if (currState->aarch64) {
587  if (currState->el == EL2 || currState->el == EL3) {
588  return true; // By default translations are treated as global
589  // in AArch64 EL2 and EL3
590  } else if (currState->isSecure && !currState->secureLookup) {
591  return false;
592  }
593  }
594  return !bits(data, 11);
595  }
596 
598  bool af() const
599  {
600  assert(type() == Block || type() == Page);
601  return bits(data, 10);
602  }
603 
605  uint8_t sh() const
606  {
607  assert(type() == Block || type() == Page);
608  return bits(data, 9, 8);
609  }
610 
612  uint8_t ap() const
613  {
614  assert(type() == Block || type() == Page);
615  // Long descriptors only support the AP[2:1] scheme
616  return bits(data, 7, 6);
617  }
618 
620  bool rw() const
621  {
622  assert(type() == Block || type() == Page);
623  return !bits(data, 7);
624  }
625 
627  bool user() const
628  {
629  assert(type() == Block || type() == Page);
630  return bits(data, 6);
631  }
632 
636  static uint8_t ap(bool rw, bool user)
637  {
638  return ((!rw) << 2) | (user << 1);
639  }
640 
642  {
643  // Long-desc. format only supports Client domain
644  assert(type() == Block || type() == Page);
646  }
647 
649  uint8_t attrIndx() const
650  {
651  assert(type() == Block || type() == Page);
652  return bits(data, 4, 2);
653  }
654 
656  uint8_t memAttr() const
657  {
658  assert(type() == Block || type() == Page);
659  return bits(data, 5, 2);
660  }
661 
664  void setAf()
665  {
666  data |= 1 << 10;
667  _dirty = true;
668  }
669 
671  bool dirty() const
672  {
673  return _dirty;
674  }
675 
677  bool secureTable() const
678  {
679  assert(type() == Table);
680  return !bits(data, 63);
681  }
682 
684  uint8_t apTable() const
685  {
686  assert(type() == Table);
687  return bits(data, 62, 61);
688  }
689 
691  uint8_t rwTable() const
692  {
693  assert(type() == Table);
694  return !bits(data, 62);
695  }
696 
699  uint8_t userTable() const
700  {
701  assert(type() == Table);
702  return !bits(data, 61);
703  }
704 
706  bool xnTable() const
707  {
708  assert(type() == Table);
709  return bits(data, 60);
710  }
711 
713  bool pxnTable() const
714  {
715  assert(type() == Table);
716  return bits(data, 59);
717  }
718  };
719 
721  {
722  public:
725 
727  bool aarch64;
728 
731 
734 
737 
739  uint16_t asid;
740  uint8_t vmid;
741  bool isHyp;
742 
745 
748 
751 
754 
756  SCTLR sctlr;
757 
759  SCR scr;
760 
762  CPSR cpsr;
763 
765  union {
766  TTBCR ttbcr; // AArch32 translations
767  TCR tcr; // AArch64 translations
768  };
769 
771  HTCR htcr;
772 
774  HCR hcr;
775 
777  VTCR_t vtcr;
778 
780  bool isWrite;
781 
783  bool isFetch;
784 
786  bool isSecure;
787 
790 
794  bool rwTable;
795  bool userTable;
796  bool xnTable;
797  bool pxnTable;
798 
800  bool hpd;
801 
803  bool stage2Req;
804 
807 
809  bool timing;
810 
813 
816 
819 
823 
826 
829  bool delayed;
830 
832 
835 
837  unsigned levels;
838 
839  void doL1Descriptor();
840  void doL2Descriptor();
841 
842  void doLongDescriptor();
843 
844  WalkerState();
845 
846  std::string name() const { return tableWalker->name(); }
847  };
848 
849  protected:
850 
853 
857 
860 
863 
866 
868  const bool isStage2;
869 
872 
874  SCTLR sctlr;
875 
877 
879  bool pending;
880 
883  unsigned numSquashable;
884 
887  bool _haveLPAE;
889  uint8_t _physAddrRange;
891 
893  struct TableWalkerStats : public Stats::Group {
904  Stats::Histogram pendingWalks; // essentially "L" of queueing theory
907  } stats;
908 
909  mutable unsigned pendingReqs;
911 
912  static const unsigned REQUESTED = 0;
913  static const unsigned COMPLETED = 1;
914 
915  public:
916  PARAMS(ArmTableWalker);
917  TableWalker(const Params &p);
918  virtual ~TableWalker();
919 
920  void init() override;
921 
922  bool haveLPAE() const { return _haveLPAE; }
923  bool haveVirtualization() const { return _haveVirtualization; }
924  bool haveLargeAsid64() const { return _haveLargeAsid64; }
925  uint8_t physAddrRange() const { return _physAddrRange; }
927  void completeDrain();
928  DrainState drain() override;
929  void drainResume() override;
930 
931  Port &getPort(const std::string &if_name,
932  PortID idx=InvalidPortID) override;
933 
934  Fault walk(const RequestPtr &req, ThreadContext *tc,
935  uint16_t asid, uint8_t _vmid,
936  bool _isHyp, TLB::Mode mode, TLB::Translation *_trans,
937  bool timing, bool functional, bool secure,
938  TLB::ArmTranslationType tranType, bool _stage2Req);
939 
940  void setTlb(TLB *_tlb) { tlb = _tlb; }
941  TLB* getTlb() { return tlb; }
942  void setMMU(Stage2MMU *m, RequestorID requestor_id);
943  void memAttrs(ThreadContext *tc, TlbEntry &te, SCTLR sctlr,
944  uint8_t texcb, bool s);
946  LongDescriptor &lDescriptor);
948  LongDescriptor &lDescriptor);
949 
950  static LookupLevel toLookupLevel(uint8_t lookup_level_as_int);
951 
952  private:
953 
954  void doL1Descriptor();
955  void doL1DescriptorWrapper();
957 
958  void doL2Descriptor();
959  void doL2DescriptorWrapper();
961 
962  void doLongDescriptor();
963 
972 
973  void doLongDescriptorWrapper(LookupLevel curr_lookup_level);
975 
976  bool fetchDescriptor(Addr descAddr, uint8_t *data, int numBytes,
977  Request::Flags flags, int queueIndex, Event *event,
978  void (TableWalker::*doDescriptor)());
979 
981 
982  void insertTableEntry(DescriptorBase &descriptor, bool longDescriptor);
983 
984  Fault processWalk();
986 
987  bool checkVAddrSizeFaultAArch64(Addr addr, int top_bit,
988  GrainSize granule, int tsz, bool low_range);
989 
992  bool checkAddrSizeFaultAArch64(Addr addr, int pa_range);
993 
995  void processWalkWrapper();
997 
998  void nextWalk(ThreadContext *tc);
999 
1000  void pendingChange();
1001 
1002  static uint8_t pageSizeNtoStatBin(uint8_t N);
1003 
1005  LookupLevel lookup_level);
1006 };
1007 
1008 } // namespace ArmISA
1009 
1010 #endif //__ARCH_ARM_TABLE_WALKER_HH__
1011 
ArmISA::TableWalker::L1Descriptor::l2Addr
Addr l2Addr() const
Address of L2 descriptor if it exists.
Definition: table_walker.hh:190
ArmISA::TableWalker::WalkerState::pxnTable
bool pxnTable
Definition: table_walker.hh:797
ArmISA::TableWalker::TableWalkerStats::walkWaitTime
Stats::Histogram walkWaitTime
Definition: table_walker.hh:902
ArmISA::TableWalker::L1Descriptor::getRawData
virtual uint64_t getRawData() const
Definition: table_walker.hh:115
ArmISA::TableWalker::L2Descriptor::dbgHeader
virtual std::string dbgHeader() const
Definition: table_walker.hh:270
ArmISA::TableWalker::WalkerState::stage2Req
bool stage2Req
Flag indicating if a second stage of lookup is required.
Definition: table_walker.hh:803
ArmISA::TableWalker::WalkerState::mode
BaseTLB::Mode mode
Save mode for use in delayed response.
Definition: table_walker.hh:815
ArmISA::TableWalker::checkAddrSizeFaultAArch64
bool checkAddrSizeFaultAArch64(Addr addr, int pa_range)
Returns true if the address exceeds the range permitted by the system-wide setting or by the TCR_ELx ...
Definition: table_walker.cc:767
ArmISA::TableWalker::LongDescriptor::af
bool af() const
Returns true if the access flag (AF) is set.
Definition: table_walker.hh:598
ArmISA::TableWalker::WalkerState::el
ExceptionLevel el
Current exception level.
Definition: table_walker.hh:730
ArmISA::TableWalker::LongDescriptor::grainSize
GrainSize grainSize
Width of the granule size in bits.
Definition: table_walker.hh:401
ArmISA::TableWalker::WalkerState::scr
SCR scr
Cached copy of the scr as it existed when translation began.
Definition: table_walker.hh:759
ArmISA::TableWalker::walk
Fault walk(const RequestPtr &req, ThreadContext *tc, uint16_t asid, uint8_t _vmid, bool _isHyp, TLB::Mode mode, TLB::Translation *_trans, bool timing, bool functional, bool secure, TLB::ArmTranslationType tranType, bool _stage2Req)
Definition: table_walker.cc:189
ArmISA::TableWalker::drainResume
void drainResume() override
Resume execution after a successful drain.
Definition: table_walker.cc:179
ArmISA::TableWalker::WalkerState::functional
bool functional
If the atomic mode should be functional.
Definition: table_walker.hh:812
ArmISA::LookupLevel
LookupLevel
Definition: pagetable.hh:72
ArmISA::TableWalker::TableWalkerStats::walksShortDescriptor
Stats::Scalar walksShortDescriptor
Definition: table_walker.hh:896
ArmISA::TableWalker::L1Descriptor::pfn
Addr pfn() const
Return the physical frame, bits shifted right.
Definition: table_walker.hh:158
ArmISA::TableWalker::L2Descriptor
Level 2 page table descriptor.
Definition: table_walker.hh:243
ArmISA::TableWalker::WalkerState::tcr
TCR tcr
Definition: table_walker.hh:767
ArmISA::TableWalker::memAttrsAArch64
void memAttrsAArch64(ThreadContext *tc, TlbEntry &te, LongDescriptor &lDescriptor)
Definition: table_walker.cc:1481
ArmISA::TableWalker::DescriptorBase::secure
virtual bool secure(bool have_security, WalkerState *currState) const =0
ArmISA::TableWalker::L1Descriptor::supersection
bool supersection() const
Is the page a Supersection (16 MiB)?
Definition: table_walker.hh:136
ArmISA::TableWalker::doL2Descriptor
void doL2Descriptor()
Definition: table_walker.cc:1866
ArmISA::EL2
@ EL2
Definition: types.hh:624
ArmISA::TableWalker::WalkerState::isHyp
bool isHyp
Definition: table_walker.hh:741
ArmISA::TableWalker::WalkerState::doL2Descriptor
void doL2Descriptor()
ArmISA::TableWalker::WalkerState::tranType
TLB::ArmTranslationType tranType
The translation type that has been requested.
Definition: table_walker.hh:818
ArmISA::TableWalker::WalkerState::asid
uint16_t asid
ASID that we're servicing the request under.
Definition: table_walker.hh:739
ArmISA::TableWalker::TableWalkerStats::TableWalkerStats
TableWalkerStats(Stats::Group *parent)
Definition: table_walker.cc:2318
ArmISA::TableWalker::DescriptorBase::global
virtual bool global(WalkerState *currState) const =0
ArmISA::TableWalker::LongDescriptor::physAddrRange
uint8_t physAddrRange
Definition: table_walker.hh:403
data
const char data[]
Definition: circlebuf.test.cc:47
ArmISA::TableWalker::LongDescriptor::rwTable
uint8_t rwTable() const
R/W protection flag for subsequent levels of lookup.
Definition: table_walker.hh:691
ArmISA::TableWalker::doL0LongDescriptorWrapper
void doL0LongDescriptorWrapper()
Definition: table_walker.cc:2019
ArmISA::TableWalker::DescriptorBase::shareable
virtual bool shareable() const
Definition: table_walker.hh:86
ArmISA::TableWalker::testWalk
Fault testWalk(Addr pa, Addr size, TlbEntry::DomainType domain, LookupLevel lookup_level)
Definition: table_walker.cc:2288
ArmISA::TableWalker::L2Descriptor::offsetBits
virtual uint8_t offsetBits() const
Definition: table_walker.hh:285
ArmISA::TableWalker::processWalkLPAE
Fault processWalkLPAE()
Definition: table_walker.cc:578
ArmISA::TableWalker::L1Descriptor::_dirty
bool _dirty
This entry has been modified (access flag set) and needs to be written back to memory.
Definition: table_walker.hh:107
ArmISA::TLB::ArmTranslationType
ArmTranslationType
Definition: tlb.hh:127
ArmISA::TableWalker::_haveLPAE
bool _haveLPAE
Definition: table_walker.hh:887
ArmISA::TableWalker::WalkerState::req
RequestPtr req
Request that is currently being serviced.
Definition: table_walker.hh:736
InvalidPortID
const PortID InvalidPortID
Definition: types.hh:244
ArmISA::TableWalker::LongDescriptor::LongDescriptor
LongDescriptor()
Definition: table_walker.hh:385
ArmISA::TableWalker::L1Descriptor::shareable
bool shareable() const
If the section is shareable.
Definition: table_walker.hh:206
ArmISA::TableWalker::sctlr
SCTLR sctlr
Cached copy of the sctlr as it existed when translation began.
Definition: table_walker.hh:874
ArmISA::TableWalker::DescriptorBase::lookupLevel
LookupLevel lookupLevel
Current lookup level for this descriptor.
Definition: table_walker.hh:71
ArmISA::TableWalker::WalkerState::userTable
bool userTable
Definition: table_walker.hh:795
ArmISA::TableWalker::stage2Mmu
Stage2MMU * stage2Mmu
The MMU to forward second stage look upts to.
Definition: table_walker.hh:859
ArmISA::TableWalker::DescriptorBase::dbgHeader
virtual std::string dbgHeader() const =0
ArmISA::TableWalker::haveLPAE
bool haveLPAE() const
Definition: table_walker.hh:922
Flags< FlagsType >
ArmISA::TableWalker::isStage2
const bool isStage2
Indicates whether this table walker is part of the stage 2 mmu.
Definition: table_walker.hh:868
ArmISA::TableWalker::LongDescriptor::nextDescAddr
Addr nextDescAddr(Addr va) const
Return the address of the next descriptor.
Definition: table_walker.hh:540
ArmISA::TableWalker::L2Descriptor::secure
bool secure(bool have_security, WalkerState *currState) const
Definition: table_walker.hh:280
ArmISA::TableWalker::doLongDescriptorWrapper
void doLongDescriptorWrapper(LookupLevel curr_lookup_level)
Definition: table_walker.cc:2043
ArmISA::TableWalker::LongDescriptor::pfn
Addr pfn() const
Return the physical frame, bits shifted right.
Definition: table_walker.hh:502
ArmISA::TableWalker::doL2LongDescEvent
EventFunctionWrapper doL2LongDescEvent
Definition: table_walker.hh:969
ArmISA::TableWalker::numSquashable
unsigned numSquashable
The number of walks belonging to squashed instructions that can be removed from the pendingQueue per ...
Definition: table_walker.hh:883
ArmISA::TableWalker::WalkerState::physAddrRange
int physAddrRange
Current physical address range in bits.
Definition: table_walker.hh:733
ArmISA::TableWalker::WalkerState::tc
ThreadContext * tc
Thread context that we're doing the walk for.
Definition: table_walker.hh:724
ArmISA::TableWalker::haveLargeAsid64
bool haveLargeAsid64() const
Definition: table_walker.hh:924
ArmISA::TableWalker::L2Descriptor::L2Descriptor
L2Descriptor(L1Descriptor &parent)
Definition: table_walker.hh:259
ArmISA::TableWalker::LongDescriptor::apTable
uint8_t apTable() const
Two bit access protection flags for subsequent levels of lookup.
Definition: table_walker.hh:684
ArmISA::te
Bitfield< 30 > te
Definition: miscregs_types.hh:334
BaseTLB::Mode
Mode
Definition: tlb.hh:57
ArmISA::TableWalker::DescriptorBase::xn
virtual bool xn() const =0
ArmISA::TableWalker::TableWalker
TableWalker(const Params &p)
Definition: table_walker.cc:56
Tick
uint64_t Tick
Tick count type.
Definition: types.hh:59
ArmISA::TableWalker::WalkerState::vmid
uint8_t vmid
Definition: table_walker.hh:740
ArmISA::TableWalker::WalkerState::levels
unsigned levels
Page entries walked during service (for stats)
Definition: table_walker.hh:837
ArmISA::TableWalker::_haveVirtualization
bool _haveVirtualization
Definition: table_walker.hh:888
ArmISA::TableWalker::L1Descriptor::EntryType
EntryType
Type of page table entry ARM DDI 0406B: B3-8.
Definition: table_walker.hh:95
ArmISA::TableWalker::processWalk
Fault processWalk()
Definition: table_walker.cc:469
PortID
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:243
ArmISA::TableWalker::doProcessEvent
EventFunctionWrapper doProcessEvent
Definition: table_walker.hh:996
ArmISA::TableWalker::ReservedGrain
@ ReservedGrain
Definition: table_walker.hh:371
ArmISA::TableWalker::WalkerState
Definition: table_walker.hh:720
RequestPtr
std::shared_ptr< Request > RequestPtr
Definition: request.hh:86
ArmISA::TableWalker::L2Descriptor::dirty
bool dirty() const
This entry needs to be written back to memory.
Definition: table_walker.hh:359
ArmISA::TableWalker::WalkerState::startTime
Tick startTime
Timestamp for calculating elapsed time in service (for stats)
Definition: table_walker.hh:834
ArmISA::TableWalker::LongDescriptor::Table
@ Table
Definition: table_walker.hh:380
ArmISA::TableWalker::WalkerState::hcr
HCR hcr
Cached copy of the htcr as it existed when translation began.
Definition: table_walker.hh:774
ArmISA::TableWalker::memAttrs
void memAttrs(ThreadContext *tc, TlbEntry &te, SCTLR sctlr, uint8_t texcb, bool s)
Definition: table_walker.cc:1148
ArmISA::TableWalker::WalkerState::name
std::string name() const
Definition: table_walker.hh:846
ArmISA::TableWalker::pageSizeNtoStatBin
static uint8_t pageSizeNtoStatBin(uint8_t N)
Definition: table_walker.cc:2297
ArmISA::TableWalker::TableWalkerStats::walksLongDescriptor
Stats::Scalar walksLongDescriptor
Definition: table_walker.hh:897
tlb.hh
ArmISA::TableWalker::LongDescriptor::getRawData
virtual uint64_t getRawData() const
Definition: table_walker.hh:406
ArmISA::EL3
@ EL3
Definition: types.hh:625
ArmISA::TableWalker::L1Descriptor::type
EntryType type() const
Definition: table_walker.hh:130
ArmISA::TableWalker::LongDescriptor::pxnTable
bool pxnTable() const
Is privileged execution allowed on subsequent lookup levels?
Definition: table_walker.hh:713
ArmISA::TableWalker::doL2DescriptorWrapper
void doL2DescriptorWrapper()
Definition: table_walker.cc:1978
ArmISA::TableWalker::L1Descriptor
Definition: table_walker.hh:92
ArmISA::TableWalker::init
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: table_walker.cc:108
ArmISA::TableWalker::L1Descriptor::domain
TlbEntry::DomainType domain() const
Domain Client/Manager: ARM DDI 0406B: B3-31.
Definition: table_walker.hh:184
ArmISA::TableWalker::LongDescriptor::type
EntryType type() const
Return the descriptor type.
Definition: table_walker.hh:433
system.hh
ArmISA::TableWalker::doL0LongDescEvent
EventFunctionWrapper doL0LongDescEvent
Definition: table_walker.hh:965
ArmISA::TableWalker::REQUESTED
static const unsigned REQUESTED
Definition: table_walker.hh:912
ArmISA::ArmFault::FaultSource
FaultSource
Generic fault source enums used to index into {short/long/aarch64}DescFaultSources[] to get the actua...
Definition: faults.hh:91
ArmISA::Stage2MMU
Definition: stage2_mmu.hh:50
ArmISA::TableWalker::L1Descriptor::ap
uint8_t ap() const
Three bit access protection flags.
Definition: table_walker.hh:178
ArmISA::TableWalker::WalkerState::doLongDescriptor
void doLongDescriptor()
ArmISA::TableWalker::DescriptorBase::offsetBits
virtual uint8_t offsetBits() const =0
ArmISA::TableWalker::LongDescriptor::userTable
uint8_t userTable() const
User/privileged mode protection flag for subsequent levels of lookup.
Definition: table_walker.hh:699
Stats::Vector
A vector of scalar stats.
Definition: statistics.hh:2007
ArmISA::TableWalker::pendingChangeTick
Tick pendingChangeTick
Definition: table_walker.hh:910
ArmISA::TableWalker::L2Descriptor::paddr
Addr paddr(Addr va) const
Return complete physical address given a VA.
Definition: table_walker.hh:335
ArmISA::TableWalker::WalkerState::tableWalker
TableWalker * tableWalker
Definition: table_walker.hh:831
ArmISA::TableWalker::WalkerState::isWrite
bool isWrite
If the access is a write.
Definition: table_walker.hh:780
ArmISA
Definition: ccregs.hh:41
ArmISA::TableWalker::LongDescriptor::ap
uint8_t ap() const
2-bit access protection flags
Definition: table_walker.hh:612
ArmISA::TableWalker::WalkerState::isSecure
bool isSecure
If the access comes from the secure state.
Definition: table_walker.hh:786
ArmISA::TableWalker::nextWalk
void nextWalk(ThreadContext *tc)
Definition: table_walker.cc:2099
ArmISA::TableWalker::L2Descriptor::invalid
bool invalid() const
Is the entry invalid.
Definition: table_walker.hh:291
request.hh
ArmISA::TableWalker::WalkerState::l1Desc
L1Descriptor l1Desc
Short-format descriptors.
Definition: table_walker.hh:821
ArmISA::TableWalker::L1Descriptor::data
uint32_t data
The raw bits of the entry.
Definition: table_walker.hh:103
ArmISA::TlbEntry::DomainType::Client
@ Client
ArmISA::L0
@ L0
Definition: pagetable.hh:73
ArmISA::TableWalker::WalkerState::timing
bool timing
If the mode is timing or atomic.
Definition: table_walker.hh:809
ClockedObject
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
Definition: clocked_object.hh:231
ArmISA::TableWalker::TableWalkerStats::pageSizes
Stats::Vector pageSizes
Definition: table_walker.hh:905
ArmISA::TableWalker::WalkerState::longDesc
LongDescriptor longDesc
Long-format descriptor (LPAE and AArch64)
Definition: table_walker.hh:825
EventFunctionWrapper
Definition: eventq.hh:1112
ArmISA::TableWalker::WalkerState::secureLookup
bool secureLookup
Helper variables used to implement hierarchical access permissions when the long-desc.
Definition: table_walker.hh:793
Stats::Histogram
A simple histogram stat.
Definition: statistics.hh:2126
ArmISA::TableWalker::LongDescriptor::contiguousHint
bool contiguousHint() const
Contiguous hint bit.
Definition: table_walker.hh:573
ArmISA::TableWalker::DescriptorBase::pfn
virtual Addr pfn() const =0
ArmISA::TableWalker::WalkerState::cpsr
CPSR cpsr
Cached copy of the cpsr as it existed when translation began.
Definition: table_walker.hh:762
ArmISA::TableWalker::toLookupLevel
static LookupLevel toLookupLevel(uint8_t lookup_level_as_int)
Definition: table_walker.cc:2255
ArmISA::TableWalker::WalkerState::stage2Tran
TLB::Translation * stage2Tran
A pointer to the stage 2 translation that's in progress.
Definition: table_walker.hh:806
ArmISA::TableWalker::LongDescriptor::global
bool global(WalkerState *currState) const
Is the translation global (no asid used)?
Definition: table_walker.hh:580
ArmISA::TableWalker::L1Descriptor::Section
@ Section
Definition: table_walker.hh:98
ArmISA::TableWalker::processWalkAArch64
Fault processWalkAArch64()
Definition: table_walker.cc:774
ArmISA::TableWalker::LongDescriptor::Block
@ Block
Definition: table_walker.hh:381
DrainState
DrainState
Object drain/handover states.
Definition: drain.hh:71
Stats::Scalar
This is a simple scalar statistic, like a counter.
Definition: statistics.hh:1933
ArmISA::TableWalker::LongDescriptor::rw
bool rw() const
Read/write access protection flag.
Definition: table_walker.hh:620
ArmISA::TableWalker::L1Descriptor::L1Descriptor
L1Descriptor()
Default ctor.
Definition: table_walker.hh:110
RequestorID
uint16_t RequestorID
Definition: request.hh:89
ArmISA::TableWalker::requestorId
RequestorID requestorId
Requestor id assigned by the MMU.
Definition: table_walker.hh:865
ArmISA::TableWalker::L2Descriptor::domain
virtual TlbEntry::DomainType domain() const
Definition: table_walker.hh:275
ArmISA::TableWalker::L1Descriptor::dirty
bool dirty() const
This entry needs to be written back to memory.
Definition: table_walker.hh:221
ArmISA::TableWalker::L2Descriptor::pfn
Addr pfn() const
Return the physical frame, bits shifted right.
Definition: table_walker.hh:329
ArmISA::TableWalker::doL3LongDescriptorWrapper
void doL3LongDescriptorWrapper()
Definition: table_walker.cc:2037
ArmISA::TableWalker::L1Descriptor::setAp0
void setAp0()
Set access flag that this entry has been touched.
Definition: table_walker.hh:214
ArmISA::TableWalker::L2Descriptor::ap
uint8_t ap() const
Three bit access protection flags.
Definition: table_walker.hh:315
ArmISA::TableWalker::LongDescriptor::data
uint64_t data
The raw bits of the entry.
Definition: table_walker.hh:391
ArmISA::TableWalker::L2Descriptor::_dirty
bool _dirty
This entry has been modified (access flag set) and needs to be written back to memory.
Definition: table_walker.hh:251
ArmISA::TableWalker::L1Descriptor::paddr
Addr paddr() const
Return the physcal address of the entry, bits in position.
Definition: table_walker.hh:142
ArmISA::TableWalker::WalkerState::aarch64
bool aarch64
If the access is performed in AArch64 state.
Definition: table_walker.hh:727
ArmISA::TableWalker::L2Descriptor::texcb
uint8_t texcb() const
Memory region attributes: ARM DDI 0406B: B3-32.
Definition: table_walker.hh:321
ArmISA::TableWalker::LongDescriptor::attrIndx
uint8_t attrIndx() const
Attribute index.
Definition: table_walker.hh:649
ArmISA::TableWalker::WalkerState::doL1Descriptor
void doL1Descriptor()
ThreadContext
ThreadContext is the external interface to all thread state for anything outside of the CPU.
Definition: thread_context.hh:88
ClockedObject::Params
ClockedObjectParams Params
Parameters of ClockedObject.
Definition: clocked_object.hh:237
ArmISA::TableWalker::fetchDescriptor
bool fetchDescriptor(Addr descAddr, uint8_t *data, int numBytes, Request::Flags flags, int queueIndex, Event *event, void(TableWalker::*doDescriptor)())
Definition: table_walker.cc:2108
Event
Definition: eventq.hh:248
ArmISA::TableWalker::DescriptorBase::getRawData
virtual uint64_t getRawData() const =0
ArmISA::TableWalker::_haveLargeAsid64
bool _haveLargeAsid64
Definition: table_walker.hh:890
ArmISA::TableWalker::TableWalkerStats::walks
Stats::Scalar walks
Definition: table_walker.hh:895
ArmISA::L1
@ L1
Definition: pagetable.hh:74
ArmISA::ExceptionLevel
ExceptionLevel
Definition: types.hh:621
ArmISA::TableWalker::L1Descriptor::Reserved
@ Reserved
Definition: table_walker.hh:99
Fault
std::shared_ptr< FaultBase > Fault
Definition: types.hh:246
ArmISA::TableWalker::WalkerState::xnTable
bool xnTable
Definition: table_walker.hh:796
MipsISA::event
Bitfield< 10, 5 > event
Definition: pra_constants.hh:297
ArmISA::TableWalker::getTlb
TLB * getTlb()
Definition: table_walker.hh:941
ArmISA::TableWalker::stats
ArmISA::TableWalker::TableWalkerStats stats
ArmISA::TableWalker::L1Descriptor::secure
bool secure(bool have_security, WalkerState *currState) const
Returns true if this entry targets the secure physical address map.
Definition: table_walker.hh:230
ArmISA::TableWalker::L1Descriptor::global
bool global(WalkerState *currState) const
Is the translation global (no asid used)?
Definition: table_walker.hh:166
ArmISA::TableWalker::haveSecurity
bool haveSecurity
Cached copies of system-level properties.
Definition: table_walker.hh:886
ArmISA::TableWalker::LongDescriptor::domain
TlbEntry::DomainType domain() const
Definition: table_walker.hh:641
ArmISA::TableWalker::LongDescriptor::dbgHeader
virtual std::string dbgHeader() const
Definition: table_walker.hh:411
ArmISA::TableWalker::L2Descriptor::large
bool large() const
What is the size of the mapping?
Definition: table_walker.hh:297
ArmISA::TableWalker::L2Descriptor::setAp0
void setAp0()
Set access flag that this entry has been touched.
Definition: table_walker.hh:352
ArmISA::TableWalker::stateQueues
std::list< WalkerState * > stateQueues[MAX_LOOKUP_LEVELS]
Queues of requests for all the different lookup levels.
Definition: table_walker.hh:852
Port
Ports are used to interface objects to each other.
Definition: port.hh:56
ArmISA::TableWalker::LongDescriptor::secureTable
bool secureTable() const
Whether the subsequent levels of lookup are secure.
Definition: table_walker.hh:677
ArmISA::TableWalker::Grain64KB
@ Grain64KB
Definition: table_walker.hh:370
ArmISA::TableWalker::L1Descriptor::Ignore
@ Ignore
Definition: table_walker.hh:96
ArmISA::TableWalker::Grain16KB
@ Grain16KB
Definition: table_walker.hh:369
ArmISA::mode
Bitfield< 4, 0 > mode
Definition: miscregs_types.hh:70
ArmISA::TableWalker::WalkerState::rwTable
bool rwTable
Definition: table_walker.hh:794
ArmISA::TableWalker::DescriptorBase
Definition: table_walker.hh:66
ArmISA::TableWalker::LongDescriptor::memAttr
uint8_t memAttr() const
Memory attributes, only used by stage 2 translations.
Definition: table_walker.hh:656
ArmISA::TableWalker::LongDescriptor::secure
bool secure(bool have_security, WalkerState *currState) const
Returns true if this entry targets the secure physical address map.
Definition: table_walker.hh:426
ArmISA::TableWalker::pendingChange
void pendingChange()
Definition: table_walker.cc:2272
ArmISA::TableWalker::PARAMS
PARAMS(ArmTableWalker)
Block
Definition: global.h:77
BaseTLB::Translation
Definition: tlb.hh:59
ArmISA::TableWalker::L1Descriptor::texcb
uint8_t texcb() const
Memory region attributes: ARM DDI 0406B: B3-32.
Definition: table_walker.hh:200
ArmISA::TableWalker::L2Descriptor::shareable
bool shareable() const
If the section is shareable.
Definition: table_walker.hh:344
ArmISA::TableWalker::WalkerState::vtcr
VTCR_t vtcr
Cached copy of the vtcr as it existed when translation began.
Definition: table_walker.hh:777
ArmISA::TableWalker::haveVirtualization
bool haveVirtualization() const
Definition: table_walker.hh:923
mbits
constexpr T mbits(T val, unsigned first, unsigned last)
Mask off the given bits in place like bits() but without shifting.
Definition: bitfield.hh:100
ArmISA::TableWalker::getPort
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
Definition: table_walker.cc:116
ArmISA::TableWalker::doL2LongDescriptorWrapper
void doL2LongDescriptorWrapper()
Definition: table_walker.cc:2031
ArmISA::TableWalker::LongDescriptor::aarch64
bool aarch64
True if the current lookup is performed in AArch64 state.
Definition: table_walker.hh:398
ArmISA::TableWalker::WalkerState::delayed
bool delayed
Whether the response is delayed in timing mode due to additional lookups.
Definition: table_walker.hh:829
ArmISA::TableWalker::doL3LongDescEvent
EventFunctionWrapper doL3LongDescEvent
Definition: table_walker.hh:971
ArmISA::L2
@ L2
Definition: pagetable.hh:75
ArmISA::TableWalker::port
DmaPort * port
Port shared by the two table walkers.
Definition: table_walker.hh:862
ArmISA::TableWalker::LongDescriptor::ap
static uint8_t ap(bool rw, bool user)
Return the AP bits as compatible with the AP[2:0] format.
Definition: table_walker.hh:636
ArmISA::TableWalker::LongDescriptor::Page
@ Page
Definition: table_walker.hh:382
ArmISA::TableWalker::L2Descriptor::getRawData
virtual uint64_t getRawData() const
Definition: table_walker.hh:265
ArmISA::TableWalker::L2Descriptor::data
uint32_t data
The raw bits of the entry.
Definition: table_walker.hh:246
ArmISA::TableWalker::TableWalkerStats
Statistics.
Definition: table_walker.hh:893
faults.hh
ArmISA::TableWalker::DescriptorBase::ap
virtual uint8_t ap() const =0
ArmISA::TableWalker::LongDescriptor::user
bool user() const
User/privileged level access protection flag.
Definition: table_walker.hh:627
ArmISA::TableWalker::LongDescEventByLevel
Event * LongDescEventByLevel[4]
Definition: table_walker.hh:974
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:148
ArmISA::TableWalker::TableWalkerStats::walkServiceTime
Stats::Histogram walkServiceTime
Definition: table_walker.hh:903
ArmISA::TableWalker::LongDescriptor::setAf
void setAf()
Set access flag that this entry has been touched.
Definition: table_walker.hh:664
ArmISA::TableWalker::L2Descriptor::l1Parent
L1Descriptor * l1Parent
Definition: table_walker.hh:247
ArmISA::TableWalker::TableWalkerStats::walksLongTerminatedAtLevel
Stats::Vector walksLongTerminatedAtLevel
Definition: table_walker.hh:899
ArmISA::TableWalker::WalkerState::isFetch
bool isFetch
If the access is a fetch (for execution, and no-exec) must be checked?
Definition: table_walker.hh:783
ArmISA::TableWalker::TableWalkerStats::walksShortTerminatedAtLevel
Stats::Vector walksShortTerminatedAtLevel
Definition: table_walker.hh:898
ArmISA::TableWalker::generateLongDescFault
Fault generateLongDescFault(ArmFault::FaultSource src)
Definition: table_walker.cc:1686
ArmISA::TableWalker::LongDescriptor::offsetBits
uint8_t offsetBits() const
Return the bit width of the page/block offset.
Definition: table_walker.hh:472
ArmISA::TableWalker::memAttrsLPAE
void memAttrsLPAE(ThreadContext *tc, TlbEntry &te, LongDescriptor &lDescriptor)
Definition: table_walker.cc:1355
ArmISA::TableWalker::WalkerState::htcr
HTCR htcr
Cached copy of the htcr as it existed when translation began.
Definition: table_walker.hh:771
ArmISA::asid
asid
Definition: miscregs_types.hh:611
ArmISA::TableWalker::completeDrain
void completeDrain()
Checks if all state is cleared and if so, completes drain.
Definition: table_walker.cc:145
ArmISA::TableWalker::physAddrRange
uint8_t physAddrRange() const
Definition: table_walker.hh:925
ArmISA::TLB
Definition: tlb.hh:109
ArmISA::TableWalker::doL1LongDescEvent
EventFunctionWrapper doL1LongDescEvent
Definition: table_walker.hh:967
X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:80
SimObject::name
virtual const std::string name() const
Definition: sim_object.hh:182
ArmISA::TableWalker::WalkerState::hpd
bool hpd
Hierarchical access permission disable.
Definition: table_walker.hh:800
ArmISA::TableWalker::drain
DrainState drain() override
Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are pa...
Definition: table_walker.cc:158
miscregs.hh
ArmISA::TableWalker::WalkerState::vaddr_tainted
Addr vaddr_tainted
The virtual address that is being translated.
Definition: table_walker.hh:753
ArmISA::TableWalker::WalkerState::vaddr
Addr vaddr
The virtual address that is being translated with tagging removed.
Definition: table_walker.hh:750
ArmISA::TableWalker::setMMU
void setMMU(Stage2MMU *m, RequestorID requestor_id)
Definition: table_walker.cc:100
ArmISA::TableWalker::L1Descriptor::xn
bool xn() const
Is the translation not allow execution?
Definition: table_walker.hh:172
ArmISA::TableWalker::doL1DescriptorWrapper
void doL1DescriptorWrapper()
Definition: table_walker.cc:1922
ArmISA::TlbEntry::DomainType
DomainType
Definition: pagetable.hh:90
ArmISA::TlbEntry
Definition: pagetable.hh:81
ArmISA::TableWalker::pendingReqs
unsigned pendingReqs
Definition: table_walker.hh:909
Stats::Vector2d
A 2-Dimensional vecto of scalar stats.
Definition: statistics.hh:2058
ArmISA::TableWalker::LongDescriptor::dirty
bool dirty() const
This entry needs to be written back to memory.
Definition: table_walker.hh:671
ArmISA::TableWalker::tlb
TLB * tlb
TLB that is initiating these table walks.
Definition: table_walker.hh:871
ArmISA::TableWalker::LongDescriptor::sh
uint8_t sh() const
2-bit shareability field
Definition: table_walker.hh:605
ArmISA::TableWalker::LongDescriptor::paddr
Addr paddr() const
Return the physical address of the entry.
Definition: table_walker.hh:508
ArmISA::TableWalker::LongDescriptor::_dirty
bool _dirty
This entry has been modified (access flag set) and needs to be written back to memory.
Definition: table_walker.hh:395
ArmISA::TableWalker::TableWalkerStats::requestOrigin
Stats::Vector2d requestOrigin
Definition: table_walker.hh:906
ArmISA::TableWalker::Grain4KB
@ Grain4KB
Definition: table_walker.hh:368
ArmISA::TableWalker::WalkerState::isUncacheable
bool isUncacheable
True if table walks are uncacheable (for table descriptors)
Definition: table_walker.hh:789
ArmISA::domain
Bitfield< 7, 4 > domain
Definition: miscregs_types.hh:418
ArmISA::TableWalker::DescriptorBase::DescriptorBase
DescriptorBase()
Definition: table_walker.hh:68
ArmISA::TableWalker::pendingQueue
std::list< WalkerState * > pendingQueue
Queue of requests that have passed are waiting because the walker is currently busy.
Definition: table_walker.hh:856
clocked_object.hh
Stats::Group
Statistics container.
Definition: group.hh:87
ArmISA::TableWalker::checkVAddrSizeFaultAArch64
bool checkVAddrSizeFaultAArch64(Addr addr, int top_bit, GrainSize granule, int tsz, bool low_range)
Definition: table_walker.cc:750
ArmISA::TableWalker::DescriptorBase::domain
virtual TlbEntry::DomainType domain() const =0
ArmISA::TableWalker::LongDescriptor::Invalid
@ Invalid
Definition: table_walker.hh:379
ArmISA::TableWalker::LongDescriptor::xn
bool xn() const
Is execution allowed on this mapping?
Definition: table_walker.hh:559
ArmISA::stride
Bitfield< 21, 20 > stride
Definition: miscregs_types.hh:441
ArmISA::MAX_LOOKUP_LEVELS
@ MAX_LOOKUP_LEVELS
Definition: pagetable.hh:77
ArmISA::TableWalker::LongDescriptor::nextTableAddr
Addr nextTableAddr() const
Return the address of the next page table.
Definition: table_walker.hh:523
ArmISA::TableWalker::WalkerState::sctlr
SCTLR sctlr
Cached copy of the sctlr as it existed when translation began.
Definition: table_walker.hh:756
bits
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
Definition: bitfield.hh:73
ArmISA::TableWalker::COMPLETED
static const unsigned COMPLETED
Definition: table_walker.hh:913
ArmISA::TableWalker
Definition: table_walker.hh:61
ArmISA::TableWalker::doL1LongDescriptorWrapper
void doL1LongDescriptorWrapper()
Definition: table_walker.cc:2025
ArmISA::TableWalker::LongDescriptor::xnTable
bool xnTable() const
Is execution allowed on subsequent lookup levels?
Definition: table_walker.hh:706
ArmISA::TableWalker::doL1DescEvent
EventFunctionWrapper doL1DescEvent
Definition: table_walker.hh:956
ArmISA::TableWalker::L1Descriptor::dbgHeader
virtual std::string dbgHeader() const
Definition: table_walker.hh:120
ArmISA::TableWalker::WalkerState::WalkerState
WalkerState()
Definition: table_walker.cc:128
ArmISA::TableWalker::LongDescriptor::pxn
bool pxn() const
Is privileged execution allowed on this mapping? (LPAE only)
Definition: table_walker.hh:566
ArmISA::TableWalker::doL2DescEvent
EventFunctionWrapper doL2DescEvent
Definition: table_walker.hh:960
ArmISA::pa
Bitfield< 39, 12 > pa
Definition: miscregs_types.hh:650
ArmISA::TableWalker::L2Descriptor::global
bool global(WalkerState *currState) const
Is the translation global (no asid used)?
Definition: table_walker.hh:309
ArmISA::TableWalker::currState
WalkerState * currState
Definition: table_walker.hh:876
MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:323
ArmISA::TableWalker::~TableWalker
virtual ~TableWalker()
Definition: table_walker.cc:94
std::list
STL list class.
Definition: stl.hh:51
ArmISA::TableWalker::doLongDescriptor
void doLongDescriptor()
Definition: table_walker.cc:1706
ArmISA::TableWalker::processWalkWrapper
void processWalkWrapper()
Definition: table_walker.cc:378
ArmISA::TableWalker::L2Descriptor::xn
bool xn() const
Is execution allowed on this mapping?
Definition: table_walker.hh:303
ArmISA::TableWalker::LongDescriptor
Long-descriptor format (LPAE)
Definition: table_walker.hh:375
ArmISA::s
Bitfield< 4 > s
Definition: miscregs_types.hh:556
ArmISA::TableWalker::WalkerState::transState
TLB::Translation * transState
Translation state for delayed requests.
Definition: table_walker.hh:744
ArmISA::TableWalker::setTlb
void setTlb(TLB *_tlb)
Definition: table_walker.hh:940
ArmISA::TableWalker::WalkerState::fault
Fault fault
The fault that we are going to return.
Definition: table_walker.hh:747
ArmISA::TableWalker::L1Descriptor::paddr
Addr paddr(Addr va) const
Return the physcal address of the entry, bits in position.
Definition: table_walker.hh:149
ArmISA::TableWalker::WalkerState::ttbcr
TTBCR ttbcr
Definition: table_walker.hh:766
ArmISA::TableWalker::TableWalkerStats::squashedAfter
Stats::Scalar squashedAfter
Definition: table_walker.hh:901
ArmISA::TableWalker::WalkerState::l2Desc
L2Descriptor l2Desc
Definition: table_walker.hh:822
DmaPort
Definition: dma_device.hh:58
ArmISA::TableWalker::TableWalkerStats::squashedBefore
Stats::Scalar squashedBefore
Definition: table_walker.hh:900
ArmISA::TableWalker::DescriptorBase::texcb
virtual uint8_t texcb() const
Definition: table_walker.hh:82
ArmISA::TableWalker::L2Descriptor::L2Descriptor
L2Descriptor()
Default ctor.
Definition: table_walker.hh:254
ArmISA::TableWalker::insertTableEntry
void insertTableEntry(DescriptorBase &descriptor, bool longDescriptor)
Definition: table_walker.cc:2180
ArmISA::TableWalker::_physAddrRange
uint8_t _physAddrRange
Definition: table_walker.hh:889
ArmISA::TableWalker::TableWalkerStats::pendingWalks
Stats::Histogram pendingWalks
Definition: table_walker.hh:904
ArmISA::va
Bitfield< 8 > va
Definition: miscregs_types.hh:272
ArmISA::L3
@ L3
Definition: pagetable.hh:76
ArmISA::m
Bitfield< 0 > m
Definition: miscregs_types.hh:389
ArmISA::TableWalker::pending
bool pending
If a timing translation is currently in progress.
Definition: table_walker.hh:879
ArmISA::TableWalker::LongDescriptor::EntryType
EntryType
Descriptor type.
Definition: table_walker.hh:378
ArmISA::TableWalker::doL1Descriptor
void doL1Descriptor()
Definition: table_walker.cc:1581
ArmISA::TableWalker::L1Descriptor::offsetBits
virtual uint8_t offsetBits() const
Definition: table_walker.hh:125
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:171
ArmISA::TableWalker::GrainSize
GrainSize
Definition: table_walker.hh:367
ArmISA::TableWalker::L1Descriptor::PageTable
@ PageTable
Definition: table_walker.hh:97
eventq.hh

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