diff options
Diffstat (limited to 'firmware/target/arm/thread-arm.c')
-rw-r--r-- | firmware/target/arm/thread-arm.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/firmware/target/arm/thread-arm.c b/firmware/target/arm/thread-arm.c index c2d91cec25..9ea3d0bef9 100644 --- a/firmware/target/arm/thread-arm.c +++ b/firmware/target/arm/thread-arm.c | |||
@@ -77,7 +77,15 @@ static inline void load_context(const void* addr) | |||
77 | asm volatile( | 77 | asm volatile( |
78 | "ldr r0, [%0, #40] \n" /* Load start pointer */ | 78 | "ldr r0, [%0, #40] \n" /* Load start pointer */ |
79 | "cmp r0, #0 \n" /* Check for NULL */ | 79 | "cmp r0, #0 \n" /* Check for NULL */ |
80 | "ldmneia %0, { r0, pc } \n" /* If not already running, jump to start */ | 80 | |
81 | /* If not already running, jump to start */ | ||
82 | #if ARM_ARCH == 4 && defined(USE_THUMB) | ||
83 | "ldmneia %0, { r0, r12 } \n" | ||
84 | "bxne r12 \n" | ||
85 | #else | ||
86 | "ldmneia %0, { r0, pc } \n" | ||
87 | #endif | ||
88 | |||
81 | "ldmia %0, { r4-r11, sp, lr } \n" /* Load regs r4 to r14 from context */ | 89 | "ldmia %0, { r4-r11, sp, lr } \n" /* Load regs r4 to r14 from context */ |
82 | : : "r" (addr) : "r0" /* only! */ | 90 | : : "r" (addr) : "r0" /* only! */ |
83 | ); | 91 | ); |