tlb_map.hh revision 5562:875cb7d09831
12379SN/A/* 210298Salexandru.dutu@amd.com * Copyright (c) 2006 The Regents of The University of Michigan 32379SN/A * All rights reserved. 42379SN/A * 52379SN/A * Redistribution and use in source and binary forms, with or without 62379SN/A * modification, are permitted provided that the following conditions are 72379SN/A * met: redistributions of source code must retain the above copyright 82379SN/A * notice, this list of conditions and the following disclaimer; 92379SN/A * redistributions in binary form must reproduce the above copyright 102379SN/A * notice, this list of conditions and the following disclaimer in the 112379SN/A * documentation and/or other materials provided with the distribution; 122379SN/A * neither the name of the copyright holders nor the names of its 132379SN/A * contributors may be used to endorse or promote products derived from 142379SN/A * this software without specific prior written permission. 152379SN/A * 162379SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172379SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182379SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192379SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202379SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212379SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222379SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232379SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242379SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252379SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262379SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272379SN/A * 282665Ssaidi@eecs.umich.edu * Authors: Ali Saidi 292665Ssaidi@eecs.umich.edu */ 302379SN/A 312379SN/A#ifndef __ARCH_SPARC_TLB_MAP_HH__ 322379SN/A#define __ARCH_SPARC_TLB_MAP_HH__ 332379SN/A 3410298Salexandru.dutu@amd.com#include "arch/sparc/pagetable.hh" 352379SN/A#include <map> 362379SN/A 376216Snate@binkert.orgnamespace SparcISA 386216Snate@binkert.org{ 392379SN/A 402379SN/Aclass TlbMap 412379SN/A{ 422423SN/A private: 435004Sgblack@eecs.umich.edu typedef std::map<TlbRange, TlbEntry*> RangeMap; 442809Ssaidi@eecs.umich.edu RangeMap tree; 456216Snate@binkert.org 466658Snate@binkert.org public: 472394SN/A typedef RangeMap::iterator iterator; 485004Sgblack@eecs.umich.edu 4910298Salexandru.dutu@amd.com iterator find(const TlbRange &r) 5010298Salexandru.dutu@amd.com { 5110298Salexandru.dutu@amd.com iterator i; 522379SN/A 532379SN/A i = tree.upper_bound(r); 5410298Salexandru.dutu@amd.com 552379SN/A if (i == tree.begin()) { 5610298Salexandru.dutu@amd.com if (r.real == i->first.real && 572379SN/A r.partitionId == i->first.partitionId && 582379SN/A i->first.va < r.va + r.size && 592809Ssaidi@eecs.umich.edu i->first.va+i->first.size >= r.va && 609676Smitch.hayenga+gem5@gmail.com (r.real || r.contextId == i->first.contextId)) 612809Ssaidi@eecs.umich.edu return i; 625004Sgblack@eecs.umich.edu else 635004Sgblack@eecs.umich.edu // Nothing could match, so return end() 642809Ssaidi@eecs.umich.edu return tree.end(); 652809Ssaidi@eecs.umich.edu } 662379SN/A 672399SN/A i--; 682399SN/A 692399SN/A if (r.real != i->first.real) 708601Ssteve.reinhardt@amd.com return tree.end(); 718601Ssteve.reinhardt@amd.com if (!r.real && r.contextId != i->first.contextId) 722379SN/A return tree.end(); 732379SN/A if (r.partitionId != i->first.partitionId) 742379SN/A return tree.end(); 7510298Salexandru.dutu@amd.com if (i->first.va <= r.va+r.size && 7610318Sandreas.hansson@arm.com i->first.va+i->first.size >= r.va) 7710298Salexandru.dutu@amd.com return i; 7810298Salexandru.dutu@amd.com 7910298Salexandru.dutu@amd.com return tree.end(); 8010298Salexandru.dutu@amd.com } 8110298Salexandru.dutu@amd.com 8210298Salexandru.dutu@amd.com bool intersect(const TlbRange &r) 8310298Salexandru.dutu@amd.com { 8410298Salexandru.dutu@amd.com iterator i; 852379SN/A i = find(r); 8610298Salexandru.dutu@amd.com if (i != tree.end()) 8710298Salexandru.dutu@amd.com return true; 8810558Salexandru.dutu@amd.com return false; 8910558Salexandru.dutu@amd.com } 9010558Salexandru.dutu@amd.com 9110558Salexandru.dutu@amd.com 9210558Salexandru.dutu@amd.com iterator insert(TlbRange &r, TlbEntry *d) 9310558Salexandru.dutu@amd.com { 9410558Salexandru.dutu@amd.com if (intersect(r)) 9510558Salexandru.dutu@amd.com return tree.end(); 9610558Salexandru.dutu@amd.com 9710558Salexandru.dutu@amd.com return tree.insert(std::make_pair<TlbRange,TlbEntry*>(r, d)).first; 9810558Salexandru.dutu@amd.com } 9910558Salexandru.dutu@amd.com 10010558Salexandru.dutu@amd.com size_t erase(TlbRange k) 10110558Salexandru.dutu@amd.com { 10210298Salexandru.dutu@amd.com return tree.erase(k); 1032379SN/A } 1048601Ssteve.reinhardt@amd.com 1058601Ssteve.reinhardt@amd.com void erase(iterator p) 1068601Ssteve.reinhardt@amd.com { 1072399SN/A tree.erase(p); 1082399SN/A } 1092379SN/A 11010558Salexandru.dutu@amd.com void erase(iterator p, iterator q) 11110558Salexandru.dutu@amd.com { 11210558Salexandru.dutu@amd.com tree.erase(p,q); 11310558Salexandru.dutu@amd.com } 11410558Salexandru.dutu@amd.com 11510558Salexandru.dutu@amd.com void clear() 11610558Salexandru.dutu@amd.com { 11710558Salexandru.dutu@amd.com tree.erase(tree.begin(), tree.end()); 11810556Salexandru.dutu@amd.com } 11910558Salexandru.dutu@amd.com 12010298Salexandru.dutu@amd.com iterator begin() 12110298Salexandru.dutu@amd.com { 1222379SN/A return tree.begin(); 1235004Sgblack@eecs.umich.edu } 1248600Ssteve.reinhardt@amd.com 1258600Ssteve.reinhardt@amd.com iterator end() 1268600Ssteve.reinhardt@amd.com { 1278600Ssteve.reinhardt@amd.com return tree.end(); 1288600Ssteve.reinhardt@amd.com } 12910298Salexandru.dutu@amd.com 1308600Ssteve.reinhardt@amd.com size_t size() 1318600Ssteve.reinhardt@amd.com { 1325004Sgblack@eecs.umich.edu return tree.size(); 1335004Sgblack@eecs.umich.edu } 1345004Sgblack@eecs.umich.edu 1355004Sgblack@eecs.umich.edu bool empty() 13610298Salexandru.dutu@amd.com { 1372399SN/A return tree.empty(); 1382379SN/A } 1392379SN/A 1402379SN/A void print() 1415748SSteve.Reinhardt@amd.com { 1425748SSteve.Reinhardt@amd.com iterator i; 1432379SN/A i = tree.begin(); 1442399SN/A while (i != tree.end()) { 1452379SN/A std::cout << std::hex << i->first.va << " " << i->first.size << " " << 1462379SN/A i->first.contextId << " " << i->first.partitionId << " " << 1475748SSteve.Reinhardt@amd.com i->first.real << " " << i->second << std::endl; 1485748SSteve.Reinhardt@amd.com i++; 1495748SSteve.Reinhardt@amd.com } 1505748SSteve.Reinhardt@amd.com } 1515748SSteve.Reinhardt@amd.com 1525748SSteve.Reinhardt@amd.com}; 1535748SSteve.Reinhardt@amd.com 1542399SN/A}; 1555004Sgblack@eecs.umich.edu 1562379SN/A#endif // __ARCH_SPARC_TLB_MAP_HH__ 1572379SN/A