1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2011-09-23     Bernard      the first version
9  * 2011-10-05     Bernard      add thumb mode
10  */
11 #include <rtthread.h>
12 #include <board.h>
13 #include <armv7.h>
14 
15 /**
16  * @addtogroup AM33xx
17  */
18 /*@{*/
19 
20 /**
21  * This function will initialize thread stack
22  *
23  * @param tentry the entry of thread
24  * @param parameter the parameter of entry
25  * @param stack_addr the beginning stack address
26  * @param texit the function will be called when thread exit
27  *
28  * @return stack address
29  */
rt_hw_stack_init(void * tentry,void * parameter,rt_uint8_t * stack_addr,void * texit)30 rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
31 	rt_uint8_t *stack_addr, void *texit)
32 {
33 	rt_uint32_t *stk;
34 
35 	stk 	 = (rt_uint32_t*)stack_addr;
36 	*(stk) 	 = (rt_uint32_t)tentry;			/* entry point */
37 	*(--stk) = (rt_uint32_t)texit;			/* lr */
38 	*(--stk) = 0;							/* r12 */
39 	*(--stk) = 0;							/* r11 */
40 	*(--stk) = 0;							/* r10 */
41 	*(--stk) = 0;							/* r9 */
42 	*(--stk) = 0;							/* r8 */
43 	*(--stk) = 0;							/* r7 */
44 	*(--stk) = 0;							/* r6 */
45 	*(--stk) = 0;							/* r5 */
46 	*(--stk) = 0;							/* r4 */
47 	*(--stk) = 0;							/* r3 */
48 	*(--stk) = 0;							/* r2 */
49 	*(--stk) = 0;							/* r1 */
50 	*(--stk) = (rt_uint32_t)parameter;		/* r0 : argument */
51 
52 	/* cpsr */
53 	if ((rt_uint32_t)tentry & 0x01)
54 		*(--stk) = SVCMODE | 0x20;			/* thumb mode */
55 	else
56 		*(--stk) = SVCMODE;					/* arm mode   */
57 
58 	/* return task's current stack address */
59 	return (rt_uint8_t *)stk;
60 }
61 
62 /*@}*/
63