mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-14 08:57:58 +00:00
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:
parent
fd60a87e75
commit
40153df63a
1 changed files with 11 additions and 4 deletions
|
@ -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.
|
||||||
|
|
Loading…
Reference in a new issue