diff options
Diffstat (limited to 'cpukit/score/cpu/m32c/context_init.c')
-rw-r--r-- | cpukit/score/cpu/m32c/context_init.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/cpukit/score/cpu/m32c/context_init.c b/cpukit/score/cpu/m32c/context_init.c new file mode 100644 index 0000000000..e79fb0e9c9 --- /dev/null +++ b/cpukit/score/cpu/m32c/context_init.c @@ -0,0 +1,81 @@ +/* + * COPYRIGHT (c) 1989-2008. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdint.h> +#include <rtems/system.h> + +typedef struct { + uint16_t sbLow; + uint16_t sbHigh; /* push/pop sb */ + uint16_t flg; /* push/pop flg */ + uint32_t a1; /* pushm */ + uint32_t a0; + uint32_t r0r2; + uint32_t r1r3; + uint16_t frameLow; /* exitd */ + uint16_t frameHigh; + uint16_t startLow; + uint16_t startHigh; + uint16_t zero; +} Starting_Frame; + +#if defined(__r8c_cpu__) + #warning "_get_sb: not implemented on R8C" + #define _get_sb( _sb ) +#else + #define _get_sb( _sb ) \ + __asm__ volatile( "stc sb, %0" : "=r" (_sb)) +#endif + +void _CPU_Context_Initialize( + Context_Control *the_context, + uint32_t *stack_base, + size_t size, + uint32_t new_level, + void *entry_point, + bool is_fp +) +{ + void *stackEnd = stack_base; + register uint32_t sb; + Starting_Frame *frame; + + _get_sb( sb ); + stackEnd += size; + + frame = (Starting_Frame *)stackEnd; + frame--; + + frame->zero = 0; + frame->sbLow = ((uint32_t)sb) & 0xffff; + frame->sbHigh = ((uint32_t)sb >> 16) & 0xffff; + frame->flg = 0x80; /* User stack */ + if ( !new_level ) /* interrupt level 0 --> enabled */ + frame->flg |= 0x40; + frame->a0 = 0x01020304; + frame->a1 =0xa1a2a3a4; + frame->r0r2 = 0; + frame->r1r3 = 0; +#if defined(__r8c_cpu__) + #warning "not implemented on R8C" +#else + frame->frameLow = (uint16_t) (((uint32_t)frame) & 0xffff); + frame->frameHigh = (uint16_t) (((uint32_t)frame >> 16) & 0xffff); + frame->startLow = (uint16_t) (((uint32_t)entry_point) & 0xffff); + frame->startHigh = (uint16_t) (((uint32_t)entry_point >> 16) & 0xffff); +#endif + the_context->sp = (uintptr_t)frame; + the_context->fb = (uintptr_t)&frame->frameLow; +} |