mirror of https://github.com/thesofproject/sof.git
rimage: validate manifest segments
make sure no manifest segments collide with each other and fail if they do. Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
This commit is contained in:
parent
c5bd37f428
commit
9b0ead72d3
|
@ -260,6 +260,62 @@ static int man_get_module_manifest(struct image *image, struct module *module,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline const char *segment_name(int i)
|
||||||
|
{
|
||||||
|
switch (i) {
|
||||||
|
case SOF_MAN_SEGMENT_TEXT:
|
||||||
|
return "TEXT";
|
||||||
|
case SOF_MAN_SEGMENT_RODATA:
|
||||||
|
return "DATA";
|
||||||
|
case SOF_MAN_SEGMENT_BSS:
|
||||||
|
return "BSS";
|
||||||
|
default:
|
||||||
|
return "NONE";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* make sure no segments collide */
|
||||||
|
static int man_module_validate(struct sof_man_module *man_module)
|
||||||
|
{
|
||||||
|
uint32_t istart, iend;
|
||||||
|
uint32_t jstart, jend;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
|
||||||
|
istart = man_module->segment[i].v_base_addr;
|
||||||
|
iend = istart + man_module->segment[i].flags.r.length *
|
||||||
|
MAN_PAGE_SIZE;
|
||||||
|
|
||||||
|
for (j = 0; j < 3; j++) {
|
||||||
|
|
||||||
|
/* don't validate segment against itself */
|
||||||
|
if (i == j)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
jstart = man_module->segment[j].v_base_addr;
|
||||||
|
jend = jstart + man_module->segment[j].flags.r.length *
|
||||||
|
MAN_PAGE_SIZE;
|
||||||
|
|
||||||
|
if (jstart > istart && jstart < iend)
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
if (jend > istart && jend < iend)
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* success, no overlapping segments */
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err:
|
||||||
|
fprintf(stderr, "error: segment %s [0x%8.8x:0x%8.8x] overlaps",
|
||||||
|
segment_name(i), istart, iend);
|
||||||
|
fprintf(stderr, " with %s [0x%8.8x:0x%8.8x]\n",
|
||||||
|
segment_name(j), jstart, jend);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
static int man_module_create(struct image *image, struct module *module,
|
static int man_module_create(struct image *image, struct module *module,
|
||||||
struct sof_man_module *man_module)
|
struct sof_man_module *man_module)
|
||||||
{
|
{
|
||||||
|
@ -328,6 +384,10 @@ static int man_module_create(struct image *image, struct module *module,
|
||||||
|
|
||||||
fprintf(stdout, "\tNo\tAddress\t\tSize\tFile\tType\n");
|
fprintf(stdout, "\tNo\tAddress\t\tSize\tFile\tType\n");
|
||||||
|
|
||||||
|
/* validate segments */
|
||||||
|
if (man_module_validate(man_module) < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/* find all sections and copy to corresponding segments */
|
/* find all sections and copy to corresponding segments */
|
||||||
for (i = 0; i < module->hdr.e_shnum; i++) {
|
for (i = 0; i < module->hdr.e_shnum; i++) {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue