|
12 | 12 |
|
13 | 13 | struct alloc_header { |
14 | 14 | size_t size; /* requested size */ |
15 | | - int from_efi; /* 0 = memalign, 1 = EFI pages */ |
16 | 15 | }; |
17 | 16 |
|
18 | | -void malloc_stats(void) |
19 | | -{ |
20 | | - /* optional: implement stats if needed */ |
21 | | -} |
22 | | - |
23 | | -static void *efi_malloc(size_t size) { |
| 17 | +void *efi_malloc(size_t size) { |
24 | 18 | efi_status_t efiret; |
25 | 19 | efi_physical_addr_t mem; |
26 | | - size_t pages = DIV_ROUND_UP(size, EFI_PAGE_SIZE); |
| 20 | + struct alloc_header *hdr; |
| 21 | + size_t pages; |
| 22 | + |
| 23 | + if (!size) |
| 24 | + return ZERO_SIZE_PTR; |
27 | 25 |
|
| 26 | + pages= DIV_ROUND_UP(size, EFI_PAGE_SIZE); |
28 | 27 | efiret = BS->allocate_pages(EFI_ALLOCATE_ANY_PAGES, |
29 | 28 | EFI_LOADER_DATA, pages, &mem); |
30 | 29 | if (EFI_ERROR(efiret)) { |
31 | 30 | errno = efi_errno(efiret); |
32 | 31 | return NULL; |
33 | 32 | } |
34 | 33 |
|
35 | | - return efi_phys_to_virt(mem); |
36 | | -} |
37 | | - |
38 | | -static void efi_free(void *ptr, size_t size) { |
39 | | - efi_physical_addr_t phys = efi_virt_to_phys(ptr); |
40 | | - size_t pages = DIV_ROUND_UP(size, EFI_PAGE_SIZE); |
41 | | - BS->free_pages(phys, pages); |
42 | | -} |
43 | | - |
44 | | -void *memalign(size_t alignment, size_t bytes) |
45 | | -{ |
46 | | - void *mem = NULL; |
47 | | - |
48 | | - if (!bytes) |
49 | | - return ZERO_SIZE_PTR; |
50 | | - |
51 | | - if (alignment <= MALLOC_MAX_SIZE && bytes <= MALLOC_MAX_SIZE) |
52 | | - mem = sbrk(bytes + alignment); |
53 | | - if (!mem) { |
54 | | - errno = ENOMEM; |
55 | | - return NULL; |
56 | | - } |
57 | | - |
58 | | - return PTR_ALIGN(mem, alignment); |
59 | | -} |
60 | | - |
61 | | -void *malloc(size_t size) |
62 | | -{ |
63 | | - struct alloc_header *hdr; |
64 | | - void *mem; |
65 | | - |
66 | | - if (!size) |
67 | | - return ZERO_SIZE_PTR; |
68 | | - |
69 | | - /* if asked size is bigger than 1MB allocate from efi*/ |
70 | | - if (size >= SZ_1M) |
71 | | - goto efi_alloc; |
72 | | - |
73 | | - /* try memalign first, to use boot service memory */ |
74 | | - mem = memalign(CONFIG_MALLOC_ALIGNMENT, size + sizeof(*hdr)); |
75 | | - if (mem && !errno) { |
76 | | - hdr = (struct alloc_header *)mem; |
77 | | - hdr->from_efi = 0; |
78 | | - goto return_ptr; |
79 | | - } |
80 | | - |
81 | | -efi_alloc: |
82 | | - /* if no memory left from boot services fallback here*/ |
83 | | - mem = efi_malloc(size + sizeof(*hdr)); |
84 | | - if (!mem) |
85 | | - return NULL; |
86 | | - |
87 | | - hdr = (struct alloc_header *)mem; |
88 | | - hdr->from_efi = 1; |
89 | | - |
90 | | -return_ptr: |
| 34 | + hdr = (struct alloc_header *)efi_phys_to_virt(mem); |
91 | 35 | hdr->size = size; |
92 | 36 | return (void *)(hdr + 1); |
93 | 37 | } |
94 | 38 |
|
95 | | -void free(void *ptr) |
96 | | -{ |
| 39 | +void efi_free(void *ptr) { |
| 40 | + efi_physical_addr_t phys; |
97 | 41 | struct alloc_header *hdr; |
98 | 42 |
|
99 | 43 | if (!ptr) |
100 | 44 | return; |
101 | | - |
| 45 | + |
102 | 46 | hdr = (struct alloc_header *)ptr - 1; |
| 47 | + phys = efi_virt_to_phys(hdr); |
103 | 48 |
|
104 | | - if (hdr->from_efi) |
105 | | - efi_free(hdr, hdr->size + sizeof(*hdr)); |
106 | | -} |
107 | | - |
108 | | -size_t malloc_usable_size(void *mem) |
109 | | -{ |
110 | | - struct alloc_header *hdr; |
111 | | - |
112 | | - if (!mem) |
113 | | - return 0; |
114 | | - |
115 | | - hdr = (struct alloc_header *)mem - 1; |
116 | | - return hdr->size; |
| 49 | + size_t pages = DIV_ROUND_UP(hdr->size, EFI_PAGE_SIZE); |
| 50 | + BS->free_pages(phys, pages); |
117 | 51 | } |
118 | 52 |
|
119 | | -void *realloc(void *ptr, size_t size) |
| 53 | +void *efi_realloc(void *ptr, size_t size) |
120 | 54 | { |
121 | 55 | struct alloc_header *hdr; |
122 | 56 | void *n_mem; |
123 | 57 | size_t old_sz; |
124 | 58 |
|
125 | 59 | if (!ptr) |
126 | | - return malloc(size); |
| 60 | + return efi_malloc(size); |
127 | 61 |
|
128 | 62 | if (!size) { |
129 | | - free(ptr); |
| 63 | + efi_free(ptr); |
130 | 64 | return NULL; |
131 | 65 | } |
132 | 66 |
|
133 | 67 | hdr = (struct alloc_header *)ptr - 1; |
134 | 68 | old_sz = hdr->size; |
135 | 69 |
|
136 | | - n_mem = malloc(size); |
| 70 | + n_mem = efi_malloc(size); |
137 | 71 | if (!n_mem) { |
138 | 72 | errno = ENOMEM; |
139 | 73 | return NULL; |
140 | 74 | } |
141 | 75 |
|
142 | 76 | memcpy(n_mem, ptr, (old_sz < size) ? old_sz : size); |
143 | | - free(ptr); |
| 77 | + efi_free(ptr); |
144 | 78 |
|
145 | 79 | return n_mem; |
146 | 80 | } |
0 commit comments