[PATCH 1/1] cmd: fix loads, saves on sandbox
Simon Glass
sjg at chromium.org
Mon Jun 26 11:07:32 CEST 2023
Hi Heinrich,
On Sun, 25 Jun 2023 at 10:54, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> The loads and saves commands crash on the sandbox due to illegal memory
> access.
>
> For command line arguments the sandbox uses a virtual address space which
> does not equal the addresses of the memory allocated with memmap(). Add the
> missing address translations for the loads and saves commands.
>
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> ---
> cmd/load.c | 16 ++++++++++++----
> 1 file changed, 12 insertions(+), 4 deletions(-)
Reviewed-by: Simon Glass <sjg at chromium.org>
>
> diff --git a/cmd/load.c b/cmd/load.c
> index 5c4f34781d..2715cf5957 100644
> --- a/cmd/load.c
> +++ b/cmd/load.c
> @@ -181,13 +181,17 @@ static ulong load_serial(long offset)
> } else
> #endif
> {
> + void *dst;
> +
> ret = lmb_reserve(&lmb, store_addr, binlen);
> if (ret) {
> printf("\nCannot overwrite reserved area (%08lx..%08lx)\n",
> store_addr, store_addr + binlen);
> return ret;
> }
> - memcpy((char *)(store_addr), binbuf, binlen);
> + dst = map_sysmem(store_addr, binlen);
> + memcpy(dst, binbuf, binlen);
> + unmap_sysmem(dst);
> lmb_free(&lmb, store_addr, binlen);
> }
> if ((store_addr) < start_addr)
> @@ -350,15 +354,19 @@ static int save_serial(ulong address, ulong count)
> if(write_record(SREC3_START)) /* write the header */
> return (-1);
> do {
> - if(count) { /* collect hex data in the buffer */
> - c = *(volatile uchar*)(address + reclen); /* get one byte */
> - checksum += c; /* accumulate checksum */
> + volatile uchar *src;
> +
> + src = map_sysmem(address, count);
> + if (count) { /* collect hex data in the buffer */
> + c = src[reclen]; /* get one byte */
> + checksum += c; /* accumulate checksum */
> data[2*reclen] = hex[(c>>4)&0x0f];
> data[2*reclen+1] = hex[c & 0x0f];
> data[2*reclen+2] = '\0';
> ++reclen;
> --count;
> }
> + unmap_sysmem((void *)src);
nit: You should not need the cast.
> if(reclen == SREC_BYTES_PER_RECORD || count == 0) {
> /* enough data collected for one record: dump it */
> if(reclen) { /* build & write a data record: */
> --
> 2.40.1
>
Regards,
Simon
More information about the U-Boot
mailing list