hc
2024-08-12 0517ab8c70e05fc5877c0c6dae1a5f42a16dcf88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * Simple malloc implementation
 *
 * Copyright (c) 2014 Google, Inc
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
#include <common.h>
#include <malloc.h>
#include <mapmem.h>
#include <asm/io.h>
 
DECLARE_GLOBAL_DATA_PTR;
 
void *malloc_simple(size_t bytes)
{
   ulong new_ptr;
   void *ptr;
 
   new_ptr = gd->malloc_ptr + bytes;
   debug("%s: size=%zx, ptr=%lx, limit=%lx: ", __func__, bytes, new_ptr,
         gd->malloc_limit);
   if (new_ptr > gd->malloc_limit) {
       debug("space exhausted\n");
       return NULL;
   }
   ptr = map_sysmem(gd->malloc_base + gd->malloc_ptr, bytes);
   gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr));
   debug("%lx\n", (ulong)ptr);
 
   return ptr;
}
 
void *memalign_simple(size_t align, size_t bytes)
{
   ulong addr, new_ptr;
   void *ptr;
 
   addr = ALIGN(gd->malloc_base + gd->malloc_ptr, align);
   new_ptr = addr + bytes - gd->malloc_base;
   if (new_ptr > gd->malloc_limit) {
       printf("sys malloc pool space exhausted\n");
       return NULL;
   }
 
   ptr = map_sysmem(addr, bytes);
   gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr));
   debug("%lx\n", (ulong)ptr);
 
   return ptr;
}
 
#if CONFIG_IS_ENABLED(SYS_MALLOC_SIMPLE)
void *calloc(size_t nmemb, size_t elem_size)
{
   size_t size = nmemb * elem_size;
   void *ptr;
 
   ptr = malloc(size);
   memset(ptr, '\0', size);
 
   return ptr;
}
#endif