.global Irq_Handler\r
.type Irq_Handler, %function\r
\r
-#define IRQ_ENABLE() cpsie i\r
-#define IRQ_DISABLE() cpsid i\r
\r
-\r
-\r
-\r
-\r
-\r
-// lr\r
+// Registers part of context.\r
#define REG_SAVE r4-r8,r10,r11\r
\r
\r
Irq_Handler:\r
- mov r2, #0xDF // Swich back to sys mode.\r
+ // Save link register\r
+ mov r3, lr\r
+ \r
+ // We don't want to use the IRQ mode\r
+ // so swich back to sys mode.\r
+ mov r2, #0xDF\r
msr cpsr_c, r2\r
- push {REG_SAVE,lr}\r
+ \r
+ // Restore link register again\r
+ mov lr, r3\r
+ \r
+ // Push registers on stack\r
+ push {REG_SAVE,lr}\r
+ \r
sub.w sp,sp,#C_SIZE\r
mov.w r4,#LC_PATTERN\r
- str r4,[sp,#C_CONTEXT_OFFS] \r
- mov r0,sp // stack as first arg\r
+ str r4,[sp,#C_CONTEXT_OFFS]\r
+ \r
+ // Put stack as first arg to Irq_Entry \r
+ mov r0,sp \r
+ \r
+ // When at interrupt nest count = 0, load interrupt stack \r
+ ldr r4,=os_sys\r
+ ldr r5,[r4,#SYS_INT_NEST_CNT]\r
+ cmp r5, #0\r
+ bgt arggg\r
+ ldr sp,[r4,#SYS_INT_STACK] \r
+ \r
+arggg: \r
bl Irq_Entry\r
mov sp, r0 // pop from returned stack\r
\r
/* Do a normal exception return */\r
add.w sp,sp,#C_SIZE\r
+ \r
+ // Restore registers\r
pop {REG_SAVE,lr}\r
- bx lr\r
-\r
-// b os_lc_restore\r
-\r
+ subs pc, lr, #0x4\r
+ \r
\r
/**\r
* Fake an interrupt stack to be able to return to thread mode.\r
bx lr\r
\r
Dummy_Irq:\r
- nop\r
- nop\r
+ /* Go back to sys mode for easier debugging.\r
+ Save link register*/\r
+ mov r3, lr\r
+ /* We don't want to use the IRQ mode\r
+ so swich back to sys mode. */\r
+ mov r2, #0xDF\r
+ msr cpsr_c, r2\r
+ /* Restore link register again */\r
+ mov lr, r3\r
b Dummy_Irq\r
\r
.size Reset_Handler, .-Reset_Handler\r
.section .int_vecs,"ax",%progbits\r
.extern Irq_Handler\r
\r
- b Dummy_Irq /* Reset? */\r
+ b Reset_Handler /* Reset? */\r
b Dummy_Irq /* Undef? */\r
b Dummy_Irq /* SVC */\r
b Dummy_Irq /* Prefetch */\r
#include "irq.h"\r
#include "arc.h"\r
\r
+void CortexR4OsTick() {\r
+ /** Clear all pending interrupts\r
+ * otherwise this will hit again\r
+ * as soon as interrupts are enabled. */\r
+ rtiREG1->INTFLAG = 0x1;\r
+\r
+ // Call regular OsTick.\r
+ OsTick();\r
+}\r
\r
/**\r
* Init of free running timer.\r
*/\r
void Os_SysTickInit( void ) {\r
TaskType tid;\r
- tid = Os_Arc_CreateIsr(OsTick,6,"OsTick");\r
+ tid = Os_Arc_CreateIsr(CortexR4OsTick,6,"OsTick");\r
Irq_AttachIsr2(tid,NULL, 2);\r
}\r
\r