1 /* 2 * Copyright (c) 2017, 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 ReturnBlobToWrongHeapTest 26 * @key stress 27 * @summary Test if VM attempts to return code blobs to an incorrect code heap or to outside of the code cache. 28 * @library /test/lib / 29 * @modules java.base/jdk.internal.misc 30 * java.management 31 * 32 * @build sun.hotspot.WhiteBox 33 * @run driver ClassFileInstaller sun.hotspot.WhiteBox 34 * sun.hotspot.WhiteBox$WhiteBoxPermission 35 * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions 36 * -XX:+WhiteBoxAPI 37 * -XX:CompileCommand=dontinline,compiler.codecache.stress.Helper$TestCase::method 38 * -XX:+SegmentedCodeCache 39 * -XX:ReservedCodeCacheSize=16M 40 * -XX:CodeCacheMinBlockLength=1 41 * compiler.codecache.stress.ReturnBlobToWrongHeapTest 42 */ 43 44 package compiler.codecache.stress; 45 46 import sun.hotspot.code.BlobType; 47 48 import java.util.ArrayList; 49 50 public class ReturnBlobToWrongHeapTest { 51 private static final long largeBlobSize = Helper.WHITE_BOX.getUintxVMFlag("ReservedCodeCacheSize") >> 6; 52 private static final long codeCacheMinBlockLength = Helper.WHITE_BOX.getUintxVMFlag("CodeCacheMinBlockLength"); 53 private static final BlobType[] BLOB_TYPES = BlobType.getAvailable().toArray(new BlobType[0]); 54 55 // Allocate blob in first code heap (the code heap with index 0). 56 private static long allocate(int size) { 57 return Helper.WHITE_BOX.allocateCodeBlob(size, BLOB_TYPES[0].id); 58 } 59 60 // Free blob. 61 private static void free(long address) { 62 Helper.WHITE_BOX.freeCodeBlob(address); 63 } 64 65 public static void main(String[] args) { 66 if (codeCacheMinBlockLength == 1) { 67 // Fill first code heap with large blobs until allocation fails. 68 long address; 69 while ((address = allocate((int)largeBlobSize)) != 0) { 70 } 71 72 // Allocate segment-sized blocks in first code heap. 73 long lastSegmentSizedAddress = 0; // Address of the last segment-sized blob allocated 74 while ((address = allocate(0)) != 0) { 75 lastSegmentSizedAddress = address; 76 } 77 78 if (lastSegmentSizedAddress == 0) { 79 throw new RuntimeException("Test failed: Not possible to allocate segment-sized blob"); 80 } 81 82 // Remove last segment-sized block from the first code heap. 83 free(lastSegmentSizedAddress); 84 } else { 85 throw new RuntimeException("Test requires CodeCacheMinBlockLength==1; CodeCacheMinBlockLength is " + 86 codeCacheMinBlockLength); 87 } 88 } 89 }