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 <malloc.h>
  12#include <mapmem.h>
  13#include <asm/io.h>
  14
  15DECLARE_GLOBAL_DATA_PTR;
  16
  17static 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
  37void *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
  50void *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)
  63void *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
  77void 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