]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
cmd: fix loads, saves on sandbox
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sun, 25 Jun 2023 09:54:23 +0000 (11:54 +0200)
committerSimon Glass <sjg@chromium.org>
Thu, 20 Jul 2023 20:10:57 +0000 (14:10 -0600)
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@canonical.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
cmd/load.c

index 5c4f34781d452e83448ed8f35142e860c157f4bc..2715cf5957eef6bbdceb464e5d15610a107fa011 100644 (file)
@@ -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);
                if(reclen == SREC_BYTES_PER_RECORD || count == 0) {
                        /* enough data collected for one record: dump it */
                        if(reclen) {    /* build & write a data record: */