mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 12:54:37 +00:00
sandbox: efi_loader: Correct use of addresses as pointers
The cache-flush function is incorrect which causes a crash in the
remoteproc tests with arm64.
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@chromium.org>
Fixes: 3286d223fd
("sandbox: implement invalidate_icache_all()")
Acked-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Changes in v6:
- Re-introduce
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(-)
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
parent
bda30f83f9
commit
e46e4d6fd7
3 changed files with 20 additions and 9 deletions
|
@ -4,12 +4,18 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cpu_func.h>
|
#include <cpu_func.h>
|
||||||
|
#include <mapmem.h>
|
||||||
#include <asm/state.h>
|
#include <asm/state.h>
|
||||||
|
|
||||||
void flush_cache(unsigned long addr, unsigned long size)
|
void flush_cache(unsigned long addr, unsigned long size)
|
||||||
{
|
{
|
||||||
|
void *ptr;
|
||||||
|
|
||||||
|
ptr = map_sysmem(addr, size);
|
||||||
|
|
||||||
/* Clang uses (char *) parameters, GCC (void *) */
|
/* 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)
|
void invalidate_icache_all(void)
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <elf.h>
|
#include <elf.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
|
#include <mapmem.h>
|
||||||
#include <remoteproc.h>
|
#include <remoteproc.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <dm/device_compat.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++) {
|
for (i = 0; i < ehdr->e_phnum; i++, phdr++) {
|
||||||
void *dst = (void *)(uintptr_t)phdr->p_paddr;
|
void *dst = (void *)(uintptr_t)phdr->p_paddr;
|
||||||
void *src = (void *)addr + phdr->p_offset;
|
void *src = (void *)addr + phdr->p_offset;
|
||||||
|
ulong dst_addr;
|
||||||
|
|
||||||
if (phdr->p_type != PT_LOAD)
|
if (phdr->p_type != PT_LOAD)
|
||||||
continue;
|
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)
|
if (phdr->p_filesz != phdr->p_memsz)
|
||||||
memset(dst + phdr->p_filesz, 0x00,
|
memset(dst + phdr->p_filesz, 0x00,
|
||||||
phdr->p_memsz - phdr->p_filesz);
|
phdr->p_memsz - phdr->p_filesz);
|
||||||
flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
|
dst_addr = map_to_sysmem(dst);
|
||||||
roundup((unsigned long)dst + phdr->p_filesz,
|
flush_cache(rounddown(dst_addr, ARCH_DMA_MINALIGN),
|
||||||
|
roundup(dst_addr + phdr->p_filesz,
|
||||||
ARCH_DMA_MINALIGN) -
|
ARCH_DMA_MINALIGN) -
|
||||||
rounddown((unsigned long)dst, ARCH_DMA_MINALIGN));
|
rounddown(dst_addr, ARCH_DMA_MINALIGN));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -377,6 +380,7 @@ int rproc_elf32_load_rsc_table(struct udevice *dev, ulong fw_addr,
|
||||||
const struct dm_rproc_ops *ops;
|
const struct dm_rproc_ops *ops;
|
||||||
Elf32_Shdr *shdr;
|
Elf32_Shdr *shdr;
|
||||||
void *src, *dst;
|
void *src, *dst;
|
||||||
|
ulong dst_addr;
|
||||||
|
|
||||||
shdr = rproc_elf32_find_rsc_table(dev, fw_addr, fw_size);
|
shdr = rproc_elf32_find_rsc_table(dev, fw_addr, fw_size);
|
||||||
if (!shdr)
|
if (!shdr)
|
||||||
|
@ -398,10 +402,10 @@ int rproc_elf32_load_rsc_table(struct udevice *dev, ulong fw_addr,
|
||||||
(ulong)dst, *rsc_size);
|
(ulong)dst, *rsc_size);
|
||||||
|
|
||||||
memcpy(dst, src, *rsc_size);
|
memcpy(dst, src, *rsc_size);
|
||||||
flush_cache(rounddown((unsigned long)dst, ARCH_DMA_MINALIGN),
|
dst_addr = map_to_sysmem(dst);
|
||||||
roundup((unsigned long)dst + *rsc_size,
|
flush_cache(rounddown(dst_addr, ARCH_DMA_MINALIGN),
|
||||||
ARCH_DMA_MINALIGN) -
|
roundup(dst_addr + *rsc_size, ARCH_DMA_MINALIGN) -
|
||||||
rounddown((unsigned long)dst, ARCH_DMA_MINALIGN));
|
rounddown(dst_addr, ARCH_DMA_MINALIGN));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <efi_loader.h>
|
#include <efi_loader.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#include <mapmem.h>
|
||||||
#include <pe.h>
|
#include <pe.h>
|
||||||
#include <sort.h>
|
#include <sort.h>
|
||||||
#include <crypto/mscode.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 */
|
||||||
flush_cache((ulong)efi_reloc,
|
flush_cache(map_to_sysmem(efi_reloc),
|
||||||
ALIGN(virt_size, EFI_CACHELINE_SIZE));
|
ALIGN(virt_size, EFI_CACHELINE_SIZE));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue