svn commit: r259043 - head/libexec/rtld-elf

Konstantin Belousov kib at FreeBSD.org
Fri Dec 6 21:30:32 UTC 2013


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);
+}


More information about the svn-src-all mailing list