[PATCH v3 1/9] sandbox: efi_loader: Correct use of addresses as pointers
Heinrich Schuchardt
xypron.glpk at gmx.de
Tue Nov 12 15:46:19 CET 2024
On 12.11.24 15:28, Heinrich Schuchardt wrote:
> On 12.11.24 15:10, Simon Glass wrote:
>> The cache-flush function is incorrect which causes a crash in the
>> remoteproc tests with arm64.
>
> We should throw out all these sandbox virtual addresses where they are
> not needed.
>
> Just add the missing conversion to drivers/remoteproc/rproc-elf-loader.c.
>
> And change flush_cache() on all architectures to use void *.
>
> Best regards
>
> Heinrich
There are a number of places where the flush_cache invocation currently
assumes that sandbox virtual addresses are used.
We will have to wait until the complete separation of CLI from the rest
of U-Boot to clean this up.
Acked-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
>
>>
>> Fix both problems by using map_sysmem() to convert an address to a
>> pointer and map_to_sysmem() to convert a pointer to an address.
>>
>> Also update the image-loader's cache-flushing logic.
>>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> Fixes: 3286d223fd7 ("sandbox: implement invalidate_icache_all()")
>> ---
>>
>> (no changes since v2)
>>
>> Changes in v2:
>> - Drop message about EFI_LOADER
>>
>> arch/sandbox/cpu/cache.c | 8 +++++++-
>> drivers/remoteproc/rproc-elf-loader.c | 18 +++++++++++-------
>> lib/efi_loader/efi_image_loader.c | 3 ++-
>> 3 files changed, 20 insertions(+), 9 deletions(-)
>>
>> diff --git a/arch/sandbox/cpu/cache.c b/arch/sandbox/cpu/cache.c
>> index c8a5e64214b..96b3da47e8e 100644
>> --- a/arch/sandbox/cpu/cache.c
>> +++ b/arch/sandbox/cpu/cache.c
>> @@ -4,12 +4,18 @@
>> */
>>
>> #include <cpu_func.h>
>> +#include <mapmem.h>
>> #include <asm/state.h>
>>
>> void flush_cache(unsigned long addr, unsigned long size)
>> {
>> + void *ptr;
>> +
>> + ptr = map_sysmem(addr, size);
>> +
>> /* Clang uses (char *) parameters, GCC (void *) */
>> - __builtin___clear_cache((void *)addr, (void *)(addr + size));
>> + __builtin___clear_cache(map_sysmem(addr, size), ptr + size);
>> + unmap_sysmem(ptr);
>> }
>>
>> void invalidate_icache_all(void)
>> diff --git a/drivers/remoteproc/rproc-elf-loader.c b/drivers/
>> remoteproc/rproc-elf-loader.c
>> index ab1836b3f07..0b3941b7798 100644
>> --- a/drivers/remoteproc/rproc-elf-loader.c
>> +++ b/drivers/remoteproc/rproc-elf-loader.c
>> @@ -6,6 +6,7 @@
>> #include <dm.h>
>> #include <elf.h>
>> #include <log.h>
>> +#include <mapmem.h>
>> #include <remoteproc.h>
>> #include <asm/cache.h>
>> #include <dm/device_compat.h>
>> @@ -180,6 +181,7 @@ int rproc_elf32_load_image(struct udevice *dev,
>> unsigned long addr, ulong size)
>> for (i = 0; i < ehdr->e_phnum; i++, phdr++) {
>> void *dst = (void *)(uintptr_t)phdr->p_paddr;
>> void *src = (void *)addr + phdr->p_offset;
>> + ulong dst_addr;
>>
>> if (phdr->p_type != PT_LOAD)
>> continue;
>> @@ -195,10 +197,11 @@ int rproc_elf32_load_image(struct udevice *dev,
>> unsigned long addr, ulong size)
>> if (phdr->p_filesz != phdr->p_memsz)
>> memset(dst + phdr->p_filesz, 0x00,
>> phdr->p_memsz - phdr->p_filesz);
>> - flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
>> - roundup((unsigned long)dst + phdr->p_filesz,
>> + dst_addr = map_to_sysmem(dst);
>> + flush_cache(rounddown(dst_addr, ARCH_DMA_MINALIGN),
>> + roundup(dst_addr + phdr->p_filesz,
>> ARCH_DMA_MINALIGN) -
>> - rounddown((unsigned long)dst, ARCH_DMA_MINALIGN));
>> + rounddown(dst_addr, ARCH_DMA_MINALIGN));
>> }
>>
>> return 0;
>> @@ -377,6 +380,7 @@ int rproc_elf32_load_rsc_table(struct udevice
>> *dev, ulong fw_addr,
>> const struct dm_rproc_ops *ops;
>> Elf32_Shdr *shdr;
>> void *src, *dst;
>> + ulong dst_addr;
>>
>> shdr = rproc_elf32_find_rsc_table(dev, fw_addr, fw_size);
>> if (!shdr)
>> @@ -398,10 +402,10 @@ int rproc_elf32_load_rsc_table(struct udevice
>> *dev, ulong fw_addr,
>> (ulong)dst, *rsc_size);
>>
>> memcpy(dst, src, *rsc_size);
>> - flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
>> - roundup((unsigned long)dst + *rsc_size,
>> - ARCH_DMA_MINALIGN) -
>> - rounddown((unsigned long)dst, ARCH_DMA_MINALIGN));
>> + dst_addr = map_to_sysmem(dst);
>> + flush_cache(rounddown(dst_addr, ARCH_DMA_MINALIGN),
>> + roundup(dst_addr + *rsc_size, ARCH_DMA_MINALIGN) -
>> + rounddown(dst_addr, ARCH_DMA_MINALIGN));
>>
>> return 0;
>> }
>> diff --git a/lib/efi_loader/efi_image_loader.c b/lib/efi_loader/
>> efi_image_loader.c
>> index 0ddf69a0918..bb58cf1badb 100644
>> --- a/lib/efi_loader/efi_image_loader.c
>> +++ b/lib/efi_loader/efi_image_loader.c
>> @@ -13,6 +13,7 @@
>> #include <efi_loader.h>
>> #include <log.h>
>> #include <malloc.h>
>> +#include <mapmem.h>
>> #include <pe.h>
>> #include <sort.h>
>> #include <crypto/mscode.h>
>> @@ -977,7 +978,7 @@ efi_status_t efi_load_pe(struct
>> efi_loaded_image_obj *handle,
>> }
>>
>> /* Flush cache */
>> - flush_cache((ulong)efi_reloc,
>> + flush_cache(map_to_sysmem(efi_reloc),
>> ALIGN(virt_size, EFI_CACHELINE_SIZE));
>>
>> /*
>
More information about the U-Boot
mailing list