pagetable.hh revision 8229:78bf55f23338
17119Sgblack@eecs.umich.edu/*
27119Sgblack@eecs.umich.edu * Copyright (c) 2010 ARM Limited
310037SARM gem5 Developers * All rights reserved
47120Sgblack@eecs.umich.edu *
57120Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67120Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77120Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87120Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97120Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107120Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117120Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127120Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137120Sgblack@eecs.umich.edu *
147120Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan
157119Sgblack@eecs.umich.edu * All rights reserved.
167119Sgblack@eecs.umich.edu *
177119Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
187119Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
197119Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
207119Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
217119Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
227119Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
237119Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
247119Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
257119Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
267119Sgblack@eecs.umich.edu * this software without specific prior written permission.
277119Sgblack@eecs.umich.edu *
287119Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
297119Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
307119Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
317119Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
327119Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
337119Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
347119Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
357119Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
367119Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
377119Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
387119Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
397119Sgblack@eecs.umich.edu *
407119Sgblack@eecs.umich.edu * Authors: Ali Saidi
417119Sgblack@eecs.umich.edu */
427119Sgblack@eecs.umich.edu
437119Sgblack@eecs.umich.edu#ifndef __ARCH_ARM_PAGETABLE_H__
447646Sgene.wu@arm.com#define __ARCH_ARM_PAGETABLE_H__
457646Sgene.wu@arm.com
467646Sgene.wu@arm.com#include "arch/arm/isa_traits.hh"
477646Sgene.wu@arm.com#include "arch/arm/utility.hh"
487646Sgene.wu@arm.com#include "arch/arm/vtophys.hh"
497646Sgene.wu@arm.com#include "config/full_system.hh"
507646Sgene.wu@arm.com#include "sim/serialize.hh"
517646Sgene.wu@arm.com
527646Sgene.wu@arm.comnamespace ArmISA {
537646Sgene.wu@arm.com
547646Sgene.wu@arm.comstruct VAddr
557646Sgene.wu@arm.com{
567646Sgene.wu@arm.com    VAddr(Addr a) { panic("not implemented yet."); }
577646Sgene.wu@arm.com};
587646Sgene.wu@arm.com
597646Sgene.wu@arm.com
607646Sgene.wu@arm.com// ITB/DTB page table entry
617646Sgene.wu@arm.comstruct PTE
627646Sgene.wu@arm.com{
637646Sgene.wu@arm.com    void serialize(std::ostream &os)
647646Sgene.wu@arm.com    {
657646Sgene.wu@arm.com        panic("Need to implement PTE serialization\n");
667646Sgene.wu@arm.com    }
677646Sgene.wu@arm.com
687646Sgene.wu@arm.com    void unserialize(Checkpoint *cp, const std::string &section)
697646Sgene.wu@arm.com    {
707646Sgene.wu@arm.com        panic("Need to implement PTE serialization\n");
717646Sgene.wu@arm.com    }
727646Sgene.wu@arm.com
737205Sgblack@eecs.umich.edu};
747205Sgblack@eecs.umich.edu
757205Sgblack@eecs.umich.edu// ITB/DTB table entry
767205Sgblack@eecs.umich.edustruct TlbEntry
777205Sgblack@eecs.umich.edu{
787205Sgblack@eecs.umich.edu  public:
797205Sgblack@eecs.umich.edu    enum MemoryType {
807205Sgblack@eecs.umich.edu        StronglyOrdered,
817205Sgblack@eecs.umich.edu        Device,
827205Sgblack@eecs.umich.edu        Normal
837205Sgblack@eecs.umich.edu    };
847205Sgblack@eecs.umich.edu    enum DomainType {
857205Sgblack@eecs.umich.edu        DomainNoAccess = 0,
867205Sgblack@eecs.umich.edu        DomainClient,
877205Sgblack@eecs.umich.edu        DomainReserved,
887205Sgblack@eecs.umich.edu        DomainManager
897205Sgblack@eecs.umich.edu    };
908442Sgblack@eecs.umich.edu
918442Sgblack@eecs.umich.edu    // Matching variables
927205Sgblack@eecs.umich.edu    Addr pfn;
937205Sgblack@eecs.umich.edu    Addr size;              // Size of this entry, == Type of TLB Rec
947205Sgblack@eecs.umich.edu    Addr vpn;               // Virtual Page Number
957205Sgblack@eecs.umich.edu    uint32_t asid;          // Address Space Identifier
967205Sgblack@eecs.umich.edu    uint8_t N;              // Number of bits in pagesize
977205Sgblack@eecs.umich.edu    bool global;
987205Sgblack@eecs.umich.edu    bool valid;
997205Sgblack@eecs.umich.edu
1007205Sgblack@eecs.umich.edu    // Type of memory
1017597Sminkyu.jeong@arm.com    bool nonCacheable;     // Can we wrap this in mtype?
1027597Sminkyu.jeong@arm.com    bool sNp;      // Section descriptor
1037205Sgblack@eecs.umich.edu
1047205Sgblack@eecs.umich.edu    // Memory Attributes
1057205Sgblack@eecs.umich.edu    MemoryType mtype;
1067205Sgblack@eecs.umich.edu    uint8_t innerAttrs;
1077205Sgblack@eecs.umich.edu    uint8_t outerAttrs;
1087205Sgblack@eecs.umich.edu    bool shareable;
1097205Sgblack@eecs.umich.edu    uint32_t attributes;    // Memory attributes formatted for PAR
1107205Sgblack@eecs.umich.edu
1117205Sgblack@eecs.umich.edu
1127205Sgblack@eecs.umich.edu    // Access permissions
1137205Sgblack@eecs.umich.edu    bool xn;                // Execute Never
1147205Sgblack@eecs.umich.edu    uint8_t ap;           // Access permissions bits
1157205Sgblack@eecs.umich.edu    uint8_t domain;       // Access Domain
1167205Sgblack@eecs.umich.edu
1177205Sgblack@eecs.umich.edu    //Construct an entry that maps to physical address addr for SE mode
1187205Sgblack@eecs.umich.edu    TlbEntry(Addr _asn, Addr _vaddr, Addr _paddr)
1197205Sgblack@eecs.umich.edu    {
1207205Sgblack@eecs.umich.edu        pfn = _paddr >> PageShift;
1217205Sgblack@eecs.umich.edu        size = PageBytes - 1;
1227205Sgblack@eecs.umich.edu        asid = _asn;
1237205Sgblack@eecs.umich.edu        global = false;
1247205Sgblack@eecs.umich.edu        valid = true;
1257205Sgblack@eecs.umich.edu
1268442Sgblack@eecs.umich.edu        vpn = _vaddr >> PageShift;
1278442Sgblack@eecs.umich.edu
1287205Sgblack@eecs.umich.edu        nonCacheable = sNp = false;
1297597Sminkyu.jeong@arm.com
1307597Sminkyu.jeong@arm.com        xn = 0;
1317205Sgblack@eecs.umich.edu        ap = 0; // ???
1327205Sgblack@eecs.umich.edu        domain = DomainClient; //???
1337205Sgblack@eecs.umich.edu    }
1347205Sgblack@eecs.umich.edu
1357205Sgblack@eecs.umich.edu    TlbEntry()
1367205Sgblack@eecs.umich.edu    {}
1377205Sgblack@eecs.umich.edu
1387205Sgblack@eecs.umich.edu    void
1397205Sgblack@eecs.umich.edu    updateVaddr(Addr new_vaddr)
1407205Sgblack@eecs.umich.edu    {
1417205Sgblack@eecs.umich.edu        vpn = new_vaddr >> PageShift;
1427205Sgblack@eecs.umich.edu    }
1437205Sgblack@eecs.umich.edu
1447205Sgblack@eecs.umich.edu    Addr
1457205Sgblack@eecs.umich.edu    pageStart()
1467205Sgblack@eecs.umich.edu    {
1477205Sgblack@eecs.umich.edu        return pfn << PageShift;
1487205Sgblack@eecs.umich.edu    }
1497205Sgblack@eecs.umich.edu
1508442Sgblack@eecs.umich.edu    bool
1518442Sgblack@eecs.umich.edu    match(Addr va, uint8_t cid)
1527205Sgblack@eecs.umich.edu    {
1537205Sgblack@eecs.umich.edu        Addr v = vpn << N;
1547205Sgblack@eecs.umich.edu        if (valid && va >= v && va <= v + size && (global || cid == asid))
1557205Sgblack@eecs.umich.edu            return true;
1567205Sgblack@eecs.umich.edu        return false;
1577205Sgblack@eecs.umich.edu    }
1587205Sgblack@eecs.umich.edu
1597205Sgblack@eecs.umich.edu    Addr
1607205Sgblack@eecs.umich.edu    pAddr(Addr va)
1617205Sgblack@eecs.umich.edu    {
1627205Sgblack@eecs.umich.edu        return (pfn << N) | (va & size);
1637205Sgblack@eecs.umich.edu    }
1647119Sgblack@eecs.umich.edu
1657119Sgblack@eecs.umich.edu    void
1667119Sgblack@eecs.umich.edu    serialize(std::ostream &os)
1677119Sgblack@eecs.umich.edu    {
1687119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(pfn);
1697119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(size);
1707119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(vpn);
1717119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(asid);
1727119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(N);
1737119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(global);
1747119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(valid);
1757119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(nonCacheable);
1767119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(sNp);
1777119Sgblack@eecs.umich.edu        SERIALIZE_ENUM(mtype);
1788442Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(innerAttrs);
1797119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(outerAttrs);
1807119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(shareable);
1817119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(attributes);
1827119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(xn);
1837119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(ap);
1847119Sgblack@eecs.umich.edu        SERIALIZE_SCALAR(domain);
1857597Sminkyu.jeong@arm.com    }
1867597Sminkyu.jeong@arm.com    void
1877119Sgblack@eecs.umich.edu    unserialize(Checkpoint *cp, const std::string &section)
1887119Sgblack@eecs.umich.edu    {
1897119Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(pfn);
1907119Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(size);
1917119Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(vpn);
1927119Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(asid);
1937639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(N);
1947639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(global);
1957639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(valid);
1967639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(nonCacheable);
1977639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(sNp);
1987639Sgblack@eecs.umich.edu        UNSERIALIZE_ENUM(mtype);
1997639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(innerAttrs);
2007639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(outerAttrs);
2017639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(shareable);
2027639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(attributes);
2037639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(xn);
2047639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(ap);
2057639Sgblack@eecs.umich.edu        UNSERIALIZE_SCALAR(domain);
2067639Sgblack@eecs.umich.edu    }
2077639Sgblack@eecs.umich.edu
2087639Sgblack@eecs.umich.edu};
2097639Sgblack@eecs.umich.edu
2107639Sgblack@eecs.umich.edu
2117639Sgblack@eecs.umich.edu
2128444Sgblack@eecs.umich.edu};
2137639Sgblack@eecs.umich.edu#endif // __ARCH_ARM_PAGETABLE_H__
2147639Sgblack@eecs.umich.edu
2157639Sgblack@eecs.umich.edu