Size optimizations.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@15359 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Giovanni Di Sirio 2022-01-15 16:57:24 +00:00
parent c1ee7b08b5
commit 305bc3a8ed
1 changed files with 106 additions and 123 deletions

View File

@ -165,19 +165,6 @@ typedef struct {
/* Module local functions. */ /* Module local functions. */
/*===========================================================================*/ /*===========================================================================*/
static msg_t read_section_header(elf_load_context_t *ctxp,
elf32_section_header_t *shp,
elf_secnum_t index) {
msg_t ret;
ret = vfsSetFilePosition(ctxp->fnp,
ctxp->sections_off + ((vfs_offset_t)index *
(vfs_offset_t)sizeof (elf32_section_header_t)),
VFS_SEEK_SET);
CH_RETURN_ON_ERROR(ret);
return vfsReadFile(ctxp->fnp, (void *)shp, sizeof (elf32_section_header_t));
}
static msg_t area_is_intersecting(elf_load_context_t *ctxp, static msg_t area_is_intersecting(elf_load_context_t *ctxp,
const memory_area_t *map) { const memory_area_t *map) {
elf_section_info_t *esip; elf_section_info_t *esip;
@ -411,10 +398,19 @@ static msg_t reloc_section(elf_load_context_t *ctxp,
return ret; return ret;
} }
static msg_t init_elf_context(elf_load_context_t *ctxp, /*===========================================================================*/
vfs_file_node_c *fnp, /* Module exported functions. */
const memory_area_t *map) { /*===========================================================================*/
static uint8_t elf32_header[16] = {
msg_t sbElfLoad(vfs_file_node_c *fnp, const memory_area_t *map) {
msg_t ret;
elf_load_context_t ctx;
elf_secnum_t i;
elf_section_info_t *esip;
/* Load context initialization.*/
{
static const uint8_t elf32_header[16] = {
0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00, 0x7f, 0x45, 0x4c, 0x46, 0x01, 0x01, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; };
@ -422,17 +418,17 @@ static msg_t init_elf_context(elf_load_context_t *ctxp,
msg_t ret; msg_t ret;
/* Context fully cleared.*/ /* Context fully cleared.*/
memset((void *)ctxp, 0, sizeof (elf_load_context_t)); memset((void *)&ctx, 0, sizeof (elf_load_context_t));
/* Initializing the fixed part of the context.*/ /* Initializing the fixed part of the context.*/
ctxp->fnp = fnp; ctx.fnp = fnp;
ctxp->map = map; ctx.map = map;
ctxp->next = &ctxp->allocated[0]; ctx.next = &ctx.allocated[0];
/* Reading the main ELF header.*/ /* Reading the main ELF header.*/
ret = vfsSetFilePosition(ctxp->fnp, (vfs_offset_t)0, VFS_SEEK_SET); ret = vfsSetFilePosition(ctx.fnp, (vfs_offset_t)0, VFS_SEEK_SET);
CH_RETURN_ON_ERROR(ret); CH_RETURN_ON_ERROR(ret);
ret = vfsReadFile(ctxp->fnp, (void *)&h, sizeof (elf32_header_t)); ret = vfsReadFile(ctx.fnp, (void *)&h, sizeof (elf32_header_t));
CH_RETURN_ON_ERROR(ret); CH_RETURN_ON_ERROR(ret);
/* Checking for the expected header.*/ /* Checking for the expected header.*/
@ -448,35 +444,23 @@ static msg_t init_elf_context(elf_load_context_t *ctxp,
/* TODO more consistency checks.*/ /* TODO more consistency checks.*/
/* Storing info required later.*/ /* Storing info required later.*/
ctxp->entry = h.e_entry; ctx.entry = h.e_entry;
ctxp->sections_num = (unsigned)h.e_shnum; ctx.sections_num = (unsigned)h.e_shnum;
ctxp->sections_off = (vfs_offset_t)h.e_shoff; ctx.sections_off = (vfs_offset_t)h.e_shoff;
return CH_RET_SUCCESS;
} }
/*===========================================================================*/
/* Module exported functions. */
/*===========================================================================*/
msg_t sbElfLoad(vfs_file_node_c *fnp, const memory_area_t *map) {
msg_t ret;
do {
elf_load_context_t ctx;
elf_secnum_t i;
elf_section_info_t *esip;
ret = init_elf_context(&ctx, fnp, map);
CH_BREAK_ON_ERROR(ret);
/* Loading phase, scanning section headers.*/ /* Loading phase, scanning section headers.*/
for (i = 0U; i < ctx.sections_num; i++) { for (i = 0U; i < ctx.sections_num; i++) {
elf32_section_header_t sh; elf32_section_header_t sh;
/* Reading the header.*/ /* Reading the header.*/
ret = read_section_header(&ctx, &sh, i); ret = vfsSetFilePosition(ctx.fnp,
CH_BREAK_ON_ERROR(ret); ctx.sections_off + ((vfs_offset_t)i *
(vfs_offset_t)sizeof (elf32_section_header_t)),
VFS_SEEK_SET);
CH_RETURN_ON_ERROR(ret);
ret = vfsReadFile(ctx.fnp, (void *)&sh, sizeof (elf32_section_header_t));
CH_RETURN_ON_ERROR(ret);
/* Empty sections are not processed.*/ /* Empty sections are not processed.*/
if (sh.sh_size == 0U) { if (sh.sh_size == 0U) {
@ -536,7 +520,6 @@ msg_t sbElfLoad(vfs_file_node_c *fnp, const memory_area_t *map) {
CH_RETURN_ON_ERROR(ret); CH_RETURN_ON_ERROR(ret);
} }
} }
} while (false);
return ret; return ret;
} }