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

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

initial

File size: 14.0 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 * Copyright (C) 2007 by KURUSUGAWA Electronics Industry Inc, JAPAN
9 * Copyright (C) 2008 by Takahisa Yokota
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.16 2005/11/12 14:58:46 hiro Exp $
53 */
54
55/*
56 * プロセッサ依存モジュール アセンブリ言語部(MCF52235用)
57 */
58
59#define _MACRO_ONLY
60#include "jsp_kernel.h"
61#include "offset.h"
62
63/*
64 * タスクディスパッチャ
65 *
66 * dispatch は,マスタモード・割込み禁止状æ…
67‹ã§å‘¼ã³å‡ºã•ãªã‘ればならな
68 * い.exit_and_dispatch も,マスタモード・割込み禁止状æ…
69‹ã§å‘¼ã³å‡ºã™ã®
70 * が原則であるが,カーネル起動時に対応するため,割込みモードで呼び出
71 * した場合にも対応している.
72 */
73 .text
74 .globl dispatch
75 .globl exit_and_dispatch
76dispatch:
77 lea -44(%sp), %sp
78 movem.l %d2-%d7/%a2-%a6, (%sp) /* レジスタを保存 */
79 move.l runtsk, %a0 /* A0 を runtsk に */
80 move.l %sp, TCB_msp(%a0) /* タスクスタックを保存 */
81 move.l #dispatch_r, %d2
82 move.l %d2, TCB_pc(%a0) /* 実行再開番地を保存 */
83 jbra dispatcher
84
85dispatch_r:
86 movem.l (%sp), %d2-%d7/%a2-%a6 /* レジスタを復帰 */
87 lea 44(%sp), %sp
88 btst.b #TCB_enatex_bit, TCB_enatex(%a0)
89 jbeq dispatch_r_1 /* enatex が FALSE ならリターン */
90 tst.l TCB_texptn(%a0) /* texptn が 0 でなければ */
91 jbne call_texrtn /* タスク例外処理ルーチンの呼出し */
92dispatch_r_1:
93 rts
94
95exit_and_dispatch:
96 clr.l intnest
97
98dispatcher:
99 /*
100 * ここではマスタモード・割込み禁止状æ…
101‹ã§ãªã‘ればならない.
102 */
103 move.l schedtsk, %a0
104 move.l %a0, runtsk /* schedtsk を runtsk に */
105 jbeq dispatcher_1 /* runtsk があるか? */
106 move.l TCB_msp(%a0), %sp /* タスクスタックを復帰 */
107 move.l TCB_pc(%a0), %a1 /* 実行再開番地を復帰 */
108 jmp (%a1)
109dispatcher_1:
110 addq.l #1, intnest
111 move.l #STACKTOP, %sp
112 stop #0x2000 /* 割込み待
113ち(割込みモード) */
114 /*
115 * ここで割込みモードに切り換えるのは,割込みハンドラ内
116で
117 * のタスクディスパッチの防止という2つの意味がある.
118 *
119 * この stop命令は,IPM を 0 にするが,本来は task_intmask に
120 * 設定すべきである.M68040 では,stop 命令のパラメータに定数
121 * しかとれないため,やむをえず 0 にしている(stop 命令を 8つ
122 * 並べて,task_intmask の値で飛び分ける手はあるが,そこまで
123 * やる意義はないと考えた).
124 *
125 * プロセッサを待
126ちモードに移行させる処理と,割込み許可とは,
127 * 不可分に行なう必
128要がある(M68040 では stop命令で両方行なう
129 * ので問題ない).これを不可分に行なわない場合,割込みを許可
130 * した直後に割込みがå…
131¥ã‚Šï¼Œãã®ä¸­ã§ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œå¯èƒ½çŠ¶æ…
132‹ã«ãªã‚‹
133 * と,実行すべきタスクがあるにもかかわらずプロセッサが待
134ちモー
135 * ドになってしまう.
136 *
137 * 割込みを待
138つ間は,runtsk を NULL(=0)に設定しなければなら
139 * ない.このように設定しないと,割込みハンドラから iget_tid
140 * を呼び出した際の動作が仕様に合致しなくなる.
141 */
142 move.w #0x2700, %sr /* 割込み禁止 */
143 clr.l intnest
144 tst.l reqflg /* reqflg が FALSE なら */
145 jbeq dispatcher_1 /* dispatcher_1 へ */
146 clr.l reqflg /* reqflg を FALSE に */
147 jbra dispatcher
148
149/*
150 * no_reg_exception()
151 * CPU例外として登録されていない例外が発生すると呼び出される
152 * 例外が発生した時点のpc,sr,pr,r0〜15を出力してカーネル
153 * を停止する。
154 */
155 .text
156 .align 2
157 .globl no_reg_exception
158no_reg_exception:
159 move.l %a7, %sp@-
160 move.l %a6, %sp@-
161 move.l %a5, %sp@-
162 move.l %a4, %sp@-
163 move.l %a3, %sp@-
164 move.l %a2, %sp@-
165 move.l %a1, %sp@-
166 move.l %a0, %sp@-
167 move.l %d7, %sp@-
168 move.l %d6, %sp@-
169 move.l %d5, %sp@-
170 move.l %d4, %sp@-
171 move.l %d3, %sp@-
172 move.l %d2, %sp@-
173 move.l %d1, %sp@-
174 move.l %d0, %sp@-
175 move.l %sp, %sp@-
176 jbsr cpu_experr
177
178/*
179 * タスク起動時処理
180 */
181 .text
182 .globl activate_r
183activate_r:
184 /*
185 * タスク起動直後はタスク例外処理が禁止されているため,ここでタ
186 * スク例外処理ルーチンを呼び出す条件は成り立たない.
187 */
188#ifdef SUPPORT_CHG_IPM /* t_unlock_cpu 相当の処理 */
189 move.w %sr, %d0 /* 割込みマスクを task_intmask に */
190 and.l #~0x00000700, %d0
191 clr.l %d1
192 move.w task_intmask, %d1
193 or.l %d1, %d0
194 move.w %d0, %sr
195#else /* SUPPORT_CHG_IPM */
196 move.w %sr, %d0
197 and.l #~0x00000700, %d0 /* 割込み許可 */
198 move.w %d0, %sr
199#endif /* SUPPORT_CHG_IPM */
200 move.l (%sp)+, %a0 /* タスクの起動番地を a0 に */
201 jmp (%a0)
202
203/**
204 *
205 * CPU例外のå…
206¥å£å‡¦ç†ã®ç¶šã
207 *
208 * CPU例外ハンドラは,非タスクコンテキストで実行する.そのため,CPU例
209 * 外ハンドラを呼び出す前に割込みモードに移行し,リターンしてきた後に
210 * å…
211ƒã®ãƒ¢ãƒ¼ãƒ‰ã«æˆ»ã™ï¼Žå…
212ƒã®ãƒ¢ãƒ¼ãƒ‰ã«æˆ»ã™ãŸã‚ã«ï¼Œå‰²è¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã«ç§»è¡Œã™ã‚‹å‰
213 * の SR を割込みスタック上に保存する.CPU例外がタスクコンテキストで
214 * 発生し,reqflg が TRUE になった時に,ret_exc へ分岐する.
215 * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
216 * に起動された割込みハンドラ内
217でディスパッチが要求された場合に,ディ
218 * スパッチされない.
219 *  
220 * 一般不当命令の場合は戻り番地を2バイト進める必
221要があるが
222 * 対応していない
223 * (GDB stubがブレークポイントとして使用する。)
224 *  
225 *   CPU例外要因毎に展開されるルーチンでr0,r1を保存し、
226 *   割込み禁止にした後、
227 *    d1:割込み受付直後のSRのコピー
228 *    a0:C言語ルーチンのå…
229ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
230 *   の状æ…
231‹ã§ã“こに来る。
232 *   
233 *   レジスタ割当
234 *    r4:C言語ルーチンの引数
235 *      スタック上に積まれたSRのアドレス
236 *    r7:タスクスタックポインタ
237 */
238 .text
239 .align 2
240 .globl cpu_exception_entry
241cpu_exception_entry:
242 /* 割込み/CPU例外ネストカウンタのチェック */
243 tst.l intnest /* CPU例外発生時のコンテキストを判定 */
244 bne _exc_from_int /* 多重例外ならジャンプ */
245 addq.l #1, intnest
246
247 /* 初段のCPU例外の場合 */
248 /* スタックå…
249¥ã‚Œæ›¿ãˆå‰ã® */
250 /* タスクスタックポインタを保存 */
251 move.l %sp, %a1
252 /* 割込みスタックに切り替え */
253 move.l #STACKTOP, %sp
254 move.l %a1,-(%sp) /*   */
255 move.w %d1, %sr /* 割込み許可 */
256 /* タスクスタックポインタを */
257 /* 割込みスタックに積む */
258 jsr (%a0) /* C言語ルーチン呼び出し */
259
260 move.l #(MAX_IPM << 8), %d0 /* 割込み禁止 */
261 ori.l #0x00003000, %d0
262 move.w %d0, %sr
263 /* 割込み/CPU例外ネストカウンタをクリア */
264 clr.l intnest
265 move.l (%sp),%sp /* スタック切替え */
266 /* reqflgのチェック */
267 tst.l reqflg
268 jbne ret_exc
269 movem.l (%sp), %d0-%d1/%a0-%a1
270 adda.l #16,%sp
271 rte
272
273/*
274 * 割込みの口処理の続き
275 *
276 *   割込み要因毎に展開されるルーチンでr0,r1を保存し、
277 *   割込み禁止にした後、
278 *    d1:割込み受付直後のSRのコピー
279 *    a0:C言語ルーチンのå…
280ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
281 *   の状æ…
282‹ã§ã“こに来る。
283 *   
284 *   レジスタ割当
285 *    r7:タスクスタックポインタ
286 */
287 .text
288 .align 2
289 .globl interrupt_entry
290interrupt_entry:
291 /* 割込み/CPU例外ネストカウンタのチェック */
292 tst.l intnest /* 多重割込みならジャンプ */
293 bne _interrupt_from_int
294 addq.l #1, intnest /* 割込みネストカウンタをインクリメント */
295
296 /* 初段の割込みの場合 */
297 /* スタックå…
298¥ã‚Œæ›¿ãˆå‰ã® */
299 /* タスクスタックポインタを保存 */
300 move.l %sp, %a1 /* 割込みスタックに切り替え */
301 move.l #STACKTOP, %sp
302 move.l %a1,-(%sp) /* タスクスタックポインタを */
303 move.w %d1, %sr /* 割込み許可 */
304 /* 割込みスタックに積む */
305 jsr (%a0) /* C言語ルーチン呼び出し */
306 /* 割込み禁止 */
307 move.l #(MAX_IPM << 8), %d0
308 ori.l #0x00002000, %d0
309 move.w %d0, %sr /* 割込み禁止 */
310 /* 割込み/CPU例外ネストカウンタをクリア*/
311 clr.l intnest
312 move.l (%sp),%sp /* スタック切替え */
313 /* reqflgのチェック */
314 tst.l reqflg
315 jbne ret_int
316 movem.l (%sp), %d0-%d1/%a0-%a1
317 adda.l #16,%sp
318 rte
319
320/* 多重割込みの場合 */
321/* 割込み発生時のコンテキストを判別後、 */
322/* 割込み禁止 */
323/* a0:C言語ルーチンのå…
324ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ */
325/* d0:割り込みネスト回数 */
326/*     d1:割込み受付直後のSRのコピー */
327/* の状æ…
328‹ã§ã“こに飛んでくる */
329_exc_from_int:
330_interrupt_from_int:
331 addq.l #1, intnest /* 割込みネストカウンタをインクリメント */
332 move.w %d1,%sr /* 割込み許可 */
333
334 jsr (%a0) /* C言語ルーチン呼び出し */
335
336 move.l #(MAX_IPM << 8), %d0
337 ori.l #0x00002000, %d0
338 move.w %d0, %sr /* 割込み禁止 */
339 /* 割込み/CPU例外ネストカウンタをディクリメント */
340 subq.l #1, intnest
341 movem.l (%sp), %d0-%d1/%a0-%a1
342 adda.l #16,%sp
343 rte
344
345/*
346 * 割込みハンドラ/CPU例外ハンドラ出口処理
347 *
348 * ret_int は割込み禁止状æ…
349‹ã§ï¼Œret_exc はマスタモード・
350 * 割込み禁止状æ…
351‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.また ret_exc は,スクラッ
352 * チレジスタを保存した状æ…
353‹ã§å‘¼ã³å‡ºã™ã“と.
354 */
355 .text
356 .align 2
357ret_int:
358ret_exc:
359 clr.l reqflg /* reqflg を FALSE に */
360 move.l runtsk, %a0 /* A0 ← runtsk */
361 tst.l enadsp /* enadsp が FALSE なら */
362 jbeq ret_int_1 /* ret_int_1 へ */
363 cmp.l schedtsk, %a0 /* runtsk と schedtsk が同じなら */
364 jbeq ret_int_1 /* ret_int_1 へ */
365 lea -44(%sp), %sp
366 movem.l %d2-%d7/%a2-%a6, (%sp) /* 残りのレジスタを保存 */
367 move.l %sp, TCB_msp(%a0) /* タスクスタックを保存 */
368 move.l #ret_int_r, %d2
369 move.l %d2, TCB_pc(%a0) /* 実行再開番地を保存 */
370 jbra dispatcher
371ret_int_r:
372 movem.l (%sp), %d2-%d7/%a2-%a6 /* レジスタを復帰 */
373 lea 44(%sp), %sp
374ret_int_1:
375 btst.b #TCB_enatex_bit, TCB_enatex(%a0)
376 jbeq ret_int_2 /* enatex が FALSE ならリターン */
377 tst.l TCB_texptn(%a0) /* texptn が 0 ならリターン */
378 jbeq ret_int_2
379 jsr call_texrtn /* タスク例外処理ルーチンの呼出し */
380ret_int_2:
381#ifdef SUPPORT_CHG_IPM
382 move.l 16(%sp), %d0 /* 戻りå…
383ˆã®å‰²è¾¼ã¿ãƒžã‚¹ã‚¯ã‚’ */
384 and.l #~0x00000700, %d0 /* task_intmask に */
385 clr.l %d1
386 move.w task_intmask, %d1
387 or.l %d1, %d0
388 move.l %d0, 16(%sp)
389#endif /* SUPPORT_CHG_IPM */
390 movem.l (%sp), %d0-%d1/%a0-%a1 /* スクラッチレジスタを復帰 */
391 adda.l #16, %sp
392 rte
393
394/*
395 * 微少時間待
396ち
397 */
398 .globl _sil_dly_nse
399_sil_dly_nse:
400 subi.l #SIL_DLY_TIM1, %d0 /* D0 から SIL_DLY_TIM1 を引く */
401 jbhi _sil_dly_nse_1 /* 結果が 0 以下ならリターン */
402 rts
403_sil_dly_nse_1:
404 subi.l #SIL_DLY_TIM2, %d0 /* D0 から SIL_DLY_TIM2 を引く */
405 jbhi _sil_dly_nse_1 /* 結果が 0 より大きければループ */
406 rts
Note: See TracBrowser for help on using the repository browser.