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