1 /*
 2  * Copyright (c) 2013, 2023, 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  * @test
26  * @summary Testing that, faced with a given (possibly odd) mapping address of class space, the encoding
27  *          scheme fits the address
28  * @requires vm.bits == 64 & !vm.graal.enabled & vm.debug == true
29  * @requires vm.flagless
30  * @library /test/lib
31  * @modules java.base/jdk.internal.misc
32  *          java.management
33  * @run driver CompressedClassPointersEncodingScheme
34  */
35 
36 import jdk.test.lib.Platform;
37 import jdk.test.lib.process.OutputAnalyzer;
38 import jdk.test.lib.process.ProcessTools;
39 import jtreg.SkippedException;
40 
41 import java.io.IOException;
42 
43 public class CompressedClassPointersEncodingScheme {
44 
45     private static void test(long forceAddress, long classSpaceSize, long expectedEncodingBase, int expectedEncodingShift) throws IOException {
46         String forceAddressString = String.format("0x%016X", forceAddress).toLowerCase();
47         String expectedEncodingBaseString = String.format("0x%016X", expectedEncodingBase).toLowerCase();
48         ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder(
49                 "-Xshare:off", // to make CompressedClassSpaceBaseAddress work
50                 "-XX:+UnlockDiagnosticVMOptions",
51                 "-XX:-UseCompressedOops", // keep VM from optimizing heap location
52                 "-XX:CompressedClassSpaceBaseAddress=" + forceAddress,
53                 "-XX:CompressedClassSpaceSize=" + classSpaceSize,
54                 "-Xmx128m",
55                 "-Xlog:metaspace*",
56                 "-version");
57         OutputAnalyzer output = new OutputAnalyzer(pb.start());
58 
59         output.reportDiagnosticSummary();
60 
61         // We ignore cases where we were not able to map at the force address
62         if (output.contains("reserving class space failed")) {
63             throw new SkippedException("Skipping because we cannot force ccs to " + forceAddressString);
64         }
65 
66         output.shouldHaveExitValue(0);
67         output.shouldContain("Narrow klass base: " + expectedEncodingBaseString + ", Narrow klass shift: " + expectedEncodingShift);
68     }
69 
70     final static long K = 1024;
71     final static long M = K * 1024;
72     final static long G = M * 1024;
73     public static void main(String[] args) throws Exception {
74         // Test ccs nestling right at the end of the 4G range
75         // Expecting base=0, shift=0
76         test(4 * G - 128 * M, 128 * M, 0, 0);
77 
78         // add more...
79 
80     }
81 }