pagetable.hh revision 7404
16019Shines@cs.fsu.edu/* 27399SAli.Saidi@ARM.com * Copyright (c) 2010 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 466019Shines@cs.fsu.edu#include "arch/arm/isa_traits.hh" 476019Shines@cs.fsu.edu#include "arch/arm/utility.hh" 486019Shines@cs.fsu.edu#include "arch/arm/vtophys.hh" 496019Shines@cs.fsu.edu#include "config/full_system.hh" 506019Shines@cs.fsu.edu 516019Shines@cs.fsu.edunamespace ArmISA { 526019Shines@cs.fsu.edu 537399SAli.Saidi@ARM.comstruct VAddr 547399SAli.Saidi@ARM.com{ 557399SAli.Saidi@ARM.com VAddr(Addr a) { panic("not implemented yet."); } 567399SAli.Saidi@ARM.com}; 577399SAli.Saidi@ARM.com 587399SAli.Saidi@ARM.com 597399SAli.Saidi@ARM.com// ITB/DTB page table entry 607399SAli.Saidi@ARM.comstruct PTE 617399SAli.Saidi@ARM.com{ 627399SAli.Saidi@ARM.com void serialize(std::ostream &os) 636019Shines@cs.fsu.edu { 647399SAli.Saidi@ARM.com panic("Need to implement PTE serialization\n"); 657399SAli.Saidi@ARM.com } 666019Shines@cs.fsu.edu 677399SAli.Saidi@ARM.com void unserialize(Checkpoint *cp, const std::string §ion) 687399SAli.Saidi@ARM.com { 697399SAli.Saidi@ARM.com panic("Need to implement PTE serialization\n"); 707399SAli.Saidi@ARM.com } 716019Shines@cs.fsu.edu 727399SAli.Saidi@ARM.com}; 736019Shines@cs.fsu.edu 747404SAli.Saidi@ARM.comstruct TlbRange 757404SAli.Saidi@ARM.com{ 767404SAli.Saidi@ARM.com Addr va; 777404SAli.Saidi@ARM.com Addr size; 787404SAli.Saidi@ARM.com int contextId; 797404SAli.Saidi@ARM.com bool global; 807404SAli.Saidi@ARM.com 817404SAli.Saidi@ARM.com inline bool 827404SAli.Saidi@ARM.com operator<(const TlbRange &r2) const 837404SAli.Saidi@ARM.com { 847404SAli.Saidi@ARM.com if (!(global || r2.global)) { 857404SAli.Saidi@ARM.com if (contextId < r2.contextId) 867404SAli.Saidi@ARM.com return true; 877404SAli.Saidi@ARM.com else if (contextId > r2.contextId) 887404SAli.Saidi@ARM.com return false; 897404SAli.Saidi@ARM.com } 907404SAli.Saidi@ARM.com 917404SAli.Saidi@ARM.com if (va < r2.va) 927404SAli.Saidi@ARM.com return true; 937404SAli.Saidi@ARM.com return false; 947404SAli.Saidi@ARM.com } 957404SAli.Saidi@ARM.com 967404SAli.Saidi@ARM.com inline bool 977404SAli.Saidi@ARM.com operator==(const TlbRange &r2) const 987404SAli.Saidi@ARM.com { 997404SAli.Saidi@ARM.com return va == r2.va && 1007404SAli.Saidi@ARM.com size == r2.size && 1017404SAli.Saidi@ARM.com contextId == r2.contextId && 1027404SAli.Saidi@ARM.com global == r2.global; 1037404SAli.Saidi@ARM.com } 1047404SAli.Saidi@ARM.com}; 1057404SAli.Saidi@ARM.com 1067404SAli.Saidi@ARM.com 1077399SAli.Saidi@ARM.com// ITB/DTB table entry 1087399SAli.Saidi@ARM.comstruct TlbEntry 1097399SAli.Saidi@ARM.com{ 1107404SAli.Saidi@ARM.com public: 1117404SAli.Saidi@ARM.com enum MemoryType { 1127404SAli.Saidi@ARM.com StronglyOrdered, 1137404SAli.Saidi@ARM.com Device, 1147404SAli.Saidi@ARM.com Normal 1157404SAli.Saidi@ARM.com }; 1167404SAli.Saidi@ARM.com enum DomainType { 1177404SAli.Saidi@ARM.com DomainNoAccess = 0, 1187404SAli.Saidi@ARM.com DomainClient, 1197404SAli.Saidi@ARM.com DomainReserved, 1207404SAli.Saidi@ARM.com DomainManager 1217404SAli.Saidi@ARM.com }; 1226019Shines@cs.fsu.edu 1237404SAli.Saidi@ARM.com // Matching variables 1247404SAli.Saidi@ARM.com Addr pfn; 1257404SAli.Saidi@ARM.com Addr size; // Size of this entry, == Type of TLB Rec 1267404SAli.Saidi@ARM.com Addr vpn; // Virtual Page Number 1277404SAli.Saidi@ARM.com uint32_t asid; // Address Space Identifier 1287404SAli.Saidi@ARM.com uint8_t N; // Number of bits in pagesize 1297404SAli.Saidi@ARM.com bool global; 1307404SAli.Saidi@ARM.com bool valid; 1317399SAli.Saidi@ARM.com 1327404SAli.Saidi@ARM.com // Type of memory 1337404SAli.Saidi@ARM.com bool nonCacheable; // Can we wrap this in mtype? 1347404SAli.Saidi@ARM.com bool sNp; // Section descriptor 1357404SAli.Saidi@ARM.com 1367404SAli.Saidi@ARM.com // Access permissions 1377404SAli.Saidi@ARM.com bool xn; // Execute Never 1387404SAli.Saidi@ARM.com uint8_t ap:3; // Access permissions bits 1397404SAli.Saidi@ARM.com uint8_t domain:4; // Access Domain 1407404SAli.Saidi@ARM.com 1417404SAli.Saidi@ARM.com TlbRange range; // For fast TLB searching 1427404SAli.Saidi@ARM.com 1437404SAli.Saidi@ARM.com //Construct an entry that maps to physical address addr for SE mode 1447399SAli.Saidi@ARM.com TlbEntry(Addr _asn, Addr _vaddr, Addr _paddr) 1456019Shines@cs.fsu.edu { 1467404SAli.Saidi@ARM.com pfn = _paddr >> PageShift; 1477404SAli.Saidi@ARM.com size = PageBytes - 1; 1487404SAli.Saidi@ARM.com asid = _asn; 1497404SAli.Saidi@ARM.com global = false; 1507399SAli.Saidi@ARM.com valid = true; 1517404SAli.Saidi@ARM.com 1527404SAli.Saidi@ARM.com vpn = _vaddr >> PageShift; 1537404SAli.Saidi@ARM.com 1547404SAli.Saidi@ARM.com nonCacheable = sNp = false; 1557404SAli.Saidi@ARM.com 1567404SAli.Saidi@ARM.com xn = 0; 1577404SAli.Saidi@ARM.com ap = 0; // ??? 1587404SAli.Saidi@ARM.com domain = DomainClient; //??? 1597399SAli.Saidi@ARM.com } 1606019Shines@cs.fsu.edu 1617399SAli.Saidi@ARM.com TlbEntry() 1627399SAli.Saidi@ARM.com {} 1636019Shines@cs.fsu.edu 1647399SAli.Saidi@ARM.com void 1657399SAli.Saidi@ARM.com updateVaddr(Addr new_vaddr) 1667399SAli.Saidi@ARM.com { 1677404SAli.Saidi@ARM.com vpn = new_vaddr >> PageShift; 1687399SAli.Saidi@ARM.com } 1696019Shines@cs.fsu.edu 1707399SAli.Saidi@ARM.com Addr 1717399SAli.Saidi@ARM.com pageStart() 1727399SAli.Saidi@ARM.com { 1737404SAli.Saidi@ARM.com return pfn << PageShift; 1747404SAli.Saidi@ARM.com } 1757404SAli.Saidi@ARM.com 1767404SAli.Saidi@ARM.com bool 1777404SAli.Saidi@ARM.com match(Addr va, uint8_t cid) 1787404SAli.Saidi@ARM.com { 1797404SAli.Saidi@ARM.com Addr v = vpn << N; 1807404SAli.Saidi@ARM.com if (valid && va >= v && va <= v + size && (global || cid == asid)) 1817404SAli.Saidi@ARM.com return true; 1827404SAli.Saidi@ARM.com return false; 1837404SAli.Saidi@ARM.com } 1847404SAli.Saidi@ARM.com 1857404SAli.Saidi@ARM.com Addr 1867404SAli.Saidi@ARM.com pAddr(Addr va) 1877404SAli.Saidi@ARM.com { 1887404SAli.Saidi@ARM.com return (pfn << N) | (va & size); 1897399SAli.Saidi@ARM.com } 1906019Shines@cs.fsu.edu 1917402SAli.Saidi@ARM.com void serialize(std::ostream &os) { panic("Need to Implement\n"); } 1927402SAli.Saidi@ARM.com void unserialize(Checkpoint *cp, const std::string §ion) 1937402SAli.Saidi@ARM.com { panic("Need to Implement\n");} 1947399SAli.Saidi@ARM.com}; 1956019Shines@cs.fsu.edu 1967399SAli.Saidi@ARM.com 1976019Shines@cs.fsu.edu 1986019Shines@cs.fsu.edu}; 1996019Shines@cs.fsu.edu#endif // __ARCH_ARM_PAGETABLE_H__ 2006019Shines@cs.fsu.edu 201