source: rubycfg_asp/trunk/asp_dcre/arch/rx630_ccrx/prc_support.src@ 313

Last change on this file since 313 was 313, checked in by coas-nagasima, 7 years ago

ソースを追加

File size: 29.9 KB
Line 
1;
2; TOPPERS/ASP Kernel
3; Toyohashi Open Platform for Embedded Real-Time Systems/
4; Advanced 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 Embedded and Real-Time Systems Laboratory
9; Graduate School of Information Science, Nagoya Univ., JAPAN
10; Copyright (C) 2010 by Witz Corporation, JAPAN
11; Copyright (C) 2013 by Mitsuhiro Matsuura
12;
13; 上記著作権者
14は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
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およびTOPPERSプロジェクトを
47; å…
48è²¬ã™ã‚‹ã“と.
49;
50; 本ソフトウェアは,無保証で提供されているものである.上記著作権者
51お
52; よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
53; に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
54; アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
55; の責任を負わない.
56;
57;
58
59;
60; プロセッサ依存モジュール アセンブリ言語部(RX用)
61;
62
63;
64; ディスパッチャおよび割込み(CPU例外)出å…
65¥ã‚Šå£ã®ãƒ«ãƒ¼ãƒ«:
66; 動作モードを以下のように定義する.
67; ディスパッチャモード:
68; CPUロック状æ…
69‹, 割込み優å…
70ˆåº¦ãƒžã‚¹ã‚¯å…
71¨è§£é™¤çŠ¶æ…
72‹,
73; タスクコンテキスト(intnest = 0), タスクスタック
74; 割込み(CPU例外)処理モード
75; å…
76¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
77‹(PSWレジスタIビット = 0),
78; 割込み優å…
79ˆåº¦ãƒžã‚¹ã‚¯å…
80¨è§£é™¤ã§ãªã„状æ…
81‹(IPL != 0)
82; 割込みコンテキスト(intnest != 0), 割込みスタック
83;
84; カーネル管理外割込みのサポート有無と, CPUロック状æ…
85‹, 割込み優å…
86ˆåº¦
87; マスクå…
88¨è§£é™¤çŠ¶æ…
89‹ã®é–¢ä¿‚は以下の通りである.
90; カーネル管理外割込み未サポート時:
91; CPUロック状æ…
92‹(PSWレジスタIビット = 0)
93; 割込み優å…
94ˆåº¦ãƒžã‚¹ã‚¯å…
95¨è§£é™¤çŠ¶æ…
96‹(IPL = 0)
97; カーネル管理外割込みサポート時:
98; CPUロック状æ…
99‹
100; (PSWレジスタIビット = 0, IPL = IPL_LOCK, lock_flag = true)
101; 割込み優å…
102ˆåº¦ãƒžã‚¹ã‚¯å…
103¨è§£é™¤çŠ¶æ…
104‹(saved_ipl = 0)
105;
106; 各構造体ポインタを以下のように各レジスタにアサインする.
107; r15 = p_runtsk ただしディスパッチャの各出口では無効
108; r14 = *p_runtsk dispatcher の中では p_runtsk 確定時に再取得する
109; 各å…
110¥ã‚Šå£ã‹ã‚‰æœ€åˆã«å¤‰æ•°ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã¨ãã«ä¸Šè¨˜ãƒ¬ã‚¸ã‚¹ã‚¿ã«ä¿å­˜ã™ã‚‹.
111;
112; 構造体アライメントへの対応
113; 構造体アライメントが4Byte(アンパック)の場合:
114; 一般的なレジスタ相対アドレッシングが可能
115; 例: mov.l #__kernel_p_runtsk, r15
116; mov.l r0, TCB_sp[r15]
117; 構造体アライメントが4Byteではない(パック)の場合:
118; mov.lのようにロングサイズ指定の場合、相対値は4の倍数のみ有効
119; このため, 一度対象アドレスを求めてからアクセスする必
120要がある
121; 例: mov.l #__kernel_p_runtsk, r15
122; add #TCB_sp, r15, r5
123; mov.l r0, [r5]
124; 各オフセット値を判断し, 条件アセンブルによりコードを切り替える
125;
126
127;
128; 構造体アクセスのオフセット定義
129;
130 .include offset.inc
131
132;
133; 各種EQU定義(Hファイルの#define定義)
134;
135 .include asm_config.inc
136
137 .glb __kernel_istkpt
138
139 .glb __kernel_p_runtsk
140 .glb __kernel_p_schedtsk
141 .glb __kernel_reqflg
142 .glb __kernel_dspflg
143
144 .glb __kernel_dispatch
145 .glb __exit_and_dispatch
146 .glb __kernel_start_r
147 .glb __kernel_call_texrtn
148 .glb _kernel_interrupt
149 .glb _kernel_exception
150 .glb __kernel_intnest
151 .glb __kernel_call_exit_kernel
152 .glb __kernel_start_dispatch
153
154 .glb _ext_tsk
155 .glb __kernel_exit_kernel
156
157.if TIPM_LOCK != -15
158 .glb __kernel_lock_flag
159 .glb __kernel_saved_ipl
160.endif
161
162 .glb __kernel_break_wait
163 .glb _sil_dly_nse
164
165.if LOG_INH_ENTER == 1
166 .glb _kernel_log_inh_enter
167.endif ; LOG_INH_ENTER == 1
168.if LOG_INH_LEAVE == 1
169 .glb _kernel_log_inh_leave
170.endif ; LOG_INH_LEAVE == 1
171.if LOG_EXC_ENTER == 1
172 .glb _kernel_log_exc_enter
173.endif ; LOG_EXC_ENTER == 1
174.if LOG_EXC_LEAVE == 1
175 .glb _kernel_log_exc_leave
176.endif ; LOG_EXC_LEAVE == 1
177.if LOG_DSP_ENTER == 1
178 .glb _kernel_log_dsp_enter
179.endif ; LOG_DSP_ENTER == 1
180.if LOG_DSP_LEAVE == 1
181 .glb _kernel_log_dsp_leave
182.endif ; LOG_DSP_LEAVE == 1
183
184;
185; TCB_sp への書込みマクロ
186;
187st_TCB_sp .macro src, tcb, tmp
188.if (TCB_sp % 4) == 0
189 mov.l src, TCB_sp[tcb]
190.else
191 add #TCB_sp, tcb, tmp
192 mov.l src, [tmp]
193.endif
194.endm
195
196;
197; TCB_sp からの読出しマクロ
198;
199ld_TCB_sp .macro dst, tcb, tmp
200.if (TCB_sp % 4) == 0
201 mov.l TCB_sp[tcb], dst
202.else
203 add #TCB_sp, tcb, tmp
204 mov.l [tmp], dst
205.endif
206.endm
207
208;
209; TCB_pc への書込みマクロ
210;
211st_TCB_pc .macro src, tcb, tmp
212.if (TCB_pc % 4) == 0
213 mov.l src, TCB_pc[tcb]
214.else
215 add #TCB_pc, tcb, tmp
216 mov.l src, [tmp]
217.endif
218.endm
219
220;
221; TCB_pc からの読出しマクロ
222;
223ld_TCB_pc .macro dst, tcb, tmp
224.if (TCB_pc % 4) == 0
225 mov.l TCB_pc[tcb], dst
226.else
227 add #TCB_pc, tcb, tmp
228 mov.l [tmp], dst
229.endif
230.endm
231
232;
233; TCB_texptn からの読出しマクロ
234;
235ld_TCB_texptn .macro dst, tcb, tmp
236.if (TCB_texptn % 4) == 0
237 mov.l TCB_texptn[tcb], dst
238.else
239 add #TCB_texptn, tcb, tmp
240 mov.l [tmp], dst
241.endif
242.endm
243
244;
245; TCB_p_tinib からの読出しマクロ
246;
247ld_TCB_p_tinib .macro dst, tcb, tmp
248.if (TCB_p_tinib % 4) == 0
249 mov.l TCB_p_tinib[tcb], dst
250.else
251 add #TCB_p_tinib, tcb, tmp
252 mov.l [tmp], dst
253.endif
254.endm
255
256;
257; TINIB_exinf からの読出しマクロ
258;
259ld_TINIB_exinf .macro dst, tinib, tmp
260.if (TINIB_exinf % 4) == 0
261 mov.l TINIB_exinf[tinib], dst
262.else
263 add #TINIB_exinf, tinib, tmp
264 mov.l [tmp], dst
265.endif
266.endm
267
268;
269; TINIB_task からの読出しマクロ
270;
271ld_TINIB_task .macro dst, tinib, tmp
272.if (TINIB_task % 4) == 0
273 mov.l TINIB_task[tinib], dst
274.else
275 add #TINIB_task, tinib, tmp
276 mov.l [tmp], dst
277.endif
278.endm
279
280
281 .section P, CODE
282
283;
284; APIからのタスクディスパッチャå…
285¥å£
286;
287; 呼び出し条件:
288; ・ディスパッチャモード(ファイルヘッダ参ç…
289§)
290;
291; ここでは, コンテキストの退避と, 実行再開番地の設定をする.
292;
293__kernel_dispatch:
294 pushm r6-r13 ; 非スクラッチレジスタ保存
295 mov.l #__kernel_p_runtsk, r15
296 mov.l [r15], r14
297 st_TCB_sp r0, r14, r5 ; スタックポインタをTCBに保存
298 st_TCB_pc #dispatch_r, r14, r5 ; 実行再開番地をTCBに保存
299 bra dispatcher
300
301;
302; APIへのタスクディスパッチャ出口
303;
304; 呼び出し条件:
305; ・ディスパッチャモード(ファイルヘッダ参ç…
306§)
307;
308; ここでは, タスク例外ハンドラ呼出しと, コンテキストの復帰をする.
309;
310dispatch_r:
311 btst #TCB_enatex_bit, TCB_enatex[r14] ; タスク例外処理許可?
312 bz dispatch_r_rts
313 ld_TCB_texptn r5, r14, r4 ; 保留例外要因があるか?
314 cmp #0, r5
315 bz dispatch_r_rts
316 bsr __kernel_call_texrtn ; タスク例外ハンドラ呼出し処理実行
317dispatch_r_rts:
318 popm r6-r13 ; 非スクラッチレジスタ復帰
319 rts ; dispatch 呼び出しå…
320ƒã¸æˆ»ã‚‹.
321
322;
323; タスク起動処理(タスクå…
324ˆé ­ã¸ã®ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチャ出口)
325;
326; 呼び出し条件:
327; ・ディスパッチャモード(ファイルヘッダ参ç…
328§)
329;
330; ここでは, CPUロック解除状æ…
331‹ã«ã—, タスクを起動する.
332;
333__kernel_start_r:
334 mov.l #_ext_tsk, r5
335 push.l r5 ; 戻り番地をスタックに積む
336 ld_TCB_p_tinib r5, r14, r4
337 ld_TINIB_exinf r1, r5, r4 ; 拡張情
338報を第一引数に設定
339 ld_TINIB_task r5, r5, r4 ; タスクの起動番地を取得
340.if TIPM_LOCK == -15
341 setpsw i ; 割込み許可(CPUロック解除状æ…
342‹)
343.else
344 mov.l #__kernel_lock_flag, r4 ; CPUロック解除状æ…
345‹ã¸
346 mov.l #0, [r4] ; ここに来るときは必
347ず saved_ipl の
348 mvtc #00010000H, psw ; 値は 0 のため, 直値を設定する.
349 ; å…
350¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ…
351‹( I = 1 )
352 ; 割込み優å…
353ˆåº¦ãƒžã‚¹ã‚¯å…
354¨è§£é™¤çŠ¶æ…
355‹( IPL = 0 )
356.endif
357 jmp r5
358
359;
360; カーネル起動からのタスクディスパッチャå…
361¥å£
362;
363; このルーチンは,カーネル起動時に,すべての割込みを禁止した状æ…
364‹
365; (割込みロック状æ…
366‹ã¨åŒç­‰ï¼‰ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žã¾ãŸï¼Œå‰²è¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ï¼ˆéž
367; タスクコンテキストと同等)で呼び出されることを想定している.
368;
369; 呼び出し条件:
370; ・割込み(CPU例外)処理モード(ファイルヘッダ参ç…
371§)
372;
373; ここでは, ディスパッチャモードに変更する.
374;
375__kernel_start_dispatch:
376 mov.l #__kernel_intnest, r5
377 mov.w #0, [r5] ; タスクコンテキストに切換え
378.if TIPM_LOCK != -15
379 mvtc #(IPL_LOCK | 00010000H), psw ; å…
380¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ…
381‹
382 ; 割込み優å…
383ˆåº¦ãƒžã‚¹ã‚¯å…
384¨è§£é™¤ã§ãªã„状æ…
385‹
386.endif
387
388;
389; タスク終了(現在のコンテキストを捨てる)からのタスクディスパッチャå…
390¥å£
391;
392; 呼び出し条件:
393; ・ディスパッチャモード(ファイルヘッダ参ç…
394§)
395;
396; ここでは, 何もすることはない.
397; なお, p_runtsk のアドレス取得だけは行なう.
398;
399__exit_and_dispatch:
400 mov.l #__kernel_p_runtsk, r15
401
402;
403; ディスパッチャ本体
404;
405; 呼び出し条件:
406; ・すべてのタスクのコンテキストは保存されている.
407;
408; dispatcher 呼出時のスタック:
409; ・__kernel_dispatch からきた場合 : タスクスタック
410; ・exit_and_dispatch からきた場合:
411; exit_task からきた場合 : タスクスタック
412; カーネル起動時(__kernel_start_dispatch) : 割込みスタック
413; ・ret_int からきた場合 : タスクスタック
414; ・dispatcher_idle_loop からきた場合 : 割込みスタック
415;
416dispatcher:
417.if LOG_DSP_ENTER == 1
418 push.l r15
419 mov.l r14, r1 ; 引数(ディスパッチå…
420ƒTCB)を設定
421 bsr _kernel_log_dsp_enter
422 pop.l r15
423.endif
424 mov.l #__kernel_p_schedtsk, r5
425 mov.l [r5], [r15] ; p_schedtsk を p_runtsk に
426 mov.l [r15], r14
427 cmp #0, r14
428 bz dispatcher_pre_idle ; schedtsk がなければアイドルループへ
429 ld_TCB_sp r0, r14, r5 ; タスクスタックポインタを復帰
430.if LOG_DSP_LEAVE == 1
431 push.l r14
432 mov.l r14, r1 ; 引数(ディスパッチå…
433ˆTCB)を設定
434 bsr _kernel_log_dsp_leave
435 pop.l r14
436.endif
437 ld_TCB_pc r5, r14, r4
438 jmp r5 ; 実行再開番地へジャンプ
439
440;
441; schdedtskがNULLの場合はアイドルループにå…
442¥ã‚‹
443; アイドルループは割込み処理モードで動作させる
444;
445; ここで割込みモードに切り換えるのは,ここで発生する割込み処理に
446; どのスタックを使うかという問題の解決と,割込みハンドラ内
447でのタ
448; スクディスパッチの防止という2つの意味がある.
449;
450dispatcher_pre_idle:
451 mov.l #__kernel_istkpt,r5
452 mov.l [r5], r0 ; 割込み用のスタックへ切替え
453 mov.l #__kernel_intnest, r5
454 mov.w #1, [r5] ; 非タスクコンテキストに切換え
455.if TIPM_LOCK != -15
456 mov.l #__kernel_lock_flag, r5 ; CPUロック解除状æ…
457‹ã¸
458 mov.l #0, [r5]
459 mvtc #0, psw ; 優å…
460ˆåº¦0の割込み処理中を偽装
461
462.endif
463
464dispatcher_idle_loop:
465 setpsw i ; å…
466¨å‰²è¾¼ã¿è¨±å¯
467 clrpsw i ; å…
468¨å‰²è¾¼ã¿ç¦æ­¢
469
470 mov.l #__kernel_reqflg, r5 ; reqflg が FALSE なら
471 mov.l [r5], r4
472 cmp #0, r4
473 bz dispatcher_idle_loop ; アイドルループを繰り返す
474 mov.l #0, [r5] ; reqflgがtrueならfalseにする
475 mov.l #__kernel_intnest, r5
476 mov.w #0, [r5] ; タスクコンテキストに切換え
477.if TIPM_LOCK != -15
478 mov.l #__kernel_lock_flag, r5 ; CPUロック状æ…
479‹ã¸
480 mov.l #1, [r5]
481 mov.l #__kernel_saved_ipl, r5
482 mov.l #0, [r5]
483 mvtc #(IPL_LOCK | PSW_I_MASK), psw ; å…
484¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ…
485‹
486 ; 割込み優å…
487ˆåº¦ãƒžã‚¹ã‚¯å…
488¨è§£é™¤ã§ãªã„状æ…
489‹
490.endif
491 bra dispatcher ; dispatcher へ戻る
492
493
494;
495; カーネルの終了処理の呼出し
496;
497; モードとスタックを非タスクコンテキスト用に切り替え.
498;
499 .glb __kernel_call_exit_kernel
500__kernel_call_exit_kernel:
501.if TIPM_LOCK != -15
502 clrpsw i ; å…
503¨å‰²è¾¼ã¿ç¦æ­¢
504 mov.l #__kernel_lock_flag, r5 ; CPUロック解除状æ…
505‹ã¸
506 mov.l #0, [r5]
507.endif
508 mov.l #__kernel_istkpt, r5
509 mov.l [r5], r0 ; 割込み用のスタックへ切替え
510 mov.l #__kernel_intnest, r5
511 mov.w #1, [r5] ; 非タスクコンテキストに切換え
512 bsr __kernel_exit_kernel
513 bra __kernel_call_exit_kernel
514
515
516;
517; 割込み(CPU例外)からのタスクディスパッチャå…
518¥å£
519;
520; 呼出し条件:
521; ・å…
522¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
523‹(PSWレジスタIビット = 0)
524; ・割込み優å…
525ˆåº¦ãƒžã‚¹ã‚¯å…
526¨è§£é™¤ã§ãªã„状æ…
527‹(IPL != 0)
528; ・タスクコンテキスト(intnest=0)
529; ・使用スタックはタスクスタック
530; ・reqflg = true
531;
532; ここでは, ディスパッチャモードに変更し, reqflgをOFFにしてから,
533; 遅
534延ディスパッチの有無を判断する.
535;
536
537;
538; ret_intå…
539ˆé ­ã§ã‚¹ã‚¿ãƒƒã‚¯ã«ç©ã¾ã‚Œã¦ã„ã‚‹PSWレジスタへのオフセット
540; ACC + FPSW + R14--R15 + R1--R5 + PC
541;
542 RET_INT_GET_PSW_OFFSET .equ (8+4+28+4)
543
544ret_int:
545.if TIPM_LOCK == -15
546 mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; 割込み/CPU例外発生前のIPL値取得
547 and #PSW_IPL_MASK, r5
548 mvtc r5, psw ; å…
549¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯(CPUロック)状æ…
550‹
551 ; 割込み/CPU例外発生前の割込み優å…
552ˆåº¦
553.else
554 mov.l #__kernel_lock_flag, r5 ; CPUロック状æ…
555‹ã¸
556 mov.l #1, [r5]
557 mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; 割込み/CPU例外発生前のIPL値取得
558 and #PSW_IPL_MASK, r5
559 mov.l #__kernel_saved_ipl, r4
560 mov.l r5, [r4]
561 mvtc #(IPL_LOCK | PSW_I_MASK), psw ; å…
562¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ…
563‹
564 ; 割込み優å…
565ˆåº¦ãƒžã‚¹ã‚¯å…
566¨è§£é™¤ã§ãªã„状æ…
567‹
568.endif
569 mov.l #__kernel_reqflg, r5
570 mov.l #0, [r5] ; reqflg <--- FALSE
571 mov.l #__kernel_p_runtsk, r15
572 mov.l [r15], r14
573 mov.l #__kernel_dspflg, r5 ; dspflg が FALSE なら ret_int_r へ
574 mov.l [r5], r5
575 cmp #0, r5
576 bz ret_int_r_call_tex
577 mov.l #__kernel_p_schedtsk, r5
578 mov.l [r5], r5
579 cmp r5, r14 ; p_schedtsk と p_runtsk が同じなら
580 beq ret_int_r_call_tex ; ret_int_r_call_tex へ
581 pushm r6-r13 ; 非スクラッチレジスタ保存
582 st_TCB_sp r0, r14, r5 ; スタックポインタをTCBに保存
583 st_TCB_pc #ret_int_r, r14, r5 ; 実行再開番地をTCBに保存
584 bra dispatcher
585
586;
587; 割込み(CPU例外)へのタスクディスパッチャ出口
588;
589; 呼び出し条件:
590; ・ディスパッチャモード(ファイルヘッダ参ç…
591§)
592;
593; ここでは, タスク例外ハンドラ呼出しと, 割込み(CPU例外)処理モードへの
594; 変更と, コンテキストの復帰を行い, 割込み(CUP例外)発生å…
595ƒã¸æˆ»ã‚‹.
596;
597__kernel_break_wait: ;タスクモニタ用ラベル
598ret_int_r:
599 popm r6-r13 ; 非スクラッチレジスタ復帰
600ret_int_r_call_tex:
601 btst #TCB_enatex_bit, TCB_enatex[r14] ; タスク例外処理許可?
602 bz ret_int_r_rte
603 ld_TCB_texptn r5, r14, r4 ; 保留例外要因があるか?
604 cmp #0, r5
605 bz ret_int_r_rte
606 bsr __kernel_call_texrtn ; タスク例外ハンドラ呼出し処理実行
607ret_int_r_rte:
608.if TIPM_LOCK != -15
609 clrpsw i ; å…
610¨å‰²è¾¼ã¿ç¦æ­¢
611 mov.l #__kernel_lock_flag, r5 ; CPUロック解除状æ…
612‹ã¸
613 mov.l #0, [r5]
614.endif
615 popm r4-r5 ; アキュムレータ復帰
616 mvtaclo r5 ; ACC最下位16bitは0で復帰
617 mvtachi r4
618 popc fpsw ; FPUステータスレジスタ復帰
619 popm r14-r15 ; レジスタ復帰
620 popm r1-r5
621 rte ; 割込み前の処理に戻る
622
623
624;
625; 割込みの出å…
626¥å£å‡¦ç†(アセンブリ言語記述部分)
627;
628; 呼出し条件:
629; ・割込み発生時のH/W処理により, PSWレジスタのIビット=0, IPLは受付け
630; た割込みのIPL.
631; ・スタックは多重割り込みなら割込みスタック, そうでなければ
632; タスクスタック
633; ・割込み発生時のH/W処理により,スタックに割込みからの復帰PCとPSWが
634; 保存されている.
635; ・ベクタテーブルに登録された個別のå…
636¥ã‚Šå£å‡¦ç†ã«ã‚ˆã‚Š, スタックに
637; スクラッチレジスタ(R1-R5)が保存されている.
638;
639; 引数:
640; ・r1:割込み要因番号
641; ・r2:割込みハンドラのアドレス
642;
643; レジスタがスタック上にどのように保存されているかを以下に示す.
644; この図では上が低位, 下が高位のアドレスで, スタックは下から
645; 上方向に向かって積み上げられるものとする.
646;
647; -------------------------
648; | ACC-HI(4byte) |
649; -------------------------(SP + 0)
650; | ACC-LO(4byte) |
651; -------------------------(SP + 4)
652; | FPSW(4byte) |
653; -------------------------(SP + 8)
654; | R14(4byte) |
655; -------------------------(SP + 12)
656; | R15(4byte) |
657; -------------------------(SP + 16)
658; | R1(4byte) |
659; -------------------------(SP + 20)
660; | R2(4byte) |
661; -------------------------(SP + 24)
662; | R3(4byte) |
663; -------------------------(SP + 28)
664; | R4(4byte) |
665; -------------------------(SP + 32)
666; | R5(4byte) |
667; -------------------------(SP + 36)
668; | PC(4byte) |
669; -------------------------(SP + 40)
670; | PSW(4byte) |
671; -------------------------(SP + 44)
672;
673; ここでは, 割込み処理モードに変更してハンドラを実行する.
674;
675; ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
676; TRUE になった時に,ret_int へ分岐(遅
677延ディスパッチ)する.
678;
679; 多重割込みかどうかは割込みネストカウンタの値で判定する.
680; intnest != 0 ならば多重割込みであると判定する.
681;
682; reqflg はCPUロック状æ…
683‹ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹. そうでないと,
684; reqflg チェック後に起動された割込みハンドラ内
685で
686; ディスパッチが要求された場合に,ディスパッチされない.
687;
688_kernel_interrupt:
689 pushm r14-r15 ; スクラッチレジスタを退避
690 pushc fpsw ; FPUステータスレジスタ退避
691 mvfacmi r5
692 shll #16, r5 ; ACC最下位16bitは0とする
693 mvfachi r4
694 pushm r4-r5 ; アキュムレータ退避
695 mov.l #__kernel_intnest, r5
696 mov.w [r5], r4
697 add #1, r4 ; ネスト回数をインクリメント
698 mov.w r4, [r5]
699 cmp #1, r4 ; 多重割り込みかどうか
700 bnz interrupt_from_int ; 加算前が0でなければ多重割込み
701 ; 初段の割込み
702 mov.l r0, r3 ; スタックポインタを取り出し
703 mov.l #__kernel_istkpt, r5 ; 割込み用のスタックへ切替える
704 mov.l [r5], r0
705 push.l r3 ; タスクスタックを保持
706interrupt_from_int: ; 多重割込み
707 setpsw i ; 割込み許可(CPUロック解除状æ…
708‹)
709
710.if LOG_INH_LEAVE == 1
711 push.l r1 ; ログトレースの引数を保持
712.endif
713
714.if LOG_INH_ENTER == 1
715 push.l r2
716 bsr _kernel_log_inh_enter ; ログトレース関数の呼出し
717 ; 引数の割込み要因番号は既にr1にå…
718¥ã£ã¦ã„ã‚‹
719 pop r2
720.endif
721
722 jsr r2 ; Cルーチン呼び出し
723
724.if LOG_INH_LEAVE == 1
725 pop r1 ; 引数に割込み要因番号を設定
726 bsr _kernel_log_inh_leave ; ログトレース関数の呼出し
727.endif
728
729 clrpsw i ; 割込み禁止(CPUロック状æ…
730‹)
731 mov.l #__kernel_intnest, r5
732 mov.w [r5], r4
733 sub #1, r4 ; ネスト回数をデクリメント
734 mov.w r4, [r5]
735 cmp #0, r4 ; 多重割り込みかどうか
736 bnz interrupt_return ; 多重割り込みならリターン
737 ; 初段の割込み
738 pop r0 ; タスクのスタックに戻す
739 mov.l #__kernel_reqflg, r5 ; ディスパッチ要求がないか?
740 mov.l [r5], r5
741 cmp #1, r5
742 bz ret_int ; あれば ret_int へジャンプ
743interrupt_return:
744 popm r4-r5 ; アキュムレータ復帰
745 mvtaclo r5 ; ACC最下位16bitは0で復帰
746 mvtachi r4
747 popc fpsw ; FPUステータスレジスタ復帰
748 popm r14-r15 ; レジスタ復帰
749 popm r1-r5
750 rte ; 割込み前の処理に戻る
751
752
753;
754; CPU例外の出å…
755¥å£å‡¦ç†(アセンブリ言語記述部分)
756;
757; 呼出し条件:
758; ・CPU例外発生時のH/W処理により, PSWレジスタのIビット=0, IPL=0.
759; ・スタックは多重割り込みなら割込みスタック, そうでなければ
760; タスクスタック
761; ・CPU例外発生時のH/W処理により,スタックにCPU例外からの復帰PCと
762; PSWが保存されている.
763; ・ベクタテーブルに登録された個別のå…
764¥ã‚Šå£å‡¦ç†ã«ã‚ˆã‚Š, スタックに
765; スクラッチレジスタ(R1-R5)が保存されている.
766;
767; 引数:
768; ・r1:CPU例外要因番号
769; ・r2:CPU例外ハンドラのアドレス
770;
771; レジスタがスタック上にどのように保存されているかを以下に示す.
772; この図では上が低位, 下が高位のアドレスで, スタックは下から
773; 上方向に向かって積み上げられるものとする.
774; なお, CPU例外要因番号とR6-R13はCPU例外ハンドラ内
775で情
776報を取得
777; する目的で退避しており, 出口処理では保存内
778容を破棄すればよい.
779;
780; -------------------------
781; | CPU例外要因番号 | <----- p_excinf
782; ------------------------- (intptr_t)(p_excinf + 0)
783; | R6(4byte) |
784; ------------------------- (intptr_t)(p_excinf + 4)
785; | R7(4byte) |
786; ------------------------- (intptr_t)(p_excinf + 8)
787; | R8(4byte) |
788; ------------------------- (intptr_t)(p_excinf + 12)
789; | R9(4byte) |
790; ------------------------- (intptr_t)(p_excinf + 16)
791; | R10(4byte) |
792; ------------------------- (intptr_t)(p_excinf + 20)
793; | R11(4byte) |
794; ------------------------- (intptr_t)(p_excinf + 24)
795; | R12(4byte) |
796; ------------------------- (intptr_t)(p_excinf + 28)
797; | R13(4byte) |
798; ------------------------- (intptr_t)(p_excinf + 32)
799; | ACC-HI(4byte) |
800; ------------------------- (intptr_t)(p_excinf + 36)
801; | ACC-LO(4byte) |
802; ------------------------- (intptr_t)(p_excinf + 40)
803; | FPSW(4byte) |
804; ------------------------- (intptr_t)(p_excinf + 44)
805; | R14(4byte) |
806; ------------------------- (intptr_t)(p_excinf + 48)
807; | R15(4byte) |
808; ------------------------- (intptr_t)(p_excinf + 52)
809; | R1(4byte) |
810; ------------------------- (intptr_t)(p_excinf + 56)
811; | R2(4byte) |
812; ------------------------- (intptr_t)(p_excinf + 60)
813; | R3(4byte) |
814; ------------------------- (intptr_t)(p_excinf + 64)
815; | R4(4byte) |
816; ------------------------- (intptr_t)(p_excinf + 68)
817; | R5(4byte) |
818; ------------------------- (intptr_t)(p_excinf + 72)
819; | PC(4byte) |
820; ------------------------- (intptr_t)(p_excinf + 76)
821; | PSW(4byte) |
822; ------------------------- (intptr_t)(p_excinf + 80)
823;
824; ここでは, 割込み処理モードに変更してハンドラを実行する.
825; CPU例外ハンドラに渡すVP型の変数 p_excinf としてISPの値渡す.
826;
827; ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
828; TRUE になった時に,ret_int へ分岐(遅
829延ディスパッチ)する.
830;
831; 多重割込みかどうかは割込みネストカウンタの値で判定する.
832; intnest != 0 ならば多重割込みであると判定する.
833;
834; reqflg はCPUロック状æ…
835‹ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹. そうでないと,
836; reqflg チェック後に起動された割込みハンドラ内
837で
838; ディスパッチが要求された場合に,ディスパッチされない.
839;
840;
841; CPU例外å…
842¥å£å‡¦ç†
843;
844; ここでは, 割込み処理モードに変更してハンドラを実行する.
845;
846
847;
848; CPU例外ハンドラ呼出し後に不要となるスタック情
849報のサイズ
850; EXCNO + R6--R13
851;
852 EXCINF_REG_SIZE .equ (4+32)
853
854_kernel_exception:
855 pushm r14-r15 ; スクラッチレジスタを退避
856 pushc fpsw
857 mvfacmi r5
858 shll #16, r5 ; ACC最下位16bitは0とする
859 mvfachi r4
860 pushm r4-r5 ; アキュムレータ退避
861 pushm r6-r13 ; 非スクラッチレジスタ保存
862 push.l r1 ; CPU例外要因番号を保持
863 mov.l r0, r3 ; スタックポインタを取り出し
864 mov.l EXC_GET_PSW_OFFSET[r3], r5
865 and #PSW_I_MASK, r5
866 bz exception_nonkernel ; å…
867¨å‰²è¾¼ã¿ç¦æ­¢(CPUロック)状æ…
868‹ãªã‚‰ç®¡ç†å¤–
869.if TIPM_LOCK != -15
870 mov.l EXC_GET_PSW_OFFSET[r3], r5
871 and #PSW_IPL_MASK, r5
872 cmp #IPL_LOCK, r5
873 bgt exception_nonkernel ; IPLがCPUロックレベル以上なら管理外
874.endif
875 mov.l #__kernel_intnest, r5
876 mov.w [r5], r4
877 add #1, r4 ; ネスト回数をインクリメント
878 mov.w r4, [r5]
879 cmp #1, r4 ; 多重割り込みかどうか
880 bnz exception_from_int ; 加算前が0でなければ多重割込み
881 ; 初段の割込み
882 mov.l #__kernel_istkpt, r5 ; 割込み用のスタックへ切替える
883 mov.l [r5], r0
884 push.l r3 ; タスクスタックを保持
885exception_from_int: ; 多重割込み
886 mov.l EXC_GET_PSW_OFFSET[r3], r5
887 mvtc r5, psw ; CPU例外発生前の状æ…
888‹ã«æˆ»ã™
889.if LOG_EXC_LEAVE == 1
890 push.l r1 ; ログトレースの引数を保持
891.endif
892
893.if LOG_EXC_ENTER == 1
894 pushm r2-r3
895 bsr _kernel_log_exc_enter ; ログトレース関数の呼出し
896 ; 引数の割込み要因番号は既にr1にå…
897¥ã£ã¦ã„ã‚‹
898 popm r2-r3
899.endif
900
901 mov.l r3, r1 ; 引数のp_excinfを設定
902 jsr r2 ; Cルーチン呼び出し
903
904.if LOG_EXC_LEAVE == 1
905 pop r1 ; 引数に割込み要因番号を設定
906 bsr _kernel_log_exc_leave ; ログトレース関数の呼出し
907.endif
908
909 clrpsw i ; ここからは必
910ず割込み禁止
911 mov.l #__kernel_intnest, r5
912 mov.w [r5], r4
913 sub #1, r4 ; ネスト回数をデクリメント
914 mov.w r4, [r5]
915 cmp #0, r4 ; 多重割り込みかどうか
916 bnz exception_return ; 多重割り込みならリターン
917 ; 初段の割込み
918 pop r0 ; タスクのスタックに戻す
919 mov.l #__kernel_reqflg, r5 ; ディスパッチ要求がないか?
920 mov.l [r5], r5
921 cmp #1, r5
922 bnz exception_return ; なければリターン
923 add #EXCINF_REG_SIZE, r0 ; CPU例外情
924報の破棄
925 bra ret_int ; あれば ret_int へジャンプ
926
927exception_nonkernel:
928 mov.l #__kernel_intnest, r5
929 mov.w [r5], r4
930 add #1, r4 ; ネスト回数をインクリメント
931 mov.w r4, [r5]
932 cmp #1, r4 ; 多重割り込みかどうか
933 bnz exception_from_nonkernelint ; 加算前が0でなければ多重割込み
934 ; 初段の割込み
935 mov.l #__kernel_istkpt, r5 ; 割込み用のスタックへ切替える
936 mov.l [r5], r0
937 push.l r3 ; タスクスタックを保持
938exception_from_nonkernelint: ; 多重割込み
939 mov.l EXC_GET_PSW_OFFSET[r3], r5
940 mvtc r5, psw ; CPU例外発生前の状æ…
941‹ã«æˆ»ã™
942
943 mov.l r3, r1 ; 引数のp_excinfを設定
944 jsr r2 ; Cルーチン呼び出し
945
946 clrpsw i ; ここからは必
947ず割込み禁止
948 mov.l #__kernel_intnest, r5
949 mov.w [r5], r4
950 sub #1, r4 ; ネスト回数をデクリメント
951 mov.w r4, [r5]
952 cmp #0, r4 ; 多重割り込みかどうか
953 bnz exception_return ; 多重割り込みならリターン
954 ; 初段の割込み
955 pop r0 ; タスクのスタックに戻す
956
957exception_return:
958 add #EXCINF_REG_SIZE, r0 ; CPU例外情
959報の破棄
960 popm r4-r5 ; アキュムレータ復帰
961 mvtaclo r5 ; ACC最下位16bitは0で復帰
962 mvtachi r4
963 popc fpsw ; FPUステータスレジスタ復帰
964 popm r14-r15 ; レジスタ復帰
965 popm r1-r5
966 rte ; 割込み前の処理に戻る
967
968
969;
970; 微少時間待
971ち
972;
973_sil_dly_nse:
974 mov.l #SIL_DLY_TIM1, r5
975 sub r5, r1
976 ble sil_dly_nse_ret
977sil_dly_nse_loop:
978 mov.l #SIL_DLY_TIM2, r5
979 sub r5, r1
980 bgt sil_dly_nse_loop
981sil_dly_nse_ret:
982 rts
983
984 .end
985
Note: See TracBrowser for help on using the repository browser.