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