diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2016-09-21 00:09:23 +0100 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2016-12-12 13:17:33 +0100 |
commit | a523c3fcfe40734f3b15fbf086578fa188fc0ec6 (patch) | |
tree | 2e0a9c880b9df4675d856328e68cf7c16a961391 /rbutil/rbutilqt/test/test-httpget.cpp | |
parent | 7e0820fe21247d528f4c3483822af4f4a66571ee (diff) | |
download | rockbox-a523c3fcfe40734f3b15fbf086578fa188fc0ec6.tar.gz rockbox-a523c3fcfe40734f3b15fbf086578fa188fc0ec6.zip |
imx233: fix IRQ handler w.r.t unwinder
The IRQ handler saves registers on the IRQ stack, saves the old PC to imx233
HW_DIGCTL_SCRATCH0 register and switcht to SVC for the actual handling. The
old code had a problem in that if the unwinder is called during the IRQ (for
example by the watchdog), then __get_sp() will use SPSR_svc to discover the
previous mode, switch to it and recover SP. But SPSR_svc is invalid, it should
be SPSR_irq but we switch from IRQ to SVC mode. The new code copies SPSR_irq
to SPSR_svc in IRQ to fix this problem. It also saves/restore SCRATCH0 in
case I one day renable nested interrupts or use SCRATCH0 for other purposes.
I also changed the old watchdog code to call UIE directly instead of trying
to make the code crash with a SWI.
Change-Id: Id87462d410764b019bd2aa9adc71cb917ade32e3
Diffstat (limited to 'rbutil/rbutilqt/test/test-httpget.cpp')
0 files changed, 0 insertions, 0 deletions