source: asp3_gr_sakura/trunk/arch/rx630_gcc/prc_support.S@ 317

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

GR-SAKURA向けASP3を追加

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