ARM (Thumb Mode) _CPU_Context_switch_arm

Sebastian Huber sebastian.huber at
Mon Feb 25 15:02:46 UTC 2013

On 02/25/2013 03:15 PM, Matthew J Fletcher wrote:
> Sebastian,
> The _Thread_Heir->Registers are ok into the _Context_Switch() call, sp and lr
> both sensible.
> At the 'mrs r2, cpsr' line sp is 0x40001b2c (rubbish) and pc sensible.
> In _restore, after the 'ldmia r1, ...' instruction the sp and lr are loaded
> with the correct values from _Thread_Heir->Registers.
> Its the 'msr cpsr, r2' messes up the sp and lr

Ok, if you load undefined values into the CPSR, then a lot of things may 
happen.  What is the value of r2 before the msr?  It should be 0x13.

I think there is a bug in

void _CPU_Context_Initialize(
   Context_Control *the_context,
   void *stack_area_begin,
   size_t stack_area_size,
   uint32_t new_level,
   void (*entry_point)( void ),
   bool is_fp
   the_context->register_sp = (uint32_t) stack_area_begin + stack_area_size;
   the_context->register_lr = (uint32_t) entry_point;
   the_context->register_cpsr = new_level | arm_cpu_mode;

if new_level != 0.  Is this the case here?

Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber at
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

More information about the users mailing list