aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/string.h13
-rw-r--r--malloc.c12
-rw-r--r--tables.c10
3 files changed, 22 insertions, 13 deletions
diff --git a/include/string.h b/include/string.h
index c939cd0..d1bb037 100644
--- a/include/string.h
+++ b/include/string.h
@@ -23,7 +23,16 @@ static inline void *memcpy(void *dest, const void *src, size_t n)
return __builtin_memcpy(dest, src, n);
}
-void *malloc(int n);
-void *malloc_fseg(int n);
+void *malloc_align(int n, int align);
+void *malloc_fseg_align(int n, int align);
+static inline void *malloc(int n)
+{
+ return malloc_align(n, 16);
+}
+
+static inline void *malloc_fseg(int n)
+{
+ return malloc_fseg_align(n, 16);
+}
#endif
diff --git a/malloc.c b/malloc.c
index c8d865b..8738373 100644
--- a/malloc.c
+++ b/malloc.c
@@ -5,15 +5,17 @@
static uint8_t *fseg_base = &edata;
static uint8_t *malloc_top = &stext;
-void *malloc(int n)
+void *malloc_align(int n, int align)
{
- malloc_top -= (n + 15) & -16;
+ malloc_top = (uint8_t *) ((uintptr_t)(malloc_top - n) & -align);
return malloc_top;
}
-void *malloc_fseg(int n)
+void *malloc_fseg_align(int n, int align)
{
- void *p = fseg_base;
- fseg_base += (n + 15) & -16;
+ void *p;
+ fseg_base = (uint8_t *) (((uintptr_t)fseg_base + align - 1) & -align);
+ p = fseg_base;
+ fseg_base += n;
return p;
}
diff --git a/tables.c b/tables.c
index bb533b6..32b2406 100644
--- a/tables.c
+++ b/tables.c
@@ -57,15 +57,13 @@ static void do_alloc(char *file, uint32_t align, uint8_t zone)
if (id == -1)
panic();
- if (align > 16)
- n += align - 16;
+ if (align < 16)
+ align = 16;
if (zone == ALLOC_FSEG)
- p = malloc_fseg(n);
+ p = malloc_fseg_align(n, align);
else
- p = malloc(n);
-
- p = (char *)((uintptr_t)(p + align - 1) & -align);
+ p = malloc_align(n, align);
set_file_addr(id, p);
fw_cfg_read_file(id, p, n);