1 /*
2  * Copyright (c) 2023 Intel Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_LLEXT_BUF_LOADER_H
8 #define ZEPHYR_LLEXT_BUF_LOADER_H
9 
10 #include <zephyr/llext/loader.h>
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 /**
17  * @file
18  * @brief LLEXT buffer loader implementation.
19  *
20  * @addtogroup llext_loader_apis
21  * @{
22  */
23 
24 /**
25  * @brief Implementation of @ref llext_loader that reads from a memory buffer.
26  */
27 struct llext_buf_loader {
28 	/** Extension loader */
29 	struct llext_loader loader;
30 
31 	/** @cond ignore */
32 	const uint8_t *buf;
33 	size_t len;
34 	size_t pos;
35 	/** @endcond */
36 };
37 
38 /** @cond ignore */
39 int llext_buf_read(struct llext_loader *ldr, void *buf, size_t len);
40 int llext_buf_seek(struct llext_loader *ldr, size_t pos);
41 void *llext_buf_peek(struct llext_loader *ldr, size_t pos);
42 
43 #define Z_LLEXT_BUF_LOADER(_buf, _buf_len, _storage)                                               \
44 	{                                                                                          \
45 		.loader =                                                                          \
46 			{                                                                          \
47 				.prepare = NULL,                                                   \
48 				.read = llext_buf_read,                                            \
49 				.seek = llext_buf_seek,                                            \
50 				.peek = llext_buf_peek,                                            \
51 				.finalize = NULL,                                                  \
52 				.storage = _storage,                                               \
53 			},                                                                         \
54 		.buf = (_buf),                                                                     \
55 		.len = (_buf_len),                                                                 \
56 		.pos = 0,                                                                          \
57 	}
58 /** @endcond */
59 
60 /**
61  * @brief Initializer for an llext_buf_loader structure
62  *
63  * The storage type for the provided buffer depends on the value of the
64  * @kconfig{CONFIG_LLEXT_STORAGE_WRITABLE} option: if it is defined, the
65  * buffer is assumed to be writable; otherwise it is assumed to be persistent.
66  *
67  * Consider using one of the alternative macros instead.
68  *
69  * @see LLEXT_TEMPORARY_BUF_LOADER
70  * @see LLEXT_PERSISTENT_BUF_LOADER
71  * @see LLEXT_WRITABLE_BUF_LOADER
72  *
73  * @param _buf Buffer containing the ELF binary
74  * @param _buf_len Buffer length in bytes
75  */
76 #define LLEXT_BUF_LOADER(_buf, _buf_len) \
77 	Z_LLEXT_BUF_LOADER(_buf, _buf_len,                                                         \
78 			   IS_ENABLED(CONFIG_LLEXT_STORAGE_WRITABLE) ?                             \
79 				LLEXT_STORAGE_WRITABLE : LLEXT_STORAGE_PERSISTENT)
80 
81 /**
82  * @brief Initialize an llext_buf_loader structure for a temporary buffer
83  *
84  * ELF data from the specified buffer can only be used during llext_load().
85  * The LLEXT subsystem will copy all necessary data to internal buffers at load
86  * time.
87  *
88  * @param _buf Buffer containing the ELF binary
89  * @param _buf_len Buffer length in bytes
90  */
91 #define LLEXT_TEMPORARY_BUF_LOADER(_buf, _buf_len) \
92 	Z_LLEXT_BUF_LOADER(_buf, _buf_len, LLEXT_STORAGE_TEMPORARY)
93 
94 /**
95  * @brief Initialize an llext_buf_loader structure for a persistent, read-only buffer
96  *
97  * ELF data from the specified buffer is guaranteed to be accessible for as
98  * long as the extension is loaded. The LLEXT subsystem may directly access the
99  * ELF data, as long as no modification is required during loading.
100  *
101  * @param _buf Buffer containing the ELF binary
102  * @param _buf_len Buffer length in bytes
103  */
104 #define LLEXT_PERSISTENT_BUF_LOADER(_buf, _buf_len) \
105 	Z_LLEXT_BUF_LOADER(_buf, _buf_len, LLEXT_STORAGE_PERSISTENT)
106 
107 /**
108  * @brief Initialize an llext_buf_loader structure for a persistent, writable buffer
109  *
110  * ELF data from the specified buffer is guaranteed to be accessible for as
111  * long as the extension is loaded. The LLEXT subsystem may directly access and
112  * modify the ELF data.
113  *
114  * @param _buf Buffer containing the ELF binary
115  * @param _buf_len Buffer length in bytes
116  */
117 #define LLEXT_WRITABLE_BUF_LOADER(_buf, _buf_len) \
118 	Z_LLEXT_BUF_LOADER(_buf, _buf_len, LLEXT_STORAGE_WRITABLE)
119 
120 /**
121  * @}
122  */
123 
124 #ifdef __cplusplus
125 }
126 #endif
127 
128 #endif /* ZEPHYR_LLEXT_BUF_LOADER_H */
129