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