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
348229Snate@binkert.org#include <map>
358229Snate@binkert.org
363804Ssaidi@eecs.umich.edu#include "arch/sparc/pagetable.hh"
373804Ssaidi@eecs.umich.edu
383804Ssaidi@eecs.umich.edunamespace SparcISA
393804Ssaidi@eecs.umich.edu{
403804Ssaidi@eecs.umich.edu
413804Ssaidi@eecs.umich.educlass TlbMap
423804Ssaidi@eecs.umich.edu{
433804Ssaidi@eecs.umich.edu  private:
443804Ssaidi@eecs.umich.edu    typedef std::map<TlbRange, TlbEntry*> RangeMap;
453804Ssaidi@eecs.umich.edu    RangeMap tree;
463804Ssaidi@eecs.umich.edu
473804Ssaidi@eecs.umich.edu  public:
483804Ssaidi@eecs.umich.edu    typedef RangeMap::iterator iterator;
493804Ssaidi@eecs.umich.edu
507741Sgblack@eecs.umich.edu    iterator
517741Sgblack@eecs.umich.edu    find(const TlbRange &r)
523804Ssaidi@eecs.umich.edu    {
533804Ssaidi@eecs.umich.edu        iterator i;
543804Ssaidi@eecs.umich.edu
553804Ssaidi@eecs.umich.edu        i = tree.upper_bound(r);
563804Ssaidi@eecs.umich.edu
575562Snate@binkert.org        if (i == tree.begin()) {
583832Ssaidi@eecs.umich.edu            if (r.real == i->first.real &&
593832Ssaidi@eecs.umich.edu                r.partitionId == i->first.partitionId &&
603832Ssaidi@eecs.umich.edu                i->first.va < r.va + r.size &&
613832Ssaidi@eecs.umich.edu                i->first.va+i->first.size >= r.va &&
623832Ssaidi@eecs.umich.edu                (r.real || r.contextId == i->first.contextId))
633832Ssaidi@eecs.umich.edu                return i;
643832Ssaidi@eecs.umich.edu            else
653832Ssaidi@eecs.umich.edu                // Nothing could match, so return end()
663832Ssaidi@eecs.umich.edu                return tree.end();
675562Snate@binkert.org        }
683804Ssaidi@eecs.umich.edu
693804Ssaidi@eecs.umich.edu        i--;
703804Ssaidi@eecs.umich.edu
713804Ssaidi@eecs.umich.edu        if (r.real != i->first.real)
723804Ssaidi@eecs.umich.edu            return tree.end();
733804Ssaidi@eecs.umich.edu        if (!r.real && r.contextId != i->first.contextId)
743804Ssaidi@eecs.umich.edu            return tree.end();
753804Ssaidi@eecs.umich.edu        if (r.partitionId != i->first.partitionId)
763804Ssaidi@eecs.umich.edu            return tree.end();
773804Ssaidi@eecs.umich.edu        if (i->first.va <= r.va+r.size &&
783804Ssaidi@eecs.umich.edu            i->first.va+i->first.size >= r.va)
793804Ssaidi@eecs.umich.edu            return i;
803804Ssaidi@eecs.umich.edu
813804Ssaidi@eecs.umich.edu        return tree.end();
823804Ssaidi@eecs.umich.edu    }
833804Ssaidi@eecs.umich.edu
847741Sgblack@eecs.umich.edu    bool
857741Sgblack@eecs.umich.edu    intersect(const TlbRange &r)
863804Ssaidi@eecs.umich.edu    {
873804Ssaidi@eecs.umich.edu        iterator i;
883804Ssaidi@eecs.umich.edu        i = find(r);
893804Ssaidi@eecs.umich.edu        if (i != tree.end())
903804Ssaidi@eecs.umich.edu            return true;
913804Ssaidi@eecs.umich.edu        return false;
923804Ssaidi@eecs.umich.edu    }
933804Ssaidi@eecs.umich.edu
943804Ssaidi@eecs.umich.edu
957741Sgblack@eecs.umich.edu    iterator
967741Sgblack@eecs.umich.edu    insert(TlbRange &r, TlbEntry *d)
973804Ssaidi@eecs.umich.edu    {
983804Ssaidi@eecs.umich.edu        if (intersect(r))
993804Ssaidi@eecs.umich.edu            return tree.end();
1003804Ssaidi@eecs.umich.edu
1018946Sandreas.hansson@arm.com        return tree.insert(std::make_pair(r, d)).first;
1023804Ssaidi@eecs.umich.edu    }
1033804Ssaidi@eecs.umich.edu
1047741Sgblack@eecs.umich.edu    size_t
1057741Sgblack@eecs.umich.edu    erase(TlbRange k)
1063804Ssaidi@eecs.umich.edu    {
1073804Ssaidi@eecs.umich.edu        return tree.erase(k);
1083804Ssaidi@eecs.umich.edu    }
1093804Ssaidi@eecs.umich.edu
1107741Sgblack@eecs.umich.edu    void
1117741Sgblack@eecs.umich.edu    erase(iterator p)
1123804Ssaidi@eecs.umich.edu    {
1133804Ssaidi@eecs.umich.edu        tree.erase(p);
1143804Ssaidi@eecs.umich.edu    }
1153804Ssaidi@eecs.umich.edu
1167741Sgblack@eecs.umich.edu    void
1177741Sgblack@eecs.umich.edu    erase(iterator p, iterator q)
1183804Ssaidi@eecs.umich.edu    {
1193804Ssaidi@eecs.umich.edu        tree.erase(p,q);
1203804Ssaidi@eecs.umich.edu    }
1213804Ssaidi@eecs.umich.edu
1227741Sgblack@eecs.umich.edu    void
1237741Sgblack@eecs.umich.edu    clear()
1243804Ssaidi@eecs.umich.edu    {
1253804Ssaidi@eecs.umich.edu        tree.erase(tree.begin(), tree.end());
1263804Ssaidi@eecs.umich.edu    }
1273804Ssaidi@eecs.umich.edu
1287741Sgblack@eecs.umich.edu    iterator
1297741Sgblack@eecs.umich.edu    begin()
1303804Ssaidi@eecs.umich.edu    {
1313804Ssaidi@eecs.umich.edu        return tree.begin();
1323804Ssaidi@eecs.umich.edu    }
1333804Ssaidi@eecs.umich.edu
1347741Sgblack@eecs.umich.edu    iterator
1357741Sgblack@eecs.umich.edu    end()
1363804Ssaidi@eecs.umich.edu    {
1373804Ssaidi@eecs.umich.edu        return tree.end();
1383804Ssaidi@eecs.umich.edu    }
1393804Ssaidi@eecs.umich.edu
1407741Sgblack@eecs.umich.edu    size_t
1417741Sgblack@eecs.umich.edu    size()
1423804Ssaidi@eecs.umich.edu    {
1433804Ssaidi@eecs.umich.edu        return tree.size();
1443804Ssaidi@eecs.umich.edu    }
1453804Ssaidi@eecs.umich.edu
1467741Sgblack@eecs.umich.edu    bool
1477741Sgblack@eecs.umich.edu    empty()
1483804Ssaidi@eecs.umich.edu    {
1493804Ssaidi@eecs.umich.edu        return tree.empty();
1503804Ssaidi@eecs.umich.edu    }
1513929Ssaidi@eecs.umich.edu
1527741Sgblack@eecs.umich.edu    void
1537741Sgblack@eecs.umich.edu    print()
1543929Ssaidi@eecs.umich.edu    {
1553929Ssaidi@eecs.umich.edu        iterator i;
1563929Ssaidi@eecs.umich.edu        i = tree.begin();
1573929Ssaidi@eecs.umich.edu        while (i != tree.end()) {
1583929Ssaidi@eecs.umich.edu           std::cout << std::hex << i->first.va << " " << i->first.size << " " <<
1593929Ssaidi@eecs.umich.edu                i->first.contextId << " " << i->first.partitionId << " " <<
1603929Ssaidi@eecs.umich.edu                i->first.real << " " << i->second << std::endl;
1613929Ssaidi@eecs.umich.edu            i++;
1623929Ssaidi@eecs.umich.edu        }
1633929Ssaidi@eecs.umich.edu    }
1643929Ssaidi@eecs.umich.edu
1653804Ssaidi@eecs.umich.edu};
1663804Ssaidi@eecs.umich.edu
1673804Ssaidi@eecs.umich.edu};
1683804Ssaidi@eecs.umich.edu
1693804Ssaidi@eecs.umich.edu#endif // __ARCH_SPARC_TLB_MAP_HH__
170