69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * Copyright (c) 2006-2021, RT-Thread Development Team | ||
|  |  * | ||
|  |  * SPDX-License-Identifier: Apache-2.0 | ||
|  |  * | ||
|  |  * Change Logs: | ||
|  |  * Date           Author       Notes | ||
|  |  * 2011-01-13     weety      copy from mini2440 | ||
|  |  */ | ||
|  | #include <rtthread.h>
 | ||
|  | 
 | ||
|  | /*****************************/ | ||
|  | /* CPU Mode                  */ | ||
|  | /*****************************/ | ||
|  | #define USERMODE        0x10
 | ||
|  | #define FIQMODE         0x11
 | ||
|  | #define IRQMODE         0x12
 | ||
|  | #define SVCMODE         0x13
 | ||
|  | #define ABORTMODE       0x17
 | ||
|  | #define UNDEFMODE       0x1b
 | ||
|  | #define MODEMASK        0x1f
 | ||
|  | #define NOINT           0xc0
 | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * This function will initialize thread stack | ||
|  |  * | ||
|  |  * @param tentry the entry of thread | ||
|  |  * @param parameter the parameter of entry | ||
|  |  * @param stack_addr the beginning stack address | ||
|  |  * @param texit the function will be called when thread exit | ||
|  |  * | ||
|  |  * @return stack address | ||
|  |  */ | ||
|  | rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, | ||
|  |                              rt_uint8_t *stack_addr, void *texit) | ||
|  | { | ||
|  |     rt_uint32_t *stk; | ||
|  | 
 | ||
|  |     stack_addr += sizeof(rt_uint32_t); | ||
|  |     stack_addr  = (rt_uint8_t *)RT_ALIGN_DOWN((rt_uint32_t)stack_addr, 8); | ||
|  |     stk      = (rt_uint32_t *)stack_addr; | ||
|  | 
 | ||
|  |     *(--stk) = (rt_uint32_t)tentry;         /* entry point */ | ||
|  |     *(--stk) = (rt_uint32_t)texit;          /* lr */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r12 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r11 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r10 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r9 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r8 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r7 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r6 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r5 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r4 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r3 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r2 */ | ||
|  |     *(--stk) = 0xdeadbeef;                  /* r1 */ | ||
|  |     *(--stk) = (rt_uint32_t)parameter;      /* r0 : argument */ | ||
|  | 
 | ||
|  |     /* cpsr */ | ||
|  |     if ((rt_uint32_t)tentry & 0x01) | ||
|  |         *(--stk) = SVCMODE | 0x20;          /* thumb mode */ | ||
|  |     else | ||
|  |         *(--stk) = SVCMODE;                 /* arm mode   */ | ||
|  | 
 | ||
|  |     /* return task's current stack address */ | ||
|  |     return (rt_uint8_t *)stk; | ||
|  | } | ||
|  | 
 |