diff options
-rw-r--r-- | include/string.h | 13 | ||||
-rw-r--r-- | malloc.c | 12 | ||||
-rw-r--r-- | tables.c | 10 |
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 @@ -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; } @@ -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); |