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.gc.z;
26
27 import sun.jvm.hotspot.debugger.Address;
28 import sun.jvm.hotspot.runtime.VM;
29 import sun.jvm.hotspot.runtime.VMObject;
30 import sun.jvm.hotspot.types.CIntegerField;
31 import sun.jvm.hotspot.types.Type;
32 import sun.jvm.hotspot.types.TypeDataBase;
33
34 class ZPage extends VMObject {
35 private static CIntegerField typeField;
36 private static long virtualFieldOffset;
37 private static long forwardingFieldOffset;
38
39 static {
40 VM.registerVMInitializedObserver((o, d) -> initialize(VM.getVM().getTypeDataBase()));
41 }
42
43 static private synchronized void initialize(TypeDataBase db) {
44 Type type = db.lookupType("ZPage");
45
46 typeField = type.getCIntegerField("_type");
47 virtualFieldOffset = type.getField("_virtual").getOffset();
48 forwardingFieldOffset = type.getField("_forwarding").getOffset();
49 }
50
51 ZPage(Address addr) {
52 super(addr);
53 }
54
55 private byte type() {
56 return typeField.getJByte(addr);
57 }
58
59 private ZVirtualMemory virtual() {
60 return new ZVirtualMemory(addr.addOffsetTo(virtualFieldOffset));
61 }
62
63 private ZForwardingTable forwarding() {
64 return new ZForwardingTable(addr.addOffsetTo(forwardingFieldOffset));
65 }
66
67 private long start() {
68 return virtual().start();
69 }
70
71 Address forward_object(Address from) {
72 // Lookup address in forwarding table
73 long from_offset = ZAddress.offset(from);
74 long from_index = (from_offset - start()) >> object_alignment_shift();
75 ZForwardingTableEntry entry = forwarding().find(from_index);
76 assert(!entry.is_empty());
77 assert(entry.from_index() == from_index);
78
79 return ZAddress.good(entry.to_offset());
80 }
81
82 Address relocate_object(Address from) {
83 // Lookup address in forwarding table
84 long from_offset = ZAddress.offset(from);
85 long from_index = (from_offset - start()) >> object_alignment_shift();
86 ZForwardingTableEntry entry = forwarding().find(from_index);
87 if (!entry.is_empty() && entry.from_index() == from_index) {
88 return ZAddress.good(entry.to_offset());
89 }
90
91 // There's no relocate operation in the SA. Simply use the from address and hope for the best.
92 return from;
93 }
94
95
96 long object_alignment_shift() {
97 switch (type()) {
98 case ZGlobals.ZPageTypeSmall:
99 return ZGlobals.ZObjectAlignmentSmallShift();
100
101 case ZGlobals.ZPageTypeMedium:
102 return ZGlobals.ZObjectAlignmentMediumShift;
103
104 default:
105 assert(type() == ZGlobals.ZPageTypeLarge);
106 return ZGlobals.ZObjectAlignmentLargeShift;
107 }
108 }
109 }
|
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.gc.z;
26
27 import sun.jvm.hotspot.debugger.Address;
28 import sun.jvm.hotspot.runtime.VM;
29 import sun.jvm.hotspot.runtime.VMObject;
30 import sun.jvm.hotspot.runtime.VMObjectFactory;
31 import sun.jvm.hotspot.types.CIntegerField;
32 import sun.jvm.hotspot.types.Type;
33 import sun.jvm.hotspot.types.TypeDataBase;
34
35 class ZPage extends VMObject {
36 private static CIntegerField typeField;
37 private static long virtualFieldOffset;
38 private static long forwardingFieldOffset;
39 private static byte ZPageTypeSmall;
40 private static byte ZPageTypeMedium;
41 private static byte ZPageTypeLarge;
42 private static int ZObjectAlignmentSmallShift;
43 private static int ZObjectAlignmentMediumShift;
44 private static int ZObjectAlignmentLargeShift;
45
46 static {
47 VM.registerVMInitializedObserver((o, d) -> initialize(VM.getVM().getTypeDataBase()));
48 }
49
50 static private synchronized void initialize(TypeDataBase db) {
51 Type type = db.lookupType("ZPage");
52
53 typeField = type.getCIntegerField("_type");
54 virtualFieldOffset = type.getField("_virtual").getOffset();
55 forwardingFieldOffset = type.getField("_forwarding").getOffset();
56
57 ZPageTypeSmall = db.lookupIntConstant("ZPageTypeSmall").byteValue();
58 ZPageTypeMedium = db.lookupIntConstant("ZPageTypeMedium").byteValue();
59 ZPageTypeLarge = db.lookupIntConstant("ZPageTypeLarge").byteValue();
60 ZObjectAlignmentSmallShift = db.lookupIntConstant("ZObjectAlignmentSmallShift").intValue();
61 ZObjectAlignmentMediumShift = db.lookupIntConstant("ZObjectAlignmentMediumShift").intValue();
62 ZObjectAlignmentLargeShift = db.lookupIntConstant("ZObjectAlignmentLargeShift").intValue();
63 }
64
65 ZPage(Address addr) {
66 super(addr);
67 }
68
69 private byte type() {
70 return typeField.getJByte(addr);
71 }
72
73 private ZVirtualMemory virtual() {
74 return (ZVirtualMemory)VMObjectFactory.newObject(ZVirtualMemory.class, addr.addOffsetTo(virtualFieldOffset));
75 }
76
77 private ZForwardingTable forwarding() {
78 return (ZForwardingTable)VMObjectFactory.newObject(ZForwardingTable.class, addr.addOffsetTo(forwardingFieldOffset));
79 }
80
81 private long start() {
82 return virtual().start();
83 }
84
85 Address forward_object(Address from) {
86 // Lookup address in forwarding table
87 long from_offset = ZAddress.offset(from).asLongValue();
88 long from_index = (from_offset - start()) >> object_alignment_shift();
89 ZForwardingTableEntry entry = forwarding().find(from_index);
90 assert(!entry.is_empty());
91 assert(entry.from_index() == from_index);
92
93 return ZAddress.good(entry.to_offset());
94 }
95
96 Address relocate_object(Address from) {
97 // Lookup address in forwarding table
98 long from_offset = ZAddress.offset(from).asLongValue();
99 long from_index = (from_offset - start()) >> object_alignment_shift();
100 ZForwardingTableEntry entry = forwarding().find(from_index);
101 if (!entry.is_empty() && entry.from_index() == from_index) {
102 return ZAddress.good(entry.to_offset());
103 }
104
105 // There's no relocate operation in the SA.
106 return ZAddress.good(from);
107 }
108
109
110 long object_alignment_shift() {
111 if (type() == ZPageTypeSmall) {
112 return ZObjectAlignmentSmallShift;
113 } else if (type() == ZPageTypeMedium) {
114 return ZObjectAlignmentMediumShift;
115 } else {
116 assert(type() == ZPageTypeLarge);
117 return ZObjectAlignmentLargeShift;
118 }
119 }
120 }
|