tlb_map.hh revision 3929:3640569369a5
1/*
2 * Copyright (c) 2006 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Ali Saidi
29 */
30
31#ifndef __ARCH_SPARC_TLB_MAP_HH__
32#define __ARCH_SPARC_TLB_MAP_HH__
33
34#include "arch/sparc/pagetable.hh"
35#include <map>
36
37namespace SparcISA
38{
39
40class TlbMap
41{
42  private:
43    typedef std::map<TlbRange, TlbEntry*> RangeMap;
44    RangeMap tree;
45
46  public:
47    typedef RangeMap::iterator iterator;
48
49    iterator find(const TlbRange &r)
50    {
51        iterator i;
52
53        i = tree.upper_bound(r);
54
55        if (i == tree.begin())
56            if (r.real == i->first.real &&
57                r.partitionId == i->first.partitionId &&
58                i->first.va < r.va + r.size &&
59                i->first.va+i->first.size >= r.va &&
60                (r.real || r.contextId == i->first.contextId))
61                return i;
62            else
63                // Nothing could match, so return end()
64                return tree.end();
65
66        i--;
67
68        if (r.real != i->first.real)
69            return tree.end();
70        if (!r.real && r.contextId != i->first.contextId)
71            return tree.end();
72        if (r.partitionId != i->first.partitionId)
73            return tree.end();
74        if (i->first.va <= r.va+r.size &&
75            i->first.va+i->first.size >= r.va)
76            return i;
77
78        return tree.end();
79    }
80
81    bool intersect(const TlbRange &r)
82    {
83        iterator i;
84        i = find(r);
85        if (i != tree.end())
86            return true;
87        return false;
88    }
89
90
91    iterator insert(TlbRange &r, TlbEntry *d)
92    {
93        if (intersect(r))
94            return tree.end();
95
96        return tree.insert(std::make_pair<TlbRange,TlbEntry*>(r, d)).first;
97    }
98
99    size_t erase(TlbRange k)
100    {
101        return tree.erase(k);
102    }
103
104    void erase(iterator p)
105    {
106        tree.erase(p);
107    }
108
109    void erase(iterator p, iterator q)
110    {
111        tree.erase(p,q);
112    }
113
114    void clear()
115    {
116        tree.erase(tree.begin(), tree.end());
117    }
118
119    iterator begin()
120    {
121        return tree.begin();
122    }
123
124    iterator end()
125    {
126        return tree.end();
127    }
128
129    size_t size()
130    {
131        return tree.size();
132    }
133
134    bool empty()
135    {
136        return tree.empty();
137    }
138
139    void print()
140    {
141        iterator i;
142        i = tree.begin();
143        while (i != tree.end()) {
144           std::cout << std::hex << i->first.va << " " << i->first.size << " " <<
145                i->first.contextId << " " << i->first.partitionId << " " <<
146                i->first.real << " " << i->second << std::endl;
147            i++;
148        }
149    }
150
151};
152
153};
154
155#endif // __ARCH_SPARC_TLB_MAP_HH__
156