diff --git a/include/zephyr/llext/buf_loader.h b/include/zephyr/llext/buf_loader.h index c75d20e4530..5a50e215bd3 100644 --- a/include/zephyr/llext/buf_loader.h +++ b/include/zephyr/llext/buf_loader.h @@ -37,6 +37,7 @@ struct llext_buf_loader { /** @cond ignore */ int llext_buf_read(struct llext_loader *ldr, void *buf, size_t len); int llext_buf_seek(struct llext_loader *ldr, size_t pos); +void *llext_buf_peek(struct llext_loader *ldr, size_t pos); /** @endcond */ /** @@ -49,7 +50,8 @@ int llext_buf_seek(struct llext_loader *ldr, size_t pos); { \ .loader = { \ .read = llext_buf_read, \ - .seek = llext_buf_seek \ + .seek = llext_buf_seek, \ + .peek = llext_buf_peek, \ }, \ .buf = (_buf), \ .len = (_buf_len), \ diff --git a/include/zephyr/llext/loader.h b/include/zephyr/llext/loader.h index db4157168aa..915a6278a44 100644 --- a/include/zephyr/llext/loader.h +++ b/include/zephyr/llext/loader.h @@ -73,7 +73,19 @@ struct llext_loader { * @retval 0 Success * @retval -errno Error reading (any errno) */ - int (*seek)(struct llext_loader *s, size_t pos); + int (*seek)(struct llext_loader *ldr, size_t pos); + + /** + * @brief Peek at an absolute location + * + * Return a pointer to the buffer at specified offset. + * + * @param[in] ldr Loader + * @param[in] pos Position to obtain a pointer to + * + * @retval pointer into the buffer + */ + void *(*peek)(struct llext_loader *ldr, size_t pos); /** @cond ignore */ elf_ehdr_t hdr; diff --git a/subsys/llext/buf_loader.c b/subsys/llext/buf_loader.c index 1b9fb576e7d..d744a85e473 100644 --- a/subsys/llext/buf_loader.c +++ b/subsys/llext/buf_loader.c @@ -29,3 +29,10 @@ int llext_buf_seek(struct llext_loader *l, size_t pos) return 0; } + +void *llext_buf_peek(struct llext_loader *l, size_t pos) +{ + struct llext_buf_loader *buf_l = CONTAINER_OF(l, struct llext_buf_loader, loader); + + return (void *)(buf_l->buf + pos); +} diff --git a/subsys/llext/llext.c b/subsys/llext/llext.c index 24f48414ad8..50f98654bae 100644 --- a/subsys/llext/llext.c +++ b/subsys/llext/llext.c @@ -31,6 +31,15 @@ static inline int llext_seek(struct llext_loader *l, size_t pos) return l->seek(l, pos); } +static inline void *llext_peek(struct llext_loader *l, size_t pos) +{ + if (l->peek) { + return l->peek(l, pos); + } + + return NULL; +} + static sys_slist_t _llext_list = SYS_SLIST_STATIC_INIT(&_llext_list); sys_slist_t *llext_list(void)