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

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

initial

File size: 28.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 *
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.37 2005/08/22 16:57:25 honda Exp $
51 */
52
53
54#define _MACRO_ONLY
55#include "jsp_kernel.h"
56#include "offset.h"
57#include <t_config.h>
58
59
60/*
61 * 例外/割り込み出å…
62¥ã‚Šå£å‡¦ç†ãƒ«ãƒ¼ãƒãƒ³
63 * SH3はベクタテーブルを持たず、例外,TRAPAが発生するとVBR+0x100番地を、
64 * 内
65部/外部/NMI割り込みが発生すると、VBR+0x600番地を実行する。
66 */
67
68/*
69 * VBR に設定する値
70 */
71 .section .text
72 .align 2
73 .global _BASE_VBR
74_BASE_VBR:
75 nop
76 nop
77 nop
78
79/*
80 * Exception 100 vector
81 * アドレスエラー,スロット不当命令例外、Trapa例外等が発生すると実行される。
82 *
83 * CPU例外ハンドラは、非タスクコンテキストで実行する、そのため、CPU例外ハン
84 * ドラを呼び出す前に例外/割り込みを示すレジスタバンク1の r7 レジスタをイン
85 * クメントし、リターンしてきた後にデクリメントする。CPU例外がタスクコンテキ
86 * ストで発生し、regflg が TRUE になった時に、 ret_exc へ分岐する。
87 * regflg をチェックする前に割り込みを禁止しないと、reqflg をチェック後に起
88 * 動された割り込みハンドラ内
89でディスパッチが要求された場合に、ディスパッチ
90 * されない。
91 *
92 *
93 * 例外が発生すると、例外発生å…
94ƒã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã‚ã‚‹spc,pr,ssr,r0〜r7を退避
95 * する。例外が発生した時点でのコンテキストを調べ非タスクコンテキストなら
96 * _exception_from_intから実行を開始する。例外の要因はEXPEVTレジスタ読み、
97 * exc_tableからCPU例外ハンドラの開始番地を読み込む。発生した例外に対して
98 * CPU例外ハンドラが登録されていなければ、_no_reg_exceptionにブランチして、
99 * ssr,sr,spc,prの内
100容を出力して停止する。CPU例外ハンドラからリターンして
101 * きたら、reqflgを調べ0以外ならrec_exc()に飛び、0ならå…
102ƒã®å‡¦ç†ã«ãƒªã‚¿ãƒ¼ãƒ³ã™
103 * る。
104 *
105 *
106 * BLビットの扱いについて
107 * ssr,spc に戻りå…
108ˆã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’戻して rte を発行する際には,割込み(NMI
109 * も含む)を受け付けないように BL ビットを1にする必
110要がある.例外/割込みハ
111 * ンドラ終了時には BL をビットを1にせず IPM を MAX_IPM に設定する.これは,
112 * BL ビットが1の場合に例外が発生すると CPU がリセットされることを考æ…
113®ã—て,
114 * 安å…
115¨ã®ãŸã‚ï¼Œssr,spcを復帰する直前でBLを1に設定している.
116 *
117 */
118
119
120 .org 0x0100 /* _BASE_VBR + 0x0100番地にé…
121ç½® */
122 .align 2
123 .global _general_exception
124_general_exception:
125 stc.l spc,@-r15 /* spc,pr,ssr をスタックに保存する */
126 sts.l pr,@-r15
127 stc.l ssr,@-r15
128 stc.l gbr,@-r15
129 sts.l macl,@-r15
130 sts.l mach,@-r15
131 stc.l r0_bank,@-r15 /* 例外発生時のr0〜r7を保存 */
132 stc.l r1_bank,@-r15
133 stc.l r2_bank,@-r15
134 stc.l r3_bank,@-r15
135 stc.l r4_bank,@-r15
136 stc.l r5_bank,@-r15
137 stc.l r6_bank,@-r15
138 stc.l r7_bank,@-r15
139 tst r7,r7 /* 例外発生å…
140ƒã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’判定 */
141 bf/s _exception_from_exc /* 発生å…
142ƒãŒä¾‹å¤–/割り込みハンドラならジャンプ */
143 add #0x01,r7 /* 例外/割り込みネスト回数をインクリメント */
144 mov r15,r1 /* 戻りå…
145ˆãŒå‰²ã‚Šè¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã§ãªã„のでスタッ */
146 mov.l _stacktop_exc,r15 /* クをå…
147¥ã‚Œæ›¿ãˆå…
148ƒã®ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ã‚’保存 */
149 mov.l r1,@-r15
150 mov.l _expevt,r0 /* 例外を許可すると消えるレジスタを保存 */
151 mov.l @r0,r5 /* EXPEVTレジスタを取得 */
152 ldc r1,r4_bank /* CPU例外ハンドラへの引数 */
153 ldc r5,r5_bank
154 mov.l _unmak_rb_bl_exc,r2 /* BLビットを0に,レジスタバンクを切り替え */
155 stc sr,r3
156 and r3,r2
157 ldc r2,sr
158 shlr2 r5 /* EXPEVTを3ビット右シフト */
159 shlr r5
160 mov.l _exc_table_exc,r0 /* exc_tableのアドレスをr0に */
161 mov.l @(r0,r5),r2 /* ハンドラのアドレスを取得 */
162 tst r2,r2 /* ハンドラが登録されていない例外なら */
163 bt _no_reg_exception /* no_reg_exceptionへジャンプ */
164 jsr @r2 /* CPU例外ハンドラへ */
165 nop
166 mov.l _mask_md_ipm_exc,r0
167 ldc r0,sr /* 割り込み禁止 */
168 stc r7_bank,r7 /* 例外/割り込みのネスト回数をデクリメント */
169 dt r7
170 ldc r7,r7_bank
171 mov.l _reqflg_exc,r2 /* reqflgのチェック */
172 mov.l @r2,r1
173 tst r1,r1 /* reqflgがFALSEならret_to_task_excに飛び */
174 bt/s _ret_to_task_exc /* タスクに戻る */
175 mov.l @r15,r15 /* 戻りå…
176ˆãŒã‚¿ã‚¹ã‚¯ãªã®ã§ã‚¹ã‚¿ãƒƒã‚¯ã‚’戻す */
177 xor r0,r0
178 bra ret_exc
179 mov.l r0,@r2 /* reqflgをクリア */
180
181
182/*
183 * exception_from_int
184 * CPU例外発生時のコンテキストが非タスクコンテキストの場合の処理
185 * タスクコンテキストの場合との処理の違いは、とCPU例外ハンドラの
186 * 処理が終了すると必
187ずå…
188ƒã®å‡¦ç†ã«æˆ»ã‚‹ã“とである。
189 */
190
191_exception_from_exc:
192 mov.l _expevt,r0 /* 例外を許可すると消えるレジスタを保存 */
193 mov.l @r0,r5 /* EXPEVTレジスタを取得 */
194 ldc r15,r4_bank /* CPU例外ハンドラへの引数 */
195 ldc r5,r5_bank
196 mov.l _unmak_rb_bl_exc,r2 /* BLビットを0に,レジスタバンクを切り替え */
197 stc sr,r3
198 and r3,r2
199 ldc r2,sr
200 shlr2 r5 /* EXPECTを3ビット右シフト */
201 shlr r5
202 mov.l _exc_table_exc,r0 /* exc_tableのアドレスをr0に */
203 mov.l @(r0,r5),r2 /* ハンドラのアドレスを取得 */
204 tst r2,r2 /* ハンドラが登録されていない例外なら */
205 bt _no_reg_exception /* no_reg_exceptionへジャンプ */
206 jsr @r2 /* CPU例外ハンドラへ */
207 nop
208 mov.l _mask_md_ipm_exc,r0
209 ldc r0,sr /* BL=1,割り込み禁止 */
210 stc r7_bank,r7 /* 例外/割り込みのネスト回数をデクリメント */
211 dt r7
212 ldc r7,r7_bank
213_ret_to_task_exc:
214 mov.l @r15+,r7 /* r0〜r1,ssr,pr,spcを復帰しタスクに戻る */
215 mov.l @r15+,r6
216 mov.l @r15+,r5
217 mov.l @r15+,r4
218 mov.l @r15+,r3
219 mov.l @r15+,r2
220 mov.l @r15+,r1
221 mov.l _mask_md_bl_exc,r0
222 ldc r0,sr /* BLを1に */
223 mov.l @r15+,r0
224 lds.l @r15+,mach
225 lds.l @r15+,macl
226 ldc.l @r15+,gbr
227 ldc.l @r15+,ssr
228 lds.l @r15+,pr
229 ldc.l @r15+,spc
230 rte
231 nop
232
233
234/*
235 * no_reg_exception()
236 * CPU例外として登録されていない例外が発生すると呼び出される
237 * 例外コード、例外が発生した時点のpc,sr,prを出力してカーネル
238 * を停止する。
239 */
240_no_reg_exception:
241 mov.l _expevt,r5
242 mov.l @r5,r4
243 stc spc,r5
244 stc ssr,r6
245 sts pr,r7
246 mov.l _cpu_expevt_k,r1
247 jsr @r1
248 nop
249
250 .align 4
251_stacktop_exc:
252 .long STACKTOP /* タスク独立部のスタックの初期値 */
253_expevt:
254 .long EXPEVT
255_exc_table_exc:
256 .long _exc_table
257_unmak_rb_bl_exc:
258 .long 0x4fffffff
259_mask_md_ipm_exc:
260 .long 0x40000000 + MAX_IPM << 4
261_reqflg_exc:
262 .long _reqflg
263_cpu_expevt_k:
264 .long _cpu_expevt
265_mask_md_bl_exc:
266 .long 0x50000000 + MAX_IPM << 4
267
268
269
270
271/*
272 * タスクディスパッチャ
273 *
274 * _dispatch は、r7_bank1 = 0,割込み禁止状æ…
275‹ã§å‘¼ã³å‡ºã•ãªã‘ればならな
276 * い._exit_and_dispatch も,r7_bank1 = 0・割込み禁止状æ…
277‹ã§å‘¼ã³å‡ºã™
278 * のが原則であるが,カーネル起動時に対応するため,r7_bank1 = 1で呼び
279 * 出した場合にも対応している.
280 */
281
282 .text
283 .align 2
284 .global _dispatch
285_dispatch:
286 sts.l pr,@-r15 /* pr,r8〜r15 をスタックに保存 */
287 mov.l r14,@-r15 /* r0〜r7は呼び出しå…
288ƒã§ä¿å­˜ã—ているため */
289 mov.l r13,@-r15 /* 保存する必
290要が無い */
291 mov.l r12,@-r15
292 mov.l r11,@-r15
293 mov.l r10,@-r15
294 mov.l r9, @-r15
295 mov.l r8, @-r15
296 mov.l _runtsk_dis,r2 /* r0 <- runtsk */
297 mov.l @r2,r0
298 mov.l r15,@(TCB_sp,r0) /* タスクスタックをTCBに保存 60以下ならOK*/
299 mov.l dispatch_r_k,r1 /* 実行再開番地を保存 */
300 mov.l r1,@(TCB_pc,r0) /* 実行再開番地をTCBに保存 60以下ならOK */
301 bra dispatcher
302 nop
303
304dispatch_r:
305 mov.l @r15+,r8 /* レジスタを復帰 */
306 mov.l @r15+,r9
307 mov.l @r15+,r10
308 mov.l @r15+,r11
309 mov.l @r15+,r12
310 mov.l @r15+,r13
311 mov.l @r15+,r14
312 lds.l @r15+,pr
313 /*
314 * タスク例外処理ルーチンの起動
315 * dispatch_rはdispatcherから呼び出されるため,
316 * tcbのアドレスはr0にå…
317¥ã£ã¦ã„る.
318 */
319 mov.l @(TCB_enatex,r0),r1
320 mov.l _enatex_mask_dis,r2
321 tst r1,r2
322 bt dispatch_r_1 /* enatex が FALSE ならリターン */
323 mov.l @(TCB_texptn,r0),r1 /* texptnをロード */
324 tst r1,r1
325 bt dispatch_r_1 /* texptn が 0で無ければ */
326 mov.l _call_texrtn_dis,r1 /* タスク例外ルーチンの呼び出し */
327 jmp @r1
328 nop
329dispatch_r_1:
330 rts
331 nop
332
333 .global _exit_and_dispatch
334_exit_and_dispatch:
335 xor r1,r1 /* r7_bank1を0クリア */
336 ldc r1,r7_bank
337dispatcher:
338 /*
339 * ここには割り込み禁止で来ること
340 */
341 mov.l _schedtsk_dis,r12 /* r0 <- schedtsk */
342 mov.l @r12,r0
343 mov.l _runtsk_dis,r2
344 mov.l r0,@r2 /* schedtskをruntskに */
345 cmp/eq #0,r0 /* schedtsk があるか? */
346 bt dispatcher_1 /* 無ければジャンプ */
347 mov.l @(TCB_sp,r0),r15 /* TCBからタスクスタックを復帰 */
348 mov.l @(TCB_pc,r0),r1 /* TCBから実行再開番地を復帰 */
349 jmp @r1
350 nop
351dispatcher_1:
352 /* イミディエイト値を毎回読み込むのは効率が悪いので事前に用意する
353 * r8 : 割り込み禁止のためのSRの値
354 * r9 : 割り込み待
355ち中のSRの値
356 * r10 : reqflgの番地
357 * r11 : 0x01
358 * r12 : 0x00
359 * r13 : sleep中のSRの状æ…
360‹
361 */
362 mov.l _mask_md_ipm_dis,r8 /* 割り込み禁止のSRの値 */
363#ifdef NO_SLEEP
364 mov.l _mask_md_dis,r9 /* 割り込み待
365ち中のSRの値 */
366#else
367 mov.l _mask_bl_md_dis,r9 /* 割り込み待
368ち中のSRの値 */
369#endif
370#ifdef SUPPORT_CHG_IPM
371 mov.l _task_intmask_k,r2
372 mov.l @r2,r3
373 or r3,r9
374#endif
375 mov.l _reqflg_dis,r10
376 mov #0x01,r11
377 xor r12,r12
378 mov.l _stacktop_dis,r15 /* スタックを割り込みスタックに */
379 ldc r11,r7_bank /* r7_bank1 を1にして割り込み状æ…
380‹ã« */
381dispatcher_2:
382 /*
383 * ここで割込みモードに切り換えるのは,ここで発生する割込み処理
384 * にどのスタックを使うかという問題の解決と,割込みハンドラ内
385で
386 * のタスクディスパッチの防止という二つの意味がある.
387 */
388 /*
389 * 割込み許可後にsleep命令を実行すると,割込み許可命令の実行前に
390 * 割込み要求がå…
391¥ã£ã¦ã„る場合,割込み許可命令の実行とå…
392±ã«å‰²è¾¼ã¿ãŒ
393 * 受け付けられその復帰後に,reqflgのチェックではなく sleep 状æ…
394‹
395 * にå…
396¥ã£ã¦ã—まう.
397 * この問題は,割込みの許可と sleep 状æ…
398‹ã¸ã®ç§»è¡ŒãŒã‚¢ãƒˆãƒŸãƒƒã‚¯ã«å®Ÿ
399 * 行できないことに起因する.
400 * そのため,sleep 実行直前の SR 変更では BL ビットを'1'に設定す
401 * ることで,割込みの許可と sleep 状æ…
402‹ã¸ã®ä»¥é™ã‚’アトミックに実行
403 * する.
404 * ldc r9,sr ではBLビットがセットされるため,割込みは受け付けずス
405 * リープモードに移行する.スリープモード中は,BLビットが1でも割
406 * 込みを受け付けるため(SH7709ハードウェアマニュアル 8-10),スリー
407 * プモードへの移行直後に割込みを受付スリープモードから復帰する.
408 */
409
410 ldc r9,sr /* 割り込みの許可 */
411#ifndef NO_SLEEP
412 sleep /* 割込み待
413ち */
414#endif /* NO_SLEEP */
415 ldc r8,sr /* 割り込み禁止 */
416 mov.l @r10,r7 /* r7 <- reqflg */
417 tst r7,r7 /* reqflg が FALSEなら */
418 bt dispatcher_2 /* dispatcher_2 へ */
419 ldc r12,r7_bank /* r7_bank1 をクリア */
420 mov.l r12,@r10 /* reqflg を FALSEに */
421 bra dispatcher
422 nop
423 .align 4
424_runtsk_dis:
425 .long _runtsk
426_schedtsk_dis:
427 .long _schedtsk
428_enatex_mask_dis:
429 .long TCB_enatex_mask
430_call_texrtn_dis:
431 .long _call_texrtn
432_mask_md_ipm_dis:
433 .long 0x40000000 + MAX_IPM << 4
434_mask_md_dis:
435 .long 0x40000000
436_mask_bl_md_dis:
437 .long 0x50000000
438dispatch_r_k:
439 .long dispatch_r
440_stacktop_dis:
441 .long STACKTOP /* タスク独立部のスタックの初期値 */
442_reqflg_dis:
443 .long _reqflg
444
445/*
446 * 割り込みハンドラ/CPU例外ハンドラ出口処理
447 *
448 * 戻りå…
449ˆãŒã‚¿ã‚¹ã‚¯ã§reqflgがセットされている場合のみここにくる。
450 * r7_bank1 = 0,割り込み禁止状æ…
451‹,スクラッチレジスタを保存した
452 * 状æ…
453‹ã§å‘¼ã³å‡ºã™ã“と。
454 *
455 */
456 .text
457 .align 2
458 .globl ret_int
459 .globl ret_exc
460ret_exc:
461ret_int:
462 mov.l _runtsk_ret,r1 /* r0 <- runtsk */
463 mov.l @r1,r0
464 mov.l _enadsp_ret,r2 /* enadspのチェック */
465 mov.l @r2,r3
466 tst r3,r3
467 bt ret_int_1
468 mov.l _schedtsk_ret,r4 /* r5 <- schedtsk */
469 mov.l @r4,r5
470 cmp/eq r0,r5 /* runtsk と schedtsk を比較 */
471 bt ret_int_1
472 mov.l r14,@-r15 /* 残りのレジスタを保存 */
473 mov.l r13,@-r15
474 mov.l r12,@-r15
475 mov.l r11,@-r15
476 mov.l r10,@-r15
477 mov.l r9,@-r15
478 mov.l r8,@-r15
479 mov #TCB_sp,r1 /* タスクスタックを保存 */
480 mov.l r15,@(r0,r1)
481 mov.l ret_int_r_k,r1 /* 実行再開番地を保存 */
482 mov #TCB_pc,r2
483 mov.l r1,@(r0,r2)
484 bra dispatcher
485 nop
486
487ret_int_r:
488 mov.l @r15+,r8
489 mov.l @r15+,r9
490 mov.l @r15+,r10
491 mov.l @r15+,r11
492 mov.l @r15+,r12
493 mov.l @r15+,r13
494 mov.l @r15+,r14
495ret_int_1:
496 /*
497 * タスク例外処理ルーチンの起動
498 * ret_int_r は dispatcher から呼び出されるため,tcbのアドレスはr0に
499 * å…
500¥ã£ã¦ã„る.
501 * なお,割込みの出口でタスクスイッチが発生しない場合はディスパッチャ
502 * を通らずに ret_int から直接 ret_int_1 に飛ぶ
503 */
504 mov.l @(TCB_enatex,r0),r1
505 mov.l _enatex_mask_ret,r2
506 tst r1,r2
507 bt ret_int_2 /* enatex が FALSE ならリターン */
508 mov.l @(TCB_texptn,r0),r1 /* texptnをロード */
509 tst r1,r1
510 bt ret_int_2 /* texptn が 0で無ければT<= 0 */
511 mov.l _call_texrtn_ret,r1 /* タスク例外ルーチンの呼び出し */
512 jsr @r1
513 nop
514ret_int_2:
515#ifdef SUPPORT_CHG_IPM
516 mov #44,r0
517 mov.l @(r0,r15),r1
518 mov.l _unmask_ipm,r2
519 and r2,r1
520 mov.l _task_intmask_k,r2
521 mov.l @r2,r3
522 or r3,r1
523 mov.l r1,@(r0,r15)
524#endif /* SUPPORT_CHG_IMP */
525 mov.l @r15+,r7 /* spc,pr,ssr,スクラッチレジスタを復帰 */
526 mov.l @r15+,r6
527 mov.l @r15+,r5
528 mov.l @r15+,r4
529 mov.l @r15+,r3
530 mov.l @r15+,r2
531 mov.l @r15+,r1
532 mov.l _mask_md_bl_ret,r0
533 ldc r0,sr /* BLを1に */
534 mov.l @r15+,r0
535 lds.l @r15+,mach
536 lds.l @r15+,macl
537 ldc.l @r15+,gbr
538 ldc.l @r15+,ssr
539 lds.l @r15+,pr
540 ldc.l @r15+,spc
541 rte
542 nop
543
544 .align 4
545_runtsk_ret:
546 .long _runtsk
547_schedtsk_ret:
548 .long _schedtsk
549_enadsp_ret:
550 .long _enadsp
551ret_int_r_k:
552 .long ret_int_r
553_enatex_mask_ret:
554 .long TCB_enatex_mask
555_call_texrtn_ret:
556 .long _call_texrtn
557_mask_md_bl_ret:
558 .long 0x50000000
559
560/*
561 * タスク起動処理
562 */
563 .text
564 .align 2
565 .globl _activate_r
566_activate_r:
567 stc sr,r0 /* 割り込み許可 */
568 mov.l _unmask_ipm,r1
569 and r1,r0
570#ifdef SUPPORT_CHG_IPM
571 mov.l _task_intmask_k,r1
572 mov.l @r1,r2
573 or r2,r0
574#endif /* SUPPORT_CHG_IPM */
575 ldc r0,sr
576 mov.l @r15+,r1
577 lds.l @r15+,pr
578 mov.l @r15+,r4
579 jmp @r1
580 nop
581 .align 4
582_unmask_ipm:
583 .long 0xffffff0f
584#ifdef SUPPORT_CHG_IPM
585_task_intmask_k:
586 .long _task_intmask
587#endif /* SUPPORT_CHG_IPM */
588
589
590/*
591 * Exception 600 vector
592 * 割り込みが発生すると実行される。
593 *
594 *
595 * SH3は割り込みが発生するとすべてVBR+0x600番地からプログラムを実行するため、
596 * ここにé…
597ç½®ã™ã‚‹ãƒ«ãƒ¼ãƒãƒ³ã§ã¾ãšã‚¹ã‚¿ãƒƒã‚¯ã®åˆ‡ã‚Šæ›¿ãˆã€ãƒ¬ã‚¸ã‚¹ã‚¿ã®ä¿å­˜,IPMの設定,
598 * 割り込み要因の判定を行いその後BLビットを0にして割り込みハンドラを呼ぶ必
599要
600 * がある。
601 * 割り込み要因に対応した割り込みハンドラの開始番地はé…
602åˆ—int_table[]に登録し
603 * て呼び出す。オフセットの計算は、割り込み要因レジスタを右に2ビットシフトし
604 * て行う。割り込み要因レジスタはSH7708ではINTEVTレジスタにセットされるが、
605 * SH7709およびSH7709AではINTEVT2にセットされるため、ifdefにより切り分けてい
606 * る。また、一部のディバイスについて割り込み要因レジスタで渡される値とIPMと
607 * の間には関係がないため、各割り込み要因に対応したIPMを持つSRの内
608容をé…
609åˆ—
610 * int_plevel_table[]に登録してそれを読み出す。
611 *
612 * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
613 * に起動された割込みハンドラ内
614でディスパッチが要求された場合に,ディ
615 * スパッチされない.
616 *
617 */
618
619 .org 0x0600 /* _BASE_VBR + 0x0600番地にé…
620ç½® */
621 .align 2
622 .global _interrupt
623_interrupt:
624 stc.l spc,@-r15 /* 多重割り込みがå…
625¥ã‚‹ã¨æ¶ˆãˆã¦ã—まうので */
626 sts.l pr,@-r15 /* spc,pr,ssr,gbr,macl,mach */
627 stc.l ssr,@-r15
628 stc.l gbr,@-r15
629 sts.l macl,@-r15
630 sts.l mach,@-r15
631 stc.l r0_bank,@-r15 /* ,r0〜r7をスタックに保存 */
632 stc.l r1_bank,@-r15
633 stc.l r2_bank,@-r15
634 stc.l r3_bank,@-r15
635 stc.l r4_bank,@-r15
636 stc.l r5_bank,@-r15
637 stc.l r6_bank,@-r15
638 stc.l r7_bank,@-r15
639 tst r7,r7 /* 割り込み発生時のコンテキストを判定 */
640 bf/s _interrupt_from_int /* 例外/割り込みハンドラならジャンプ */
641 add #0x01,r7 /* 割り込みのネスト回数をインクリメント*/
642 mov r15,r1 /* スタックをå…
643¥ã‚Œæ›¿ãˆå…
644ƒã®ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ */
645 mov.l _stacktop_k,r15 /* ンタを保存 */
646 mov.l r1,@-r15
647 mov.l _intevt,r0 /* 例外要因レジスタを取得 */
648 mov.l @r0,r4
649 shlr2 r4 /* 3ビット右シフトしオフセットを求める */
650 shlr r4
651 mov.l _int_plevel_table_k,r0
652 mov.l @(r0,r4),r5 /* 割り込みの優å…
653ˆåº¦ã‚’取得 */
654 mov.l _int_table_k,r0
655 mov.l @(r0,r4),r2 /* 割り込みハンドラのアドレスを取得 */
656 ldc r2,r2_bank /* バンク0に切り替えるためコピー */
657 ldc r5,sr /* これ以降割り込みを受け付ける。 */
658 jsr @r2 /* 割り込みハンドラへ */
659 nop
660 mov.l _mask_md_ipm_ret,r0
661 ldc r0,sr /* 割り込み禁止 */
662 stc r7_bank,r7 /* 例外/割り込みのネスト回数をデクリメント*/
663 dt r7
664 ldc r7,r7_bank
665 mov.l _reqflg_k,r4 /* reqflgのチェック */
666 mov.l @r4,r1
667 tst r1,r1 /* reqflgがFALSEならret_to_task_intに飛ぶ */
668 bt/s _ret_to_task_int /* タスクに戻る */
669 mov.l @r15,r15 /* 戻りå…
670ˆãŒã‚¿ã‚¹ã‚¯ãªã®ã§ã‚¹ã‚¿ãƒƒã‚¯ã‚’戻す */
671 xor r0,r0
672 bra ret_int
673 mov.l r0,@r4 /* reqflgをクリア */
674_interrupt_from_int:
675 mov.l _intevt,r0 /* 例外要因レジスタを取得 */
676 mov.l @r0,r4
677 shlr2 r4 /* オフセットを求める */
678 shlr r4 /* オフセットを求める */
679 mov.l _int_plevel_table_k,r0
680 mov.l @(r0,r4),r5 /* 割り込みの優å…
681ˆåº¦ã‚’取得 */
682 mov.l _int_table_k,r0
683 mov.l @(r0,r4),r2 /* 割り込みハンドラのアドレスを取得 */
684 ldc r2,r2_bank /* バンク0に切り替えるためコピー */
685 ldc r5,sr /* これ以降割り込みを受け付ける。 */
686 jsr @r2 /* 割り込みハンドラへ */
687 nop
688 mov.l _mask_md_ipm_ret,r0
689 ldc r0,sr /* 割り込み禁止 */
690 stc r7_bank,r7 /* 例外/割り込みのネスト回数をデクリメント*/
691 dt r7
692 ldc r7,r7_bank
693_ret_to_task_int:
694 mov.l @r15+,r7 /* 割り込みå…
695ƒã«æˆ»ã‚‹ */
696 mov.l @r15+,r6
697 mov.l @r15+,r5
698 mov.l @r15+,r4
699 mov.l @r15+,r3
700 mov.l @r15+,r2
701 mov.l @r15+,r1
702 mov.l _mask_md_bl_int,r0
703 ldc r0,sr /* BL を1に */
704 mov.l @r15+,r0
705 lds.l @r15+,mach
706 lds.l @r15+,macl
707 ldc.l @r15+,gbr
708 ldc.l @r15+,ssr
709 lds.l @r15+,pr
710 ldc.l @r15+,spc
711 rte
712 nop
713
714 /*
715 * 未登録の割込みが発生すると,その時の INTEVT,INTEVT2,SR,PC を
716 * 引数にcpu_interrupt()を呼び出す.
717 */
718 .global _no_reg_interrupt
719_no_reg_interrupt:
720 mov.l _intevt1,r0
721 mov.l @r0,r4
722#if defined(SH7709) || defined(SH7709A) || defined(SH7729R) || defined(SH7727)
723 mov.l _intevt2,r0
724 mov.l @r0,r5
725#endif
726 stc spc,r6
727 stc ssr,r7
728 mov.l _cpu_interrupt_k,r1
729 jsr @r1
730 nop
731
732
733 .align 4
734_stacktop_k:
735 .long STACKTOP /* 非タスク独立部のスタックの初期値 */
736_intevt:
737#if defined(SH7708) || defined(SH7750)
738 .long INTEVT
739#else
740 .long INTEVT2
741#endif
742_int_table_k:
743 .long _int_table
744_int_plevel_table_k:
745 .long _int_plevel_table
746_reqflg_k:
747 .long _reqflg
748_mask_md_ipm_ret:
749 .long 0x40000000 + MAX_IPM << 4
750_mask_md_bl_int:
751 .long 0x50000000
752_intevt1:
753 .long INTEVT
754#if defined(SH7709) || defined(SH7709A) || defined(SH7729R) || defined(SH7727)
755_intevt2:
756 .long INTEVT2
757#endif
758_cpu_interrupt_k:
759 .long _cpu_interrupt
760
761
762/*
763 * 微少時間待
764ち
765 */
766 .globl _sil_dly_nse
767_sil_dly_nse:
768 mov.l _sil_dly_tim1, r1
769 add r1, r4
770 cmp/pl r4
771 bt _sil_dly_nse1
772 rts
773 nop
774_sil_dly_nse1:
775 mov.l _sil_dly_tim2, r1
776 add r1, r4
777 cmp/pl r4
778 bt _sil_dly_nse1
779 rts
780 nop
781 .align 4
782_sil_dly_tim1:
783 .long -SIL_DLY_TIM1
784_sil_dly_tim2:
785 .long -SIL_DLY_TIM2
Note: See TracBrowser for help on using the repository browser.