source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/sh3-ghs/cpu_support.sh@ 363

Last change on this file since 363 was 363, checked in by ykominami, 5 years ago

add tags/jsp-1.4.4-full-UTF8

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