Fix kernel bug: process on arm never exit.
authorasterix <asterix@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 24 Apr 2009 16:46:26 +0000 (16:46 +0000)
committerasterix <asterix@38d2e660-2303-0410-9eaa-f027e97ec537>
Fri, 24 Apr 2009 16:46:26 +0000 (16:46 +0000)
git-svn-id: https://src.develer.com/svnoss/bertos/trunk@2666 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/cpu/arm/hw/switch_ctx_arm.S
bertos/cpu/frame.h

index bde843cda734cd14ed7066fcb69dfa096dc2c4b2..39e9f46a2dabb58b88475203acf095dacd9a1155 100644 (file)
 .globl asm_switch_context
 asm_switch_context:
        mrs     r2, cpsr               /* Save status. */
+
+       /*
+        * To work correctly the lr should point to proc_exit, so when process finish
+        * could be return
+        */
+       push {lr}                  /* Add one element on stack, for next switching */
+
        stmfd   sp!, {r2, r4-r11, lr}  /* Save registers. */
 
        str     sp, [r1]               /* Save old stack pointer. */
@@ -50,4 +57,5 @@ asm_switch_context:
        ldmfd   sp!, {r2, r4-r11, lr}  /* Load new registers. */
        msr     cpsr, r2               /* restore flags reg. */
 
-       mov     pc, lr
+       pop {r0}                  /* pop on stack address of the process that we want to jump */
+       mov     pc, r0
index c96351566f156c71d93de7fe50c803403ebc2966..1a80fa1da21fa2faf415391212835573a99608ea 100644 (file)
@@ -58,7 +58,7 @@
 
 #elif CPU_ARM
 
-       #define CPU_SAVED_REGS_CNT     9
+       #define CPU_SAVED_REGS_CNT     10
        #define CPU_STACK_GROWS_UPWARD 0
        #define CPU_SP_ON_EMPTY_SLOT   0
 
         * - ARM state.
         * - CPU in Supervisor Mode (SVC).
         */
-       #define CPU_REG_INIT_VALUE(reg) (reg == (CPU_SAVED_REGS_CNT - 1) ? 0x13 : 0)
+       #define CPU_REG_INIT_VALUE(reg) \
+       ({  int a = 0; \
+               if(reg == 0) \
+                       a = (int)proc_exit; \
+               else if(reg == (CPU_SAVED_REGS_CNT - 1)) \
+                       a = 0x13; \
+               a; \
+       })
 
 #elif CPU_PPC