tlb_map.hh revision 5562
13804Ssaidi@eecs.umich.edu/*
23804Ssaidi@eecs.umich.edu * Copyright (c) 2006 The Regents of The University of Michigan
33804Ssaidi@eecs.umich.edu * All rights reserved.
43804Ssaidi@eecs.umich.edu *
53804Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
63804Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
73804Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
83804Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
93804Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
103804Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
113804Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
123804Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
133804Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
143804Ssaidi@eecs.umich.edu * this software without specific prior written permission.
153804Ssaidi@eecs.umich.edu *
163804Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173804Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183804Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193804Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203804Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213804Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223804Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233804Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243804Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253804Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263804Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273804Ssaidi@eecs.umich.edu *
283804Ssaidi@eecs.umich.edu * Authors: Ali Saidi
293804Ssaidi@eecs.umich.edu */
303804Ssaidi@eecs.umich.edu
313804Ssaidi@eecs.umich.edu#ifndef __ARCH_SPARC_TLB_MAP_HH__
323804Ssaidi@eecs.umich.edu#define __ARCH_SPARC_TLB_MAP_HH__
333804Ssaidi@eecs.umich.edu
343804Ssaidi@eecs.umich.edu#include "arch/sparc/pagetable.hh"
353804Ssaidi@eecs.umich.edu#include <map>
363804Ssaidi@eecs.umich.edu
373804Ssaidi@eecs.umich.edunamespace SparcISA
383804Ssaidi@eecs.umich.edu{
393804Ssaidi@eecs.umich.edu
403804Ssaidi@eecs.umich.educlass TlbMap
413804Ssaidi@eecs.umich.edu{
423804Ssaidi@eecs.umich.edu  private:
433804Ssaidi@eecs.umich.edu    typedef std::map<TlbRange, TlbEntry*> RangeMap;
443804Ssaidi@eecs.umich.edu    RangeMap tree;
453804Ssaidi@eecs.umich.edu
463804Ssaidi@eecs.umich.edu  public:
473804Ssaidi@eecs.umich.edu    typedef RangeMap::iterator iterator;
483804Ssaidi@eecs.umich.edu
493804Ssaidi@eecs.umich.edu    iterator find(const TlbRange &r)
503804Ssaidi@eecs.umich.edu    {
513804Ssaidi@eecs.umich.edu        iterator i;
523804Ssaidi@eecs.umich.edu
533804Ssaidi@eecs.umich.edu        i = tree.upper_bound(r);
543804Ssaidi@eecs.umich.edu
555562Snate@binkert.org        if (i == tree.begin()) {
563832Ssaidi@eecs.umich.edu            if (r.real == i->first.real &&
573832Ssaidi@eecs.umich.edu                r.partitionId == i->first.partitionId &&
583832Ssaidi@eecs.umich.edu                i->first.va < r.va + r.size &&
593832Ssaidi@eecs.umich.edu                i->first.va+i->first.size >= r.va &&
603832Ssaidi@eecs.umich.edu                (r.real || r.contextId == i->first.contextId))
613832Ssaidi@eecs.umich.edu                return i;
623832Ssaidi@eecs.umich.edu            else
633832Ssaidi@eecs.umich.edu                // Nothing could match, so return end()
643832Ssaidi@eecs.umich.edu                return tree.end();
655562Snate@binkert.org        }
663804Ssaidi@eecs.umich.edu
673804Ssaidi@eecs.umich.edu        i--;
683804Ssaidi@eecs.umich.edu
693804Ssaidi@eecs.umich.edu        if (r.real != i->first.real)
703804Ssaidi@eecs.umich.edu            return tree.end();
713804Ssaidi@eecs.umich.edu        if (!r.real && r.contextId != i->first.contextId)
723804Ssaidi@eecs.umich.edu            return tree.end();
733804Ssaidi@eecs.umich.edu        if (r.partitionId != i->first.partitionId)
743804Ssaidi@eecs.umich.edu            return tree.end();
753804Ssaidi@eecs.umich.edu        if (i->first.va <= r.va+r.size &&
763804Ssaidi@eecs.umich.edu            i->first.va+i->first.size >= r.va)
773804Ssaidi@eecs.umich.edu            return i;
783804Ssaidi@eecs.umich.edu
793804Ssaidi@eecs.umich.edu        return tree.end();
803804Ssaidi@eecs.umich.edu    }
813804Ssaidi@eecs.umich.edu
823804Ssaidi@eecs.umich.edu    bool intersect(const TlbRange &r)
833804Ssaidi@eecs.umich.edu    {
843804Ssaidi@eecs.umich.edu        iterator i;
853804Ssaidi@eecs.umich.edu        i = find(r);
863804Ssaidi@eecs.umich.edu        if (i != tree.end())
873804Ssaidi@eecs.umich.edu            return true;
883804Ssaidi@eecs.umich.edu        return false;
893804Ssaidi@eecs.umich.edu    }
903804Ssaidi@eecs.umich.edu
913804Ssaidi@eecs.umich.edu
923804Ssaidi@eecs.umich.edu    iterator insert(TlbRange &r, TlbEntry *d)
933804Ssaidi@eecs.umich.edu    {
943804Ssaidi@eecs.umich.edu        if (intersect(r))
953804Ssaidi@eecs.umich.edu            return tree.end();
963804Ssaidi@eecs.umich.edu
973804Ssaidi@eecs.umich.edu        return tree.insert(std::make_pair<TlbRange,TlbEntry*>(r, d)).first;
983804Ssaidi@eecs.umich.edu    }
993804Ssaidi@eecs.umich.edu
1003804Ssaidi@eecs.umich.edu    size_t erase(TlbRange k)
1013804Ssaidi@eecs.umich.edu    {
1023804Ssaidi@eecs.umich.edu        return tree.erase(k);
1033804Ssaidi@eecs.umich.edu    }
1043804Ssaidi@eecs.umich.edu
1053804Ssaidi@eecs.umich.edu    void erase(iterator p)
1063804Ssaidi@eecs.umich.edu    {
1073804Ssaidi@eecs.umich.edu        tree.erase(p);
1083804Ssaidi@eecs.umich.edu    }
1093804Ssaidi@eecs.umich.edu
1103804Ssaidi@eecs.umich.edu    void erase(iterator p, iterator q)
1113804Ssaidi@eecs.umich.edu    {
1123804Ssaidi@eecs.umich.edu        tree.erase(p,q);
1133804Ssaidi@eecs.umich.edu    }
1143804Ssaidi@eecs.umich.edu
1153804Ssaidi@eecs.umich.edu    void clear()
1163804Ssaidi@eecs.umich.edu    {
1173804Ssaidi@eecs.umich.edu        tree.erase(tree.begin(), tree.end());
1183804Ssaidi@eecs.umich.edu    }
1193804Ssaidi@eecs.umich.edu
1203804Ssaidi@eecs.umich.edu    iterator begin()
1213804Ssaidi@eecs.umich.edu    {
1223804Ssaidi@eecs.umich.edu        return tree.begin();
1233804Ssaidi@eecs.umich.edu    }
1243804Ssaidi@eecs.umich.edu
1253804Ssaidi@eecs.umich.edu    iterator end()
1263804Ssaidi@eecs.umich.edu    {
1273804Ssaidi@eecs.umich.edu        return tree.end();
1283804Ssaidi@eecs.umich.edu    }
1293804Ssaidi@eecs.umich.edu
1303804Ssaidi@eecs.umich.edu    size_t size()
1313804Ssaidi@eecs.umich.edu    {
1323804Ssaidi@eecs.umich.edu        return tree.size();
1333804Ssaidi@eecs.umich.edu    }
1343804Ssaidi@eecs.umich.edu
1353804Ssaidi@eecs.umich.edu    bool empty()
1363804Ssaidi@eecs.umich.edu    {
1373804Ssaidi@eecs.umich.edu        return tree.empty();
1383804Ssaidi@eecs.umich.edu    }
1393929Ssaidi@eecs.umich.edu
1403929Ssaidi@eecs.umich.edu    void print()
1413929Ssaidi@eecs.umich.edu    {
1423929Ssaidi@eecs.umich.edu        iterator i;
1433929Ssaidi@eecs.umich.edu        i = tree.begin();
1443929Ssaidi@eecs.umich.edu        while (i != tree.end()) {
1453929Ssaidi@eecs.umich.edu           std::cout << std::hex << i->first.va << " " << i->first.size << " " <<
1463929Ssaidi@eecs.umich.edu                i->first.contextId << " " << i->first.partitionId << " " <<
1473929Ssaidi@eecs.umich.edu                i->first.real << " " << i->second << std::endl;
1483929Ssaidi@eecs.umich.edu            i++;
1493929Ssaidi@eecs.umich.edu        }
1503929Ssaidi@eecs.umich.edu    }
1513929Ssaidi@eecs.umich.edu
1523804Ssaidi@eecs.umich.edu};
1533804Ssaidi@eecs.umich.edu
1543804Ssaidi@eecs.umich.edu};
1553804Ssaidi@eecs.umich.edu
1563804Ssaidi@eecs.umich.edu#endif // __ARCH_SPARC_TLB_MAP_HH__
157