pagetable.hh revision 10558
16019Shines@cs.fsu.edu/* 210037SARM gem5 Developers * Copyright (c) 2010, 2012-2013 ARM Limited 37399SAli.Saidi@ARM.com * All rights reserved 47399SAli.Saidi@ARM.com * 57399SAli.Saidi@ARM.com * The license below extends only to copyright in the software and shall 67399SAli.Saidi@ARM.com * not be construed as granting a license to any other intellectual 77399SAli.Saidi@ARM.com * property including but not limited to intellectual property relating 87399SAli.Saidi@ARM.com * to a hardware implementation of the functionality of the software 97399SAli.Saidi@ARM.com * licensed hereunder. You may use the software subject to the license 107399SAli.Saidi@ARM.com * terms below provided that you ensure that this notice is replicated 117399SAli.Saidi@ARM.com * unmodified and in its entirety in all distributions of the software, 127399SAli.Saidi@ARM.com * modified or unmodified, in source code or in binary form. 137399SAli.Saidi@ARM.com * 146019Shines@cs.fsu.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan 156019Shines@cs.fsu.edu * All rights reserved. 166019Shines@cs.fsu.edu * 176019Shines@cs.fsu.edu * Redistribution and use in source and binary forms, with or without 186019Shines@cs.fsu.edu * modification, are permitted provided that the following conditions are 196019Shines@cs.fsu.edu * met: redistributions of source code must retain the above copyright 206019Shines@cs.fsu.edu * notice, this list of conditions and the following disclaimer; 216019Shines@cs.fsu.edu * redistributions in binary form must reproduce the above copyright 226019Shines@cs.fsu.edu * notice, this list of conditions and the following disclaimer in the 236019Shines@cs.fsu.edu * documentation and/or other materials provided with the distribution; 246019Shines@cs.fsu.edu * neither the name of the copyright holders nor the names of its 256019Shines@cs.fsu.edu * contributors may be used to endorse or promote products derived from 266019Shines@cs.fsu.edu * this software without specific prior written permission. 276019Shines@cs.fsu.edu * 286019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 296019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 306019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 316019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 326019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 336019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 346019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 356019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 366019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 376019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 386019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 396019Shines@cs.fsu.edu * 407404SAli.Saidi@ARM.com * Authors: Ali Saidi 416019Shines@cs.fsu.edu */ 426019Shines@cs.fsu.edu 436019Shines@cs.fsu.edu#ifndef __ARCH_ARM_PAGETABLE_H__ 446019Shines@cs.fsu.edu#define __ARCH_ARM_PAGETABLE_H__ 456019Shines@cs.fsu.edu 4610037SARM gem5 Developers#include <cstdint> 4710037SARM gem5 Developers 486019Shines@cs.fsu.edu#include "arch/arm/isa_traits.hh" 496019Shines@cs.fsu.edu#include "arch/arm/utility.hh" 506019Shines@cs.fsu.edu#include "arch/arm/vtophys.hh" 517733SAli.Saidi@ARM.com#include "sim/serialize.hh" 527733SAli.Saidi@ARM.com 536019Shines@cs.fsu.edunamespace ArmISA { 546019Shines@cs.fsu.edu 557399SAli.Saidi@ARM.comstruct VAddr 567399SAli.Saidi@ARM.com{ 577399SAli.Saidi@ARM.com VAddr(Addr a) { panic("not implemented yet."); } 587399SAli.Saidi@ARM.com}; 597399SAli.Saidi@ARM.com 607399SAli.Saidi@ARM.com 617399SAli.Saidi@ARM.com// ITB/DTB page table entry 627399SAli.Saidi@ARM.comstruct PTE 637399SAli.Saidi@ARM.com{ 647399SAli.Saidi@ARM.com void serialize(std::ostream &os) 656019Shines@cs.fsu.edu { 667399SAli.Saidi@ARM.com panic("Need to implement PTE serialization\n"); 677399SAli.Saidi@ARM.com } 686019Shines@cs.fsu.edu 697399SAli.Saidi@ARM.com void unserialize(Checkpoint *cp, const std::string §ion) 707399SAli.Saidi@ARM.com { 717399SAli.Saidi@ARM.com panic("Need to implement PTE serialization\n"); 727399SAli.Saidi@ARM.com } 736019Shines@cs.fsu.edu 747399SAli.Saidi@ARM.com}; 756019Shines@cs.fsu.edu 7610037SARM gem5 Developers// Lookup level 7710037SARM gem5 Developersenum LookupLevel { 7810037SARM gem5 Developers L0 = 0, // AArch64 only 7910037SARM gem5 Developers L1, 8010037SARM gem5 Developers L2, 8110037SARM gem5 Developers L3, 8210037SARM gem5 Developers MAX_LOOKUP_LEVELS 8310037SARM gem5 Developers}; 8410037SARM gem5 Developers 857399SAli.Saidi@ARM.com// ITB/DTB table entry 867399SAli.Saidi@ARM.comstruct TlbEntry 877399SAli.Saidi@ARM.com{ 887404SAli.Saidi@ARM.com public: 8910037SARM gem5 Developers enum class MemoryType : std::uint8_t { 907404SAli.Saidi@ARM.com StronglyOrdered, 917404SAli.Saidi@ARM.com Device, 927404SAli.Saidi@ARM.com Normal 937404SAli.Saidi@ARM.com }; 9410037SARM gem5 Developers 9510037SARM gem5 Developers enum class DomainType : std::uint8_t { 9610037SARM gem5 Developers NoAccess = 0, 9710037SARM gem5 Developers Client, 9810037SARM gem5 Developers Reserved, 9910037SARM gem5 Developers Manager 1007404SAli.Saidi@ARM.com }; 1016019Shines@cs.fsu.edu 1027404SAli.Saidi@ARM.com // Matching variables 1037404SAli.Saidi@ARM.com Addr pfn; 1047404SAli.Saidi@ARM.com Addr size; // Size of this entry, == Type of TLB Rec 1057404SAli.Saidi@ARM.com Addr vpn; // Virtual Page Number 10610037SARM gem5 Developers uint64_t attributes; // Memory attributes formatted for PAR 10710037SARM gem5 Developers 10810037SARM gem5 Developers LookupLevel lookupLevel; // Lookup level where the descriptor was fetched 10910037SARM gem5 Developers // from. Used to set the FSR for faults 11010037SARM gem5 Developers // occurring while the long desc. format is in 11110037SARM gem5 Developers // use (AArch32 w/ LPAE and AArch64) 11210037SARM gem5 Developers 11310037SARM gem5 Developers uint16_t asid; // Address Space Identifier 11410037SARM gem5 Developers uint8_t vmid; // Virtual machine Identifier 1157404SAli.Saidi@ARM.com uint8_t N; // Number of bits in pagesize 11610037SARM gem5 Developers uint8_t innerAttrs; 11710037SARM gem5 Developers uint8_t outerAttrs; 11810037SARM gem5 Developers uint8_t ap; // Access permissions bits 11910037SARM gem5 Developers uint8_t hap; // Hyp access permissions bits 12010037SARM gem5 Developers DomainType domain; // Access Domain 12110037SARM gem5 Developers 12210037SARM gem5 Developers MemoryType mtype; 12310037SARM gem5 Developers 12410037SARM gem5 Developers // True if the long descriptor format is used for this entry (LPAE only) 12510037SARM gem5 Developers bool longDescFormat; // @todo use this in the update attribute bethod 12610037SARM gem5 Developers 12710037SARM gem5 Developers bool isHyp; 1287404SAli.Saidi@ARM.com bool global; 1297404SAli.Saidi@ARM.com bool valid; 1307399SAli.Saidi@ARM.com 13110037SARM gem5 Developers // True if the entry targets the non-secure physical address space 13210037SARM gem5 Developers bool ns; 13310037SARM gem5 Developers // True if the entry was brought in from a non-secure page table 13410037SARM gem5 Developers bool nstid; 13510037SARM gem5 Developers // Exception level on insert, AARCH64 EL0&1, AARCH32 -> el=1 13610037SARM gem5 Developers uint8_t el; 13710037SARM gem5 Developers 1387404SAli.Saidi@ARM.com // Type of memory 1397404SAli.Saidi@ARM.com bool nonCacheable; // Can we wrap this in mtype? 1407404SAli.Saidi@ARM.com 1417436Sdam.sunwoo@arm.com // Memory Attributes 1427436Sdam.sunwoo@arm.com bool shareable; 14310037SARM gem5 Developers bool outerShareable; 1447436Sdam.sunwoo@arm.com 1457404SAli.Saidi@ARM.com // Access permissions 1467404SAli.Saidi@ARM.com bool xn; // Execute Never 14710037SARM gem5 Developers bool pxn; // Privileged Execute Never (LPAE only) 1487404SAli.Saidi@ARM.com 1497404SAli.Saidi@ARM.com //Construct an entry that maps to physical address addr for SE mode 15010558Salexandru.dutu@amd.com TlbEntry(Addr _asn, Addr _vaddr, Addr _paddr, 15110558Salexandru.dutu@amd.com bool uncacheable, bool read_only) : 15210037SARM gem5 Developers pfn(_paddr >> PageShift), size(PageBytes - 1), vpn(_vaddr >> PageShift), 15310037SARM gem5 Developers attributes(0), lookupLevel(L1), asid(_asn), vmid(0), N(0), 15410558Salexandru.dutu@amd.com innerAttrs(0), outerAttrs(0), ap(read_only ? 0x3 : 0), hap(0x3), 15510037SARM gem5 Developers domain(DomainType::Client), mtype(MemoryType::StronglyOrdered), 15610037SARM gem5 Developers longDescFormat(false), isHyp(false), global(false), valid(true), 15710558Salexandru.dutu@amd.com ns(true), nstid(true), el(0), nonCacheable(uncacheable), 15810558Salexandru.dutu@amd.com shareable(false), outerShareable(false), xn(0), pxn(0) 1596019Shines@cs.fsu.edu { 16010037SARM gem5 Developers // no restrictions by default, hap = 0x3 1617404SAli.Saidi@ARM.com 16210037SARM gem5 Developers // @todo Check the memory type 16310558Salexandru.dutu@amd.com if (read_only) 16410558Salexandru.dutu@amd.com warn("ARM TlbEntry does not support read-only mappings\n"); 1657399SAli.Saidi@ARM.com } 1666019Shines@cs.fsu.edu 16710037SARM gem5 Developers TlbEntry() : 16810037SARM gem5 Developers pfn(0), size(0), vpn(0), attributes(0), lookupLevel(L1), asid(0), 16910037SARM gem5 Developers vmid(0), N(0), innerAttrs(0), outerAttrs(0), ap(0), hap(0x3), 17010037SARM gem5 Developers domain(DomainType::Client), mtype(MemoryType::StronglyOrdered), 17110037SARM gem5 Developers longDescFormat(false), isHyp(false), global(false), valid(true), 17210037SARM gem5 Developers ns(true), nstid(true), el(0), nonCacheable(false), 17310037SARM gem5 Developers shareable(false), outerShareable(false), xn(0), pxn(0) 17410037SARM gem5 Developers { 17510037SARM gem5 Developers // no restrictions by default, hap = 0x3 17610037SARM gem5 Developers 17710037SARM gem5 Developers // @todo Check the memory type 17810037SARM gem5 Developers } 1796019Shines@cs.fsu.edu 1807399SAli.Saidi@ARM.com void 1817399SAli.Saidi@ARM.com updateVaddr(Addr new_vaddr) 1827399SAli.Saidi@ARM.com { 1837404SAli.Saidi@ARM.com vpn = new_vaddr >> PageShift; 1847399SAli.Saidi@ARM.com } 1856019Shines@cs.fsu.edu 1867399SAli.Saidi@ARM.com Addr 18710037SARM gem5 Developers pageStart() const 1887399SAli.Saidi@ARM.com { 1897404SAli.Saidi@ARM.com return pfn << PageShift; 1907404SAli.Saidi@ARM.com } 1917404SAli.Saidi@ARM.com 1927404SAli.Saidi@ARM.com bool 19310037SARM gem5 Developers match(Addr va, uint8_t _vmid, bool hypLookUp, bool secure_lookup, 19410037SARM gem5 Developers uint8_t target_el) const 1957404SAli.Saidi@ARM.com { 19610037SARM gem5 Developers return match(va, 0, _vmid, hypLookUp, secure_lookup, true, target_el); 19710037SARM gem5 Developers } 19810037SARM gem5 Developers 19910037SARM gem5 Developers bool 20010037SARM gem5 Developers match(Addr va, uint16_t asn, uint8_t _vmid, bool hypLookUp, 20110037SARM gem5 Developers bool secure_lookup, bool ignore_asn, uint8_t target_el) const 20210037SARM gem5 Developers { 20310037SARM gem5 Developers bool match = false; 2047404SAli.Saidi@ARM.com Addr v = vpn << N; 20510037SARM gem5 Developers 20610037SARM gem5 Developers if (valid && va >= v && va <= v + size && (secure_lookup == !nstid) && 20710037SARM gem5 Developers (hypLookUp == isHyp)) 20810037SARM gem5 Developers { 20910037SARM gem5 Developers if (target_el == 2 || target_el == 3) 21010037SARM gem5 Developers match = (el == target_el); 21110037SARM gem5 Developers else 21210037SARM gem5 Developers match = (el == 0) || (el == 1); 21310037SARM gem5 Developers if (match && !ignore_asn) { 21410037SARM gem5 Developers match = global || (asn == asid); 21510037SARM gem5 Developers } 21610037SARM gem5 Developers if (match && nstid) { 21710037SARM gem5 Developers match = isHyp || (_vmid == vmid); 21810037SARM gem5 Developers } 21910037SARM gem5 Developers } 22010037SARM gem5 Developers return match; 2217404SAli.Saidi@ARM.com } 2227404SAli.Saidi@ARM.com 2237404SAli.Saidi@ARM.com Addr 22410037SARM gem5 Developers pAddr(Addr va) const 2257404SAli.Saidi@ARM.com { 2267404SAli.Saidi@ARM.com return (pfn << N) | (va & size); 2277399SAli.Saidi@ARM.com } 2286019Shines@cs.fsu.edu 2297733SAli.Saidi@ARM.com void 23010037SARM gem5 Developers updateAttributes() 23110037SARM gem5 Developers { 23210037SARM gem5 Developers uint64_t mask; 23310037SARM gem5 Developers uint64_t newBits; 23410037SARM gem5 Developers 23510037SARM gem5 Developers // chec bit 11 to determine if its currently LPAE or VMSA format. 23610037SARM gem5 Developers if ( attributes & (1 << 11) ) { 23710037SARM gem5 Developers newBits = ((outerShareable ? 0x2 : 23810037SARM gem5 Developers shareable ? 0x3 : 0) << 7); 23910037SARM gem5 Developers mask = 0x180; 24010037SARM gem5 Developers } else { 24110037SARM gem5 Developers /** Formatting for Physical Address Register (PAR) 24210037SARM gem5 Developers * Only including lower bits (TLB info here) 24310037SARM gem5 Developers * PAR (32-bit format): 24410037SARM gem5 Developers * PA [31:12] 24510037SARM gem5 Developers * LPAE [11] (Large Physical Address Extension) 24610037SARM gem5 Developers * TLB info [10:1] 24710037SARM gem5 Developers * NOS [10] (Not Outer Sharable) 24810037SARM gem5 Developers * NS [9] (Non-Secure) 24910037SARM gem5 Developers * -- [8] (Implementation Defined) 25010037SARM gem5 Developers * SH [7] (Sharable) 25110037SARM gem5 Developers * Inner[6:4](Inner memory attributes) 25210037SARM gem5 Developers * Outer[3:2](Outer memory attributes) 25310037SARM gem5 Developers * SS [1] (SuperSection) 25410037SARM gem5 Developers * F [0] (Fault, Fault Status in [6:1] if faulted) 25510037SARM gem5 Developers */ 25610037SARM gem5 Developers newBits = ((outerShareable ? 0:1) << 10) | 25710037SARM gem5 Developers ((shareable ? 1:0) << 7) | 25810037SARM gem5 Developers (innerAttrs << 4) | 25910037SARM gem5 Developers (outerAttrs << 2); 26010037SARM gem5 Developers // TODO: Supersection bit 26110037SARM gem5 Developers mask = 0x4FC; 26210037SARM gem5 Developers } 26310037SARM gem5 Developers // common bits 26410037SARM gem5 Developers newBits |= ns << 9; // NS bit 26510037SARM gem5 Developers mask |= 1 << 9; 26610037SARM gem5 Developers // add in the new bits 26710037SARM gem5 Developers attributes &= ~mask; 26810037SARM gem5 Developers attributes |= newBits; 26910037SARM gem5 Developers } 27010037SARM gem5 Developers 27110037SARM gem5 Developers void 27210037SARM gem5 Developers setAttributes(bool lpae) 27310037SARM gem5 Developers { 27410037SARM gem5 Developers attributes = lpae ? (1 << 11) : 0; 27510037SARM gem5 Developers updateAttributes(); 27610037SARM gem5 Developers } 27710037SARM gem5 Developers 27810037SARM gem5 Developers std::string 27910037SARM gem5 Developers print() const 28010037SARM gem5 Developers { 28110037SARM gem5 Developers return csprintf("%#x, asn %d vmn %d hyp %d ppn %#x size: %#x ap:%d " 28210037SARM gem5 Developers "ns:%d nstid:%d g:%d el:%d", vpn << N, asid, vmid, 28310037SARM gem5 Developers isHyp, pfn << N, size, ap, ns, nstid, global, el); 28410037SARM gem5 Developers } 28510037SARM gem5 Developers 28610037SARM gem5 Developers void 2877733SAli.Saidi@ARM.com serialize(std::ostream &os) 2887733SAli.Saidi@ARM.com { 28910037SARM gem5 Developers SERIALIZE_SCALAR(longDescFormat); 2907733SAli.Saidi@ARM.com SERIALIZE_SCALAR(pfn); 2917733SAli.Saidi@ARM.com SERIALIZE_SCALAR(size); 2927733SAli.Saidi@ARM.com SERIALIZE_SCALAR(vpn); 2937733SAli.Saidi@ARM.com SERIALIZE_SCALAR(asid); 29410037SARM gem5 Developers SERIALIZE_SCALAR(vmid); 29510037SARM gem5 Developers SERIALIZE_SCALAR(isHyp); 2967733SAli.Saidi@ARM.com SERIALIZE_SCALAR(N); 2977733SAli.Saidi@ARM.com SERIALIZE_SCALAR(global); 2987733SAli.Saidi@ARM.com SERIALIZE_SCALAR(valid); 29910037SARM gem5 Developers SERIALIZE_SCALAR(ns); 30010037SARM gem5 Developers SERIALIZE_SCALAR(nstid); 3017733SAli.Saidi@ARM.com SERIALIZE_SCALAR(nonCacheable); 30210037SARM gem5 Developers SERIALIZE_ENUM(lookupLevel); 3037733SAli.Saidi@ARM.com SERIALIZE_ENUM(mtype); 3047733SAli.Saidi@ARM.com SERIALIZE_SCALAR(innerAttrs); 3057733SAli.Saidi@ARM.com SERIALIZE_SCALAR(outerAttrs); 3067733SAli.Saidi@ARM.com SERIALIZE_SCALAR(shareable); 30710037SARM gem5 Developers SERIALIZE_SCALAR(outerShareable); 3087733SAli.Saidi@ARM.com SERIALIZE_SCALAR(attributes); 3097733SAli.Saidi@ARM.com SERIALIZE_SCALAR(xn); 31010037SARM gem5 Developers SERIALIZE_SCALAR(pxn); 3117733SAli.Saidi@ARM.com SERIALIZE_SCALAR(ap); 31210037SARM gem5 Developers SERIALIZE_SCALAR(hap); 31310037SARM gem5 Developers uint8_t domain_ = static_cast<uint8_t>(domain); 31410037SARM gem5 Developers paramOut(os, "domain", domain_); 3157733SAli.Saidi@ARM.com } 3167733SAli.Saidi@ARM.com void 3177733SAli.Saidi@ARM.com unserialize(Checkpoint *cp, const std::string §ion) 3187733SAli.Saidi@ARM.com { 31910037SARM gem5 Developers UNSERIALIZE_SCALAR(longDescFormat); 3207733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(pfn); 3217733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(size); 3227733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(vpn); 3237733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(asid); 32410037SARM gem5 Developers UNSERIALIZE_SCALAR(vmid); 32510037SARM gem5 Developers UNSERIALIZE_SCALAR(isHyp); 3267733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(N); 3277733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(global); 3287733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(valid); 32910037SARM gem5 Developers UNSERIALIZE_SCALAR(ns); 33010037SARM gem5 Developers UNSERIALIZE_SCALAR(nstid); 3317733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(nonCacheable); 33210037SARM gem5 Developers UNSERIALIZE_ENUM(lookupLevel); 3337733SAli.Saidi@ARM.com UNSERIALIZE_ENUM(mtype); 3347733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(innerAttrs); 3357733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(outerAttrs); 3367733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(shareable); 33710037SARM gem5 Developers UNSERIALIZE_SCALAR(outerShareable); 3387733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(attributes); 3397733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(xn); 34010037SARM gem5 Developers UNSERIALIZE_SCALAR(pxn); 3417733SAli.Saidi@ARM.com UNSERIALIZE_SCALAR(ap); 34210037SARM gem5 Developers UNSERIALIZE_SCALAR(hap); 34310037SARM gem5 Developers uint8_t domain_; 34410037SARM gem5 Developers paramIn(cp, section, "domain", domain_); 34510037SARM gem5 Developers domain = static_cast<DomainType>(domain_); 3467733SAli.Saidi@ARM.com } 3477733SAli.Saidi@ARM.com 3487399SAli.Saidi@ARM.com}; 3496019Shines@cs.fsu.edu 3507399SAli.Saidi@ARM.com 3516019Shines@cs.fsu.edu 3528902Sandreas.hansson@arm.com} 3536019Shines@cs.fsu.edu#endif // __ARCH_ARM_PAGETABLE_H__ 3546019Shines@cs.fsu.edu 355