1 /* 2 * File : stack.c 3 * This file is part of RT-Thread RTOS 4 * COPYRIGHT (C) 2006-2011, RT-Thread Development Team 5 * 6 * The license and distribution terms for this file may be 7 * found in the file LICENSE in this distribution or at 8 * http://www.rt-thread.org/license/LICENSE 9 * 10 * Change Logs: 11 * Date Author Notes 12 * 2011-02-14 Fred first implementation for 13 */ 14 15 #include <rtthread.h> 16 17 /** 18 * @addtogroup PowerPC 19 */ 20 /*@{*/ 21 22 /** 23 * This function will initialize thread stack 24 * 25 * @param tentry the entry of thread 26 * @param parameter the parameter of entry 27 * @param stack_addr the beginning stack address 28 * @param texit the function will be called when thread exit 29 * 30 * @return stack address 31 */ 32 rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, 33 rt_uint8_t *stack_addr, void *texit) 34 { 35 unsigned long *stk; 36 rt_uint32_t msr; 37 38 __asm__ __volatile__("mfmsr %0\n" : "=r" (msr)); 39 msr |= 0x00028000; 40 41 stk = (unsigned long *)stack_addr; 42 --stk; 43 *(--stk) = msr; /* srr0: machine status register */ 44 *(--stk) = (rt_uint32_t)tentry; /* srr1: entry point */ 45 *(--stk) = (rt_uint32_t)texit; /* lr: link register */ 46 *(--stk) = 0x0F0F0F0F; /* ctr: counter register */ 47 *(--stk) = 0x0F0F0F0F; /* xer: fixed-point exception register */ 48 *(--stk) = 0x0F0F0F0F; /* cr : condition register */ 49 *(--stk) = 0x00; /* usprg0 */ 50 51 *(--stk) = 0x31; /* r31 */ 52 *(--stk) = 0x30; /* r30 */ 53 *(--stk) = 0x29; /* r29 */ 54 *(--stk) = 0x28; /* r28 */ 55 *(--stk) = 0x27; /* r27 */ 56 *(--stk) = 0x26; /* r26 */ 57 *(--stk) = 0x25; /* r25 */ 58 *(--stk) = 0x24; /* r24 */ 59 *(--stk) = 0x23; /* r23 */ 60 *(--stk) = 0x22; /* r22 */ 61 *(--stk) = 0x21; /* r21 */ 62 *(--stk) = 0x20; /* r20 */ 63 *(--stk) = 0x19; /* r19 */ 64 *(--stk) = 0x18; /* r18 */ 65 *(--stk) = 0x17; /* r17 */ 66 *(--stk) = 0x16; /* r16 */ 67 *(--stk) = 0x15; /* r15 */ 68 *(--stk) = 0x14; /* r14 */ 69 *(--stk) = 0x13; /* r13: thread id */ 70 *(--stk) = 0x12; /* r12 */ 71 *(--stk) = 0x11; /* r11 */ 72 *(--stk) = 0x10; /* r10 */ 73 *(--stk) = 0x09; /* r09 */ 74 *(--stk) = 0x08; /* r08 */ 75 *(--stk) = 0x07; /* r07 */ 76 *(--stk) = 0x06; /* r06 */ 77 *(--stk) = 0x05; /* r05 */ 78 *(--stk) = 0x04; /* r04 */ 79 *(--stk) = (rt_uint32_t)parameter; /* r03: parameter and return */ 80 *(--stk) = 0x02; /* r02: toc */ 81 /* r01: sp */ 82 *(--stk) = 0x0; /* r00 */ 83 84 /* return task's current stack address */ 85 return (rt_uint8_t *)stk; 86 } 87 88 /*@}*/ 89