1 /*
2  * Copyright (c) 2018, 2019, 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.gc.z;
26 
27 import sun.jvm.hotspot.runtime.VM;
28 import sun.jvm.hotspot.types.Field;
29 import sun.jvm.hotspot.types.Type;
30 import sun.jvm.hotspot.types.TypeDataBase;
31 
32 public class ZGlobals {
33     private static Field instanceField;
34 
35     // Global phase state
36     public static int ZPhaseRelocate;
37 
38     public static byte ZPageTypeSmall;
39     public static byte ZPageTypeMedium;
40     public static byte ZPageTypeLarge;
41 
42     // Granule size shift
43     public static long ZGranuleSizeShift;
44 
45     // Page size shifts
46     public static long ZPageSizeSmallShift;
47     public static long ZPageSizeMediumShift;
48 
49     // Object alignment shifts
50     public static int  ZObjectAlignmentMediumShift;
51     public static int  ZObjectAlignmentLargeShift;
52 
53     // Pointer part of address
54     public static long ZAddressOffsetShift;
55 
56     // Pointer part of address
57     public static long ZAddressOffsetBits;
58     public static long ZAddressOffsetMask;
59     public static long ZAddressOffsetMax;
60 
61     // Address space start/end/size
62     public static long ZAddressSpaceStart;
63 
64     static {
VM.registerVMInitializedObserver(o, d) -> initialize(VM.getVM().getTypeDataBase())65         VM.registerVMInitializedObserver((o, d) -> initialize(VM.getVM().getTypeDataBase()));
66     }
67 
initialize(TypeDataBase db)68     static private synchronized void initialize(TypeDataBase db) {
69         Type type = db.lookupType("ZGlobalsForVMStructs");
70 
71         instanceField = type.getField("_instance_p");
72 
73         ZPhaseRelocate = db.lookupIntConstant("ZPhaseRelocate").intValue();
74 
75         ZPageTypeSmall = db.lookupIntConstant("ZPageTypeSmall").byteValue();
76         ZPageTypeMedium = db.lookupIntConstant("ZPageTypeMedium").byteValue();
77         ZPageTypeLarge = db.lookupIntConstant("ZPageTypeLarge").byteValue();
78 
79         ZGranuleSizeShift = db.lookupLongConstant("ZGranuleSizeShift").longValue();
80 
81         ZPageSizeSmallShift = db.lookupLongConstant("ZPageSizeSmallShift").longValue();
82         ZPageSizeMediumShift = db.lookupLongConstant("ZPageSizeMediumShift").longValue();
83 
84         ZObjectAlignmentMediumShift = db.lookupIntConstant("ZObjectAlignmentMediumShift").intValue();
85         ZObjectAlignmentLargeShift = db.lookupIntConstant("ZObjectAlignmentLargeShift").intValue();;
86 
87         ZAddressOffsetShift = db.lookupLongConstant("ZAddressOffsetShift").longValue();
88 
89         ZAddressOffsetBits = db.lookupLongConstant("ZAddressOffsetBits").longValue();
90         ZAddressOffsetMask = db.lookupLongConstant("ZAddressOffsetMask").longValue();
91         ZAddressOffsetMax  = db.lookupLongConstant("ZAddressOffsetMax").longValue();
92 
93         ZAddressSpaceStart = db.lookupLongConstant("ZAddressSpaceStart").longValue();
94     }
95 
instance()96     private static ZGlobalsForVMStructs instance() {
97         return new ZGlobalsForVMStructs(instanceField.getAddress());
98     }
99 
ZGlobalPhase()100     public static int ZGlobalPhase() {
101         return instance().ZGlobalPhase();
102     }
103 
ZGlobalSeqNum()104     public static int ZGlobalSeqNum() {
105         return instance().ZGlobalSeqNum();
106     }
107 
ZAddressGoodMask()108     public static long ZAddressGoodMask() {
109         return instance().ZAddressGoodMask();
110     }
111 
ZAddressBadMask()112     public static long ZAddressBadMask() {
113         return instance().ZAddressBadMask();
114     }
115 
ZAddressWeakBadMask()116     public static long ZAddressWeakBadMask() {
117         return instance().ZAddressWeakBadMask();
118     }
119 
ZObjectAlignmentSmallShift()120     public static int ZObjectAlignmentSmallShift() {
121         return instance().ZObjectAlignmentSmallShift();
122     }
123 
ZObjectAlignmentSmall()124     public static int ZObjectAlignmentSmall() {
125         return instance().ZObjectAlignmentSmall();
126     }
127 }
128