xref: /nrf52832-nimble/rt-thread/libcpu/ppc/common/stack.c (revision 042d53a763ad75cb1465103098bb88c245d95138)
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