| /* |
| * This file is part of the Jikes RVM project (http://jikesrvm.org). |
| * |
| * This file is licensed to You under the Eclipse Public License (EPL); |
| * You may not use this file except in compliance with the License. You |
| * may obtain a copy of the License at |
| * |
| * http://www.opensource.org/licenses/eclipse-1.0.php |
| * |
| * See the COPYRIGHT.txt file distributed with this work for information |
| * regarding copyright ownership. |
| */ |
| package org.mmtk.utility.alloc; |
| |
| import org.mmtk.utility.Constants; |
| |
| import org.vmmagic.unboxed.*; |
| import org.vmmagic.pragma.*; |
| |
| /** |
| * This plan implements constants and access methods for meta data |
| * that is embeded in allocation spaces (rather than kept on the |
| * side). The basic idea is that meta data be embeded at a very |
| * coarse power of two granularity for fast access, minimal wastage |
| * and by making the regions coarse, the contiguous meta-data will be |
| * relatively large and thus the probability of L1 conflict misses |
| * will be reduced (as compared with embedding meta-data at the start |
| * of each page which will cause those few cache lines corresponding |
| * to the start of each page to be heavily conflicted). |
| */ |
| @Uninterruptible public final class EmbeddedMetaData implements Constants { |
| |
| /* The (log of the) size of each region of meta data management */ |
| public static final int LOG_BYTES_IN_REGION = 22; |
| public static final int BYTES_IN_REGION = 1 << LOG_BYTES_IN_REGION; |
| private static final Word REGION_MASK = Word.fromIntSignExtend(BYTES_IN_REGION - 1); |
| public static final int LOG_PAGES_IN_REGION = LOG_BYTES_IN_REGION - LOG_BYTES_IN_PAGE; |
| public static final int PAGES_IN_REGION = 1 << LOG_PAGES_IN_REGION; |
| |
| /** |
| * Given an address, return the begining of the meta data for the |
| * region containing the address. This is a fast operation because |
| * it only involves masking out low order bits. |
| * |
| * @param address The address whose meta data is sought. |
| * @return The address of the start of the meta data for the meta |
| * region in which the address is located. |
| */ |
| @Inline |
| public static Address getMetaDataBase(Address address) { |
| return address.toWord().and(REGION_MASK.not()).toAddress(); |
| } |
| |
| /** |
| * Given an address, the density (coverage) of a meta data type, and |
| * the granularity (alignment) of the meta data, return the offset |
| * into the meta data the address. |
| * |
| * @param address The address whose meta data offset is sought. |
| * @param logCoverage The log base two of the coverage of the meta |
| * data in question. For example, a value of 4 would indicate a |
| * coverage of 16; one metadata byte for every 16 bytes of data. |
| * @param logAlign The log base two of the aligment or granularity |
| * of the meta-data (it may be arranged in bytes, words, double |
| * words etc). |
| * @return The offset into the meta-data for this region, given the |
| * specified address and coverage and aligment requirements. |
| */ |
| public static Extent getMetaDataOffset(Address address, |
| int logCoverage, |
| int logAlign) { |
| return address.toWord().and(REGION_MASK).rshl(logCoverage+logAlign).lsh(logAlign).toExtent(); |
| } |
| } |