Author: kib
Date: Fri Dec  6 21:30:31 2013
New Revision: 259043
URL: http://svnweb.freebsd.org/changeset/base/259043

Log:
  Build an allocator for the aligned memory on top of the rtld-private
  malloc.
  
  Reviewed by:  kan
  Sponsored by: The FreeBSD Foundation
  MFC after:    1 week

Modified:
  head/libexec/rtld-elf/rtld.h
  head/libexec/rtld-elf/xmalloc.c

Modified: head/libexec/rtld-elf/rtld.h
==============================================================================
--- head/libexec/rtld-elf/rtld.h        Fri Dec  6 21:26:57 2013        
(r259042)
+++ head/libexec/rtld-elf/rtld.h        Fri Dec  6 21:30:31 2013        
(r259043)
@@ -352,6 +352,8 @@ Obj_Entry *map_object(int, const char *,
 void *xcalloc(size_t, size_t);
 void *xmalloc(size_t);
 char *xstrdup(const char *);
+void *malloc_aligned(size_t size, size_t align);
+void free_aligned(void *ptr);
 extern Elf_Addr _GLOBAL_OFFSET_TABLE_[];
 extern Elf_Sym sym_zero;       /* For resolving undefined weak refs. */
 

Modified: head/libexec/rtld-elf/xmalloc.c
==============================================================================
--- head/libexec/rtld-elf/xmalloc.c     Fri Dec  6 21:26:57 2013        
(r259042)
+++ head/libexec/rtld-elf/xmalloc.c     Fri Dec  6 21:30:31 2013        
(r259043)
@@ -67,3 +67,33 @@ xstrdup(const char *str)
        memcpy(copy, str, len);
        return (copy);
 }
+
+void *
+malloc_aligned(size_t size, size_t align)
+{
+       void *mem, *res;
+       uintptr_t x;
+       size_t asize, r;
+
+       r = round(sizeof(void *), align);
+       asize = round(size, align) + r;
+       mem = xmalloc(asize);
+       x = (uintptr_t)mem;
+       res = (void *)round(x, align);
+       *(void **)((uintptr_t)res - sizeof(void *)) = mem;
+       return (res);
+}
+
+void
+free_aligned(void *ptr)
+{
+       void *mem;
+       uintptr_t x;
+
+       if (ptr == NULL)
+               return;
+       x = (uintptr_t)ptr;
+       x -= sizeof(void *);
+       mem = *(void **)x;
+       free(mem);
+}
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to