mirror of
https://github.com/apache/nuttx.git
synced 2026-06-06 00:14:22 +08:00
elf/coredump: alignment stack buffer to 64 to match gdb request
Signed-off-by: chao an <anchao@xiaomi.com>
This commit is contained in:
@@ -50,7 +50,10 @@
|
|||||||
# define ELF_PAGESIZE 1024
|
# define ELF_PAGESIZE 1024
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define PROGRAM_ALIGNMENT 64
|
||||||
|
|
||||||
#define ROUNDUP(x, y) ((x + (y - 1)) / (y)) * (y)
|
#define ROUNDUP(x, y) ((x + (y - 1)) / (y)) * (y)
|
||||||
|
#define ROUNDDOWN(x ,y) (((x) / (y)) * (y))
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Data
|
* Private Data
|
||||||
@@ -335,7 +338,7 @@ static void elf_emit_note(FAR struct elf_dumpinfo_s *cinfo)
|
|||||||
static void elf_emit_tcb_stack(FAR struct elf_dumpinfo_s *cinfo,
|
static void elf_emit_tcb_stack(FAR struct elf_dumpinfo_s *cinfo,
|
||||||
FAR struct tcb_s *tcb)
|
FAR struct tcb_s *tcb)
|
||||||
{
|
{
|
||||||
FAR void *buf = NULL;
|
uintptr_t buf = 0;
|
||||||
uintptr_t sp;
|
uintptr_t sp;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
@@ -348,26 +351,30 @@ static void elf_emit_tcb_stack(FAR struct elf_dumpinfo_s *cinfo,
|
|||||||
{
|
{
|
||||||
len = ((uintptr_t)tcb->stack_base_ptr +
|
len = ((uintptr_t)tcb->stack_base_ptr +
|
||||||
tcb->adj_stack_size) - sp;
|
tcb->adj_stack_size) - sp;
|
||||||
buf = (FAR void *)sp;
|
buf = sp;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_STACK_COLORATION
|
#ifdef CONFIG_STACK_COLORATION
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
len = up_check_tcbstack(tcb);
|
len = up_check_tcbstack(tcb);
|
||||||
buf = (FAR void *)((uintptr_t)tcb->stack_base_ptr +
|
buf = (uintptr_t)tcb->stack_base_ptr +
|
||||||
(tcb->adj_stack_size - len));
|
(tcb->adj_stack_size - len);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buf == NULL)
|
if (buf == 0)
|
||||||
{
|
{
|
||||||
buf = (FAR void *)tcb->stack_alloc_ptr;
|
buf = (uintptr_t)tcb->stack_alloc_ptr;
|
||||||
len = tcb->adj_stack_size +
|
len = tcb->adj_stack_size +
|
||||||
(tcb->stack_base_ptr - tcb->stack_alloc_ptr);
|
(tcb->stack_base_ptr - tcb->stack_alloc_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
elf_emit(cinfo, buf, len);
|
sp = ROUNDDOWN(buf, PROGRAM_ALIGNMENT);
|
||||||
|
len = ROUNDUP(len + (buf - sp), PROGRAM_ALIGNMENT);
|
||||||
|
buf = sp;
|
||||||
|
|
||||||
|
elf_emit(cinfo, (FAR void *)buf, len);
|
||||||
|
|
||||||
/* Align to page */
|
/* Align to page */
|
||||||
|
|
||||||
@@ -470,6 +477,11 @@ static void elf_emit_tcb_phdr(FAR struct elf_dumpinfo_s *cinfo,
|
|||||||
(tcb->stack_base_ptr - tcb->stack_alloc_ptr);
|
(tcb->stack_base_ptr - tcb->stack_alloc_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sp = ROUNDDOWN(phdr->p_vaddr, PROGRAM_ALIGNMENT);
|
||||||
|
phdr->p_filesz = ROUNDUP(phdr->p_filesz +
|
||||||
|
(phdr->p_vaddr - sp), PROGRAM_ALIGNMENT);
|
||||||
|
phdr->p_vaddr = sp;
|
||||||
|
|
||||||
phdr->p_type = PT_LOAD;
|
phdr->p_type = PT_LOAD;
|
||||||
phdr->p_offset = ROUNDUP(*offset, ELF_PAGESIZE);
|
phdr->p_offset = ROUNDUP(*offset, ELF_PAGESIZE);
|
||||||
phdr->p_paddr = phdr->p_vaddr;
|
phdr->p_paddr = phdr->p_vaddr;
|
||||||
|
|||||||
Reference in New Issue
Block a user