]> rtime.felk.cvut.cz Git - arc.git/commitdiff
Tiny example almost running now.
authormaek <devnull@localhost>
Thu, 21 Oct 2010 16:45:45 +0000 (18:45 +0200)
committermaek <devnull@localhost>
Thu, 21 Oct 2010 16:45:45 +0000 (18:45 +0200)
arch/arm/arm_cr4/kernel/arch_krn.sx
arch/arm/arm_cr4/kernel/startup_cr4.s
arch/arm/arm_cr4/kernel/sys_tick.c

index 897bc79a0816be102e01db841c01589f964d35ab..a3a90d39a944d640861839836eacf5c16f72b292 100644 (file)
        .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
index 8896fd2758ae7fa3792871c20fc5206dedd34a02..3c0a64f97f138979c557cf965adaf402ec5a367d 100644 (file)
@@ -168,8 +168,15 @@ LoopFillZero:
        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
@@ -195,7 +202,7 @@ Infinite_Loop:
        .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
index 0d9c0a117f27b69b11edb0a6ab7a96f9c152496e..1d8e40a26aa0c371a4c402a0a8ae4756ad0bfed7 100644 (file)
 #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