/** * Returns whether, according to the semantics of the object file, two sections could reasonably * both be placed (partially) on the same page-sized region of virtual memory. Usually this * means accounting for segment-level permissions/flags, as well as the physical layout of the * file. * * @param s1 one section * @param s2 another section */ protected boolean elementsCanSharePage(Element s1, Element s2, int offset1, int offset2) { // we require that they are in the same pagesize region in offset-space boolean offsetSpaceCompatible = (offset1 >> getPageSizeShift() == offset2 >> getPageSizeShift()); return offsetSpaceCompatible; // NOTE: subclasses will add their own restrictions here, e.g. // flag compatibility }
public int roundUpToPageSize(int x) { int pageShift = getPageSizeShift(); if (x % getPageSize() == 0) { return x; } else { return ((x >> pageShift) + 1) << pageShift; } }
protected Iterable<Element> elementsMappedOnPage(long vaddr, Map<Element, LayoutDecisionMap> alreadyDecided) { final long vaddrRoundedDown = (vaddr >> getPageSizeShift()) << getPageSizeShift(); // FIXME: use FilteringIterator instead of copying ArrayList<Element> ss = new ArrayList<>(); for (LayoutDecision d : decisionsByKind(LayoutDecision.Kind.VADDR, alreadyDecided)) { Element s = d.getElement(); assert d.getKind() == LayoutDecision.Kind.VADDR; int va = (int) d.getValue(); int sizeInMemory = d.getElement().getMemSize(alreadyDecided); assert sizeInMemory != -1; // if it begins before the end of this page // and doesn't end before the start, // it overlaps the page. int mappingBegin = va; int mappingEnd = va + sizeInMemory; long pageBegin = vaddrRoundedDown; long pageEnd = vaddrRoundedDown + getPageSize(); if (mappingBegin < pageEnd && mappingEnd > pageBegin) { ss.add(s); } } return ss; }
int existingSize = (int) alreadyDecided.get(alreadyMapped).getDecidedValue(LayoutDecision.Kind.SIZE); int existingEndPos = existingOffset + existingSize; int endPageNum = existingEndPos >> el.getOwner().getPageSizeShift(); int ourPageNum = fileOffset >> el.getOwner().getPageSizeShift(); mustStartNewPage |= endPageNum != ourPageNum; if (mustStartNewPage) { nextAvailableVaddr = ((nextAvailableVaddr >> el.getOwner().getPageSizeShift()) + 1) << el.getOwner().getPageSizeShift();