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

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

initial

File size: 26.1 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) 2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2010 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
14 * 再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
17 * 表示,この利用条件および下記の無保証規定が,そのままの形でソース
18 * コード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
20 * できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
23マ
24 * ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
25 * 証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
27 * できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこと.
29 * (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著作
32 * 権表示,この利用条件および下記の無保証規定を掲載すること.
33 * (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに報
36 * 告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
38 * からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.また,
41 * 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
42 * く請求からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47およ
48 * びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
49 * る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
50 * により直接的または間接的に生じたいかなる損害に関しても,その責任を負
51 * わない.
52 */
53
54/*
55 * プロセッサ依存モジュール アセンブリ言語部(Xstormy16用)
56 */
57
58#define _MACRO_ONLY
59#include <offset.h>
60#include <cpu_sfrs.h>
61
62/*
63 * タスク・割り込み・例外管理用RAM領域
64 */
65 .section .data_0,"aw"
66
67 /*
68 * 割り込み・例外ネストカウンタ
69 * (カーネル起動時を非タスクコンテキストと
70 * して扱うため初期値を1とする)
71 */
72 .global _kernel_intnest
73_kernel_intnest:
74 .hword 1
75
76 /*
77 * 割り込みハンドラテーブル
78 * (UART割り込みを含め17個)
79 */
80 .global _kernel_ih_table
81_kernel_ih_table:
82 .hword 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
83
84 /*
85 * 例外ハンドラテーブル
86 * (未定義命令/奇数番地ワードアクセス/
87 * メモリ外/reserved)
88 */
89 .global _kernel_eh_table
90_kernel_eh_table:
91 .hword 0,0,0,0
92
93/*
94 * 割り込みベクトル
95 * (このsectionは8000h-8083hにリンクされる)
96 */
97 .section .int_vec,"ax"
98 .global _start
99 .align 1
100_start:
101 clr1 psw,#7
102 br _kernel_int_irq_0
103 clr1 psw,#7
104 br _kernel_int_irq_1
105 clr1 psw,#7
106 br _kernel_int_irq_2
107 clr1 psw,#7
108 br _kernel_int_irq_3
109 clr1 psw,#7
110 br _kernel_int_irq_4
111 clr1 psw,#7
112 br _kernel_int_irq_5
113 clr1 psw,#7
114 br _kernel_int_irq_6
115 clr1 psw,#7
116 br _kernel_int_irq_7
117 clr1 psw,#7
118 br _kernel_int_irq_8
119 clr1 psw,#7
120 br _kernel_int_irq_9
121 clr1 psw,#7
122 br _kernel_int_irq_a
123 clr1 psw,#7
124 br _kernel_int_irq_b
125 clr1 psw,#7
126 br _kernel_int_irq_c
127 clr1 psw,#7
128 br _kernel_int_irq_d
129 clr1 psw,#7
130 br _kernel_int_irq_e
131 clr1 psw,#7
132 br _kernel_int_irq_f
133 .org 0x80
134 jmpf _kernel_int_irq_ex
135
136/*
137 * 割り込みハンドラå…
138¥ã‚Šå£
139 */
140_kernel_int_irq_0:
141 /*
142 * ワッチドッグタイマ割り込みかRESETかの判断
143 */
144 bn __WDTCR,#4,_after_reset
145 bp __WDTCR,#5,_after_reset
146 push r0
147 mov r0,#_kernel_ih_table+0
148 br _int_common
149_after_reset:
150 jmpf _int_reset
151_kernel_int_irq_1:
152 push r0
153 mov r0,#_kernel_ih_table+2
154 br _int_common
155_kernel_int_irq_2:
156 push r0
157 mov r0,#_kernel_ih_table+4
158 br _int_common
159_kernel_int_irq_3:
160 push r0
161 mov r0,#_kernel_ih_table+6
162 br _int_common
163_kernel_int_irq_4:
164 push r0
165 mov r0,#_kernel_ih_table+8
166 br _int_common
167_kernel_int_irq_5:
168 push r0
169 mov r0,#_kernel_ih_table+10
170 br _int_common
171_kernel_int_irq_6:
172 push r0
173 mov r0,#_kernel_ih_table+12
174 br _int_common
175_kernel_int_irq_7:
176 push r0
177 mov r0,#_kernel_ih_table+14
178 br _int_common
179_kernel_int_irq_8:
180 push r0
181 mov r0,#_kernel_ih_table+16
182 br _int_common
183_kernel_int_irq_9:
184 push r0
185 mov r0,#_kernel_ih_table+18
186 br _int_common
187_kernel_int_irq_a:
188 push r0
189 mov r0,#_kernel_ih_table+20
190 br _int_common
191_kernel_int_irq_b:
192 push r0
193 mov r0,#_kernel_ih_table+22
194 br _int_common
195_kernel_int_irq_c:
196 push r0
197 mov r0,#_kernel_ih_table+24
198 br _int_common
199_kernel_int_irq_d:
200 push r0
201 mov r0,#_kernel_ih_table+26
202 br _int_common
203_kernel_int_irq_e:
204 push r0
205 mov r0,#_kernel_ih_table+28
206 br _int_common
207_kernel_int_irq_f:
208 push r0
209 mov r0,#_kernel_ih_table+30
210 br _int_common
211
212/*
213 * 割り込みハンドラå…
214¥ã‚Šå£å‡¦ç†
215 */
216_int_common:
217 /*
218 * r1/r2の退避(r0は退避済み)
219 */
220 push r1
221 push r2
222 /*
223 * ネストした割り込みかどうかチェック
224 */
225 mov r1,_kernel_intnest
226 bz interrupt_from_task
227
228/*
229 * ネストした割り込みの処理
230 */
231 /*
232 * ネストカウンタをインクリメントし、
233 * 上位の割り込みを許可
234 */
235 inc r1
236 mov _kernel_intnest,r1
237 set1 psw,#7
238 /*
239 * r3-r9(caller saved register)の退避
240 */
241 push r3
242 push r4
243 push r5
244 push r6
245 push r7
246 push r8
247 push r9
248 /*
249 * 割り込みハンドラの呼び出し
250 */
251 mov r1,(r0)
252 bz 1f
253 mov r8,#0
254 call r8,r1
2551:
256 /*
257 * r1-r9の復å…
258ƒ
259 */
260 pop r9
261 pop r8
262 pop r7
263 pop r6
264 pop r5
265 pop r4
266 pop r3
267 pop r2
268 pop r1
269 /*
270 * ネストカウンタをデクリメントし、
271 * 割り込まれたå…
272ƒã®å‰²ã‚Šè¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã¸æˆ»ã‚‹
273 */
274 clr1 psw,#7
275 mov r0,_kernel_intnest
276 dec r0
277 mov _kernel_intnest,r0
278 pop r0
279 iret
280
281/*
282 * ネストしていない割り込みの処理
283 */
284interrupt_from_task:
285 /*
286 * ネストカウンタをインクリメント
287 */
288 mov _kernel_intnest,#1
289 /*
290 * スタックを非タスク用に切り替え、上位
291 * 割り込みを許可
292 */
293 mov r1,sp
294 mov sp,#__stack
295 set1 psw,#7
296 /*
297 * r3-r9(caller saved register)を
298 * タスク側スタックに退避
299 */
300 mov (r1++),r3
301 mov (r1++),r4
302 mov (r1++),r5
303 mov (r1++),r6
304 mov (r1++),r7
305 mov r3,r8
306 mov (r1++),r3
307 mov r3,r9
308 mov (r1++),r3
309 /*
310 * タスク側スタックポインタを割り込み用
311 * スタックに退避
312 */
313 push r1
314 /*
315 * 割り込みハンドラの呼び出し
316 */
317 mov r1,(r0)
318 bz 1f
319 mov r8,#0
320 call r8,r1
3211:
322 /*
323 * 割り込みを禁止
324 */
325 clr1 psw,#7
326
327/*
328 * 割り込み、例外å…
329±é€šã®å‡ºå£å‡¦ç†
330 */
331ret_int_and_exc:
332 /*
333 * タスク用スタックに戻す
334 */
335 pop r1
336 mov sp,r1
337 /*
338 * ネストカウンタをデクリメント
339 */
340 mov _kernel_intnest,#0
341 /*
342 * reqflgをチェックし、FALSEなら、å…
343ƒã®
344 * タスクに戻る処理にジャンプ
345 */
346 mov r0,#_kernel_reqflg
347 mov r1,(r0)
348 bz ret_to_task_int
349
350/*
351 * 割り込み中にタスクの切り替え要求が発生した場合の処理
352 */
353 /*
354 * reqflgをクリア
355 */
356 mov r1,#0
357 mov (r0),r1
358 /*
359 * ディスパッチ禁止か、runtsk=schedtsk
360 * なら、å…
361ƒã®ã‚¿ã‚¹ã‚¯ã«æˆ»ã‚‹å‡¦ç†ã¸
362 */
363 mov r0,#_kernel_enadsp
364 mov r1,(r0)
365 bz ret_int_1
366 mov r0,#_kernel_runtsk
367 mov r1,(r0)
368 mov r2,#_kernel_schedtsk
369 mov r3,(r2)
370 bz r1,r3,ret_int_1
371 /*
372 * タスクの切り替えのため、r10-13/spを退避
373 */
374 push r10
375 push r11
376 push r12
377 push r13
378 mov r7,sp
379 mov (r1,+TCB_sp),r7 /* r1 points runtsk */
380 /*
381 * mode=1(ret_int_rに戻る)を設定し
382 * ディスパッチャへ
383 */
384 mov r7,#1
385 mov (r1,+TCB_mode),r7
386 br dispatcher
387
388/*
389 * 割り込み中のディスパッチからの復帰処理
390 */
391ret_int_r:
392
393 /*
394 * r10-13を復å…
395ƒ
396 */
397 pop r13
398 pop r12
399 pop r11
400 pop r10
401
402/*
403 * å…
404ƒã®ã‚¿ã‚¹ã‚¯ã«æˆ»ã‚‹å‡¦ç†
405 */
406ret_int_1:
407 mov r0,#_kernel_runtsk
408 mov r1,(r0)
409 /*
410 * タスク例外ハンドラ許可のチェック
411 */
412 mov.b r7,(r1,+TCB_enatex)
413 bn r7,#TCB_enatex_bit,ret_to_task_int
414 /*
415 * タスク例外発生のチェック
416 */
417 mov r7,(r1,+TCB_texptn)
418 bz ret_to_task_int
419 /*
420 * タスク例外ハンドラの呼び出し
421 */
422 callf _kernel_call_texrtn
423 /*
424 * r0-r9を復å…
425ƒã—、å…
426ƒã®ã‚¿ã‚¹ã‚¯ã«æˆ»ã‚‹
427 */
428ret_to_task_int:
429 pop r9
430 pop r8
431 pop r7
432 pop r6
433 pop r5
434 pop r4
435 pop r3
436 pop r2
437 pop r1
438 pop r0
439 iret
440
441/*
442 * 例外ハンドラå…
443¥ã‚Šå£
444 */
445 .global _kernel_int_irq_ex
446_kernel_int_irq_ex:
447 push r0
448 /*
449 * UART例外は割り込みとして処理
450 */
451 bn __U0CR,#0,1f /* UART0 RxRdy */
452 bn __U0CR,#1,1f
453 mov r0,#_kernel_ih_table+32
454 br _int_common
4551:
456 bn __U0CR,#2,2f /* UART0 TxEmpty */
457 bn __U0CR,#3,2f
458 mov r0,#_kernel_ih_table+32
459 br _int_common
4602:
461 bn __U1CR,#0,3f /* UART1 RxRdy */
462 bn __U1CR,#1,3f
463 mov r0,#_kernel_ih_table+32
464 br _int_common
4653:
466 bn __U1CR,#2,4f /* UART1 TxEmpty */
467 bn __U1CR,#3,4f
468 mov r0,#_kernel_ih_table+32
469 br _int_common
4704:
471 /*
472 * r1,r2を退避し、r2に例外発生時のSPを設定
473 * (例外ハンドラへの引数)
474 */
475 push r1
476 push r2
477 mov r2,sp
478 sub r2,#6
479 /*
480 * 発生した例外を判定/クリアする
481 */
482 bn __EXCPL,#1,5f /* undefined instruction */
483 set1 psw,#11
484 clr1 __EXCPL,#1
485 clr1 psw,#11
486 mov r0,#_kernel_eh_table+0
487 br _exc_common
4885:
489 bn __EXCPL,#3,6f /* word access to odd address */
490 set1 psw,#11
491 clr1 __EXCPL,#3
492 clr1 psw,#11
493 mov r0,#_kernel_eh_table+2
494 br _exc_common
4956:
496 bn __EXCPL,#5,7f /* acccess out of mamoey range */
497 set1 psw,#11
498 clr1 __EXCPL,#5
499 clr1 psw,#11
500 mov r0,#_kernel_eh_table+4
501 br _exc_common
5027:
503 mov r0,#_kernel_eh_table+6 /* unknown exception */
504 br _exc_common
505
506/*
507 * 例外ハンドラå…
508¥ã‚Šå£å‡¦ç†
509 */
510_exc_common:
511 /*
512 * ネストした例外かどうかチェック
513 * (例外は、他の割り込みにネストされる
514 * ことは無いので、割り込み禁止処理は
515 * 不要)
516 */
517 mov r1,_kernel_intnest
518 bz exception_from_task
519
520/*
521 * ネストした例外の処理
522 */
523 /*
524 * ネストカウンタをインクリメント
525 */
526 inc r1
527 mov _kernel_intnest,r1
528 /*
529 * r3-r9(caller saved register)の退避
530 */
531 push r3
532 push r4
533 push r5
534 push r6
535 push r7
536 push r8
537 push r9
538 /*
539 * 例外ハンドラの呼び出し
540 */
541 mov r1,(r0)
542 bz 1f
543 mov r8,#0
544 call r8,r1
5451:
546 /*
547 * r1-r9の復å…
548ƒ
549 */
550 pop r9
551 pop r8
552 pop r7
553 pop r6
554 pop r5
555 pop r4
556 pop r3
557 pop r2
558 pop r1
559 /*
560 * ネストカウンタをデクリメントし、
561 * 割り込まれたå…
562ƒã®å‰²ã‚Šè¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã¸æˆ»ã‚‹
563 */
564 mov r0,_kernel_intnest
565 dec r0
566 mov _kernel_intnest,r0
567 pop r0
568 iret
569
570/*
571 * ネストしていない例外の処理
572 */
573exception_from_task:
574 /*
575 * ネストカウンタをインクリメント
576 */
577 mov _kernel_intnest,#1
578 /*
579 * スタックを非タスク用に切り替える
580 */
581 mov r1,sp
582 mov sp,#__stack
583 /*
584 * r3-r9(caller saved register)を
585 * タスク側スタックに退避
586 */
587 mov (r1++),r3
588 mov (r1++),r4
589 mov (r1++),r5
590 mov (r1++),r6
591 mov (r1++),r7
592 mov r3,r8
593 mov (r1++),r3
594 mov r3,r9
595 mov (r1++),r3
596 /*
597 * タスク側スタックポインタを割り込み用
598 * スタックに退避
599 */
600 push r1
601 /*
602 * 例外ハンドラの呼び出し
603 */
604 mov r1,(r0)
605 bz 1f
606 mov r8,#0
607 call r8,r1
6081:
609 /*
610 * 割り込み・例外å…
611±é€šå‡ºå£å‡¦ç†ã¸
612 */
613 br ret_int_and_exc
614
615/*
616 * exit_and_dispatch()
617 * å…
618ƒã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’保存せず新しいタスクへ切り替える
619 * (カーネル開始後最初のタスクの起動を含む)
620 */
621 .global _kernel_exit_and_dispatch
622_kernel_exit_and_dispatch:
623 /*
624 * ネストカウンタをクリア
625 * (カーネル開始直後等、前に実行されていた
626 * タスクが無い場合、非タスクコンテキスト
627 * 実行中を示すため、ネストカウンタは1に
628 * なっている。これをクリア)
629 */
630 mov _kernel_intnest,#0
631 /*
632 * ディスパッチャでジャンプ
633 */
634 br dispatcher
635
636/*
637 * dispatch()
638 * å…
639ƒã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’保存し新しいタスクへ切り替える
640 */
641 .global _kernel_dispatch
642_kernel_dispatch:
643 /*
644 * r10-r14(callee-saved egister)を保存
645 */
646 push r10
647 push r11
648 push r12
649 push r13
650 push psw
651 /*
652 * SPをruntsk->tskctxb.spに保存
653 */
654 mov r0,#_kernel_runtsk
655 mov r1,(r0)
656 mov r7,sp
657 mov (r1,+TCB_sp),r7
658 /*
659 * mode=0(dispatch_rに戻る)を設定し
660 * ディスパッチャへ
661 */
662 mov r7,#0
663 mov (r1,+TCB_mode),r7
664 br dispatcher
665
666/*
667 * dispatch()からの戻り処理
668 * (r3はTCBを示す)
669 */
670dispatch_r:
671 /*
672 * r10-r14(callee-saved egister)を復å…
673ƒ
674 */
675 pop psw
676 pop r13
677 pop r12
678 pop r11
679 pop r10
680 /*
681 * タスク例外をチェックし、許可&
682 * 例外ありなら呼び出す
683 */
684 mov.b r7,(r3,+TCB_enatex)
685 bn r7,#TCB_enatex_bit,1f
686 mov r7,(r3,+TCB_texptn)
687 bz 1f
688 jmpf _kernel_call_texrtn
6891:
690 /*
691 * dispatch()を呼んだタスクに戻る
692 */
693 ret
694
695/*
696 * create_context()/activate_context()
697 * 新しいタスクの起動処理
698 * (r2はTCBを示す)
699 */
700 .global _kernel_create_context
701_kernel_create_context:
702 ret
703
704 .global _kernel_activate_context
705_kernel_activate_context:
706 /*
707 * スタックポインタを初期化
708 * tcb->tskctxb.sp=tcb->tinib->stk
709 */
710 mov r0,(r2,+TCB_tinib)
711 mov r1,(r0,+TINIB_stk)
712 mov (r2,+TCB_sp),r1
713 /*
714 * mode=2(activate_rに戻る)を設定
715 */
716 mov r1,#2
717 mov (r2,+TCB_mode),r1
718 ret
719
720/*
721 * activate_context()されたタスクの起動処理
722 * (r3はTCBを示す)
723 */
724activate_r:
725 /*
726 * タスクがreturnで終了したときに、
727 * ext_tsk()が呼ばれるよう、これを
728 * スタックに積む
729 */
730 mov r1,#@lo(ext_tsk)
731 push r1
732 mov r2,#@hi(ext_tsk)
733 push r2
734 /*
735 * タスク開始アドレスをスタックに積む
736 */
737 mov r0,(r3,+TCB_tinib)
738 mov r1,(r0,+TINIB_task)
739 push r1
740 mov r2,#0
741 push r2
742 /*
743 * PSW初期値をスタックに積む
744 */
745 mov r1,#0x0080
746 push r1
747 /*
748 * r2=exinf
749 */
750 mov r2,(r0,+TINIB_exinf)
751 /*
752 * タスク起動
753 */
754 iret
755
756/*
757 * ディスパッチャー
758 */
759dispatcher:
760 /*
761 * runtsk = schedtsk
762 */
763 mov r2,#_kernel_schedtsk
764 mov r3,(r2)
765 mov r0,#_kernel_runtsk
766 mov (r0),r3
767 /*
768 * schedtsk = NULL(実行可能なタスク無し)
769 * の場合、アイドル処理へ
770 */
771 bz dispatcher_1
772 /*
773 * SPを復å…
774ƒ
775 */
776 mov r7,(r3,+TCB_sp)
777 mov sp,r7
778 /*
779 * modeにしたがって、
780 * =0 : dispatch_r
781 * =1 : ret_int_r
782 * =2 : activate_r
783 */
784 mov r7,(r3,+TCB_mode)
785 bz dispatch_r
786 bz r7,#1,ret_int_r
787 br activate_r
788
789/*
790 * アイドル処理(実行可能タスク無し)
791 */
792dispatcher_1:
793 /*
794 * スタックを非タスク用に切り替える
795 */
796 mov sp,#__stack
797 /*
798 * 非タスクを示すために
799 * ネストカウンタに1をセット
800 */
801 mov _kernel_intnest,#1
802 /*
803 * タスク実行可能待
804ちのループ
805 */
806dispatcher_2:
807 /*
808 * 割り込みレベルを0に(IL=0)
809 */
810 mov psw,#0x0000
811 /*
812 * アイドルルーチンを呼び出す
813 */
814 callf _kernel_idle
815 /*
816 * タスクが実行可能になったかのチェック
817 * (reqflg=1?)
818 */
819 mov r0,#_kernel_reqflg
820 mov r1,(r0)
821 bz dispatcher_2
822 /*
823 * reqflgとネストカウンタをクリアし、
824 * ディスパッチャに戻る
825 */
826 mov r1,#0
827 mov (r0),r1
828 mov _kernel_intnest,#0
829 br dispatcher
830
831/*
832 * デフォルトのアイドルルーチン
833 */
834 .weak _kernel_idle
835_kernel_idle:
836 /*
837 * 割り込みを許可
838 */
839 set1 psw,#7
840 /*
841 * 割り込み待
842ち
843 */
844 halt
845 /*
846 * 割り込みを禁止
847 */
848 clr1 psw,#7
849 ret
850
851 .end
852
Note: See TracBrowser for help on using the repository browser.