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>
This commit is contained in:
Peng Fan 2022-04-29 16:03:13 +08:00 committed by Stefano Babic
parent fd60a87e75
commit 40153df63a

View file

@ -42,10 +42,11 @@ static const struct rproc_att *get_host_mapping(unsigned long auxcore)
* is valid, returns the entry point address. * is valid, returns the entry point address.
* Translates load addresses in the elf file to the U-Boot address space. * 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_Ehdr *ehdr; /* ELF header structure pointer */
Elf32_Phdr *phdr; /* Program header structure pointer */ Elf32_Phdr *phdr; /* Program header structure pointer */
int num = 0;
int i; int i;
ehdr = (Elf32_Ehdr *)addr; 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", debug("Loading phdr %i to 0x%p (%i bytes)\n",
i, dst, phdr->p_filesz); i, dst, phdr->p_filesz);
if (phdr->p_filesz) if (phdr->p_filesz) {
memcpy(dst, src, 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) 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);
@ -96,11 +102,12 @@ int arch_auxiliary_core_up(u32 core_id, ulong addr)
* isn't supported yet. * isn't supported yet.
*/ */
if (valid_elf_image(addr)) { if (valid_elf_image(addr)) {
stack = 0x0; pc = load_elf_image_m_core_phdr(addr, &stack);
pc = load_elf_image_m_core_phdr(addr);
if (!pc) if (!pc)
return CMD_RET_FAILURE; return CMD_RET_FAILURE;
if (!CONFIG_IS_ENABLED(ARM64))
stack = 0x0;
} else { } else {
/* /*
* Assume binary file with vector table at the beginning. * Assume binary file with vector table at the beginning.