1 /*
2 * Copyright (c) 2024 Arduino SA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #ifndef ZEPHYR_SUBSYS_LLEXT_PRIV_H_
8 #define ZEPHYR_SUBSYS_LLEXT_PRIV_H_
9
10 #include <zephyr/kernel.h>
11 #include <zephyr/llext/llext.h>
12
13 struct llext_elf_sect_map {
14 enum llext_mem mem_idx;
15 size_t offset;
16 };
17
18 /*
19 * Memory management (llext_mem.c)
20 */
21
22 int llext_copy_strings(struct llext_loader *ldr, struct llext *ext);
23 int llext_copy_regions(struct llext_loader *ldr, struct llext *ext,
24 const struct llext_load_param *ldr_parm);
25 void llext_free_regions(struct llext *ext);
26 void llext_adjust_mmu_permissions(struct llext *ext);
27
llext_alloc(size_t bytes)28 static inline void *llext_alloc(size_t bytes)
29 {
30 extern struct k_heap llext_heap;
31
32 return k_heap_alloc(&llext_heap, bytes, K_NO_WAIT);
33 }
34
llext_aligned_alloc(size_t align,size_t bytes)35 static inline void *llext_aligned_alloc(size_t align, size_t bytes)
36 {
37 extern struct k_heap llext_heap;
38
39 return k_heap_aligned_alloc(&llext_heap, align, bytes, K_NO_WAIT);
40 }
41
llext_free(void * ptr)42 static inline void llext_free(void *ptr)
43 {
44 extern struct k_heap llext_heap;
45
46 k_heap_free(&llext_heap, ptr);
47 }
48
49 /*
50 * ELF parsing (llext_load.c)
51 */
52
53 int do_llext_load(struct llext_loader *ldr, struct llext *ext,
54 const struct llext_load_param *ldr_parm);
55
llext_string(struct llext_loader * ldr,struct llext * ext,enum llext_mem mem_idx,unsigned int idx)56 static inline const char *llext_string(struct llext_loader *ldr, struct llext *ext,
57 enum llext_mem mem_idx, unsigned int idx)
58 {
59 return (char *)ext->mem[mem_idx] + idx;
60 }
61
62 /*
63 * Relocation (llext_link.c)
64 */
65
66 int llext_link(struct llext_loader *ldr, struct llext *ext,
67 const struct llext_load_param *ldr_parm);
68 void llext_dependency_remove_all(struct llext *ext);
69
70 #endif /* ZEPHYR_SUBSYS_LLEXT_PRIV_H_ */
71