lib: Add obvious definition for `calloc`

The calloc() function is useful in addition to malloc and friends, so
add the obvious definition.

Change-Id: I57a568e323344a97b35014b7b8bec16adc2fd720
Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/51949
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Tim Wawrzynczak 2021-03-30 11:49:14 -06:00 committed by Patrick Georgi
parent 8aedb34501
commit c556dffe98
3 changed files with 34 additions and 1 deletions

View File

@ -5,6 +5,7 @@
void *memalign(size_t boundary, size_t size); void *memalign(size_t boundary, size_t size);
void *malloc(size_t size); void *malloc(size_t size);
void *calloc(size_t nitems, size_t size);
void free(void *ptr); void free(void *ptr);
#endif /* STDLIB_H */ #endif /* STDLIB_H */

View File

@ -1,5 +1,6 @@
#include <stdlib.h>
#include <console/console.h> #include <console/console.h>
#include <stdlib.h>
#include <string.h>
#if CONFIG(DEBUG_MALLOC) #if CONFIG(DEBUG_MALLOC)
#define MALLOCDBG(x...) printk(BIOS_SPEW, x) #define MALLOCDBG(x...) printk(BIOS_SPEW, x)
@ -54,6 +55,15 @@ void *malloc(size_t size)
return memalign(sizeof(u64), size); return memalign(sizeof(u64), size);
} }
void *calloc(size_t nitems, size_t size)
{
void *p = malloc(nitems * size);
if (p)
memset(p, 0, nitems * size);
return p;
}
void free(void *ptr) void free(void *ptr)
{ {
if (ptr == NULL) if (ptr == NULL)

View File

@ -2,6 +2,7 @@
/* Include malloc() and memalign() source code and alter its name to indicate the functions /* Include malloc() and memalign() source code and alter its name to indicate the functions
source origin. */ source origin. */
#define calloc cb_calloc
#define malloc cb_malloc #define malloc cb_malloc
#define free cb_free #define free cb_free
#define memalign cb_memalign #define memalign cb_memalign
@ -10,6 +11,7 @@
#include "../lib/malloc.c" #include "../lib/malloc.c"
#undef calloc
#undef malloc #undef malloc
#undef free #undef free
#undef memalign #undef memalign
@ -46,6 +48,12 @@ static int setup_test(void **state)
return 0; return 0;
} }
static int setup_calloc_test(void **state)
{
memset(&_heap, 0xFF, TEST_HEAP_SZ);
return setup_test(state);
}
static void test_malloc_out_of_memory(void **state) static void test_malloc_out_of_memory(void **state)
{ {
/* Expect die() call if out of memory */ /* Expect die() call if out of memory */
@ -130,6 +138,19 @@ static void test_memalign_multiple_small_allocations(void **state)
} }
} }
static void test_calloc_memory_is_zeroed(void **state)
{
const size_t nitems = 42;
const size_t size = sizeof(uint32_t);
void *ptr = cb_calloc(nitems, size);
assert_non_null(ptr);
for (size_t i = 0; i < nitems; i++) {
const uint32_t *p = (const uint32_t *)ptr + i;
assert_int_equal(*p, 0);
}
}
int main(void) int main(void)
{ {
const struct CMUnitTest tests[] = { const struct CMUnitTest tests[] = {
@ -140,6 +161,7 @@ int main(void)
cmocka_unit_test_setup(test_memalign_out_of_memory, setup_test), cmocka_unit_test_setup(test_memalign_out_of_memory, setup_test),
cmocka_unit_test_setup(test_memalign_zero, setup_test), cmocka_unit_test_setup(test_memalign_zero, setup_test),
cmocka_unit_test_setup(test_memalign_multiple_small_allocations, setup_test), cmocka_unit_test_setup(test_memalign_multiple_small_allocations, setup_test),
cmocka_unit_test_setup(test_calloc_memory_is_zeroed, setup_calloc_test),
}; };
return cmocka_run_group_tests(tests, NULL, NULL); return cmocka_run_group_tests(tests, NULL, NULL);