diff options
author | Peng Fan <peng.fan@nxp.com> | 2022-04-29 16:03:13 +0800 |
---|---|---|
committer | Stefano Babic <sbabic@denx.de> | 2022-05-20 09:30:28 +0200 |
commit | 40153df63ab4b17382d41d03f3b65caaaea0490b (patch) | |
tree | 72612b121299f08e4422f677b908a40cc05057ce /arch | |
parent | fd60a87e752c7ea505ed5758017111ae4eb3c9c2 (diff) | |
download | u-boot-40153df63ab4b17382d41d03f3b65caaaea0490b.zip u-boot-40153df63ab4b17382d41d03f3b65caaaea0490b.tar.gz u-boot-40153df63ab4b17382d41d03f3b65caaaea0490b.tar.bz2 |
imx: bootaux: get stack from elf file
To i.MX8, M core stack is pre-coded in source code, so need to get it
before kicking M core. The stack pointer is stored in the first word of
the first PT_LOAD section __isr_vector. So use a num to index the
section loading.
Signed-off-by: Peng Fan <peng.fan@nxp.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-imx/imx_bootaux.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/arch/arm/mach-imx/imx_bootaux.c b/arch/arm/mach-imx/imx_bootaux.c index 3c6a5c0..8115bf4 100644 --- a/arch/arm/mach-imx/imx_bootaux.c +++ b/arch/arm/mach-imx/imx_bootaux.c @@ -42,10 +42,11 @@ static const struct rproc_att *get_host_mapping(unsigned long auxcore) * is valid, returns the entry point address. * Translates load addresses in the elf file to the U-Boot address space. */ -static unsigned long load_elf_image_m_core_phdr(unsigned long addr) +static unsigned long load_elf_image_m_core_phdr(unsigned long addr, ulong *stack) { Elf32_Ehdr *ehdr; /* ELF header structure pointer */ Elf32_Phdr *phdr; /* Program header structure pointer */ + int num = 0; int i; ehdr = (Elf32_Ehdr *)addr; @@ -71,8 +72,13 @@ static unsigned long load_elf_image_m_core_phdr(unsigned long addr) debug("Loading phdr %i to 0x%p (%i bytes)\n", i, dst, phdr->p_filesz); - if (phdr->p_filesz) + if (phdr->p_filesz) { memcpy(dst, src, phdr->p_filesz); + /* Stack in __isr_vector is the first section/word */ + if (!num) + *stack = *(uint32_t *)src; + num++; + } if (phdr->p_filesz != phdr->p_memsz) memset(dst + phdr->p_filesz, 0x00, phdr->p_memsz - phdr->p_filesz); @@ -96,11 +102,12 @@ int arch_auxiliary_core_up(u32 core_id, ulong addr) * isn't supported yet. */ if (valid_elf_image(addr)) { - stack = 0x0; - pc = load_elf_image_m_core_phdr(addr); + pc = load_elf_image_m_core_phdr(addr, &stack); if (!pc) return CMD_RET_FAILURE; + if (!CONFIG_IS_ENABLED(ARM64)) + stack = 0x0; } else { /* * Assume binary file with vector table at the beginning. |