diff --git a/arch/arm/kernel/unwind.c b/arch/arm/kernel/unwind.c index ef2f007d4d49..7ad8026098f8 100644 --- a/arch/arm/kernel/unwind.c +++ b/arch/arm/kernel/unwind.c @@ -544,7 +544,7 @@ void unwind_backtrace(struct pt_regs *regs, struct task_struct *tsk) sp_irq = (unsigned long)irq_stack[cpu]; addr = *((unsigned long *)(sp_irq + THREAD_INFO_OFFSET - 8 - - sizeof(addr))); + sizeof(addr) - 12)); pt_regs = (struct pt_regs *)addr; frame.fp = pt_regs->ARM_fp; frame.sp = pt_regs->ARM_sp; diff --git a/drivers/amlogic/memory_ext/vmap_stack.c b/drivers/amlogic/memory_ext/vmap_stack.c index 7f81ae545616..dae386a4d855 100644 --- a/drivers/amlogic/memory_ext/vmap_stack.c +++ b/drivers/amlogic/memory_ext/vmap_stack.c @@ -163,8 +163,9 @@ unsigned long notrace irq_stack_entry(unsigned long sp) sp_irq = (unsigned long)dst - 8; /* * save start addr of the interrupted task's context + * minus an extra 12 to force base sp 16Bytes aligned */ - sp_irq = sp_irq - sizeof(sp); + sp_irq = sp_irq - sizeof(sp) - 12; *((unsigned long *)sp_irq) = sp; return sp_irq; }