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