xref: /nrf52832-nimble/rt-thread/libcpu/ppc/common/stack.c (revision 104654410c56c573564690304ae786df310c91fc)
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*10465441SEvalZero rt_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