xref: /nrf52832-nimble/rt-thread/libcpu/mips/loongson_1b/cpuport.c (revision 104654410c56c573564690304ae786df310c91fc)
1 /*
2  * File      : cpuport.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  * 2010-07-09     Bernard      first version
13  * 2010-09-11     Bernard      add CPU reset implementation
14  */
15 
16 #include <rtthread.h>
17 #include "ls1b.h"
18 
19 /**
20  * @addtogroup Loongson LS1B
21  */
22 
23 /*@{*/
24 
25 /**
26  * this function will reset CPU
27  *
28  */
rt_hw_cpu_reset(void)29 void rt_hw_cpu_reset(void)
30 {
31 	/* open the watch-dog */
32 	WDT_EN = 0x01; 		/* watch dog enable */
33 	WDT_TIMER = 0x01;	/* watch dog will be timeout after 1 tick */
34 	WDT_SET = 0x01;		/* watch dog start */
35 
36 	rt_kprintf("reboot system...\n");
37 	while (1);
38 }
39 
40 /**
41  * this function will shutdown CPU
42  *
43  */
rt_hw_cpu_shutdown(void)44 void rt_hw_cpu_shutdown(void)
45 {
46 	rt_kprintf("shutdown...\n");
47 
48 	while (1);
49 }
50 
51 extern rt_uint32_t cp0_get_cause(void);
52 extern rt_uint32_t cp0_get_status(void);
53 extern rt_uint32_t cp0_get_hi(void);
54 extern rt_uint32_t cp0_get_lo(void);
55 
56 /**
57  * This function will initialize thread stack
58  *
59  * @param tentry the entry of thread
60  * @param parameter the parameter of entry
61  * @param stack_addr the beginning stack address
62  * @param texit the function will be called when thread exit
63  *
64  * @return stack address
65  */
rt_hw_stack_init(void * tentry,void * parameter,rt_uint8_t * stack_addr,void * texit)66 rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit)
67 {
68 	rt_uint32_t *stk;
69     static rt_uint32_t g_sr = 0;
70 
71     if (g_sr == 0)
72     {
73     	g_sr = cp0_get_status();
74     	g_sr &= 0xfffffffe;
75     	g_sr |= 0x8401;
76     }
77 
78     /** Start at stack top */
79     stk = (rt_uint32_t *)stack_addr;
80 	*(stk)   = (rt_uint32_t) tentry;        /* pc: Entry Point */
81 	*(--stk) = (rt_uint32_t) 0xeeee; 		/* c0_cause */
82 	*(--stk) = (rt_uint32_t) 0xffff;		/* c0_badvaddr */
83 	*(--stk) = (rt_uint32_t) cp0_get_lo();	/* lo */
84 	*(--stk) = (rt_uint32_t) cp0_get_hi();	/* hi */
85 	*(--stk) = (rt_uint32_t) g_sr; 			/* C0_SR: HW2 = En, IE = En */
86 	*(--stk) = (rt_uint32_t) texit;	        /* ra */
87 	*(--stk) = (rt_uint32_t) 0x0000001e;	/* s8 */
88 	*(--stk) = (rt_uint32_t) stack_addr;	/* sp */
89 	*(--stk) = (rt_uint32_t) 0x0000001c;	/* gp */
90 	*(--stk) = (rt_uint32_t) 0x0000001b;	/* k1 */
91 	*(--stk) = (rt_uint32_t) 0x0000001a;	/* k0 */
92 	*(--stk) = (rt_uint32_t) 0x00000019;	/* t9 */
93 	*(--stk) = (rt_uint32_t) 0x00000018;	/* t8 */
94 	*(--stk) = (rt_uint32_t) 0x00000017;	/* s7 */
95 	*(--stk) = (rt_uint32_t) 0x00000016;	/* s6 */
96 	*(--stk) = (rt_uint32_t) 0x00000015;	/* s5 */
97 	*(--stk) = (rt_uint32_t) 0x00000014;	/* s4 */
98 	*(--stk) = (rt_uint32_t) 0x00000013;	/* s3 */
99 	*(--stk) = (rt_uint32_t) 0x00000012;	/* s2 */
100 	*(--stk) = (rt_uint32_t) 0x00000011;	/* s1 */
101 	*(--stk) = (rt_uint32_t) 0x00000010;	/* s0 */
102 	*(--stk) = (rt_uint32_t) 0x0000000f;	/* t7 */
103 	*(--stk) = (rt_uint32_t) 0x0000000e;	/* t6 */
104 	*(--stk) = (rt_uint32_t) 0x0000000d;	/* t5 */
105 	*(--stk) = (rt_uint32_t) 0x0000000c;	/* t4 */
106 	*(--stk) = (rt_uint32_t) 0x0000000b;	/* t3 */
107 	*(--stk) = (rt_uint32_t) 0x0000000a; 	/* t2 */
108 	*(--stk) = (rt_uint32_t) 0x00000009;	/* t1 */
109 	*(--stk) = (rt_uint32_t) 0x00000008;	/* t0 */
110 	*(--stk) = (rt_uint32_t) 0x00000007;	/* a3 */
111 	*(--stk) = (rt_uint32_t) 0x00000006;	/* a2 */
112 	*(--stk) = (rt_uint32_t) 0x00000005;	/* a1 */
113 	*(--stk) = (rt_uint32_t) parameter;	    /* a0 */
114 	*(--stk) = (rt_uint32_t) 0x00000003;	/* v1 */
115 	*(--stk) = (rt_uint32_t) 0x00000002;	/* v0 */
116 	*(--stk) = (rt_uint32_t) 0x00000001;	/* at */
117 	*(--stk) = (rt_uint32_t) 0x00000000;	/* zero */
118 
119 	/* return task's current stack address */
120 	return (rt_uint8_t *)stk;
121 }
122 
123 /*@}*/
124 
125