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