+ /* Save registers */
+ stmfd sp!, {r4 - r11, lr}
+ /* Save old stack pointer */
+ str sp, [r1]
+ /* Load new stack pointer */
+ ldr sp, [r0]
+ /* Load new registers */
+ ldmfd sp!, {r4 - r11, pc}
+
+#if CONFIG_KERN_PREEMPT
+
+/* ARM interrupt mode with IRQ and FIQ disabled */
+#define ARM_IRQ_MODE 0xD2
+/* ARM supervisor mode with IRQ and FIQ disabled */
+#define ARM_SVC_MODE 0xD3
+
+.globl asm_irq_switch_context
+asm_irq_switch_context:
+ /* Return if preemption is not needed */
+ bl proc_needPreempt
+ cmp r0, #0
+ ldmeqfd sp!, {r0 - r3, ip, pc}^