001 /* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013 package org.mmtk.vm; 014 015 import org.mmtk.policy.ImmortalSpace; 016 017 import org.vmmagic.unboxed.*; 018 import org.vmmagic.pragma.*; 019 020 @Uninterruptible public abstract class Memory { 021 022 /** 023 * Allows for the VM to reserve space between HEAP_START() 024 * and AVAILABLE_START() for its own purposes. MMTk should 025 * expect to encounter objects in this range, but may not 026 * allocate in this range. 027 * 028 * MMTk expects the virtual address space between AVAILABLE_START() 029 * and AVAILABLE_END() to be contiguous and unmapped. 030 * Allows for the VM to reserve space between HEAP_END() 031 * and AVAILABLE_END() for its own purposes. MMTk should 032 * expect to encounter objects in this range, but may not 033 * allocate in this range. 034 * 035 * MMTk expects the virtual address space between AVAILABLE_START() 036 * and AVAILABLE_END() to be contiguous and unmapped. 037 * 038 * @return The high bound of the memory that MMTk can allocate. 039 */ 040 041 /** 042 * Return the space associated with/reserved for the VM. In the 043 * case of Jikes RVM this is the boot image space.<p> 044 * 045 * @return The space managed by the virtual machine. 046 */ 047 @Interruptible 048 public abstract ImmortalSpace getVMSpace(); 049 050 /** Global preparation for a collection. */ 051 public abstract void globalPrepareVMSpace(); 052 053 /** Per-collector preparation for a collection. */ 054 public abstract void collectorPrepareVMSpace(); 055 056 /** Per-collector post-collection work. */ 057 public abstract void collectorReleaseVMSpace(); 058 059 /** Global post-collection work. */ 060 public abstract void globalReleaseVMSpace(); 061 062 /** 063 * Sets the range of addresses associated with a heap. 064 * 065 * @param id the heap identifier 066 * @param start the address of the start of the heap 067 * @param end the address of the end of the heap 068 */ 069 public abstract void setHeapRange(int id, Address start, Address end); 070 071 /** 072 * Demand zero mmaps an area of virtual memory. 073 * 074 * @param start the address of the start of the area to be mapped 075 * @param size the size, in bytes, of the area to be mapped 076 * @return 0 if successful, otherwise the system errno 077 */ 078 public abstract int dzmmap(Address start, int size); 079 080 /** 081 * Protects access to an area of virtual memory. 082 * 083 * @param start the address of the start of the area to be mapped 084 * @param size the size, in bytes, of the area to be mapped 085 * @return <code>true</code> if successful, otherwise 086 * <code>false</code> 087 */ 088 public abstract boolean mprotect(Address start, int size); 089 090 /** 091 * Allows access to an area of virtual memory. 092 * 093 * @param start the address of the start of the area to be mapped 094 * @param size the size, in bytes, of the area to be mapped 095 * @return <code>true</code> if successful, otherwise 096 * <code>false</code> 097 */ 098 public abstract boolean munprotect(Address start, int size); 099 100 101 /** 102 * Zero a region of memory. 103 * 104 * @param useNT Use non temporal instructions (if available) 105 * @param start Start of address range (inclusive) 106 * @param len Length in bytes of range to zero 107 */ 108 public abstract void zero(boolean useNT, Address start, Extent len); 109 110 /** 111 * Logs the contents of an address and the surrounding memory to the 112 * error output. 113 * 114 * @param start the address of the memory to be dumped 115 * @param beforeBytes the number of bytes before the address to be 116 * included 117 * @param afterBytes the number of bytes after the address to be 118 * included 119 */ 120 public abstract void dumpMemory(Address start, int beforeBytes, 121 int afterBytes); 122 123 /** 124 * Wait for preceeding cache flush/invalidate instructions to complete 125 * on all processors. Ensures that all memory writes before this 126 * point are visible to all processors. 127 */ 128 @Inline 129 public abstract void sync(); 130 131 /** 132 * Wait for all preceeding instructions to complete and discard any 133 * prefetched instructions on this processor. Also prevents the 134 * compiler from performing code motion across this point. 135 */ 136 @Inline 137 public abstract void isync(); 138 139 /* 140 * NOTE: The following methods must be implemented by subclasses of this 141 * class, but are internal to the VM<->MM interface glue, so are never 142 * called by MMTk users. 143 */ 144 /** @return The lowest address in the virtual address space known to MMTk */ 145 protected abstract Address getHeapStartConstant(); 146 /** @return The highest address in the virtual address space known to MMTk */ 147 protected abstract Address getHeapEndConstant(); 148 /** @return The lowest address in the contiguous address space available to MMTk */ 149 protected abstract Address getAvailableStartConstant(); 150 /** @return The highest address in the contiguous address space available to MMTk */ 151 protected abstract Address getAvailableEndConstant(); 152 /** @return The log base two of the size of an address */ 153 protected abstract byte getLogBytesInAddressConstant(); 154 /** @return The log base two of the size of a word */ 155 protected abstract byte getLogBytesInWordConstant(); 156 /** @return The log base two of the size of an OS page */ 157 protected abstract byte getLogBytesInPageConstant(); 158 /** @return The log base two of the minimum allocation alignment */ 159 protected abstract byte getLogMinAlignmentConstant(); 160 /** @return The log base two of (MAX_ALIGNMENT/MIN_ALIGNMENT) */ 161 protected abstract byte getMaxAlignmentShiftConstant(); 162 /** @return The maximum number of bytes of padding to prepend to an object */ 163 protected abstract int getMaxBytesPaddingConstant(); 164 /** @return The value to store in alignment holes */ 165 protected abstract int getAlignmentValueConstant(); 166 167 /* 168 * NOTE: These methods should not be called by anything other than the 169 * reflective mechanisms in org.mmtk.vm.VM, and are not implemented by 170 * subclasses. This hack exists only to allow us to declare the respective 171 * methods as protected. 172 */ 173 static Address heapStartTrapdoor(Memory m) { 174 return m.getHeapStartConstant(); 175 } 176 static Address heapEndTrapdoor(Memory m) { 177 return m.getHeapEndConstant(); 178 } 179 static Address availableStartTrapdoor(Memory m) { 180 return m.getAvailableStartConstant(); 181 } 182 static Address availableEndTrapdoor(Memory m) { 183 return m.getAvailableEndConstant(); 184 } 185 static byte logBytesInAddressTrapdoor(Memory m) { 186 return m.getLogBytesInAddressConstant(); 187 } 188 static byte logBytesInWordTrapdoor(Memory m) { 189 return m.getLogBytesInWordConstant(); 190 } 191 static byte logBytesInPageTrapdoor(Memory m) { 192 return m.getLogBytesInPageConstant(); 193 } 194 static byte logMinAlignmentTrapdoor(Memory m) { 195 return m.getLogMinAlignmentConstant(); 196 } 197 static byte maxAlignmentShiftTrapdoor(Memory m) { 198 return m.getMaxAlignmentShiftConstant(); 199 } 200 static int maxBytesPaddingTrapdoor(Memory m) { 201 return m.getMaxBytesPaddingConstant(); 202 } 203 static int alignmentValueTrapdoor(Memory m) { 204 return m.getAlignmentValueConstant(); 205 } 206 }