svn commit: r352445 - head/stand/libsa
Toomas Soome
tsoome at FreeBSD.org
Tue Sep 17 13:15:28 UTC 2019
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);
More information about the svn-src-all
mailing list