tlb_map.hh revision 7741:340b6f01d69b
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
50    find(const TlbRange &r)
51    {
52        iterator i;
53
54        i = tree.upper_bound(r);
55
56        if (i == tree.begin()) {
57            if (r.real == i->first.real &&
58                r.partitionId == i->first.partitionId &&
59                i->first.va < r.va + r.size &&
60                i->first.va+i->first.size >= r.va &&
61                (r.real || r.contextId == i->first.contextId))
62                return i;
63            else
64                // Nothing could match, so return end()
65                return tree.end();
66        }
67
68        i--;
69
70        if (r.real != i->first.real)
71            return tree.end();
72        if (!r.real && r.contextId != i->first.contextId)
73            return tree.end();
74        if (r.partitionId != i->first.partitionId)
75            return tree.end();
76        if (i->first.va <= r.va+r.size &&
77            i->first.va+i->first.size >= r.va)
78            return i;
79
80        return tree.end();
81    }
82
83    bool
84    intersect(const TlbRange &r)
85    {
86        iterator i;
87        i = find(r);
88        if (i != tree.end())
89            return true;
90        return false;
91    }
92
93
94    iterator
95    insert(TlbRange &r, TlbEntry *d)
96    {
97        if (intersect(r))
98            return tree.end();
99
100        return tree.insert(std::make_pair<TlbRange,TlbEntry*>(r, d)).first;
101    }
102
103    size_t
104    erase(TlbRange k)
105    {
106        return tree.erase(k);
107    }
108
109    void
110    erase(iterator p)
111    {
112        tree.erase(p);
113    }
114
115    void
116    erase(iterator p, iterator q)
117    {
118        tree.erase(p,q);
119    }
120
121    void
122    clear()
123    {
124        tree.erase(tree.begin(), tree.end());
125    }
126
127    iterator
128    begin()
129    {
130        return tree.begin();
131    }
132
133    iterator
134    end()
135    {
136        return tree.end();
137    }
138
139    size_t
140    size()
141    {
142        return tree.size();
143    }
144
145    bool
146    empty()
147    {
148        return tree.empty();
149    }
150
151    void
152    print()
153    {
154        iterator i;
155        i = tree.begin();
156        while (i != tree.end()) {
157           std::cout << std::hex << i->first.va << " " << i->first.size << " " <<
158                i->first.contextId << " " << i->first.partitionId << " " <<
159                i->first.real << " " << i->second << std::endl;
160            i++;
161        }
162    }
163
164};
165
166};
167
168#endif // __ARCH_SPARC_TLB_MAP_HH__
169