Beispiel #1
0
    def free_mem(self, addr, size):
        # first check if its a right alloc
        if not self.addrs.has_key(addr):
            raise VamosInternalError("Invalid Free'd Memory at %06x" % addr)
        # align size to 4 bytes
        size = (size + 3) & ~3
        real_size = self.addrs[addr]
        assert size == real_size
        # remove from valid allocs
        del self.addrs[addr]
        # create a new free chunk
        chunk = MemoryChunk(addr, real_size)
        self._insert_chunk(chunk)

        # try to merge with prev/next
        prev = chunk.prev
        if prev != None:
            new_chunk = self._merge_chunk(prev, chunk)
            if new_chunk != None:
                log_mem_alloc.debug("merged: %s + this=%s -> %s", prev, chunk,
                                    new_chunk)
                chunk = new_chunk
        next = chunk.next
        if next != None:
            new_chunk = self._merge_chunk(chunk, next)
            if new_chunk != None:
                log_mem_alloc.debug("merged: this=%s + %s -> %s", chunk, next,
                                    new_chunk)

        # correct free bytes
        self.free_bytes += size
        num_allocs = len(self.addrs)
        log_mem_alloc.info("[free  @%06x-%06x: %06x bytes] %s", addr,
                           addr + size, size, self._stat_info())
Beispiel #2
0
 def alloc_mem(self, size, except_on_fail=True):
     """allocate memory and return addr or 0 if no more memory"""
     # align size to 4 bytes
     size = (size + 3) & ~3
     # find best free chunk
     chunk, left = self._find_best_chunk(size)
     # out of memory?
     if chunk == None:
         if except_on_fail:
             self.dump_orphans()
             log_mem_alloc.error("[alloc: NO MEMORY for %06x bytes]" % size)
             raise VamosInternalError("[alloc: NO MEMORY for %06x bytes]" %
                                      size)
         return 0
     # remove chunk from free list
     # is something left?
     addr = chunk.addr
     if left == 0:
         self._remove_chunk(chunk)
     else:
         left_chunk = MemoryChunk(addr + size, left)
         self._replace_chunk(chunk, left_chunk)
     # add to valid allocs map
     self.addrs[addr] = size
     self.free_bytes -= size
     # erase memory
     self.mem.clear_block(addr, size, 0)
     log_mem_alloc.info("[alloc @%06x-%06x: %06x bytes] %s", addr,
                        addr + size, size, self._stat_info())
     if addr % 4:
         raise VamosInternalError(
             "Memory pool is invalid, return address not aligned by a long word"
         )
     return addr
Beispiel #3
0
  def free_mem(self, addr, size):
    # first check if its a right alloc
    if not self.addrs.has_key(addr):
      raise VamosInternalError("Invalid Free'd Memory at %06x" % addr)
    # align size to 4 bytes
    size = (size + 3) & ~3
    real_size = self.addrs[addr]
    assert size == real_size
    # remove from valid allocs
    del self.addrs[addr]
    # create a new free chunk
    chunk = MemoryChunk(addr, real_size)
    self._insert_chunk(chunk)

    # try to merge with prev/next
    prev = chunk.prev
    if prev != None:
      new_chunk = self._merge_chunk(prev, chunk)
      if new_chunk != None:
        log_mem_alloc.debug("merged: %s + this=%s -> %s",
                            prev, chunk, new_chunk)
        chunk = new_chunk
    next = chunk.next
    if next != None:
      new_chunk = self._merge_chunk(chunk, next)
      if new_chunk != None:
        log_mem_alloc.debug("merged: this=%s + %s -> %s",
                            chunk, next, new_chunk)

    # correct free bytes
    self.free_bytes += size
    num_allocs = len(self.addrs)
    log_mem_alloc.info("[free  @%06x-%06x: %06x bytes] %s",
                       addr, addr+size, size, self._stat_info())
Beispiel #4
0
 def alloc_mem(self, size, except_on_fail=True):
   """allocate memory and return addr or 0 if no more memory"""
   # align size to 4 bytes
   size = (size + 3) & ~3
   # find best free chunk
   chunk, left = self._find_best_chunk(size)
   # out of memory?
   if chunk == None:
     if except_on_fail:
       self.dump_orphans()
       log_mem_alloc.error("[alloc: NO MEMORY for %06x bytes]" % size)
       raise VamosInternalError("[alloc: NO MEMORY for %06x bytes]" % size)
     return 0
   # remove chunk from free list
   # is something left?
   addr = chunk.addr
   if left == 0:
     self._remove_chunk(chunk)
   else:
     left_chunk = MemoryChunk(addr + size, left)
     self._replace_chunk(chunk, left_chunk)
   # add to valid allocs map
   self.addrs[addr] = size
   self.free_bytes -= size
   # erase memory
   self.mem.clear_block(addr, size, 0)
   log_mem_alloc.info("[alloc @%06x-%06x: %06x bytes] %s",
                      addr, addr+size, size, self._stat_info())
   if addr % 4:
     raise VamosInternalError(
         "Memory pool is invalid, return address not aligned by a long word")
   return addr
