* [PATCH V2 1/2] remoteproc: elf_loader: skip segment with memsz as zero
2022-04-13 3:30 [PATCH V2 0/2] remoteproc: elf: ignore PT_LOAD type segment with memsz as 0 Peng Fan (OSS)
@ 2022-04-13 3:30 ` Peng Fan (OSS)
2022-04-13 3:30 ` [PATCH V2 2/2] remoteproc: imx_dsp_rproc: use common rproc_elf_load_segments Peng Fan (OSS)
2022-04-13 17:28 ` [PATCH V2 0/2] remoteproc: elf: ignore PT_LOAD type segment with memsz as 0 Mathieu Poirier
2 siblings, 0 replies; 4+ messages in thread
From: Peng Fan (OSS) @ 2022-04-13 3:30 UTC (permalink / raw)
To: bjorn.andersson, mathieu.poirier
Cc: shawnguo, s.hauer, kernel, festevam, linux-imx, linux-remoteproc,
linux-arm-kernel, linux-kernel, shengjiu.wang, Peng Fan
From: Peng Fan <peng.fan@nxp.com>
Per elf specification,
p_filesz: This member gives the number of bytes in the file image of
the segment; it may be zero.
p_memsz: This member gives the number of bytes in the memory image
of the segment; it may be zero.
There is a case that i.MX DSP firmware has segment with PT_LOAD and
p_memsz/p_filesz set to zero. Such segment needs to be ignored,
otherwize rproc_da_to_va would report error.
Signed-off-by: Peng Fan <peng.fan@nxp.com>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
---
drivers/remoteproc/remoteproc_elf_loader.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/remoteproc/remoteproc_elf_loader.c b/drivers/remoteproc/remoteproc_elf_loader.c
index d635d19a5aa8..5a412d7b6e0b 100644
--- a/drivers/remoteproc/remoteproc_elf_loader.c
+++ b/drivers/remoteproc/remoteproc_elf_loader.c
@@ -181,7 +181,7 @@ int rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
bool is_iomem = false;
void *ptr;
- if (type != PT_LOAD)
+ if (type != PT_LOAD || !memsz)
continue;
dev_dbg(dev, "phdr: type %d da 0x%llx memsz 0x%llx filesz 0x%llx\n",
--
2.25.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH V2 2/2] remoteproc: imx_dsp_rproc: use common rproc_elf_load_segments
2022-04-13 3:30 [PATCH V2 0/2] remoteproc: elf: ignore PT_LOAD type segment with memsz as 0 Peng Fan (OSS)
2022-04-13 3:30 ` [PATCH V2 1/2] remoteproc: elf_loader: skip segment with memsz as zero Peng Fan (OSS)
@ 2022-04-13 3:30 ` Peng Fan (OSS)
2022-04-13 17:28 ` [PATCH V2 0/2] remoteproc: elf: ignore PT_LOAD type segment with memsz as 0 Mathieu Poirier
2 siblings, 0 replies; 4+ messages in thread
From: Peng Fan (OSS) @ 2022-04-13 3:30 UTC (permalink / raw)
To: bjorn.andersson, mathieu.poirier
Cc: shawnguo, s.hauer, kernel, festevam, linux-imx, linux-remoteproc,
linux-arm-kernel, linux-kernel, shengjiu.wang, Peng Fan,
Daniel Baluta
From: Peng Fan <peng.fan@nxp.com>
remoteproc elf loader supports the specific case that segments
have PT_LOAD and memsz/filesz set to zero, so no duplicate
code.
Acked-by: Daniel Baluta <daniel.baluta@nxp.com>
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
drivers/remoteproc/imx_dsp_rproc.c | 95 +-----------------------------
1 file changed, 1 insertion(+), 94 deletions(-)
diff --git a/drivers/remoteproc/imx_dsp_rproc.c b/drivers/remoteproc/imx_dsp_rproc.c
index 2abee78df96e..eee3c44c2146 100644
--- a/drivers/remoteproc/imx_dsp_rproc.c
+++ b/drivers/remoteproc/imx_dsp_rproc.c
@@ -649,99 +649,6 @@ static int imx_dsp_rproc_add_carveout(struct imx_dsp_rproc *priv)
return 0;
}
-/**
- * imx_dsp_rproc_elf_load_segments() - load firmware segments to memory
- * @rproc: remote processor which will be booted using these fw segments
- * @fw: the ELF firmware image
- *
- * This function specially checks if memsz is zero or not, otherwise it
- * is mostly same as rproc_elf_load_segments().
- */
-static int imx_dsp_rproc_elf_load_segments(struct rproc *rproc,
- const struct firmware *fw)
-{
- struct device *dev = &rproc->dev;
- u8 class = fw_elf_get_class(fw);
- u32 elf_phdr_get_size = elf_size_of_phdr(class);
- const u8 *elf_data = fw->data;
- const void *ehdr, *phdr;
- int i, ret = 0;
- u16 phnum;
-
- ehdr = elf_data;
- phnum = elf_hdr_get_e_phnum(class, ehdr);
- phdr = elf_data + elf_hdr_get_e_phoff(class, ehdr);
-
- /* go through the available ELF segments */
- for (i = 0; i < phnum; i++, phdr += elf_phdr_get_size) {
- u64 da = elf_phdr_get_p_paddr(class, phdr);
- u64 memsz = elf_phdr_get_p_memsz(class, phdr);
- u64 filesz = elf_phdr_get_p_filesz(class, phdr);
- u64 offset = elf_phdr_get_p_offset(class, phdr);
- u32 type = elf_phdr_get_p_type(class, phdr);
- void *ptr;
-
- /*
- * There is a case that with PT_LOAD type, the
- * filesz = memsz = 0. If memsz = 0, rproc_da_to_va
- * should return NULL ptr, then error is returned.
- * So this case should be skipped from the loop.
- * Add !memsz checking here.
- */
- if (type != PT_LOAD || !memsz)
- continue;
-
- dev_dbg(dev, "phdr: type %d da 0x%llx memsz 0x%llx filesz 0x%llx\n",
- type, da, memsz, filesz);
-
- if (filesz > memsz) {
- dev_err(dev, "bad phdr filesz 0x%llx memsz 0x%llx\n",
- filesz, memsz);
- ret = -EINVAL;
- break;
- }
-
- if (offset + filesz > fw->size) {
- dev_err(dev, "truncated fw: need 0x%llx avail 0x%zx\n",
- offset + filesz, fw->size);
- ret = -EINVAL;
- break;
- }
-
- if (!rproc_u64_fit_in_size_t(memsz)) {
- dev_err(dev, "size (%llx) does not fit in size_t type\n",
- memsz);
- ret = -EOVERFLOW;
- break;
- }
-
- /* grab the kernel address for this device address */
- ptr = rproc_da_to_va(rproc, da, memsz, NULL);
- if (!ptr) {
- dev_err(dev, "bad phdr da 0x%llx mem 0x%llx\n", da,
- memsz);
- ret = -EINVAL;
- break;
- }
-
- /* put the segment where the remote processor expects it */
- if (filesz)
- memcpy(ptr, elf_data + offset, filesz);
-
- /*
- * Zero out remaining memory for this segment.
- *
- * This isn't strictly required since dma_alloc_coherent already
- * did this for us. albeit harmless, we may consider removing
- * this.
- */
- if (memsz > filesz)
- memset(ptr + filesz, 0, memsz - filesz);
- }
-
- return ret;
-}
-
/* Prepare function for rproc_ops */
static int imx_dsp_rproc_prepare(struct rproc *rproc)
{
@@ -808,7 +715,7 @@ static const struct rproc_ops imx_dsp_rproc_ops = {
.start = imx_dsp_rproc_start,
.stop = imx_dsp_rproc_stop,
.kick = imx_dsp_rproc_kick,
- .load = imx_dsp_rproc_elf_load_segments,
+ .load = rproc_elf_load_segments,
.parse_fw = rproc_elf_load_rsc_table,
.sanity_check = rproc_elf_sanity_check,
.get_boot_addr = rproc_elf_get_boot_addr,
--
2.25.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH V2 0/2] remoteproc: elf: ignore PT_LOAD type segment with memsz as 0
2022-04-13 3:30 [PATCH V2 0/2] remoteproc: elf: ignore PT_LOAD type segment with memsz as 0 Peng Fan (OSS)
2022-04-13 3:30 ` [PATCH V2 1/2] remoteproc: elf_loader: skip segment with memsz as zero Peng Fan (OSS)
2022-04-13 3:30 ` [PATCH V2 2/2] remoteproc: imx_dsp_rproc: use common rproc_elf_load_segments Peng Fan (OSS)
@ 2022-04-13 17:28 ` Mathieu Poirier
2 siblings, 0 replies; 4+ messages in thread
From: Mathieu Poirier @ 2022-04-13 17:28 UTC (permalink / raw)
To: Peng Fan (OSS)
Cc: bjorn.andersson, shawnguo, s.hauer, kernel, festevam, linux-imx,
linux-remoteproc, linux-arm-kernel, linux-kernel, shengjiu.wang,
Peng Fan
On Wed, Apr 13, 2022 at 11:30:36AM +0800, Peng Fan (OSS) wrote:
> From: Peng Fan <peng.fan@nxp.com>
>
> V2:
> Add R-b/A-b tag
> Drop inaccurate comment in patch 1
>
> i.MX DSP firmware has segments with PT_LOAD and memsz/filesz as zero.
> It is valid case the memsz set to zero according to elf spec:
> https://refspecs.linuxbase.org/elf/elf.pdf page 40
>
> So we could let remoteproc elf loader handle this case, then no
> duplicate code in imx dsp rproc driver
>
> Tested i.MX8MP DSP and M7 remoteproc
>
> Peng Fan (2):
> remoteproc: elf_loader: skip segment with memsz as zero
> remoteproc: imx_dsp_rproc: use common rproc_elf_load_segments
>
> drivers/remoteproc/imx_dsp_rproc.c | 95 +---------------------
> drivers/remoteproc/remoteproc_elf_loader.c | 2 +-
> 2 files changed, 2 insertions(+), 95 deletions(-)
>
I have applied this set but as I pointed out in the previous revision, it will
have to be backed-out if something breaks. Hopefully it won't get to that.
Thanks,
Mathieu
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 4+ messages in thread