1 /*
2  * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 package sun.jvm.hotspot.memory;
26 
27 import java.util.*;
28 
29 import sun.jvm.hotspot.debugger.*;
30 import sun.jvm.hotspot.runtime.*;
31 import sun.jvm.hotspot.types.*;
32 import sun.jvm.hotspot.utilities.*;
33 
34 /** A very simple data structure representing a contigous region of
35     address space. */
36 
37 public class MemRegion implements Cloneable {
38   private Address start;
39   private long byteSize;
40 
41   private static AddressField  startField;
42   private static CIntegerField wordSizeField;
43 
44   static {
VM.registerVMInitializedObserver(new Observer() { public void update(Observable o, Object data) { initialize(VM.getVM().getTypeDataBase()); } })45     VM.registerVMInitializedObserver(new Observer() {
46         public void update(Observable o, Object data) {
47           initialize(VM.getVM().getTypeDataBase());
48         }
49       });
50   }
51 
initialize(TypeDataBase db)52   private static synchronized void initialize(TypeDataBase db) {
53     Type type = db.lookupType("MemRegion");
54 
55     startField    = type.getAddressField("_start");
56     wordSizeField = type.getCIntegerField("_word_size");
57   }
58 
MemRegion()59   public MemRegion() {
60   }
61 
62   /** This constructor takes a "MemRegion*" in the target process */
MemRegion(Address memRegionAddr)63   public MemRegion(Address memRegionAddr) {
64     this(startField.getValue(memRegionAddr),
65          wordSizeField.getValue(memRegionAddr));
66   }
67 
MemRegion(Address start, long wordSize)68   public MemRegion(Address start, long wordSize) {
69     setStart(start);
70     setWordSize(wordSize);
71   }
72 
MemRegion(Address start, Address limit)73   public MemRegion(Address start, Address limit) {
74     setStart(start);
75     byteSize = limit.minus(start);
76   }
77 
clone()78   public Object clone() {
79     return new MemRegion(start, byteSize);
80   }
81 
copy()82   public MemRegion copy() {
83     return (MemRegion) clone();
84   }
85 
intersection(MemRegion mr2)86   public MemRegion intersection(MemRegion mr2) {
87     MemRegion res = new MemRegion();
88     if (AddressOps.gt(mr2.start(), start())) {
89       res.setStart(mr2.start());
90     } else {
91       res.setStart(start());
92     }
93     Address resEnd;
94     Address end = end();
95     Address mr2End = mr2.end();
96     if (AddressOps.lt(end, mr2End)) {
97       resEnd = end;
98     } else {
99       resEnd = mr2End;
100     }
101     if (AddressOps.lt(resEnd, res.start())) {
102       res.setStart(null);
103       res.setWordSize(0);
104     } else {
105       res.setEnd(resEnd);
106     }
107     return res;
108   }
109 
union(MemRegion mr2)110   public MemRegion union(MemRegion mr2) {
111     MemRegion res = new MemRegion();
112     if (AddressOps.lt(mr2.start(), start())) {
113       res.setStart(mr2.start());
114     } else {
115       res.setStart(start());
116     }
117     Address resEnd;
118     Address end = end();
119     Address mr2End = mr2.end();
120     if (AddressOps.gt(end, mr2End)) {
121       resEnd = end;
122     } else {
123       resEnd = mr2End;
124     }
125     res.setEnd(resEnd);
126     return res;
127   }
128 
start()129   public Address start() {
130     return start;
131   }
132 
startAsOopHandle()133   public OopHandle startAsOopHandle() {
134     return start().addOffsetToAsOopHandle(0);
135   }
136 
end()137   public Address end() {
138     return start.addOffsetTo(byteSize);
139   }
140 
endAsOopHandle()141   public OopHandle endAsOopHandle() {
142     return end().addOffsetToAsOopHandle(0);
143   }
144 
setStart(Address start)145   public void setStart(Address start) {
146     this.start = start;
147   }
148 
setEnd(Address end)149   public void setEnd(Address end) {
150     byteSize = end.minus(start);
151   }
152 
setWordSize(long wordSize)153   public void setWordSize(long wordSize) {
154     byteSize = VM.getVM().getAddressSize() * wordSize;
155   }
156 
contains(MemRegion mr2)157   public boolean contains(MemRegion mr2) {
158     return AddressOps.lte(start, mr2.start) && AddressOps.gte(end(), mr2.end());
159   }
160 
contains(Address addr)161   public boolean contains(Address addr) {
162     return AddressOps.gte(addr, start()) && AddressOps.lt(addr, end());
163   }
164 
byteSize()165   public long byteSize() {
166     return byteSize;
167   }
168 
wordSize()169   public long wordSize() {
170     return byteSize / VM.getVM().getAddressSize();
171   }
172 }
173