Beispiel #5
0
 def map_struct(self, name, addr, struct):
     size = struct.get_size()
     access = AccessStruct(self.mem, struct, addr)
     if self.label_mgr is not None:
         label = self.label_mgr.get_label(addr)
     else:
         label = None
     mem = Memory(addr, size, label, access)
     log_mem_alloc.info("map struct: %s", mem)
     return mem
Beispiel #6
0
 def map_struct(self, name, addr, struct):
   size = struct.get_size()
   access = AccessStruct(self.mem, struct, addr)
   if self.label_mgr is not None:
     label = self.label_mgr.get_label(addr)
   else:
     label = None
   mem = Memory(addr, size, label, access)
   log_mem_alloc.info("map struct: %s", mem)
   return mem
Beispiel #7
0
 def map_struct(self, addr, struct, label=None):
     size = struct.get_size()
     access = AccessStruct(self.mem, struct, addr)
     if label and self.label_mgr:
         label_obj = LabelStruct(label, addr, struct)
         self.label_mgr.add_label(label_obj)
     else:
         label_obj = None
     mem = Memory(addr, size, label_obj, access)
     log_mem_alloc.info("map struct: %s", mem)
     return mem
Beispiel #8
0
 def alloc_bstr(self, name, bstr):
   size = len(bstr) + 2  # front: count, end: extra zero for safety
   addr = self.alloc_mem(size)
   if self.label_mgr is not None:
     label = LabelRange(name, addr, size)
     self.label_mgr.add_label(label)
   else:
     label = None
   self.mem.w_bstr(addr, bstr)
   mem = Memory(addr, size, label, self.mem)
   log_mem_alloc.info("alloc b_str: %s", mem)
   self.mem_objs[addr] = mem
   return mem
Beispiel #9
0
 def alloc_cstr(self, name, cstr):
   size = len(cstr) + 1
   addr = self.alloc_mem(size)
   if self.label_mgr is not None:
     label = LabelRange(name, addr, size)
     self.label_mgr.add_label(label)
   else:
     label = None
   self.mem.w_cstr(addr, cstr)
   mem = Memory(addr, size, label, self.mem)
   log_mem_alloc.info("alloc c_str: %s", mem)
   self.mem_objs[addr] = mem
   return mem
Beispiel #10
0
 def alloc_bstr(self, name, bstr):
     size = len(bstr) + 2  # front: count, end: extra zero for safety
     addr = self.alloc_mem(size)
     if self.label_mgr is not None:
         label = LabelRange(name, addr, size)
         self.label_mgr.add_label(label)
     else:
         label = None
     self.mem.w_bstr(addr, bstr)
     mem = Memory(addr, size, label, self.mem)
     log_mem_alloc.info("alloc b_str: %s", mem)
     self.mem_objs[addr] = mem
     return mem
Beispiel #11
0
 def alloc_memory(self, name, size, add_label=True, except_on_failure=True):
   addr = self.alloc_mem(size, except_on_failure)
   if addr == 0:
     return None
   if add_label and self.label_mgr is not None:
     label = LabelRange(name, addr, size)
     self.label_mgr.add_label(label)
   else:
     label = None
   mem = Memory(addr, size, label, self.mem)
   log_mem_alloc.info("alloc memory: %s", mem)
   self.mem_objs[addr] = mem
   return mem
Beispiel #12
0
 def alloc_memory(self, name, size, add_label=True, except_on_failure=True):
     addr = self.alloc_mem(size, except_on_failure)
     if addr == 0:
         return None
     if add_label and self.label_mgr is not None:
         label = LabelRange(name, addr, size)
         self.label_mgr.add_label(label)
     else:
         label = None
     mem = Memory(addr, size, label, self.mem)
     log_mem_alloc.info("alloc memory: %s", mem)
     self.mem_objs[addr] = mem
     return mem
Beispiel #13
0
 def alloc_cstr(self, name, cstr):
     size = len(cstr) + 1
     addr = self.alloc_mem(size)
     if self.label_mgr is not None:
         label = LabelRange(name, addr, size)
         self.label_mgr.add_label(label)
     else:
         label = None
     self.mem.w_cstr(addr, cstr)
     mem = Memory(addr, size, label, self.mem)
     log_mem_alloc.info("alloc c_str: %s", mem)
     self.mem_objs[addr] = mem
     return mem
