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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to