[PATCH 1/1] cmd: fix loads, saves on sandbox
Simon Glass
sjg at chromium.org
Mon Jun 26 13:24:05 CEST 2023
Hi Heinrich,
On Mon, 26 Jun 2023 at 11:35, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> On 6/26/23 11:07, Simon Glass wrote:
> > 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.
>
> Without the cast I get a build warning:
>
> cmd/load.c: In function ‘save_serial’:
> cmd/load.c:369:30: warning: passing argument 1 of ‘unmap_sysmem’
> discards ‘volatile’ qualifier from pointer target type
> [-Wdiscarded-qualifiers]
> 369 | unmap_sysmem(src);
> | ^~~
> In file included from include/mapmem.h:14,
> from cmd/load.c:22:
> ./arch/sandbox/include/asm/io.h:40:45: note: expected ‘const void *’ but
> argument is of type ‘volatile uchar *’ {aka ‘volatile unsigned char *’}
> 40 | static inline void unmap_sysmem(const void *vaddr)
> | ~~~~~~~~~~~~^~~~~
>
> Why Wolfgang introduced volatile in the original code is unclear to me.
> Would anybody try to save register contents as S-records?
>
> See commit fe8c2806cdba ("Initial revision")
> common/cmd_boot.c:484:
> c = *(volatile uchar*)(address + reclen); /* get one byte */
Ah yes, the const problem. Perhaps we should have an
unmap_sysmem_const() as a work-around? But this patch is fine.
Regards,
Simon
More information about the U-Boot
mailing list