1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Simple malloc implementation 4 * 5 * Copyright (c) 2014 Google, Inc 6 */ 7 8 #define LOG_CATEGORY LOGC_ALLOC 9 10 #include <common.h> 11 #include <malloc.h> 12 #include <mapmem.h> 13 #include <asm/io.h> 14 15 DECLARE_GLOBAL_DATA_PTR; 16 17 static void *alloc_simple(size_t bytes, int align) 18 { 19 ulong addr, new_ptr; 20 void *ptr; 21 22 addr = ALIGN(gd->malloc_base + gd->malloc_ptr, align); 23 new_ptr = addr + bytes - gd->malloc_base; 24 log_debug("size=%zx, ptr=%lx, limit=%lx: ", bytes, new_ptr, 25 gd->malloc_limit); 26 if (new_ptr > gd->malloc_limit) { 27 log_err("alloc space exhausted\n"); 28 return NULL; 29 } 30 31 ptr = map_sysmem(addr, bytes); 32 gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr)); 33 34 return ptr; 35 } 36 37 void *malloc_simple(size_t bytes) 38 { 39 void *ptr; 40 41 ptr = alloc_simple(bytes, 1); 42 if (!ptr) 43 return ptr; 44 45 log_debug("%lx\n", (ulong)ptr); 46 47 return ptr; 48 } 49 50 void *memalign_simple(size_t align, size_t bytes) 51 { 52 void *ptr; 53 54 ptr = alloc_simple(bytes, align); 55 if (!ptr) 56 return ptr; 57 log_debug("aligned to %lx\n", (ulong)ptr); 58 59 return ptr; 60 } 61 62 #if CONFIG_IS_ENABLED(SYS_MALLOC_SIMPLE) 63 void *calloc(size_t nmemb, size_t elem_size) 64 { 65 size_t size = nmemb * elem_size; 66 void *ptr; 67 68 ptr = malloc(size); 69 if (!ptr) 70 return ptr; 71 memset(ptr, '\0', size); 72 73 return ptr; 74 } 75 #endif 76 77 void malloc_simple_info(void) 78 { 79 log_info("malloc_simple: %lx bytes used, %lx remain\n", gd->malloc_ptr, 80 CONFIG_VAL(SYS_MALLOC_F_LEN) - gd->malloc_ptr); 81 } 82