def __init__(self, segment, segment_index, file_type, attrs, pools): ImageObject.__init__(self, attrs) self.segment = segment self.segment_index = segment_index self.file_type = file_type self.attrs.size = segment.get_memsz() # Set direct addressing, if that's what's wanted. if self.attrs.direct: self.attrs.phys_addr = segment.vaddr # Declare the segment's physical memory range in use. marked = pools.mark_physical(self.attrs.abs_name(), self.attrs.phys_addr, self.attrs.size) if self.attrs.phys_addr is not None and not marked: raise MergeError, \ 'Segment "%s": Cannot reserve physical addresses ' \ '%#x--%#x.' % \ (self.attrs.abs_name(), self.attrs.phys_addr, self.attrs.phys_addr + self.attrs.size - 1) # If it's a protected segment, reserve everything in the same SECTION if self.attrs.protected: base = align_down(segment.vaddr, 1024 * 1024) size = align_up(self.attrs.size + base - segment.vaddr, 1024 * 1024) else: base = segment.vaddr size = self.attrs.size pools.mark_virtual(self.attrs.abs_name(), base, size)
def __init__(self, segment, segment_index, file_type, attrs, pools): ImageObject.__init__(self, attrs) self.segment = segment self.segment_index = segment_index self.file_type = file_type self.attrs.size = segment.get_memsz() # Set direct addressing, if that's what's wanted. if self.attrs.direct: self.attrs.phys_addr = segment.vaddr self.attrs.virtpool = 'direct' # Declare the segment's physical memory range in use. marked = pools.mark_physical(self.attrs.abs_name(), self.attrs.phys_addr, self.attrs.size, self.attrs.cache_policy) if self.attrs.phys_addr is not None and not marked: raise MergeError, \ 'Segment "%s": Cannot reserve physical addresses ' \ '%#x--%#x.' % \ (self.attrs.abs_name(), self.attrs.phys_addr, self.attrs.phys_addr + self.attrs.size - 1) # If it's a protected segment, reserve everything in the same SECTION if self.attrs.protected: base = align_down(segment.vaddr, 1024 * 1024) size = align_up(self.attrs.size + base - segment.vaddr, 1024 * 1024) else: base = segment.vaddr size = self.attrs.size pools.mark_virtual(self.attrs.abs_name(), base, size, self.attrs.cache_policy)
def post_alloc(self, pools): if self.attrs.direct and self.attrs.has_phys_addr(): pools.mark_virtual(self.attrs.abs_name(), self.attrs.phys_addr, self.attrs.size) self.attrs.virt_addr = self.attrs.phys_addr if self.segment: self.segment.paddr = self.attrs.phys_addr self.segment.vaddr = self.attrs.virt_addr self.segment.sections[0].address = self.attrs.virt_addr
def __init__(self, segment, attrs, pools): ImageObject.__init__(self, attrs) self.segment = segment self.owned_by_rootserver = False if self.attrs.direct: self.attrs.virtpool = 'direct' pools.mark_virtual(attrs.abs_name(), self.attrs.virt_addr, self.attrs.size, self.attrs.cache_policy) pools.mark_physical(attrs.abs_name(), self.attrs.phys_addr, self.attrs.size, self.attrs.cache_policy)
def __init__(self, segment, attrs, pools): ImageObject.__init__(self, attrs) self.segment = segment self.owned_by_rootserver = False # If directly mapped and the user has specified the virtual # address, then copy it to the physical address. if self.attrs.direct and \ self.attrs.virt_addr is not None and \ self.attrs.phys_addr is None: self.attrs.phys_addr = self.attrs.virt_addr pools.mark_virtual(attrs.abs_name(), self.attrs.virt_addr, self.attrs.size) pools.mark_physical(attrs.abs_name(), self.attrs.phys_addr, self.attrs.size)
def post_alloc(self, pools): if self.attrs.direct and self.attrs.has_phys_addr(): # For direct allocation, assign the physical address to # the virtual address and then mark the virtual range as # used. All possible direct virtual addresses will have # been moved into the 'direct' virtpool (which isn't # used), so address classes should not occur. pools.mark_virtual(self.attrs.abs_name(), self.attrs.phys_addr, self.attrs.size) # Tell the memsection's zone (if it has one) to grab the # corresponding window. pools.mark_direct_zone(self.attrs.virtpool, self.attrs.abs_name(), self.attrs.phys_addr, self.attrs.size, pools) self.attrs.virt_addr = self.attrs.phys_addr if self.segment: self.segment.paddr = self.attrs.phys_addr self.segment.vaddr = self.attrs.virt_addr self.segment.sections[0].address = self.attrs.virt_addr