xref: /aosp_15_r20/external/coreboot/src/commonlib/mem_pool.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <commonlib/helpers.h>
4 #include <commonlib/mem_pool.h>
5 
mem_pool_alloc(struct mem_pool * mp,size_t sz)6 void *mem_pool_alloc(struct mem_pool *mp, size_t sz)
7 {
8 	void *p;
9 
10 	if (mp->alignment == 0)
11 		return NULL;
12 
13 	/* We assume that mp->buf started mp->alignment aligned */
14 	sz = ALIGN_UP(sz, mp->alignment);
15 
16 	/* Determine if any space available. */
17 	if ((mp->size - mp->free_offset) < sz)
18 		return NULL;
19 
20 	p = &mp->buf[mp->free_offset];
21 
22 	mp->free_offset += sz;
23 	mp->second_to_last_alloc = mp->last_alloc;
24 	mp->last_alloc = p;
25 
26 	return p;
27 }
28 
mem_pool_free(struct mem_pool * mp,void * p)29 void mem_pool_free(struct mem_pool *mp, void *p)
30 {
31 	/* Determine if p was the most recent allocation. */
32 	if (p == NULL || mp->last_alloc != p)
33 		return;
34 
35 	mp->free_offset = mp->last_alloc - mp->buf;
36 	mp->last_alloc = mp->second_to_last_alloc;
37 	/* No way to track allocation before this one. */
38 	mp->second_to_last_alloc = NULL;
39 }
40