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

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

initial

File size: 8.4 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-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: cpu_support.S,v 1.16 2005/11/12 14:58:46 hiro Exp $
51 */
52
53/*
54 * プロセッサ依存モジュール アセンブリ言語部(M68040用)
55 */
56
57#define _MACRO_ONLY
58#include "jsp_kernel.h"
59#include "offset.h"
60
61/*
62 * タスクディスパッチャ
63 *
64 * dispatch は,マスタモード・割込み禁止状æ…
65‹ã§å‘¼ã³å‡ºã•ãªã‘ればならな
66 * い.exit_and_dispatch も,マスタモード・割込み禁止状æ…
67‹ã§å‘¼ã³å‡ºã™ã®
68 * が原則であるが,カーネル起動時に対応するため,割込みモードで呼び出
69 * した場合にも対応している.
70 */
71 .text
72 .globl dispatch
73 .globl exit_and_dispatch
74dispatch:
75 movem.l %d2-%d7/%a2-%a6, -(%sp) /* レジスタを保存 */
76 move.l runtsk, %a0 /* A0 を runtsk に */
77 move.l %sp, TCB_msp(%a0) /* タスクスタックを保存 */
78 move.l #dispatch_r, TCB_pc(%a0) /* 実行再開番地を保存 */
79 jbra dispatcher
80
81dispatch_r:
82 movem.l (%sp)+, %d2-%d7/%a2-%a6 /* レジスタを復帰 */
83 btst.b #TCB_enatex_bit, TCB_enatex(%a0)
84 jbeq dispatch_r_1 /* enatex が FALSE ならリターン */
85 tst.l TCB_texptn(%a0) /* texptn が 0 でなければ */
86 jbne call_texrtn /* タスク例外処理ルーチンの呼出し */
87dispatch_r_1:
88 rts
89
90exit_and_dispatch:
91 or.w #0x1000, %sr /* マスタモード */
92dispatcher:
93 /*
94 * ここではマスタモード・割込み禁止状æ…
95‹ã§ãªã‘ればならない.
96 */
97 move.l schedtsk, %a0
98 move.l %a0, runtsk /* schedtsk を runtsk に */
99 jbeq dispatcher_1 /* runtsk があるか? */
100 move.l TCB_msp(%a0), %sp /* タスクスタックを復帰 */
101 move.l TCB_pc(%a0), %a1 /* 実行再開番地を復帰 */
102 jmp (%a1)
103dispatcher_1:
104 stop #0x2000 /* 割込み待
105ち(割込みモード) */
106 /*
107 * ここで割込みモードに切り換えるのは,ここで発生する割込み処理
108 * にどのスタックを使うかという問題の解決と,割込みハンドラ内
109で
110 * のタスクディスパッチの防止という2つの意味がある.
111 *
112 * この stop命令は,IPM を 0 にするが,本来は task_intmask に
113 * 設定すべきである.M68040 では,stop 命令のパラメータに定数
114 * しかとれないため,やむをえず 0 にしている(stop 命令を 8つ
115 * 並べて,task_intmask の値で飛び分ける手はあるが,そこまで
116 * やる意義はないと考えた).
117 *
118 * プロセッサを待
119ちモードに移行させる処理と,割込み許可とは,
120 * 不可分に行なう必
121要がある(M68040 では stop命令で両方行なう
122 * ので問題ない).これを不可分に行なわない場合,割込みを許可
123 * した直後に割込みがå…
124¥ã‚Šï¼Œãã®ä¸­ã§ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œå¯èƒ½çŠ¶æ…
125‹ã«ãªã‚‹
126 * と,実行すべきタスクがあるにもかかわらずプロセッサが待
127ちモー
128 * ドになってしまう.
129 *
130 * 割込みを待
131つ間は,runtsk を NULL(=0)に設定しなければなら
132 * ない.このように設定しないと,割込みハンドラから iget_tid
133 * を呼び出した際の動作が仕様に合致しなくなる.
134 */
135 or.w #0x1700, %sr /* マスタモード・割込み禁止 */
136 tst.l reqflg /* reqflg が FALSE なら */
137 jbeq dispatcher_1 /* dispatcher_1 へ */
138 clr.l reqflg /* reqflg を FALSE に */
139 jbra dispatcher
140
141/*
142 * タスク起動時処理
143 */
144 .text
145 .globl activate_r
146activate_r:
147 /*
148 * タスク起動直後はタスク例外処理が禁止されているため,ここでタ
149 * スク例外処理ルーチンを呼び出す条件は成り立たない.
150 */
151#ifdef SUPPORT_CHG_IPM /* t_unlock_cpu 相当の処理 */
152 move.w %sr, %d0 /* 割込みマスクを task_intmask に */
153 and.w #~0x0700, %d0
154 or.w task_intmask, %d0
155 move.w %d0, %sr
156#else /* SUPPORT_CHG_IPM */
157 and.w #~0x0700, %sr /* 割込み許可 */
158#endif /* SUPPORT_CHG_IPM */
159 move.l (%sp)+, %a0 /* タスクの起動番地を a0 に */
160 jmp (%a0)
161
162/*
163 * 割込みハンドラ/CPU例外ハンドラ出口処理
164 *
165 * ret_int は割込みモード・割込み禁止状æ…
166‹ã§ï¼Œret_exc はマスタモード・
167 * 割込み禁止状æ…
168‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.また ret_exc は,スクラッ
169 * チレジスタを保存した状æ…
170‹ã§å‘¼ã³å‡ºã™ã“と.
171 */
172 .text
173 .globl ret_int
174 .globl ret_exc
175ret_int:
176 addq.l #8, %sp /* スローアウェイフレームを捨てる */
177 or.w #0x1000, %sr /* マスタモード */
178 movem.l %d0-%d1/%a0-%a1, -(%sp) /* スクラッチレジスタを保存 */
179ret_exc:
180 clr.l reqflg /* reqflg を FALSE に */
181 move.l runtsk, %a0 /* A0 ← runtsk */
182 tst.l enadsp /* enadsp が FALSE なら */
183 jbeq ret_int_1 /* ret_int_1 へ */
184 cmp.l schedtsk, %a0 /* runtsk と schedtsk が同じなら */
185 jbeq ret_int_1 /* ret_int_1 へ */
186 movem.l %d2-%d7/%a2-%a6, -(%sp) /* 残りのレジスタを保存 */
187 move.l %sp, TCB_msp(%a0) /* タスクスタックを保存 */
188 move.l #ret_int_r, TCB_pc(%a0) /* 実行再開番地を保存 */
189 jbra dispatcher
190
191ret_int_r:
192 movem.l (%sp)+, %d2-%d7/%a2-%a6 /* レジスタを復帰 */
193ret_int_1:
194 btst.b #TCB_enatex_bit, TCB_enatex(%a0)
195 jbeq ret_int_2 /* enatex が FALSE ならリターン */
196 tst.l TCB_texptn(%a0) /* texptn が 0 ならリターン */
197 jbeq ret_int_2
198 jsr call_texrtn /* タスク例外処理ルーチンの呼出し */
199ret_int_2:
200#ifdef SUPPORT_CHG_IPM
201 move.w 16(%sp), %d0 /* 戻りå…
202ˆã®å‰²è¾¼ã¿ãƒžã‚¹ã‚¯ã‚’ */
203 and.w #~0x0700, %d0 /* task_intmask に */
204 or.w task_intmask, %d0
205 move.w %d0, 16(%sp)
206#endif /* SUPPORT_CHG_IPM */
207 movem.l (%sp)+, %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */
208 rte
209
210/*
211 * 微少時間待
212ち
213 */
214 .globl _sil_dly_nse
215_sil_dly_nse:
216 subi.l #SIL_DLY_TIM1, %d0 /* D0 から SIL_DLY_TIM1 を引く */
217 jbhi _sil_dly_nse_1 /* 結果が 0 以下ならリターン */
218 rts
219_sil_dly_nse_1:
220 subi.l #SIL_DLY_TIM2, %d0 /* D0 から SIL_DLY_TIM2 を引く */
221 jbhi _sil_dly_nse_1 /* 結果が 0 より大きければループ */
222 rts
Note: See TracBrowser for help on using the repository browser.