Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Sep 2019 13:15:27 +0000 (UTC)
From:      Toomas Soome <tsoome@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r352445 - head/stand/libsa
Message-ID:  <201909171315.x8HDFRo1061168@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: tsoome
Date: Tue Sep 17 13:15:27 2019
New Revision: 352445
URL: https://svnweb.freebsd.org/changeset/base/352445

Log:
  loader: add memalign() to libsa
  
  Implement memalign(size_t alignment, size_t size) to allocate aligned memory.

Modified:
  head/stand/libsa/stand.h
  head/stand/libsa/zalloc.c
  head/stand/libsa/zalloc_malloc.c
  head/stand/libsa/zalloc_protos.h

Modified: head/stand/libsa/stand.h
==============================================================================
--- head/stand/libsa/stand.h	Tue Sep 17 13:07:02 2019	(r352444)
+++ head/stand/libsa/stand.h	Tue Sep 17 13:15:27 2019	(r352445)
@@ -427,19 +427,23 @@ extern uint16_t		ntohs(uint16_t);
 #endif
 
 void *Malloc(size_t, const char *, int);
+void *Memalign(size_t, size_t, const char *, int);
 void *Calloc(size_t, size_t, const char *, int);
 void *Realloc(void *, size_t, const char *, int);
+void *Reallocf(void *, size_t, const char *, int);
 void Free(void *, const char *, int);
 extern void	mallocstats(void);
 
 #ifdef DEBUG_MALLOC
 #define malloc(x)	Malloc(x, __FILE__, __LINE__)
+#define memalign(x, y)	Memalign(x, y, __FILE__, __LINE__)
 #define calloc(x, y)	Calloc(x, y, __FILE__, __LINE__)
 #define free(x)		Free(x, __FILE__, __LINE__)
 #define realloc(x, y)	Realloc(x, y, __FILE__, __LINE__)
 #define reallocf(x, y)	Reallocf(x, y, __FILE__, __LINE__)
 #else
 #define malloc(x)	Malloc(x, NULL, 0)
+#define memalign(x, y)	Memalign(x, y, NULL, 0)
 #define calloc(x, y)	Calloc(x, y, NULL, 0)
 #define free(x)		Free(x, NULL, 0)
 #define realloc(x, y)	Realloc(x, y, NULL, 0)

Modified: head/stand/libsa/zalloc.c
==============================================================================
--- head/stand/libsa/zalloc.c	Tue Sep 17 13:07:02 2019	(r352444)
+++ head/stand/libsa/zalloc.c	Tue Sep 17 13:15:27 2019	(r352445)
@@ -30,6 +30,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/param.h>
+
 /*
  * LIB/MEMORY/ZALLOC.C	- self contained low-overhead memory pool/allocation
  *			  subsystem
@@ -86,7 +88,7 @@ typedef char assert_align[(sizeof(struct MemNode) <= M
  */
 
 void *
-znalloc(MemPool *mp, uintptr_t bytes)
+znalloc(MemPool *mp, uintptr_t bytes, size_t align)
 {
 	MemNode **pmn;
 	MemNode *mn;
@@ -111,14 +113,40 @@ znalloc(MemPool *mp, uintptr_t bytes)
 
 	for (pmn = &mp->mp_First; (mn = *pmn) != NULL; pmn = &mn->mr_Next) {
 		char *ptr = (char *)mn;
+		uintptr_t dptr;
+		char *aligned;
+		size_t extra;
 
-		if (bytes > mn->mr_Bytes)
+		dptr = (uintptr_t)(ptr + MALLOCALIGN);  /* pointer to data */
+		aligned = (char *)(roundup2(dptr, align) - MALLOCALIGN);
+		extra = aligned - ptr;
+
+		if (bytes + extra > mn->mr_Bytes)
 			continue;
 
 		/*
+		 * Cut extra from head and create new memory node from reminder.
+		 */
+
+		if (extra != 0) {
+			MemNode *new;
+
+			new = (MemNode *)aligned;
+			new->mr_Next = mn->mr_Next;
+			new->mr_Bytes = mn->mr_Bytes - extra;
+
+			/* And update current memory node */
+			mn->mr_Bytes = extra;
+			mn->mr_Next = new;
+			/* In next iteration, we will get our aligned address */
+			continue;
+		}
+
+		/*
 		 *  Cut a chunk of memory out of the beginning of this
 		 *  block and fixup the link appropriately.
 		 */
+
 		if (mn->mr_Bytes == bytes) {
 			*pmn = mn->mr_Next;
 		} else {

Modified: head/stand/libsa/zalloc_malloc.c
==============================================================================
--- head/stand/libsa/zalloc_malloc.c	Tue Sep 17 13:07:02 2019	(r352444)
+++ head/stand/libsa/zalloc_malloc.c	Tue Sep 17 13:15:27 2019	(r352445)
@@ -50,9 +50,27 @@ void mallocstats(void);
 #undef free
 #endif
 
+static void *Malloc_align(size_t, size_t);
+
 void *
-Malloc(size_t bytes, const char *file, int line)
+Malloc(size_t bytes, const char *file __unused, int line __unused)
 {
+	return (Malloc_align(bytes, 1));
+}
+
+void *
+Memalign(size_t alignment, size_t bytes, const char *file __unused,
+    int line __unused)
+{
+	if (alignment == 0)
+		alignment = 1;
+
+	return (Malloc_align(bytes, alignment));
+}
+
+static void *
+Malloc_align(size_t bytes, size_t alignment)
+{
 	Guard *res;
 
 	if (bytes == 0)
@@ -64,7 +82,7 @@ Malloc(size_t bytes, const char *file, int line)
 	bytes += MALLOCALIGN;
 #endif
 
-	while ((res = znalloc(&MallocPool, bytes)) == NULL) {
+	while ((res = znalloc(&MallocPool, bytes, alignment)) == NULL) {
 		int incr = (bytes + BLKEXTENDMASK) & ~BLKEXTENDMASK;
 		char *base;
 

Modified: head/stand/libsa/zalloc_protos.h
==============================================================================
--- head/stand/libsa/zalloc_protos.h	Tue Sep 17 13:07:02 2019	(r352444)
+++ head/stand/libsa/zalloc_protos.h	Tue Sep 17 13:15:27 2019	(r352445)
@@ -32,7 +32,7 @@
 #ifndef _ZALLOC_PROTOS_H
 #define	_ZALLOC_PROTOS_H
 
-Library void *znalloc(struct MemPool *mpool, uintptr_t bytes);
+Library void *znalloc(struct MemPool *mpool, uintptr_t bytes, size_t align);
 Library void zfree(struct MemPool *mpool, void *ptr, uintptr_t bytes);
 Library void zextendPool(MemPool *mp, void *base, uintptr_t bytes);
 Library void zallocstats(struct MemPool *mp);



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