Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Dec 2013 06:01:21 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r259291 - stable/9/libexec/rtld-elf
Message-ID:  <201312130601.rBD61LkD079081@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Fri Dec 13 06:01:21 2013
New Revision: 259291
URL: http://svnweb.freebsd.org/changeset/base/259291

Log:
  MFC r259043:
  Build an allocator for the aligned memory on top of the rtld-private
  malloc.

Modified:
  stable/9/libexec/rtld-elf/rtld.h
  stable/9/libexec/rtld-elf/xmalloc.c
Directory Properties:
  stable/9/libexec/rtld-elf/   (props changed)

Modified: stable/9/libexec/rtld-elf/rtld.h
==============================================================================
--- stable/9/libexec/rtld-elf/rtld.h	Fri Dec 13 06:00:44 2013	(r259290)
+++ stable/9/libexec/rtld-elf/rtld.h	Fri Dec 13 06:01:21 2013	(r259291)
@@ -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: stable/9/libexec/rtld-elf/xmalloc.c
==============================================================================
--- stable/9/libexec/rtld-elf/xmalloc.c	Fri Dec 13 06:00:44 2013	(r259290)
+++ stable/9/libexec/rtld-elf/xmalloc.c	Fri Dec 13 06:01:21 2013	(r259291)
@@ -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);
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201312130601.rBD61LkD079081>