1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
13:
14: #include <sys/machine.h>
15: #ifdef CPU_CORE_ARMV7M
16: 17: 18: 19:
20: #include "kernel.h"
21: #include "../../../sysdepend.h"
22:
23: #include "cpu_task.h"
24:
25:
26:
27: Noinit(EXPORT UB knl_tmp_stack[TMP_STACK_SIZE]);
28:
29:
30: EXPORT W knl_taskindp = 0;
31:
32:
33: 34: 35:
36: EXPORT void knl_set_reg( TCB *tcb, CONST T_REGS *regs, CONST T_EIT *eit, CONST T_CREGS *cregs )
37: {
38: SStackFrame *ssp;
39: INT i;
40:
41: #if USE_FPU
42: UW *tmpp;
43:
44: tmpp = (UW*)(( cregs != NULL )? cregs->ssp: tcb->tskctxb.ssp);
45: if(tcb->tskatr & TA_FPU) {
46: if(*tmpp & EXPRN_NO_FPU) {
47: ssp = (SStackFrame*)tmpp;
48: } else {
49: ssp = (SStackFrame*)(((SStackFrame_wFPU*)tmpp)->r_);
50: }
51: } else {
52: ssp = (SStackFrame*)tmpp;
53: }
54: #else
55: ssp = (SStackFrame*)(( cregs != NULL )? cregs->ssp: tcb->tskctxb.ssp);
56: #endif
57:
58: if ( regs != NULL ) {
59: for ( i = 0; i < 4; ++i ) {
60: ssp->r[i] = regs->r[i];
61: }
62: for ( i = 4; i < 12; ++i){
63: ssp->r_[i - 4] = regs->r[i];
64: }
65: }
66:
67: if ( eit != NULL ) {
68: ssp->pc = eit->pc;
69: }
70:
71: if ( cregs != NULL ) {
72: tcb->tskctxb.ssp = cregs->ssp;
73: }
74: }
75:
76:
77:
78: 79: 80:
81: EXPORT void knl_get_reg( TCB *tcb, T_REGS *regs, T_EIT *eit, T_CREGS *cregs )
82: {
83: SStackFrame *ssp;
84: INT i;
85:
86: #if USE_FPU
87: UW *tmpp;
88:
89: tmpp = (UW*)tcb->tskctxb.ssp;
90: if(tcb->tskatr & TA_FPU) {
91: if(*tmpp & EXPRN_NO_FPU) {
92: ssp = (SStackFrame*)tmpp;
93: } else {
94: ssp = (SStackFrame*)&(((SStackFrame_wFPU*)tmpp)->exp_ret);
95: }
96: } else {
97: ssp = (SStackFrame*)tmpp;
98: }
99: #else
100: ssp = (SStackFrame*)tcb->tskctxb.ssp;
101: #endif
102:
103: if ( regs != NULL ) {
104: for ( i = 0; i < 4; ++i ) {
105: regs->r[i] = ssp->r[i];
106: }
107: for ( i = 4; i < 12; ++i ){
108: regs->r[i] = ssp->r_[i - 4];
109: }
110: regs->r[12] = ssp->ip;
111: regs->lr = ssp->lr;
112: }
113:
114: if ( eit != NULL ) {
115: eit->pc = ssp->pc;
116: eit->taskmode = 0;
117: }
118:
119: if ( cregs != NULL ) {
120: cregs->ssp = tcb->tskctxb.ssp;
121: }
122: }
123:
124: #if USE_FPU
125: #ifdef USE_FUNC_TK_SET_CPR
126:
127: 128: 129:
130: EXPORT ER knl_set_cpr( TCB *tcb, INT copno, CONST T_COPREGS *copregs)
131: {
132: SStackFrame_wFPU *ssp;
133: INT i;
134:
135: ssp = (SStackFrame_wFPU*)(tcb->tskctxb.ssp);
136:
137: if(ssp->ufpu & EXPRN_NO_FPU ) {
138: return E_CTX;
139: }
140:
141: for ( i = 0; i < 16; ++i ) {
142: ssp->s[i] = copregs->s[i];
143: ssp->s_[i] = copregs->s[i + 16];
144: }
145: ssp->fpscr = copregs->fpscr;
146:
147: return E_OK;
148: }
149:
150: #endif
151:
152: #ifdef USE_FUNC_TK_GET_CPR
153:
154: 155: 156:
157: EXPORT ER knl_get_cpr( TCB *tcb, INT copno, T_COPREGS *copregs)
158: {
159: SStackFrame_wFPU *ssp;
160: INT i;
161:
162: ssp = (SStackFrame_wFPU*)(tcb->tskctxb.ssp);
163:
164: if(ssp->ufpu & EXPRN_NO_FPU ) {
165: return E_CTX;
166: }
167:
168: for ( i = 0; i < 16; ++i ) {
169: copregs->s[i] = ssp->s[i];
170: copregs->s[i + 16] = ssp->s_[i];
171: }
172: copregs->fpscr = ssp->fpscr;
173:
174: return E_OK;
175: }
176: #endif
177: #endif
178:
179:
180:
181: 182: 183:
184: EXPORT void knl_force_dispatch( void )
185: {
186: knl_dispatch_disabled = DDS_DISABLE_IMPLICIT;
187: knl_ctxtsk = NULL;
188: *(_UW*)SCB_ICSR = ICSR_PENDSVSET;
189: set_basepri(0);
190: }
191:
192: EXPORT void knl_dispatch( void )
193: {
194: *(_UW*)SCB_ICSR = ICSR_PENDSVSET;
195: }
196:
197: #endif