diff options
-rw-r--r-- | src/commonlib/include/commonlib/mem_pool.h | 16 | ||||
-rw-r--r-- | src/commonlib/mem_pool.c | 7 | ||||
-rw-r--r-- | src/lib/cbfs.c | 9 |
3 files changed, 21 insertions, 11 deletions
diff --git a/src/commonlib/include/commonlib/mem_pool.h b/src/commonlib/include/commonlib/mem_pool.h index 6c85397314..42b5d1ed96 100644 --- a/src/commonlib/include/commonlib/mem_pool.h +++ b/src/commonlib/include/commonlib/mem_pool.h @@ -3,6 +3,7 @@ #ifndef _MEM_POOL_H_ #define _MEM_POOL_H_ +#include <assert.h> #include <stddef.h> #include <stdint.h> @@ -16,23 +17,23 @@ * were chosen to optimize for the CBFS cache case which may need two buffers * to map a single compressed file, and will free them in reverse order.) * - * The memory returned by allocations are at least 8 byte aligned. Note - * that this requires the backing buffer to start on at least an 8 byte - * alignment. + * You must ensure the backing buffer is 'alignment' aligned. */ struct mem_pool { uint8_t *buf; size_t size; + size_t alignment; uint8_t *last_alloc; uint8_t *second_to_last_alloc; size_t free_offset; }; -#define MEM_POOL_INIT(buf_, size_) \ +#define MEM_POOL_INIT(buf_, size_, alignment_) \ { \ .buf = (buf_), \ .size = (size_), \ + .alignment = (alignment_), \ .last_alloc = NULL, \ .second_to_last_alloc = NULL, \ .free_offset = 0, \ @@ -46,10 +47,15 @@ static inline void mem_pool_reset(struct mem_pool *mp) } /* Initialize a memory pool. */ -static inline void mem_pool_init(struct mem_pool *mp, void *buf, size_t sz) +static inline void mem_pool_init(struct mem_pool *mp, void *buf, size_t sz, + size_t alignment) { + assert(alignment); + assert((uintptr_t)buf % alignment == 0); + mp->buf = buf; mp->size = sz; + mp->alignment = alignment; mem_pool_reset(mp); } diff --git a/src/commonlib/mem_pool.c b/src/commonlib/mem_pool.c index c300c65d6e..d82ab18bd7 100644 --- a/src/commonlib/mem_pool.c +++ b/src/commonlib/mem_pool.c @@ -7,8 +7,11 @@ void *mem_pool_alloc(struct mem_pool *mp, size_t sz) { void *p; - /* Make all allocations be at least 8 byte aligned. */ - sz = ALIGN_UP(sz, 8); + if (mp->alignment == 0) + return NULL; + + /* We assume that mp->buf started mp->alignment aligned */ + sz = ALIGN_UP(sz, mp->alignment); /* Determine if any space available. */ if ((mp->size - mp->free_offset) < sz) diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c index 322f161a0e..7633fdff03 100644 --- a/src/lib/cbfs.c +++ b/src/lib/cbfs.c @@ -19,16 +19,17 @@ #include <timestamp.h> #if ENV_STAGE_HAS_DATA_SECTION -struct mem_pool cbfs_cache = MEM_POOL_INIT(_cbfs_cache, REGION_SIZE(cbfs_cache)); +struct mem_pool cbfs_cache = + MEM_POOL_INIT(_cbfs_cache, REGION_SIZE(cbfs_cache), sizeof(uint64_t)); #else -struct mem_pool cbfs_cache = MEM_POOL_INIT(NULL, 0); +struct mem_pool cbfs_cache = MEM_POOL_INIT(NULL, 0, 0); #endif static void switch_to_postram_cache(int unused) { if (_preram_cbfs_cache != _postram_cbfs_cache) - mem_pool_init(&cbfs_cache, _postram_cbfs_cache, - REGION_SIZE(postram_cbfs_cache)); + mem_pool_init(&cbfs_cache, _postram_cbfs_cache, REGION_SIZE(postram_cbfs_cache), + sizeof(uint64_t)); } ROMSTAGE_CBMEM_INIT_HOOK(switch_to_postram_cache); |