source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/v850/cpu_support.S@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 10.7 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * Copyright (C) 2005 by Freelines CO.,Ltd
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件か,Free Software Foundation
13 * によってå…
14¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
15 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
16 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
18 * 利用と呼ぶ)することを無償で許諾する.
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21 * スコード中に含まれていること.
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
25å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
26 * 者
27マニュアルなど)に,上記の著作権表示,この利用条件および下記
28 * の無保証規定を掲載すること.
29 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30 * 用できない形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
32 * と.
33 * (a) 再é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
35マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再é…
38å¸ƒã®å½¢æ…
39‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
40 * 報告すること.
41 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
42 * 害からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
49 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
50 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
51 *
52 * @(#) $Id: cpu_support.S,v 1.10 2007/01/05 02:10:17 honda Exp $
53 */
54
55/*
56 * プロセッサ依存モジュール アセンブリ言語部(V850ES用)
57 */
58
59#define _MACRO_ONLY
60#include "v850asm.inc"
61#include "jsp_kernel.h"
62#include "offset.h"
63
64/*
65 * タスクディスパッチャ
66 */
67Function __kernel_dispatch
68
69 /*
70 * コンテキストの退避
71 */
72 Push ep
73 addi -120, sp, sp
74 mov sp, ep
75 sst.w r1, 116[ep]
76 sst.w r2, 112[ep]
77 sst.w r3, 108[ep]
78 sst.w r4, 104[ep]
79 sst.w r5, 100[ep]
80 sst.w r6, 96[ep]
81 sst.w r7, 92[ep]
82 sst.w r8, 88[ep]
83 sst.w r9, 84[ep]
84 sst.w r10, 80[ep]
85 sst.w r11, 76[ep]
86 sst.w r12, 72[ep]
87 sst.w r13, 68[ep]
88 sst.w r14, 64[ep]
89 sst.w r15, 60[ep]
90 sst.w r16, 56[ep]
91 sst.w r17, 52[ep]
92 sst.w r18, 48[ep]
93 sst.w r19, 44[ep]
94 sst.w r20, 40[ep]
95 sst.w r21, 36[ep]
96 sst.w r22, 32[ep]
97 sst.w r23, 28[ep]
98 sst.w r24, 24[ep]
99 sst.w r25, 20[ep]
100 sst.w r26, 16[ep]
101 sst.w r27, 12[ep]
102 sst.w r28, 8[ep]
103 sst.w r29, 4[ep]
104 sst.w r31, 0[ep]
105
106 /* スタックと次の起動番地を保存 */
107 Lea __kernel_runtsk, ep
108 sld.w 0[ep], ep
109 sst.w sp, TCB_sp[ep]
110 Lea dispatch_r, r10
111 sst.w r10, TCB_pc[ep]
112 stsr psw, r10
113 sst.w r10, TCB_psw[ep]
114
115 /*
116 * 次のタスクの準備 __kernel_dispatch_1
117 * ここは割り込み禁止状æ…
118‹ã§æ¥ã‚‹å¿…
119要がある。
120 */
121Label __kernel_dispatch_1
122 /* runtsk = schedtsk */
123 Lea __kernel_schedtsk, r10
124 ld.w 0[r10], r10
125 Lea __kernel_runtsk, r11
126 st.w r10, 0[r11]
127 cmp r10,r0
128 bne 1f
129
130 /*
131 * 起動すべきタスクはない...アイドルループ
132 */
133
134 /* 割り込みスタックに切り替え */
135 Lea STACKTOP, sp
136 /* intnestを1にする */
137 mov r0, r10
138 add 1, r10
139 Lea _intnest, r11
140 st.w r10, 0[r11]
141
142 /* 割り込み待
143ち */
144 ei
145 nop
146 nop
147 nop
148 nop
149 nop
150 nop
151 nop
152 di
153
154 /* intnestをクリアする */
155 Lea _intnest, r10
156 st.w r0, 0[r10]
157
158 br __kernel_dispatch_1
159
1601:
161 /* スタックと次の起動番地を復帰 */
162 mov r10, ep
163 sld.w TCB_pc[ep], r31
164 sld.w TCB_sp[ep], sp
165 sld.w TCB_psw[ep], r10
166 ldsr r10, psw
167 jmp r31
168
169 /* ディスパッチャの復帰ルーチン */
170Label dispatch_r
171 Lea __kernel_runtsk, r10
172 ld.w 0[r10], r10
173 ld.w TCB_enatex[r10], r11
174 tst1 TCB_enatex_bit, 0[r11]
175 be 1f
176 ld.w TCB_texptn[r10], r11
177 cmp r0, r11
178 be 1f
179
180 /* タスク例外 */
181 jarl __kernel_calltex, r31
1821:
183 mov sp, ep
184 sld.w 116[ep], r1
185 sld.w 112[ep], r2
186 sld.w 108[ep], r3
187 sld.w 104[ep], r4
188 sld.w 100[ep], r5
189 sld.w 96[ep], r6
190 sld.w 92[ep], r7
191 sld.w 88[ep], r8
192 sld.w 84[ep], r9
193 sld.w 80[ep], r10
194 sld.w 76[ep], r11
195 sld.w 72[ep], r12
196 sld.w 68[ep], r13
197 sld.w 64[ep], r14
198 sld.w 60[ep], r15
199 sld.w 56[ep], r16
200 sld.w 52[ep], r17
201 sld.w 48[ep], r18
202 sld.w 44[ep], r19
203 sld.w 40[ep], r20
204 sld.w 36[ep], r21
205 sld.w 32[ep], r22
206 sld.w 28[ep], r23
207 sld.w 24[ep], r24
208 sld.w 20[ep], r25
209 sld.w 16[ep], r26
210 sld.w 12[ep], r27
211 sld.w 8[ep], r28
212 sld.w 4[ep], r29
213 sld.w 0[ep], r31
214 addi 120, ep, sp
215 Pop ep
216 jmp r31
217
218/*
219 * タスク起動時処理
220 */
221Function __kernel_activate_r
222
223 Lea __kernel_runtsk, ep
224 ld.w 0[ep], ep
225 ld.w TCB_tinib[ep], ep
226 ld.w TINIB_exinf[ep], r6
227 ld.w TINIB_task[ep], r10
228 Lea _ext_tsk, r31
229
230 ei
231
232 jmp r10
233
234/*
235 * 現在のコンテキストを捨ててディスパッチ
236 * CPUロック状æ…
237‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない
238 */
239Function __kernel_exit_and_dispatch
240 di
241 Lea _intnest, r10
242 st.w r0, 0[r10]
243 br __kernel_dispatch_1
244
245
246.extern _InterruptHandlerEntry
247.extern __kernel_runtsk
248.extern __kernel_calltex
249
250/*
251 * 割込みハンドラ
252 */
253Function vector_handler
254
255 /* 作業領域の作成 */
256 addi -16, sp, sp
257 st.w ep, 12[sp]
258 st.w r10, 8[sp]
259 st.w r11, 4[sp]
260 st.w r12, 0[sp]
261
262 /*
263 * ハンドラ起動番地の読み出し
264 * R10 : ハンドラの番地
265 */
266 stsr ecr, r10
267 shr 2, r10
268 add -4, r10
269 Lea _InterruptHandlerEntry, r11
270 add r10, r11
271 ld.w 0[r11], r10
272
273 /* ハンドラが無ければ即終了 */
274 cmp r0,r10
275 bne 1f
276
277 /* 割り込みハンドラが登録されていない場合:
278 ここでr6を破壊して、Cの関数を呼んでいるから他のレジスタも破壊
279 される可能性が強いが、たいてい、cpu_experr()の中でhaltさせて
280 いるか無限ループしているのでこの関数からは戻ってこない。戻って
281 くるようにしたいなら他のレジスタも保存したほうがよい */
282 stsr ecr, r6
283 jarl _cpu_experr, r31
284 br end_handler
285
2861:
287 /*
288 * 残りのレジスタ退避
289 */
290 addi -116, sp, ep
291 mov ep, sp /* スタックに反映 */
292 sst.w r1, 112[ep]
293 sst.w r2, 108[ep]
294 sst.w r3, 104[ep]
295 sst.w r4, 100[ep]
296 sst.w r5, 96[ep]
297 sst.w r6, 92[ep]
298 sst.w r7, 88[ep]
299 sst.w r8, 84[ep]
300 sst.w r9, 80[ep]
301 sst.w r13, 76[ep]
302 sst.w r14, 72[ep]
303 sst.w r15, 68[ep]
304 sst.w r16, 64[ep]
305 sst.w r17, 60[ep]
306 sst.w r18, 56[ep]
307 sst.w r19, 52[ep]
308 sst.w r20, 48[ep]
309 sst.w r21, 44[ep]
310 sst.w r22, 40[ep]
311 sst.w r23, 36[ep]
312 sst.w r24, 32[ep]
313 sst.w r25, 28[ep]
314 sst.w r26, 24[ep]
315 sst.w r27, 20[ep]
316 sst.w r28, 16[ep]
317 sst.w r29, 12[ep]
318 sst.w r31, 8[ep]
319 stsr eipc, r6 /* 多重割込み対策 */
320 sst.w r6 , 4[ep]
321 stsr eipsw, r6
322 sst.w r6 , 0[ep]
323
324 /* 多重割り込みチェックとネストカウンタをインクリメント */
325 Lea _intnest, r11
326 ld.w 0[r11], r6
327 add 1, r6
328 st.w r6, 0[r11]
329 cmp 1, r6
330 ble 1f
331
332 /* 多重割込み...すでに割り込みスタックになっている */
333 jr 2f
3341:
335 /* 多重割込みでない */
336 /* スタック切り替え */
337 mov sp, r11
338 Lea STACKTOP, sp
339 Push r11
340
341 Lea end_int, r31
342 /* 割り込み許可 */
343 ei
344 /* ハンドラ起動 */
345 jmp r10
346
347 /*
348 * 割り込みからの復帰処理
349 */
350Label end_int
351 /* 割り込み禁止 */
352 di
353
354 /* スタックの復帰 */
355 ld.w 0[sp], sp
356
357 /* intnestをディクリメント */
358 Lea _intnest, r11
359 ld.w 0[r11], r10
360 mov 1, r11
361 sub r11, r10
362 Lea _intnest, r11
363 st.w r10, 0[r11]
364
365 /*
366 * タスクディスパッチャ要求があるか?
367 */
368 Lea __kernel_reqflg, r10
369 ld.w 0[r10], r11
370 cmp r0, r11
371 bz recover_from_int
372 st.w r0, 0[r10]
373 jr ret_int
374
3752:
376 Lea end_int_nest, r31
377 /* 割り込み許可 */
378 ei
379 /* ハンドラ起動 */
380 jmp r10
381
382 /*
383 * 割り込みからの復帰処理
384 */
385Label end_int_nest
386 /* 割り込み禁止 */
387 di
388
389 /* intnestをディクリメント */
390 Lea _intnest, r11
391 ld.w 0[r11], r10
392 mov 1, r11
393 sub r11, r10
394 Lea _intnest, r11
395 st.w r10, 0[r11]
396
397recover_from_int:
398 /*
399 * レジスタ復帰
400 */
401 mov sp, ep
402
403 sld.w 112[ep], r1
404 sld.w 108[ep], r2
405 sld.w 104[ep], r3
406 sld.w 100[ep], r4
407 sld.w 96[ep], r5
408 sld.w 92[ep], r6
409 sld.w 88[ep], r7
410 sld.w 84[ep], r8
411 sld.w 80[ep], r9
412 sld.w 76[ep], r13
413 sld.w 72[ep], r14
414 sld.w 68[ep], r15
415 sld.w 64[ep], r16
416 sld.w 60[ep], r17
417 sld.w 56[ep], r18
418 sld.w 52[ep], r19
419 sld.w 48[ep], r20
420 sld.w 44[ep], r21
421 sld.w 40[ep], r22
422 sld.w 36[ep], r23
423 sld.w 32[ep], r24
424 sld.w 28[ep], r25
425 sld.w 24[ep], r26
426 sld.w 20[ep], r27
427 sld.w 16[ep], r28
428 sld.w 12[ep], r29
429 sld.w 8[ep], r31
430 sld.w 4[ep], r10
431 ldsr r10, eipc
432 sld.w 0[ep], r10
433 ldsr r10, eipsw
434
435 addi 116, ep, sp
436
437
438end_handler:
439 /*
440 * 作業領域の復帰
441 */
442 addi 16, sp, sp
443 ld.w -4[sp], ep
444 ld.w -8[sp], r10
445 ld.w -12[sp], r11
446 ld.w -16[sp], r12
447 reti
448
449
450/*
451 * 割り込みにともなうタスクディスパッチの判定
452 */
453ret_int:
454 /* ディスパッチ禁止? */
455 Lea __kernel_enadsp, r10
456 ld.w 0[r10], r10
457 cmp r0, r10
458 be ret_int_r
459
460 /* タスク切り替えの必
461要があるか? */
462 Lea __kernel_schedtsk, r10
463 ld.w 0[r10], r10
464 Lea __kernel_runtsk, r11
465 ld.w 0[r11], r11
466 cmp r10,r11
467 be ret_int_r
468
469 /* TCBの中身を修正して復帰情
470報を設定 */
471 mov ep, r11
472 Lea __kernel_runtsk, ep
473 sld.w 0[ep], ep /* ep = _kernel_runtsk */
474
475 sst.w sp, TCB_sp[ep]
476 Lea ret_int_r, r10
477 sst.w r10, TCB_pc[ep]
478 stsr psw, r10
479 sst.w r10, TCB_psw[ep]
480 mov r11, ep
481
482 /* タスクディスパッチャへ */
483 stsr eipsw, r10
484 ori 0x20, r10, r10
485 ldsr r10, eipsw
486 Lea __kernel_dispatch_1, r10
487 ldsr r10, eipc
488 reti
489
490ret_int_r:
491 di
492
493 Lea __kernel_runtsk, r10
494 ld.w 0[r10], r10
495 ld.w TCB_enatex[r10], r11
496 tst1 TCB_enatex_bit, 0[r11]
497 be 1f
498 ld.w TCB_texptn[r10], r11
499 cmp r0, r11
500 be 1f
501
502 /* タスク例外 */
503 jarl __kernel_calltex, r31
5041:
505 /* おおもとの復帰処理へ飛ばす */
506 jr recover_from_int
507
508/*
509 * CPUロック状æ…
510‹ã®å–å¾—
511 *
512 * 割込み禁止ならCPUロック状æ…
513‹
514 */
515Function _sense_lock
516 stsr psw, r10
517 shr 5, r10
518 andi 1, r10, r10
519 jmp r31
520
521
Note: See TracBrowser for help on using the repository browser.