From 7868e45edbfca111bd8f45595b2f04ba445d8199 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Sat, 10 Jan 2026 22:05:21 +0000 Subject: [PATCH] elf_loader: add elf_loadmem() to load file from memory Change-Id: Ib68b0e8b610d45713a2d5480da015cc4295f2676 --- firmware/elf_loader.c | 26 ++++++++++++++++++++++++++ firmware/include/elf_loader.h | 12 ++++++++++++ 2 files changed, 38 insertions(+) diff --git a/firmware/elf_loader.c b/firmware/elf_loader.c index d1f08f661c..637dadb886 100644 --- a/firmware/elf_loader.c +++ b/firmware/elf_loader.c @@ -183,3 +183,29 @@ int elf_loadpath(const char *filename, close(fd); return err; } + +int elf_loadmem(const void *elf_buffer, + size_t elf_size, + const struct elf_load_context *ctx, + void **entrypoint) +{ + struct elf_loadmem_state state = { + .buffer = elf_buffer, + .size = elf_size, + }; + + return elf_load(elf_read_mem_callback, (intptr_t)&state, ctx, entrypoint); +} + +int elf_read_mem_callback(intptr_t loadmem_state, off_t pos, void *buf, size_t size) +{ + struct elf_loadmem_state *state = (void *)loadmem_state; + + if (pos < 0 || (size_t)pos >= state->size) + return -1; + if (state->size - (size_t)pos < size) + return -1; + + memcpy(buf, state->buffer + pos, size); + return 0; +} diff --git a/firmware/include/elf_loader.h b/firmware/include/elf_loader.h index 344a4eb4e1..9b7550bc62 100644 --- a/firmware/include/elf_loader.h +++ b/firmware/include/elf_loader.h @@ -100,4 +100,16 @@ int elf_loadpath(const char *filename, const struct elf_load_context *ctx, void **entrypoint); +struct elf_loadmem_state +{ + const void *buffer; + size_t size; +}; + +int elf_loadmem(const void *elf_buffer, + size_t elf_size, + const struct elf_load_context *ctx, + void **entrypoint); +int elf_read_mem_callback(intptr_t loadmem_state, off_t pos, void *buf, size_t size); + #endif /* __ELF_LOADER_H__ */