ARM: OMAP4: sleep: Save the complete used register stack frame
OMAP4 sleep entry code even though itself don't use many CPU registers makes call to the v7_flush_dcache_all() which uses them. Since v7_flush_dcache_all() doesn't make use of stack, the caller must take care of the stack frame. Otherwise it will lead to corrupted stack frame. Fix it by saving used registers. Reported-by: Grygorii Strashko <grygorii.strashko@ti.com> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Cc: Kevin Hilman <khilman@ti.com> Signed-off-by: Kevin Hilman <khilman@ti.com>
This commit is contained in:
parent
e0e29fd74c
commit
5b6e3eb576
@ -56,9 +56,13 @@ ppa_por_params:
|
|||||||
* The restore function pointer is stored at CPUx_WAKEUP_NS_PA_ADDR_OFFSET.
|
* The restore function pointer is stored at CPUx_WAKEUP_NS_PA_ADDR_OFFSET.
|
||||||
* It returns to the caller for CPU INACTIVE and ON power states or in case
|
* It returns to the caller for CPU INACTIVE and ON power states or in case
|
||||||
* CPU failed to transition to targeted OFF/DORMANT state.
|
* CPU failed to transition to targeted OFF/DORMANT state.
|
||||||
|
*
|
||||||
|
* omap4_finish_suspend() calls v7_flush_dcache_all() which doesn't save
|
||||||
|
* stack frame and it expects the caller to take care of it. Hence the entire
|
||||||
|
* stack frame is saved to avoid possible stack corruption.
|
||||||
*/
|
*/
|
||||||
ENTRY(omap4_finish_suspend)
|
ENTRY(omap4_finish_suspend)
|
||||||
stmfd sp!, {lr}
|
stmfd sp!, {r4-r12, lr}
|
||||||
cmp r0, #0x0
|
cmp r0, #0x0
|
||||||
beq do_WFI @ No lowpower state, jump to WFI
|
beq do_WFI @ No lowpower state, jump to WFI
|
||||||
|
|
||||||
@ -226,7 +230,7 @@ scu_gp_clear:
|
|||||||
skip_scu_gp_clear:
|
skip_scu_gp_clear:
|
||||||
isb
|
isb
|
||||||
dsb
|
dsb
|
||||||
ldmfd sp!, {pc}
|
ldmfd sp!, {r4-r12, pc}
|
||||||
ENDPROC(omap4_finish_suspend)
|
ENDPROC(omap4_finish_suspend)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user