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.utility; 014 015 import org.mmtk.utility.alloc.EmbeddedMetaData; 016 import org.mmtk.vm.VM; 017 018 /** 019 * MMTk follows the pattern set by Jikes RVM for defining sizes of 020 * primitive types thus: 021 * 022 * <pre> 023 * static final int LOG_BYTES_IN_INT = 2; 024 * static final int BYTES_IN_INT = 1<<LOG_BYTES_IN_INT; 025 * static final int LOG_BITS_IN_INT = LOG_BITS_IN_BYTE + LOG_BYTES_IN_INT; 026 * static final int BITS_IN_INT = 1<<LOG_BITS_IN_INT; 027 * </pre> 028 */ 029 public interface Constants { 030 031 /**************************************************************************** 032 * 033 * MMTk constants 034 */ 035 036 /** 037 * 038 */ 039 int INSTANCE_FIELD = 0; 040 int ARRAY_ELEMENT = 1; 041 042 043 /**************************************************************************** 044 * 045 * Generic sizes 046 */ 047 048 /** 049 * 050 */ 051 byte LOG_BYTES_IN_BYTE = 0; 052 int BYTES_IN_BYTE = 1; 053 byte LOG_BITS_IN_BYTE = 3; 054 int BITS_IN_BYTE = 1 << LOG_BITS_IN_BYTE; 055 056 byte LOG_BYTES_IN_MBYTE = 20; 057 int BYTES_IN_MBYTE = 1 << LOG_BYTES_IN_MBYTE; 058 059 byte LOG_BYTES_IN_KBYTE = 10; 060 int BYTES_IN_KBYTE = 1 << LOG_BYTES_IN_KBYTE; 061 062 /**************************************************************************** 063 * 064 * Card scanning 065 */ 066 067 /** 068 * 069 */ 070 boolean SUPPORT_CARD_SCANNING = false; 071 int LOG_CARD_META_SIZE = 2;// each card consumes four bytes of metadata 072 int LOG_CARD_UNITS = 10; // number of units tracked per card 073 int LOG_CARD_GRAIN = 0; // track at byte grain, save shifting 074 int LOG_CARD_BYTES = LOG_CARD_UNITS + LOG_CARD_GRAIN; 075 int LOG_CARD_META_BYTES = EmbeddedMetaData.LOG_BYTES_IN_REGION - LOG_CARD_BYTES + LOG_CARD_META_SIZE; 076 int LOG_CARD_META_PAGES = LOG_CARD_META_BYTES - VM.LOG_BYTES_IN_PAGE; 077 int CARD_META_PAGES_PER_REGION = SUPPORT_CARD_SCANNING ? (1<<LOG_CARD_META_PAGES) : 0; 078 int CARD_MASK = (1<<LOG_CARD_BYTES) - 1; 079 080 081 /**************************************************************************** 082 * 083 * Java-specific sizes currently required by MMTk 084 * 085 * TODO MMTk should really become independent of these Java types 086 */ 087 088 /** 089 * 090 */ 091 byte LOG_BYTES_IN_CHAR= 1; 092 int BYTES_IN_CHAR = 1 << LOG_BYTES_IN_CHAR; 093 byte LOG_BITS_IN_CHAR = LOG_BITS_IN_BYTE + LOG_BYTES_IN_CHAR; 094 int BITS_IN_CHAR = 1 << LOG_BITS_IN_CHAR; 095 096 byte LOG_BYTES_IN_SHORT = 1; 097 int BYTES_IN_SHORT = 1 << LOG_BYTES_IN_SHORT; 098 byte LOG_BITS_IN_SHORT = LOG_BITS_IN_BYTE + LOG_BYTES_IN_SHORT; 099 int BITS_IN_SHORT = 1 << LOG_BITS_IN_SHORT; 100 101 byte LOG_BYTES_IN_INT = 2; 102 int BYTES_IN_INT = 1 << LOG_BYTES_IN_INT; 103 byte LOG_BITS_IN_INT = LOG_BITS_IN_BYTE + LOG_BYTES_IN_INT; 104 int BITS_IN_INT = 1 << LOG_BITS_IN_INT; 105 106 int MAX_INT = 0x7fffffff; 107 int MIN_INT = 0x80000000; 108 109 /**************************************************************************** 110 * 111 * VM-Specific sizes 112 */ 113 114 /** 115 * 116 */ 117 byte LOG_BYTES_IN_ADDRESS = VM.LOG_BYTES_IN_ADDRESS; 118 int BYTES_IN_ADDRESS = 1 << LOG_BYTES_IN_ADDRESS; 119 int LOG_BITS_IN_ADDRESS = LOG_BITS_IN_BYTE + LOG_BYTES_IN_ADDRESS; 120 int BITS_IN_ADDRESS = 1 << LOG_BITS_IN_ADDRESS; 121 122 // Note that in MMTk we currently define WORD & ADDRESS to be the same size 123 byte LOG_BYTES_IN_WORD = LOG_BYTES_IN_ADDRESS; 124 int BYTES_IN_WORD = 1 << LOG_BYTES_IN_WORD; 125 int LOG_BITS_IN_WORD = LOG_BITS_IN_BYTE + LOG_BYTES_IN_WORD; 126 int BITS_IN_WORD = 1 << LOG_BITS_IN_WORD; 127 128 byte LOG_BYTES_IN_PAGE = VM.LOG_BYTES_IN_PAGE; 129 int BYTES_IN_PAGE = 1 << LOG_BYTES_IN_PAGE; 130 int LOG_BITS_IN_PAGE = LOG_BITS_IN_BYTE + LOG_BYTES_IN_PAGE; 131 int BITS_IN_PAGE = 1 << LOG_BITS_IN_PAGE; 132 133 /* Assume byte-addressability */ 134 byte LOG_BYTES_IN_ADDRESS_SPACE = (byte) BITS_IN_ADDRESS; 135 136 /** 137 * This value specifies the <i>minimum</i> allocation alignment 138 * requirement of the VM. When making allocation requests, both 139 * <code>align</code> and <code>offset</code> must be multiples of 140 * <code>MIN_ALIGNMENT</code>. 141 * 142 * This value is required to be a power of 2. 143 */ 144 byte LOG_MIN_ALIGNMENT = VM.LOG_MIN_ALIGNMENT; 145 int MIN_ALIGNMENT = 1 << LOG_MIN_ALIGNMENT; 146 147 /** 148 * The maximum alignment request the vm will make. This must be a 149 * power of two multiple of the minimum alignment. 150 */ 151 int MAX_ALIGNMENT = MIN_ALIGNMENT<<VM.MAX_ALIGNMENT_SHIFT; 152 153 /** 154 * The VM will add at most this value minus BYTES_IN_INT bytes of 155 * padding to the front of an object that it places in a region of 156 * memory. This value must be a power of 2. 157 */ 158 int MAX_BYTES_PADDING = VM.MAX_BYTES_PADDING; 159 160 /** 161 * The VM will add at most this value minus BYTES_IN_INT bytes of 162 * padding to the front of an object that it places in a region of 163 * memory. This value must be a power of 2. 164 */ 165 int ALIGNMENT_VALUE = VM.ALIGNMENT_VALUE; 166 }