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