blob: 18574f2e1610b61c61ad83eddefc082534daba8f [file] [log] [blame]
/*
* 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();
}
}