1 /*
2  * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #pragma once
7 
8 /* Define a noclone attribute when compiled with GCC as certain functions
9  * in the heap component should not be cloned by the compiler */
10 #if defined __has_attribute && __has_attribute(noclone)
11 #define NOCLONE_ATTR __attribute((noclone))
12 #else
13 #define NOCLONE_ATTR
14 #endif
15 
16 /* Define a structure that contains some function pointers that point to OS-related functions.
17    An instance of this structure will be provided to the heap in ROM for use if needed.
18 */
19 typedef struct {
20     void (*lock)(void *lock);
21     void (*unlock)(void *lock);
22 } multi_heap_os_funcs_t;
23 
24 /** @brief Initialize structure pointer that points a structure that contains OS-related functions pointers.
25  *
26  * @param heap_os_funcs Points to a structure that contains some OS-related function pointers.
27  * @return None.
28  *
29  */
30 void multi_heap_os_funcs_init(multi_heap_os_funcs_t *heap_os_funcs);
31 
32 /* Opaque handle to a heap block */
33 typedef const struct block_header_t *multi_heap_block_handle_t;
34 
35 /* Internal definitions for the "implementation" of the multi_heap API,
36    as defined in multi_heap.c.
37 
38    If heap poisioning is disabled, these are aliased directly to the public API.
39 
40    If heap poisoning is enabled, wrapper functions call each of these.
41 */
42 
43 void *multi_heap_malloc_impl(multi_heap_handle_t heap, size_t size);
44 
45 /* Allocate a memory region of minimum `size` bytes, aligned on `alignment`. */
46 void *multi_heap_aligned_alloc_impl(multi_heap_handle_t heap, size_t size, size_t alignment);
47 
48 /* Allocate a memory region of minimum `size` bytes, where memory's `offset` is aligned on `alignment`. */
49 void *multi_heap_aligned_alloc_impl_offs(multi_heap_handle_t heap, size_t size, size_t alignment, size_t offset);
50 
51 void multi_heap_free_impl(multi_heap_handle_t heap, void *p);
52 void *multi_heap_realloc_impl(multi_heap_handle_t heap, void *p, size_t size);
53 multi_heap_handle_t multi_heap_register_impl(void *start, size_t size);
54 void multi_heap_get_info_impl(multi_heap_handle_t heap, multi_heap_info_t *info);
55 size_t multi_heap_free_size_impl(multi_heap_handle_t heap);
56 size_t multi_heap_minimum_free_size_impl(multi_heap_handle_t heap);
57 size_t multi_heap_get_allocated_size_impl(multi_heap_handle_t heap, void *p);
58 void *multi_heap_get_block_address_impl(multi_heap_block_handle_t block);
59 
60 /* Some internal functions for heap poisoning use */
61 
62 /* Check an allocated block's poison bytes are correct. Called by multi_heap_check(). */
63 bool multi_heap_internal_check_block_poisoning(void *start, size_t size, bool is_free, bool print_errors);
64 
65 /* Fill a region of memory with the free or malloced pattern.
66    Called when merging blocks, to overwrite the old block header.
67 */
68 void multi_heap_internal_poison_fill_region(void *start, size_t size, bool is_free);
69 
70 /* Allow heap poisoning to lock/unlock the heap to avoid race conditions
71    if multi_heap_check() is running concurrently.
72 */
73 void multi_heap_internal_lock(multi_heap_handle_t heap);
74 
75 void multi_heap_internal_unlock(multi_heap_handle_t heap);
76 
77 /* Some internal functions for heap debugging code to use */
78 
79 /* Get the handle to the first (fixed free) block in a heap */
80 multi_heap_block_handle_t multi_heap_get_first_block(multi_heap_handle_t heap);
81 
82 /* Get the handle to the next block in a heap, with validation */
83 multi_heap_block_handle_t multi_heap_get_next_block(multi_heap_handle_t heap, multi_heap_block_handle_t block);
84 
85 /* Test if a heap block is free */
86 bool multi_heap_is_free(const multi_heap_block_handle_t block);
87 
88 /* Get the data address of a heap block */
89 void *multi_heap_get_block_address(multi_heap_block_handle_t block);
90 
91 /* Get the owner identification for a heap block */
92 void *multi_heap_get_block_owner(multi_heap_block_handle_t block);
93