elf: fix cache flushing in 'bootelf -p' command
authorKurban Mallachiev <mallachiev@ispras.ru>
Thu, 7 Feb 2019 11:19:45 +0000 (14:19 +0300)
committerTom Rini <trini@konsulko.com>
Tue, 19 Feb 2019 13:55:43 +0000 (08:55 -0500)
Currently there are two problems in 'bootelf -p' (load elf by segments)
command:
- bss section is not flushed, so booted elf can have non zero values
  in bss;
- at least on ARM there are 'CACHE: Misaligned operation at
  range...' warnings

Use p_memsz instead of p_filesz during cache flushing for elf segment.
p_filesz doesn't include zero initialized memory (e.g. bss section),
which also should be flushed.

Align these cache flushes to line boundaries.

Signed-off-by: Kurban Mallachiev <mallachiev@ispras.ru>
cmd/elf.c

index 7bad1f80d42f9b23fec595871dc3cb1794bee55c..d883be41931deea96e5a2be3fac3fb7ce4614ae6 100644 (file)
--- a/cmd/elf.c
+++ b/cmd/elf.c
@@ -53,7 +53,8 @@ static unsigned long load_elf64_image_phdr(unsigned long addr)
                if (phdr->p_filesz != phdr->p_memsz)
                        memset(dst + phdr->p_filesz, 0x00,
                               phdr->p_memsz - phdr->p_filesz);
-               flush_cache((unsigned long)dst, phdr->p_filesz);
+               flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
+                           roundup(phdr->p_memsz, ARCH_DMA_MINALIGN));
                ++phdr;
        }
 
@@ -167,7 +168,8 @@ static unsigned long load_elf_image_phdr(unsigned long addr)
                if (phdr->p_filesz != phdr->p_memsz)
                        memset(dst + phdr->p_filesz, 0x00,
                               phdr->p_memsz - phdr->p_filesz);
-               flush_cache((unsigned long)dst, phdr->p_filesz);
+               flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
+                           roundup(phdr->p_memsz, ARCH_DMA_MINALIGN));
                ++phdr;
        }