Beispiel #14
0
 def alloc_cstr(self, cstr, label=None):
     size = len(cstr) + 1
     addr = self.alloc_mem(size)
     if label and self.label_mgr:
         label_obj = LabelRange(label, addr, size)
         self.label_mgr.add_label(label_obj)
     else:
         label_obj = None
     self.mem.w_cstr(addr, cstr)
     mem = Memory(addr, size, label_obj, self.mem)
     log_mem_alloc.info("alloc c_str: %s", mem)
     self.mem_objs[addr] = mem
     return mem
Beispiel #15
0
 def alloc_struct(self, name, struct, size=None, add_label=True):
   if size is None:
     size = struct.get_size()
   addr = self.alloc_mem(size)
   if self.label_mgr is not None and add_label:
     label = LabelStruct(name, addr, struct)
     self.label_mgr.add_label(label)
   else:
     label = None
   access = AccessStruct(self.mem, struct, addr)
   mem = Memory(addr, size, label, access)
   log_mem_alloc.info("alloc struct: %s", mem)
   self.mem_objs[addr] = mem
   return mem
Beispiel #16
0
 def alloc_struct(self, name, struct, size=None, add_label=True):
     if size is None:
         size = struct.get_size()
     addr = self.alloc_mem(size)
     if self.label_mgr is not None and add_label:
         label = LabelStruct(name, addr, struct)
         self.label_mgr.add_label(label)
     else:
         label = None
     access = AccessStruct(self.mem, struct, addr)
     mem = Memory(addr, size, label, access)
     log_mem_alloc.info("alloc struct: %s", mem)
     self.mem_objs[addr] = mem
     return mem
Beispiel #17
0
 def alloc_struct(self, struct, size=None, label=None):
     if size is None:
         size = struct.get_size()
     addr = self.alloc_mem(size)
     if label and self.label_mgr:
         label_obj = LabelStruct(label, addr, struct)
         self.label_mgr.add_label(label_obj)
     else:
         label_obj = None
     access = AccessStruct(self.mem, struct, addr)
     mem = Memory(addr, size, label_obj, access)
     log_mem_alloc.info("alloc struct: %s", mem)
     self.mem_objs[addr] = mem
     return mem
Beispiel #18
0
 def alloc_lib(self, lib_struct, pos_size=0, neg_size=0, fd=None, label=None):
     if pos_size == 0:
         pos_size = lib_struct.get_size()
     # round neg_size to multiple of four
     neg_size = (neg_size + 3) & ~3
     size = neg_size + pos_size
     # alloc full size
     addr = self.alloc_mem(size)
     base_addr = addr + neg_size
     if label and self.label_mgr:
         label_obj = LabelLib(label, base_addr, neg_size, pos_size, lib_struct, fd)
         self.label_mgr.add_label(label_obj)
     else:
         label_obj = None
     access = AccessStruct(self.mem, lib_struct, base_addr)
     mem = Memory(addr, size, label_obj, access)
     log_mem_alloc.info("alloc lib: %s", mem)
     self.mem_objs[addr] = mem
     return mem
Beispiel #19
0
 def free_bstr(self, mem):
     log_mem_alloc.info("free b_str: %s", mem)
     if self.label_mgr is not None:
         self.label_mgr.remove_label(mem.label)
     self.free_mem(mem.addr, mem.size)
     del self.mem_objs[mem.addr]
Beispiel #20
0
 def free_memory(self, mem):
   log_mem_alloc.info("free memory: %s", mem)
   if mem.label != None:
     self.label_mgr.remove_label(mem.label)
   self.free_mem(mem.addr, mem.size)
   del self.mem_objs[mem.addr]
Beispiel #21
0
 def free_lib(self, mem):
     log_mem_alloc.info("free lib: %s", mem)
     if self.label_mgr:
         self.label_mgr.remove_label(mem.label)
     self.free_mem(mem.addr, mem.size)
     del self.mem_objs[mem.addr]
Beispiel #22
0
 def free_bstr(self, mem):
   log_mem_alloc.info("free b_str: %s", mem)
   if self.label_mgr is not None:
     self.label_mgr.remove_label(mem.label)
   self.free_mem(mem.addr, mem.size)
   del self.mem_objs[mem.addr]
Beispiel #23
0
 def free_memory(self, mem):
     log_mem_alloc.info("free memory: %s", mem)
     if mem.label != None:
         self.label_mgr.remove_label(mem.label)
     self.free_mem(mem.addr, mem.size)
     del self.mem_objs[mem.addr]