Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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