- Timestamp:
- Mar 8, 2016, 8:37:45 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
UsbWattMeter/trunk/asp_dcre/arch/rx630_ccrx/prc_support.src
-
Property svn:mime-type
set to
text/plain; charset=SHIFT_JIS
r164 r167 11 11 ; Copyright (C) 2013 by Mitsuhiro Matsuura 12 12 ; 13 ; ãLì ÒÍCȺÌ(1)`(4)Ìðð½·êÉÀèC{\tgEF 14 ; Ai{\tgEFAðüϵ½àÌðÜÞDȺ¯¶jðgpE¡»Eü 15 ; ÏEÄzziȺCpÆÄÔj·é±Æð³Åø·éD 16 ; (1) {\tgEFAð\[XR[hÌ`Åp·éêÉÍCãLÌì 17 ; \¦C±Ìpð¨æÑºLÌ³ÛØKèªC»ÌÜÜÌ`Å\[ 18 ; XR[hÉÜÜêĢ鱯D 19 ; (2) {\tgEFAðCCu`®ÈÇC¼Ì\tgEFAJÉg 20 ; pÅ«é`ÅÄzz·éêÉÍCÄzzɺ¤hL 21 gip 22 ; Ò}j 23 AÈÇjÉCãLÌì \¦C±Ìpð¨æÑºL 24 ; Ì³ÛØKèðfÚ·é±ÆD 25 ; (3) {\tgEFAðC@íÉgÝÞÈÇC¼Ì\tgEFAJÉg 26 ; pūȢ`ÅÄzz·éêÉÍCÌ¢¸ê©Ìðð½·± 27 ; ÆD 28 ; (a) Äzzɺ¤hL 29 gipÒ}j 30 AÈÇjÉCãLÌ 31 ; ì \¦C±Ìpð¨æÑºLÌ³ÛØKèðfÚ·é±ÆD 32 ; (b) ÄzzÌ`ÔðCÊÉèßéû@ÉæÁÄCTOPPERSvWFNgÉ 33 ; ñ·é±ÆD 34 ; (4) {\tgEFAÌpÉæè¼ÚIܽÍÔÚIɶ¶é¢©Èé¹ 35 ; Q©çàCãLì Ò¨æÑTOPPERSvWFNgðÆÓ·é±ÆD 36 ; ܽC{\tgEFAÌ[UܽÍGh[U©çÌ¢©Èé 37 ; RÉîÿ©çàCãLì Ò¨æÑTOPPERSvWFNgð 38 ; ÆÓ·é±ÆD 13 ; 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 14 ; ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 15 ; 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 16 ; (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 17 ; 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 18 ; スコード中に含まれていること. 19 ; (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 20 ; 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 21 ; 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 22 ; の無保証規定を掲載すること. 23 ; (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 24 ; 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 25 ; と. 26 ; (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 27 ; 作権表示,この利用条件および下記の無保証規定を掲載すること. 28 ; (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 29 ; 報告すること. 30 ; (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 31 ; 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 32 ; また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 33 ; 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 34 ; 免責すること. 39 35 ; 40 ; {\tgEFAÍC³ÛØÅñ³êÄ¢éàÌÅ éDãLì Ò¨41 ; æÑTOPPERSvWFNgÍC{\tgEFAÉÖµÄCÁèÌgpÚI42 ; ÉηéK«àÜßÄC¢©ÈéÛØàsíÈ¢DܽC{\tgEF43 ; AÌpÉæè¼ÚIܽÍÔÚIɶ¶½¢©Èé¹QÉÖµÄàC»44 ; ÌÓCðíÈ¢D36 ; 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 37 ; よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 38 ; に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 39 ; アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 40 ; の責任を負わない. 45 41 ; 46 42 ; @(#) $Id: prc_support.src 536 2014-10-09 23:11:40Z coas-nagasima $ … … 48 44 49 45 ; 50 ; vZbT˶W 51 [ AZu¾êiRX630pj 52 ; 53 54 ; 55 ; fBXpb`¨æÑÝ(CPUáO)oüèûÌ[: 56 ; ®ì[hðÈºÌæ¤Éè`·é. 57 ; fBXpb`[h: 58 ; CPUbNóÔ, ÝDæx}XNSðóÔ, 59 ; ^XNReLXg(intnest = 0), ^XNX^bN 60 ; Ý(CPUáO)[h 61 ; SÝbNóÔ(PSWWX^Irbg = 0), 62 ; ÝDæx}XNSðÅÈ¢óÔ(IPL != 0) 63 ; ÝReLXg(intnest != 0), ÝX^bN 64 ; 65 ; J[lÇOÝÌT|[gL³Æ, CPUbNóÔ, ÝDæx 66 ; }XNSðóÔÌÖWÍȺÌÊèÅ é. 67 ; J[lÇOÝ¢T|[g: 68 ; CPUbNóÔ(PSWWX^Irbg = 0) 69 ; ÝDæx}XNSðóÔ(IPL = 0) 70 ; J[lÇOÝT|[g: 71 ; CPUbNóÔ 72 ; (PSWWX^Irbg = 0, IPL = IPL_LOCK, lock_flag = true) 73 ; ÝDæx}XNSðóÔ(saved_ipl = 0) 74 ; 75 ; e\¢Ì|C^ðÈºÌæ¤ÉeWX^ÉATC·é. 76 ; r15 = p_runtsk ½¾µfBXpb`ÌeoûÅͳø 77 ; r14 = *p_runtsk dispatcher ÌÅÍ p_runtsk mèÉÄæ¾·é 78 ; eüèû©çÅÉÏANZX·éÆ«ÉãLWX^ÉÛ¶·é. 79 ; 80 ; \¢ÌACgÖÌÎ 81 ; \¢ÌACgª4Byte(ApbN)Ìê: 82 ; êÊIÈWX^ÎAhbVOªÂ\ 83 ; á: mov.l #__kernel_p_runtsk, r15 46 ; プロセッサ依存モジュール アセンブリ言語部(RX630用) 47 ; 48 49 ; 50 ; ディスパッチャおよび割込み(CPU例外)出入り口のルール: 51 ; 動作モードを以下のように定義する. 52 ; ディスパッチャモード: 53 ; CPUロック状態, 割込み優先度マスク全解除状態, 54 ; タスクコンテキスト(intnest = 0), タスクスタック 55 ; 割込み(CPU例外)処理モード 56 ; 全割込みロック状態(PSWレジスタIビット = 0), 57 ; 割込み優先度マスク全解除でない状態(IPL != 0) 58 ; 割込みコンテキスト(intnest != 0), 割込みスタック 59 ; 60 ; カーネル管理外割込みのサポート有無と, CPUロック状態, 割込み優先度 61 ; マスク全解除状態の関係は以下の通りである. 62 ; カーネル管理外割込み未サポート時: 63 ; CPUロック状態(PSWレジスタIビット = 0) 64 ; 割込み優先度マスク全解除状態(IPL = 0) 65 ; カーネル管理外割込みサポート時: 66 ; CPUロック状態 67 ; (PSWレジスタIビット = 0, IPL = IPL_LOCK, lock_flag = true) 68 ; 割込み優先度マスク全解除状態(saved_ipl = 0) 69 ; 70 ; 各構造体ポインタを以下のように各レジスタにアサインする. 71 ; r15 = p_runtsk ただしディスパッチャの各出口では無効 72 ; r14 = *p_runtsk dispatcher の中では p_runtsk 確定時に再取得する 73 ; 各入り口から最初に変数アクセスするときに上記レジスタに保存する. 74 ; 75 ; 構造体アライメントへの対応 76 ; 構造体アライメントが4Byte(アンパック)の場合: 77 ; 一般的なレジスタ相対アドレッシングが可能 78 ; 例: mov.l #__kernel_p_runtsk, r15 84 79 ; mov.l r0, TCB_sp[r15] 85 ; \¢ÌACgª4ByteÅÍÈ¢(pbN)Ìê:86 ; mov.l Ìæ¤ÉOTCYwèÌêAÎlÍ4Ì{ÌÝLø87 ; ±Ì½ß, êxÎÛAhXðßÄ©çANZX·éKvª é88 ; á: mov.l #__kernel_p_runtsk, r1580 ; 構造体アライメントが4Byteではない(パック)の場合: 81 ; mov.lのようにロングサイズ指定の場合、相対値は4の倍数のみ有効 82 ; このため, 一度対象アドレスを求めてからアクセスする必要がある 83 ; 例: mov.l #__kernel_p_runtsk, r15 89 84 ; add #TCB_sp, r15, r5 90 85 ; mov.l r0, [r5] 91 ; eItZbglð»fµ, ðAZuÉæèR[hðØèÖ¦é92 ; 93 94 ; 95 ; \¢ÌANZXÌItZbgè`86 ; 各オフセット値を判断し, 条件アセンブルによりコードを切り替える 87 ; 88 89 ; 90 ; 構造体アクセスのオフセット定義 96 91 ; 97 92 .include offset.inc 98 93 99 94 ; 100 ; eíEQUè`(Ht@CÌ#defineè`)95 ; 各種EQU定義(Hファイルの#define定義) 101 96 ; 102 97 .include asm_config.inc … … 150 145 151 146 ; 152 ; TCB_sp ÖÌÝ}N147 ; TCB_sp への書込みマクロ 153 148 ; 154 149 st_TCB_sp .macro src, tcb, tmp … … 162 157 163 158 ; 164 ; TCB_sp ©çÌÇoµ}N159 ; TCB_sp からの読出しマクロ 165 160 ; 166 161 ld_TCB_sp .macro dst, tcb, tmp … … 174 169 175 170 ; 176 ; TCB_pc ÖÌÝ}N171 ; TCB_pc への書込みマクロ 177 172 ; 178 173 st_TCB_pc .macro src, tcb, tmp … … 186 181 187 182 ; 188 ; TCB_pc ©çÌÇoµ}N183 ; TCB_pc からの読出しマクロ 189 184 ; 190 185 ld_TCB_pc .macro dst, tcb, tmp … … 198 193 199 194 ; 200 ; TCB_texptn ©çÌÇoµ}N195 ; TCB_texptn からの読出しマクロ 201 196 ; 202 197 ld_TCB_texptn .macro dst, tcb, tmp … … 210 205 211 206 ; 212 ; TCB_p_tinib ©çÌÇoµ}N207 ; TCB_p_tinib からの読出しマクロ 213 208 ; 214 209 ld_TCB_p_tinib .macro dst, tcb, tmp … … 222 217 223 218 ; 224 ; TINIB_exinf ©çÌÇoµ}N219 ; TINIB_exinf からの読出しマクロ 225 220 ; 226 221 ld_TINIB_exinf .macro dst, tinib, tmp … … 234 229 235 230 ; 236 ; TINIB_task ©çÌÇoµ}N231 ; TINIB_task からの読出しマクロ 237 232 ; 238 233 ld_TINIB_task .macro dst, tinib, tmp … … 249 244 250 245 ; 251 ; API ©çÌ^XNfBXpb`üû252 ; 253 ; ÄÑoµð:254 ; EfBXpb`[h(t@Cwb_QÆ)255 ; 256 ; ±±ÅÍ, ReLXgÌÞðÆ, ÀsÄJÔnÌÝèð·é.246 ; APIからのタスクディスパッチャ入口 247 ; 248 ; 呼び出し条件: 249 ; ・ディスパッチャモード(ファイルヘッダ参照) 250 ; 251 ; ここでは, コンテキストの退避と, 実行再開番地の設定をする. 257 252 ; 258 253 __kernel_dispatch: 259 pushm r6-r13 ; ñXNb`WX^Û¶254 pushm r6-r13 ; 非スクラッチレジスタ保存 260 255 mov.l #__kernel_p_runtsk, r15 261 256 mov.l [r15], r14 262 st_TCB_sp r0, r14, r5 ; X^bN|C^ðTCBÉÛ¶263 st_TCB_pc #dispatch_r, r14, r5 ; ÀsÄJÔnðTCBÉÛ¶257 st_TCB_sp r0, r14, r5 ; スタックポインタをTCBに保存 258 st_TCB_pc #dispatch_r, r14, r5 ; 実行再開番地をTCBに保存 264 259 bra dispatcher 265 260 266 261 ; 267 ; API ÖÌ^XNfBXpb`oû268 ; 269 ; ÄÑoµð:270 ; EfBXpb`[h(t@Cwb_QÆ)271 ; 272 ; ±±ÅÍ, ^XNáOnhÄoµÆ, ReLXgÌAð·é.262 ; APIへのタスクディスパッチャ出口 263 ; 264 ; 呼び出し条件: 265 ; ・ディスパッチャモード(ファイルヘッダ参照) 266 ; 267 ; ここでは, タスク例外ハンドラ呼出しと, コンテキストの復帰をする. 273 268 ; 274 269 dispatch_r: 275 btst #TCB_enatex_bit, TCB_enatex[r14] ; ^XNáOÂ?270 btst #TCB_enatex_bit, TCB_enatex[r14] ; タスク例外処理許可? 276 271 bz dispatch_r_rts 277 ld_TCB_texptn r5, r14, r4 ; Û¯áOvöª é©H272 ld_TCB_texptn r5, r14, r4 ; 保留例外要因があるか? 278 273 cmp #0, r5 279 274 bz dispatch_r_rts 280 bsr __kernel_call_texrtn ; ^XNáOnhÄoµÀs275 bsr __kernel_call_texrtn ; タスク例外ハンドラ呼出し処理実行 281 276 dispatch_r_rts: 282 popm r6-r13 ; ñXNb`WX^A283 rts ; dispatch ÄÑoµ³Ößé.284 285 ; 286 ; ^XNN®(^XNæªÖÌ^XNfBXpb`oû)287 ; 288 ; ÄÑoµð:289 ; EfBXpb`[h(t@Cwb_QÆ)290 ; 291 ; ±±ÅÍ, CPUbNðóÔɵ, ^XNðN®·é.277 popm r6-r13 ; 非スクラッチレジスタ復帰 278 rts ; dispatch 呼び出し元へ戻る. 279 280 ; 281 ; タスク起動処理(タスク先頭へのタスクディスパッチャ出口) 282 ; 283 ; 呼び出し条件: 284 ; ・ディスパッチャモード(ファイルヘッダ参照) 285 ; 286 ; ここでは, CPUロック解除状態にし, タスクを起動する. 292 287 ; 293 288 __kernel_start_r: 294 289 mov.l #_ext_tsk, r5 295 push.l r5 ; ßèÔnðX^bNÉÏÞ290 push.l r5 ; 戻り番地をスタックに積む 296 291 ld_TCB_p_tinib r5, r14, r4 297 ld_TINIB_exinf r1, r5, r4 ; g£îñðæêøÉÝè298 ld_TINIB_task r5, r5, r4 ; ^XNÌN®Ônðæ¾292 ld_TINIB_exinf r1, r5, r4 ; 拡張情報を第一引数に設定 293 ld_TINIB_task r5, r5, r4 ; タスクの起動番地を取得 299 294 .if TIPM_LOCK == -15 300 setpsw i ; ÝÂ(CPUbNðóÔ)301 .else 302 mov.l #__kernel_lock_flag, r4 ; CPU bNðóÔÖ303 mov.l #0, [r4] ; ±±É鯫ÍK¸ saved_ipl Ì304 mvtc #00010000H, psw ; lÍ 0 ̽ß, ¼lðÝè·é.305 ; SÝbNðóÔ( I = 1 )306 ; ÝDæx}XNSðóÔ( IPL = 0 )295 setpsw i ; 割込み許可(CPUロック解除状態) 296 .else 297 mov.l #__kernel_lock_flag, r4 ; CPUロック解除状態へ 298 mov.l #0, [r4] ; ここに来るときは必ず saved_ipl の 299 mvtc #00010000H, psw ; 値は 0 のため, 直値を設定する. 300 ; 全割込みロック解除状態( I = 1 ) 301 ; 割込み優先度マスク全解除状態( IPL = 0 ) 307 302 .endif 308 303 jmp r5 309 304 310 305 ; 311 ; J[lN®©çÌ^XNfBXpb`üû312 ; 313 ; ±Ì[`ÍCJ[lN®ÉC·×ÄÌÝðÖ~µ½óÔ314 ; iÝbNóÔÆ¯jÅÄÑo³êéDܽCÝ[hiñ315 ; ^XNReLXgƯjÅÄÑo³ê鱯ðzèµÄ¢éD316 ; 317 ; ÄÑoµð:318 ; EÝ(CPUáO)[h(t@Cwb_QÆ)319 ; 320 ; ±±ÅÍ, fBXpb`[hÉÏX·é.306 ; カーネル起動からのタスクディスパッチャ入口 307 ; 308 ; このルーチンは,カーネル起動時に,すべての割込みを禁止した状態 309 ; (割込みロック状態と同等)で呼び出される.また,割込みモード(非 310 ; タスクコンテキストと同等)で呼び出されることを想定している. 311 ; 312 ; 呼び出し条件: 313 ; ・割込み(CPU例外)処理モード(ファイルヘッダ参照) 314 ; 315 ; ここでは, ディスパッチャモードに変更する. 321 316 ; 322 317 __kernel_start_dispatch: 323 318 mov.l #__kernel_intnest, r5 324 mov.w #0, [r5] ; ^XNReLXgÉØ·¦319 mov.w #0, [r5] ; タスクコンテキストに切換え 325 320 .if TIPM_LOCK != -15 326 mvtc #(IPL_LOCK | 00010000H), psw ; SÝbNðóÔ327 ; ÝDæx}XNSðÅÈ¢óÔ328 .endif 329 330 ; 331 ; ^XNI¹(»ÝÌReLXgðÌÄé)©çÌ^XNfBXpb`üû332 ; 333 ; ÄÑoµð:334 ; EfBXpb`[h(t@Cwb_QÆ)335 ; 336 ; ±±ÅÍ, ½à·é±ÆÍÈ¢.337 ; Ȩ, p_runtsk ÌAhXæ¾¾¯ÍsȤ.321 mvtc #(IPL_LOCK | 00010000H), psw ; 全割込みロック解除状態 322 ; 割込み優先度マスク全解除でない状態 323 .endif 324 325 ; 326 ; タスク終了(現在のコンテキストを捨てる)からのタスクディスパッチャ入口 327 ; 328 ; 呼び出し条件: 329 ; ・ディスパッチャモード(ファイルヘッダ参照) 330 ; 331 ; ここでは, 何もすることはない. 332 ; なお, p_runtsk のアドレス取得だけは行なう. 338 333 ; 339 334 __exit_and_dispatch: … … 341 336 342 337 ; 343 ; fBXpb`{Ì344 ; 345 ; ÄÑoµð:346 ; E·×ÄÌ^XNÌReLXgÍÛ¶³êÄ¢é.347 ; 348 ; dispatcher ÄoÌX^bN:349 ; E__kernel_dispatch ©ç«½ê : ^XNX^bN350 ; Eexit_and_dispatch ©ç«½ê:351 ; exit_task ©ç«½ê : ^XNX^bN352 ; J[lN®(__kernel_start_dispatch) : ÝX^bN353 ; Eret_int ©ç«½ê : ^XNX^bN354 ; Edispatcher_idle_loop ©ç«½ê : ÝX^bN338 ; ディスパッチャ本体 339 ; 340 ; 呼び出し条件: 341 ; ・すべてのタスクのコンテキストは保存されている. 342 ; 343 ; dispatcher 呼出時のスタック: 344 ; ・__kernel_dispatch からきた場合 : タスクスタック 345 ; ・exit_and_dispatch からきた場合: 346 ; exit_task からきた場合 : タスクスタック 347 ; カーネル起動時(__kernel_start_dispatch) : 割込みスタック 348 ; ・ret_int からきた場合 : タスクスタック 349 ; ・dispatcher_idle_loop からきた場合 : 割込みスタック 355 350 ; 356 351 dispatcher: 357 352 .if LOG_DSP_ENTER == 1 358 353 push.l r15 359 mov.l r14, r1 ; ø(fBXpb`³TCB)ðÝè354 mov.l r14, r1 ; 引数(ディスパッチ元TCB)を設定 360 355 bsr _kernel_log_dsp_enter 361 356 pop.l r15 362 357 .endif 363 358 mov.l #__kernel_p_schedtsk, r5 364 mov.l [r5], [r15] ; p_schedtsk ð p_runtsk É359 mov.l [r5], [r15] ; p_schedtsk を p_runtsk に 365 360 mov.l [r15], r14 366 361 cmp #0, r14 367 bz dispatcher_pre_idle ; schedtsk ªÈ¯êÎACh[vÖ368 ld_TCB_sp r0, r14, r5 ; ^XNX^bN|C^ðA362 bz dispatcher_pre_idle ; schedtsk がなければアイドルループへ 363 ld_TCB_sp r0, r14, r5 ; タスクスタックポインタを復帰 369 364 .if LOG_DSP_LEAVE == 1 370 365 push.l r14 371 mov.l r14, r1 ; ø(fBXpb`æTCB)ðÝè366 mov.l r14, r1 ; 引数(ディスパッチ先TCB)を設定 372 367 bsr _kernel_log_dsp_leave 373 368 pop.l r14 374 369 .endif 375 370 ld_TCB_pc r5, r14, r4 376 jmp r5 ; ÀsÄJÔnÖWv377 378 ; 379 ; schdedtsk ªNULLÌêÍACh[vÉüé380 ; ACh[vÍÝ[hŮ쳹é381 ; 382 ; ±±ÅÝ[hÉØè·¦éÌÍC±±Å¶·éÝÉ383 ; ÇÌX^bNðg¤©Æ¢¤âèÌðÆCÝnhàÅÌ^384 ; XNfBXpb`Ìh~Æ¢¤2ÂÌÓ¡ª éD371 jmp r5 ; 実行再開番地へジャンプ 372 373 ; 374 ; schdedtskがNULLの場合はアイドルループに入る 375 ; アイドルループは割込み処理モードで動作させる 376 ; 377 ; ここで割込みモードに切り換えるのは,ここで発生する割込み処理に 378 ; どのスタックを使うかという問題の解決と,割込みハンドラ内でのタ 379 ; スクディスパッチの防止という2つの意味がある. 385 380 ; 386 381 dispatcher_pre_idle: 387 382 mov.l #__kernel_istkpt,r5 388 mov.l [r5], r0 ; ÝpÌX^bNÖØÖ¦389 mov.l #__kernel_intnest, r5 390 mov.w #1, [r5] ; ñ^XNReLXgÉØ·¦383 mov.l [r5], r0 ; 割込み用のスタックへ切替え 384 mov.l #__kernel_intnest, r5 385 mov.w #1, [r5] ; 非タスクコンテキストに切換え 391 386 .if TIPM_LOCK != -15 392 mov.l #__kernel_lock_flag, r5 ; CPU bNðóÔÖ387 mov.l #__kernel_lock_flag, r5 ; CPUロック解除状態へ 393 388 mov.l #0, [r5] 394 mvtc #0, psw ; Dæx0ÌÝðU389 mvtc #0, psw ; 優先度0の割込み処理中を偽装 395 390 .endif 396 391 397 392 dispatcher_idle_loop: 398 setpsw i ; SÝÂ399 clrpsw i ; SÝÖ~400 401 mov.l #__kernel_reqflg, r5 ; reqflg ª FALSE Èç393 setpsw i ; 全割込み許可 394 clrpsw i ; 全割込み禁止 395 396 mov.l #__kernel_reqflg, r5 ; reqflg が FALSE なら 402 397 mov.l [r5], r4 403 398 cmp #0, r4 404 bz dispatcher_idle_loop ; ACh[vðJèÔ·405 mov.l #0, [r5] ; reqflg ªtrueÈçfalseÉ·é406 mov.l #__kernel_intnest, r5 407 mov.w #0, [r5] ; ^XNReLXgÉØ·¦399 bz dispatcher_idle_loop ; アイドルループを繰り返す 400 mov.l #0, [r5] ; reqflgがtrueならfalseにする 401 mov.l #__kernel_intnest, r5 402 mov.w #0, [r5] ; タスクコンテキストに切換え 408 403 .if TIPM_LOCK != -15 409 mov.l #__kernel_lock_flag, r5 ; CPU bNóÔÖ404 mov.l #__kernel_lock_flag, r5 ; CPUロック状態へ 410 405 mov.l #1, [r5] 411 406 mov.l #__kernel_saved_ipl, r5 412 407 mov.l #0, [r5] 413 mvtc #(IPL_LOCK | PSW_I_MASK), psw ; SÝbNðóÔ414 ; ÝDæx}XNSðÅÈ¢óÔ415 .endif 416 bra dispatcher ; dispatcher Ößé417 418 419 ; 420 ; J[lÌI¹ÌÄoµ421 ; 422 ; [hÆX^bNðñ^XNReLXgpÉØèÖ¦D408 mvtc #(IPL_LOCK | PSW_I_MASK), psw ; 全割込みロック解除状態 409 ; 割込み優先度マスク全解除でない状態 410 .endif 411 bra dispatcher ; dispatcher へ戻る 412 413 414 ; 415 ; カーネルの終了処理の呼出し 416 ; 417 ; モードとスタックを非タスクコンテキスト用に切り替え. 423 418 ; 424 419 .glb __kernel_call_exit_kernel 425 420 __kernel_call_exit_kernel: 426 421 .if TIPM_LOCK != -15 427 clrpsw i ; SÝÖ~428 mov.l #__kernel_lock_flag, r5 ; CPU bNðóÔÖ422 clrpsw i ; 全割込み禁止 423 mov.l #__kernel_lock_flag, r5 ; CPUロック解除状態へ 429 424 mov.l #0, [r5] 430 425 .endif 431 426 mov.l #__kernel_istkpt, r5 432 mov.l [r5], r0 ; ÝpÌX^bNÖØÖ¦433 mov.l #__kernel_intnest, r5 434 mov.w #1, [r5] ; ñ^XNReLXgÉØ·¦427 mov.l [r5], r0 ; 割込み用のスタックへ切替え 428 mov.l #__kernel_intnest, r5 429 mov.w #1, [r5] ; 非タスクコンテキストに切換え 435 430 bsr __kernel_exit_kernel 436 431 bra __kernel_call_exit_kernel … … 438 433 439 434 ; 440 ; Ý(CPUáO)©çÌ^XNfBXpb`üû441 ; 442 ; Äoµð:443 ; ESÝbNóÔ(PSWWX^Irbg= 0)444 ; EÝDæx}XNSðÅÈ¢óÔ(IPL != 0)445 ; E^XNReLXg(intnest=0)446 ; EgpX^bNÍ^XNX^bN447 ; Ereqflg = true448 ; 449 ; ±±ÅÍ, fBXpb`[hÉÏXµ, reqflgðOFFɵĩç,450 ; xfBXpb`ÌL³ð»f·é.451 ; 452 453 ; 454 ; ret_int æªÅX^bNÉÏÜêÄ¢éPSWWX^ÖÌItZbg435 ; 割込み(CPU例外)からのタスクディスパッチャ入口 436 ; 437 ; 呼出し条件: 438 ; ・全割込みロック状態(PSWレジスタIビット = 0) 439 ; ・割込み優先度マスク全解除でない状態(IPL != 0) 440 ; ・タスクコンテキスト(intnest=0) 441 ; ・使用スタックはタスクスタック 442 ; ・reqflg = true 443 ; 444 ; ここでは, ディスパッチャモードに変更し, reqflgをOFFにしてから, 445 ; 遅延ディスパッチの有無を判断する. 446 ; 447 448 ; 449 ; ret_int先頭でスタックに積まれているPSWレジスタへのオフセット 455 450 ; ACC + FPSW + R14--R15 + R1--R5 + PC 456 451 ; … … 459 454 ret_int: 460 455 .if TIPM_LOCK == -15 461 mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; Ý/CPUáO¶OÌIPLlæ¾456 mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; 割込み/CPU例外発生前のIPL値取得 462 457 and #PSW_IPL_MASK, r5 463 mvtc r5, psw ; SÝbN(CPUbN)óÔ464 ; Ý/CPUáO¶OÌÝDæx465 .else 466 mov.l #__kernel_lock_flag, r5 ; CPU bNóÔÖ458 mvtc r5, psw ; 全割込みロック(CPUロック)状態 459 ; 割込み/CPU例外発生前の割込み優先度 460 .else 461 mov.l #__kernel_lock_flag, r5 ; CPUロック状態へ 467 462 mov.l #1, [r5] 468 mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; Ý/CPUáO¶OÌIPLlæ¾463 mov.l RET_INT_GET_PSW_OFFSET[r0], r5 ; 割込み/CPU例外発生前のIPL値取得 469 464 and #PSW_IPL_MASK, r5 470 465 mov.l #__kernel_saved_ipl, r4 471 466 mov.l r5, [r4] 472 mvtc #(IPL_LOCK | PSW_I_MASK), psw ; SÝbNðóÔ473 ; ÝDæx}XNSðÅÈ¢óÔ467 mvtc #(IPL_LOCK | PSW_I_MASK), psw ; 全割込みロック解除状態 468 ; 割込み優先度マスク全解除でない状態 474 469 .endif 475 470 mov.l #__kernel_reqflg, r5 … … 477 472 mov.l #__kernel_p_runtsk, r15 478 473 mov.l [r15], r14 479 mov.l #__kernel_dspflg, r5 ; dspflg ª FALSE Èç ret_int_r Ö474 mov.l #__kernel_dspflg, r5 ; dspflg が FALSE なら ret_int_r へ 480 475 mov.l [r5], r5 481 476 cmp #0, r5 … … 483 478 mov.l #__kernel_p_schedtsk, r5 484 479 mov.l [r5], r5 485 cmp r5, r14 ; p_schedtsk Æ p_runtsk ª¯¶Èç486 beq ret_int_r_call_tex ; ret_int_r_call_tex Ö487 pushm r6-r13 ; ñXNb`WX^Û¶488 st_TCB_sp r0, r14, r5 ; X^bN|C^ðTCBÉÛ¶489 st_TCB_pc #ret_int_r, r14, r5 ; ÀsÄJÔnðTCBÉÛ¶480 cmp r5, r14 ; p_schedtsk と p_runtsk が同じなら 481 beq ret_int_r_call_tex ; ret_int_r_call_tex へ 482 pushm r6-r13 ; 非スクラッチレジスタ保存 483 st_TCB_sp r0, r14, r5 ; スタックポインタをTCBに保存 484 st_TCB_pc #ret_int_r, r14, r5 ; 実行再開番地をTCBに保存 490 485 bra dispatcher 491 486 492 487 ; 493 ; Ý(CPUáO)ÖÌ^XNfBXpb`oû494 ; 495 ; ÄÑoµð:496 ; EfBXpb`[h(t@Cwb_QÆ)497 ; 498 ; ±±ÅÍ, ^XNáOnhÄoµÆ, Ý(CPUáO)[hÖÌ499 ; ÏXÆ, ReLXgÌAðs¢, Ý(CUPáO)¶³Ößé.500 ; 501 __kernel_break_wait: ; ^XNj^px488 ; 割込み(CPU例外)へのタスクディスパッチャ出口 489 ; 490 ; 呼び出し条件: 491 ; ・ディスパッチャモード(ファイルヘッダ参照) 492 ; 493 ; ここでは, タスク例外ハンドラ呼出しと, 割込み(CPU例外)処理モードへの 494 ; 変更と, コンテキストの復帰を行い, 割込み(CUP例外)発生元へ戻る. 495 ; 496 __kernel_break_wait: ;タスクモニタ用ラベル 502 497 ret_int_r: 503 popm r6-r13 ; ñXNb`WX^A498 popm r6-r13 ; 非スクラッチレジスタ復帰 504 499 ret_int_r_call_tex: 505 btst #TCB_enatex_bit, TCB_enatex[r14] ; ^XNáOÂ?500 btst #TCB_enatex_bit, TCB_enatex[r14] ; タスク例外処理許可? 506 501 bz ret_int_r_rte 507 ld_TCB_texptn r5, r14, r4 ; Û¯áOvöª é©H502 ld_TCB_texptn r5, r14, r4 ; 保留例外要因があるか? 508 503 cmp #0, r5 509 504 bz ret_int_r_rte 510 bsr __kernel_call_texrtn ; ^XNáOnhÄoµÀs505 bsr __kernel_call_texrtn ; タスク例外ハンドラ呼出し処理実行 511 506 ret_int_r_rte: 512 507 .if TIPM_LOCK != -15 513 clrpsw i ; SÝÖ~514 mov.l #__kernel_lock_flag, r5 ; CPU bNðóÔÖ508 clrpsw i ; 全割込み禁止 509 mov.l #__kernel_lock_flag, r5 ; CPUロック解除状態へ 515 510 mov.l #0, [r5] 516 511 .endif 517 popm r4-r5 ; AL 518 [^A 519 mvtaclo r5 ; ACCźÊ16bitÍ0ÅA 512 popm r4-r5 ; アキュムレータ復帰 513 mvtaclo r5 ; ACC最下位16bitは0で復帰 520 514 mvtachi r4 521 popc fpsw ; FPU Xe[^XWX^A522 popm r14-r15 ; WX^A515 popc fpsw ; FPUステータスレジスタ復帰 516 popm r14-r15 ; レジスタ復帰 523 517 popm r1-r5 524 rte ; ÝOÌÉßé525 526 527 ; 528 ; ÝÌoüû(AZu¾êLqª)529 ; 530 ; Äoµð:531 ; EݶÌH/WÉæè, PSWWX^ÌIrbg=0, IPLÍót¯532 ; ½ÝÌIPL.533 ; EX^bNͽdèÝÈçÝX^bN, »¤ÅȯêÎ534 ; ^XNX^bN535 ; EݶÌH/WÉæè,X^bNÉÝ©çÌAPCÆPSWª536 ; Û¶³êÄ¢é.537 ; ExN^e[uÉo^³ê½ÂÊÌüèûÉæè, X^bNÉ538 ; XNb`WX^(R1-R5)ªÛ¶³êÄ¢é.539 ; 540 ; ø:541 ; Er1:ÝvöÔ542 ; Er2:ÝnhÌAhX543 ; 544 ; WX^ªX^bNãÉÇÌæ¤ÉÛ¶³êÄ¢é©ðȺɦ·.545 ; ±Ì}ÅÍãªáÊ, ºªÊÌAhXÅ, X^bNͺ©ç546 ; ãûüÉü©ÁÄÏÝã°çêéàÌÆ·é.518 rte ; 割込み前の処理に戻る 519 520 521 ; 522 ; 割込みの出入口処理(アセンブリ言語記述部分) 523 ; 524 ; 呼出し条件: 525 ; ・割込み発生時のH/W処理により, PSWレジスタのIビット=0, IPLは受付け 526 ; た割込みのIPL. 527 ; ・スタックは多重割り込みなら割込みスタック, そうでなければ 528 ; タスクスタック 529 ; ・割込み発生時のH/W処理により,スタックに割込みからの復帰PCとPSWが 530 ; 保存されている. 531 ; ・ベクタテーブルに登録された個別の入り口処理により, スタックに 532 ; スクラッチレジスタ(R1-R5)が保存されている. 533 ; 534 ; 引数: 535 ; ・r1:割込み要因番号 536 ; ・r2:割込みハンドラのアドレス 537 ; 538 ; レジスタがスタック上にどのように保存されているかを以下に示す. 539 ; この図では上が低位, 下が高位のアドレスで, スタックは下から 540 ; 上方向に向かって積み上げられるものとする. 547 541 ; 548 542 ; ------------------------- … … 572 566 ; -------------------------(SP + 44) 573 567 ; 574 ; ±±ÅÍ, Ý[hÉÏXµÄnhðÀs·é.575 ; 576 ; nh©ç^[µ½ãÍ, ½dÝÅÈ, ©Â reqflg ª577 ; TRUE ÉÈÁ½ÉCret_int Öªò(xfBXpb`)·éD578 ; 579 ; ½dݩǤ©ÍÝlXgJE^ÌlÅ»è·é.580 ; intnest != 0 ÈçνdÝŠ鯻è·é.581 ; 582 ; reqflg ÍCPUbNóÔÅ`FbN·é. »¤ÅÈ¢ÆC583 ; reqflg `FbNãÉN®³ê½ÝnhàÅ584 ; fBXpb`ªv³ê½êÉCfBXpb`³êÈ¢.568 ; ここでは, 割込み処理モードに変更してハンドラを実行する. 569 ; 570 ; ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が 571 ; TRUE になった時に,ret_int へ分岐(遅延ディスパッチ)する. 572 ; 573 ; 多重割込みかどうかは割込みネストカウンタの値で判定する. 574 ; intnest != 0 ならば多重割込みであると判定する. 575 ; 576 ; reqflg はCPUロック状態でチェックする. そうでないと, 577 ; reqflg チェック後に起動された割込みハンドラ内で 578 ; ディスパッチが要求された場合に,ディスパッチされない. 585 579 ; 586 580 _kernel_interrupt: 587 pushm r14-r15 ; XNb`WX^ðÞð588 pushc fpsw ; FPU Xe[^XWX^Þð581 pushm r14-r15 ; スクラッチレジスタを退避 582 pushc fpsw ; FPUステータスレジスタ退避 589 583 mvfacmi r5 590 shll #16, r5 ; ACC źÊ16bitÍ0Æ·é584 shll #16, r5 ; ACC最下位16bitは0とする 591 585 mvfachi r4 592 pushm r4-r5 ; AL 593 [^Þð 586 pushm r4-r5 ; アキュムレータ退避 594 587 mov.l #__kernel_intnest, r5 595 588 mov.w [r5], r4 596 add #1, r4 ; lXgñðCNg589 add #1, r4 ; ネスト回数をインクリメント 597 590 mov.w r4, [r5] 598 cmp #1, r4 ; ½dèݩǤ©599 bnz interrupt_from_int ; ÁZOª0ÅȯêνdÝ600 ; iÌÝ601 mov.l r0, r3 ; X^bN|C^ðæèoµ602 mov.l #__kernel_istkpt, r5 ; ÝpÌX^bNÖØÖ¦é591 cmp #1, r4 ; 多重割り込みかどうか 592 bnz interrupt_from_int ; 加算前が0でなければ多重割込み 593 ; 初段の割込み 594 mov.l r0, r3 ; スタックポインタを取り出し 595 mov.l #__kernel_istkpt, r5 ; 割込み用のスタックへ切替える 603 596 mov.l [r5], r0 604 push.l r3 ; ^XNX^bNðÛ605 interrupt_from_int: ; ½dÝ606 setpsw i ; ÝÂ(CPUbNðóÔ)597 push.l r3 ; タスクスタックを保持 598 interrupt_from_int: ; 多重割込み 599 setpsw i ; 割込み許可(CPUロック解除状態) 607 600 608 601 .if LOG_INH_LEAVE == 1 609 push.l r1 ; Og[XÌøðÛ602 push.l r1 ; ログトレースの引数を保持 610 603 .endif 611 604 612 605 .if LOG_INH_ENTER == 1 613 606 push.l r2 614 bsr _kernel_log_inh_enter ; Og[XÖÌÄoµ615 ; øÌÝvöÔÍùÉr1ÉüÁÄ¢é607 bsr _kernel_log_inh_enter ; ログトレース関数の呼出し 608 ; 引数の割込み要因番号は既にr1に入っている 616 609 pop r2 617 610 .endif 618 611 619 jsr r2 ; C [`ÄÑoµ612 jsr r2 ; Cルーチン呼び出し 620 613 621 614 .if LOG_INH_LEAVE == 1 622 pop r1 ; øÉÝvöÔðÝè623 bsr _kernel_log_inh_leave ; Og[XÖÌÄoµ624 .endif 625 626 clrpsw i ; ÝÖ~(CPUbNóÔ)615 pop r1 ; 引数に割込み要因番号を設定 616 bsr _kernel_log_inh_leave ; ログトレース関数の呼出し 617 .endif 618 619 clrpsw i ; 割込み禁止(CPUロック状態) 627 620 mov.l #__kernel_intnest, r5 628 621 mov.w [r5], r4 629 sub #1, r4 ; lXgñðfNg622 sub #1, r4 ; ネスト回数をデクリメント 630 623 mov.w r4, [r5] 631 cmp #0, r4 ; ½dèݩǤ©632 bnz interrupt_return ; ½dèÝÈç^[633 ; iÌÝ634 pop r0 ; ^XNÌX^bNÉß·635 mov.l #__kernel_reqflg, r5 ; fBXpb`vªÈ¢©?624 cmp #0, r4 ; 多重割り込みかどうか 625 bnz interrupt_return ; 多重割り込みならリターン 626 ; 初段の割込み 627 pop r0 ; タスクのスタックに戻す 628 mov.l #__kernel_reqflg, r5 ; ディスパッチ要求がないか? 636 629 mov.l [r5], r5 637 630 cmp #1, r5 638 bz ret_int ; êÎ ret_int ÖWv631 bz ret_int ; あれば ret_int へジャンプ 639 632 interrupt_return: 640 popm r4-r5 ; AL 641 [^A 642 mvtaclo r5 ; ACCźÊ16bitÍ0ÅA 633 popm r4-r5 ; アキュムレータ復帰 634 mvtaclo r5 ; ACC最下位16bitは0で復帰 643 635 mvtachi r4 644 popc fpsw ; FPU Xe[^XWX^A645 popm r14-r15 ; WX^A636 popc fpsw ; FPUステータスレジスタ復帰 637 popm r14-r15 ; レジスタ復帰 646 638 popm r1-r5 647 rte ; ÝOÌÉßé648 649 650 ; 651 ; CPU áOÌoüû(AZu¾êLqª)652 ; 653 ; Äoµð:654 ; ECPUáO¶ÌH/WÉæè, PSWWX^ÌIrbg=0, IPL=0.655 ; EX^bNͽdèÝÈçÝX^bN, »¤ÅȯêÎ656 ; ^XNX^bN657 ; ECPUáO¶ÌH/WÉæè,X^bNÉCPUáO©çÌAPCÆ658 ; PSW ªÛ¶³êÄ¢é.659 ; ExN^e[uÉo^³ê½ÂÊÌüèûÉæè, X^bNÉ660 ; XNb`WX^(R1-R5)ªÛ¶³êÄ¢é.661 ; 662 ; ø:663 ; Er1:CPUáOvöÔ664 ; Er2:CPUáOnhÌAhX665 ; 666 ; WX^ªX^bNãÉÇÌæ¤ÉÛ¶³êÄ¢é©ðȺɦ·.667 ; ±Ì}ÅÍãªáÊ, ºªÊÌAhXÅ, X^bNͺ©ç668 ; ãûüÉü©ÁÄÏÝã°çêéàÌÆ·é.669 ; Ȩ, CPUáOvöÔÆR6-R13ÍCPUáOnhàÅîñðæ¾670 ; ·éÚIÅÞðµÄ¨è, oûÅÍÛ¶àeðjü·êÎæ¢.639 rte ; 割込み前の処理に戻る 640 641 642 ; 643 ; CPU例外の出入口処理(アセンブリ言語記述部分) 644 ; 645 ; 呼出し条件: 646 ; ・CPU例外発生時のH/W処理により, PSWレジスタのIビット=0, IPL=0. 647 ; ・スタックは多重割り込みなら割込みスタック, そうでなければ 648 ; タスクスタック 649 ; ・CPU例外発生時のH/W処理により,スタックにCPU例外からの復帰PCと 650 ; PSWが保存されている. 651 ; ・ベクタテーブルに登録された個別の入り口処理により, スタックに 652 ; スクラッチレジスタ(R1-R5)が保存されている. 653 ; 654 ; 引数: 655 ; ・r1:CPU例外要因番号 656 ; ・r2:CPU例外ハンドラのアドレス 657 ; 658 ; レジスタがスタック上にどのように保存されているかを以下に示す. 659 ; この図では上が低位, 下が高位のアドレスで, スタックは下から 660 ; 上方向に向かって積み上げられるものとする. 661 ; なお, CPU例外要因番号とR6-R13はCPU例外ハンドラ内で情報を取得 662 ; する目的で退避しており, 出口処理では保存内容を破棄すればよい. 671 663 ; 672 664 ; ------------------------- 673 ; | CPU áOvöÔ| <----- p_excinf665 ; | CPU例外要因番号 | <----- p_excinf 674 666 ; ------------------------- (intptr_t)(p_excinf + 0) 675 667 ; | R6(4byte) | … … 714 706 ; ------------------------- (intptr_t)(p_excinf + 80) 715 707 ; 716 ; ±±ÅÍ, Ý[hÉÏXµÄnhðÀs·é.717 ; CPU áOnhÉn·VP^ÌÏ p_excinf ƵÄISPÌln·D718 ; 719 ; nh©ç^[µ½ãÍ, ½dÝÅÈ, ©Â reqflg ª720 ; TRUE ÉÈÁ½ÉCret_int Öªò(xfBXpb`)·éD721 ; 722 ; ½dݩǤ©ÍÝlXgJE^ÌlÅ»è·é.723 ; intnest != 0 ÈçνdÝŠ鯻è·é.724 ; 725 ; reqflg ÍCPUbNóÔÅ`FbN·é. »¤ÅÈ¢ÆC726 ; reqflg `FbNãÉN®³ê½ÝnhàÅ727 ; fBXpb`ªv³ê½êÉCfBXpb`³êÈ¢.728 ; 729 ; 730 ; CPU áOüû731 ; 732 ; ±±ÅÍ, Ý[hÉÏXµÄnhðÀs·é.733 ; 734 735 ; 736 ; CPU áOnhÄoµãÉsvÆÈéX^bNîñÌTCY708 ; ここでは, 割込み処理モードに変更してハンドラを実行する. 709 ; CPU例外ハンドラに渡すVP型の変数 p_excinf としてISPの値渡す. 710 ; 711 ; ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が 712 ; TRUE になった時に,ret_int へ分岐(遅延ディスパッチ)する. 713 ; 714 ; 多重割込みかどうかは割込みネストカウンタの値で判定する. 715 ; intnest != 0 ならば多重割込みであると判定する. 716 ; 717 ; reqflg はCPUロック状態でチェックする. そうでないと, 718 ; reqflg チェック後に起動された割込みハンドラ内で 719 ; ディスパッチが要求された場合に,ディスパッチされない. 720 ; 721 ; 722 ; CPU例外入口処理 723 ; 724 ; ここでは, 割込み処理モードに変更してハンドラを実行する. 725 ; 726 727 ; 728 ; CPU例外ハンドラ呼出し後に不要となるスタック情報のサイズ 737 729 ; EXCNO + R6--R13 738 730 ; … … 740 732 741 733 _kernel_exception: 742 pushm r14-r15 ; XNb`WX^ðÞð734 pushm r14-r15 ; スクラッチレジスタを退避 743 735 pushc fpsw 744 736 mvfacmi r5 745 shll #16, r5 ; ACC źÊ16bitÍ0Æ·é737 shll #16, r5 ; ACC最下位16bitは0とする 746 738 mvfachi r4 747 pushm r4-r5 ; AL 748 [^Þð 749 pushm r6-r13 ; ñXNb`WX^Û¶ 750 push.l r1 ; CPUáOvöÔðÛ 751 mov.l r0, r3 ; X^bN|C^ðæèoµ 739 pushm r4-r5 ; アキュムレータ退避 740 pushm r6-r13 ; 非スクラッチレジスタ保存 741 push.l r1 ; CPU例外要因番号を保持 742 mov.l r0, r3 ; スタックポインタを取り出し 752 743 mov.l EXC_GET_PSW_OFFSET[r3], r5 753 744 and #PSW_I_MASK, r5 754 bz exception_nonkernel ; SÝÖ~(CPUbN)óÔÈçÇO745 bz exception_nonkernel ; 全割込み禁止(CPUロック)状態なら管理外 755 746 .if TIPM_LOCK != -15 756 747 mov.l EXC_GET_PSW_OFFSET[r3], r5 757 748 and #PSW_IPL_MASK, r5 758 749 cmp #IPL_LOCK, r5 759 bgt exception_nonkernel ; IPL ªCPUbNxÈãÈçÇO750 bgt exception_nonkernel ; IPLがCPUロックレベル以上なら管理外 760 751 .endif 761 752 mov.l #__kernel_intnest, r5 762 753 mov.w [r5], r4 763 add #1, r4 ; lXgñðCNg754 add #1, r4 ; ネスト回数をインクリメント 764 755 mov.w r4, [r5] 765 cmp #1, r4 ; ½dèݩǤ©766 bnz exception_from_int ; ÁZOª0ÅȯêνdÝ767 ; iÌÝ768 mov.l #__kernel_istkpt, r5 ; ÝpÌX^bNÖØÖ¦é756 cmp #1, r4 ; 多重割り込みかどうか 757 bnz exception_from_int ; 加算前が0でなければ多重割込み 758 ; 初段の割込み 759 mov.l #__kernel_istkpt, r5 ; 割込み用のスタックへ切替える 769 760 mov.l [r5], r0 770 push.l r3 ; ^XNX^bNðÛ771 exception_from_int: ; ½dÝ761 push.l r3 ; タスクスタックを保持 762 exception_from_int: ; 多重割込み 772 763 mov.l EXC_GET_PSW_OFFSET[r3], r5 773 mvtc r5, psw ; CPU áO¶OÌóÔÉß·764 mvtc r5, psw ; CPU例外発生前の状態に戻す 774 765 .if LOG_EXC_LEAVE == 1 775 push.l r1 ; Og[XÌøðÛ766 push.l r1 ; ログトレースの引数を保持 776 767 .endif 777 768 778 769 .if LOG_EXC_ENTER == 1 779 770 pushm r2-r3 780 bsr _kernel_log_exc_enter ; Og[XÖÌÄoµ781 ; øÌÝvöÔÍùÉr1ÉüÁÄ¢é771 bsr _kernel_log_exc_enter ; ログトレース関数の呼出し 772 ; 引数の割込み要因番号は既にr1に入っている 782 773 popm r2-r3 783 774 .endif 784 775 785 mov.l r3, r1 ; øÌp_excinfðÝè786 jsr r2 ; C [`ÄÑoµ776 mov.l r3, r1 ; 引数のp_excinfを設定 777 jsr r2 ; Cルーチン呼び出し 787 778 788 779 .if LOG_EXC_LEAVE == 1 789 pop r1 ; øÉÝvöÔðÝè790 bsr _kernel_log_exc_leave ; Og[XÖÌÄoµ791 .endif 792 793 clrpsw i ; ±±©çÍK¸ÝÖ~780 pop r1 ; 引数に割込み要因番号を設定 781 bsr _kernel_log_exc_leave ; ログトレース関数の呼出し 782 .endif 783 784 clrpsw i ; ここからは必ず割込み禁止 794 785 mov.l #__kernel_intnest, r5 795 786 mov.w [r5], r4 796 sub #1, r4 ; lXgñðfNg787 sub #1, r4 ; ネスト回数をデクリメント 797 788 mov.w r4, [r5] 798 cmp #0, r4 ; ½dèݩǤ©799 bnz exception_return ; ½dèÝÈç^[800 ; iÌÝ801 pop r0 ; ^XNÌX^bNÉß·802 mov.l #__kernel_reqflg, r5 ; fBXpb`vªÈ¢©?789 cmp #0, r4 ; 多重割り込みかどうか 790 bnz exception_return ; 多重割り込みならリターン 791 ; 初段の割込み 792 pop r0 ; タスクのスタックに戻す 793 mov.l #__kernel_reqflg, r5 ; ディスパッチ要求がないか? 803 794 mov.l [r5], r5 804 795 cmp #1, r5 805 bnz exception_return ; ȯêÎ^[806 add #EXCINF_REG_SIZE, r0 ; CPU áOîñÌjü807 bra ret_int ; êÎ ret_int ÖWv796 bnz exception_return ; なければリターン 797 add #EXCINF_REG_SIZE, r0 ; CPU例外情報の破棄 798 bra ret_int ; あれば ret_int へジャンプ 808 799 809 800 exception_nonkernel: 810 801 mov.l #__kernel_intnest, r5 811 802 mov.w [r5], r4 812 add #1, r4 ; lXgñðCNg803 add #1, r4 ; ネスト回数をインクリメント 813 804 mov.w r4, [r5] 814 cmp #1, r4 ; ½dèݩǤ©815 bnz exception_from_nonkernelint ; ÁZOª0ÅȯêνdÝ816 ; iÌÝ817 mov.l #__kernel_istkpt, r5 ; ÝpÌX^bNÖØÖ¦é805 cmp #1, r4 ; 多重割り込みかどうか 806 bnz exception_from_nonkernelint ; 加算前が0でなければ多重割込み 807 ; 初段の割込み 808 mov.l #__kernel_istkpt, r5 ; 割込み用のスタックへ切替える 818 809 mov.l [r5], r0 819 push.l r3 ; ^XNX^bNðÛ820 exception_from_nonkernelint: ; ½dÝ810 push.l r3 ; タスクスタックを保持 811 exception_from_nonkernelint: ; 多重割込み 821 812 mov.l EXC_GET_PSW_OFFSET[r3], r5 822 mvtc r5, psw ; CPU áO¶OÌóÔÉß·823 824 mov.l r3, r1 ; øÌp_excinfðÝè825 jsr r2 ; C [`ÄÑoµ826 827 clrpsw i ; ±±©çÍK¸ÝÖ~813 mvtc r5, psw ; CPU例外発生前の状態に戻す 814 815 mov.l r3, r1 ; 引数のp_excinfを設定 816 jsr r2 ; Cルーチン呼び出し 817 818 clrpsw i ; ここからは必ず割込み禁止 828 819 mov.l #__kernel_intnest, r5 829 820 mov.w [r5], r4 830 sub #1, r4 ; lXgñðfNg821 sub #1, r4 ; ネスト回数をデクリメント 831 822 mov.w r4, [r5] 832 cmp #0, r4 ; ½dèݩǤ©833 bnz exception_return ; ½dèÝÈç^[834 ; iÌÝ835 pop r0 ; ^XNÌX^bNÉß·823 cmp #0, r4 ; 多重割り込みかどうか 824 bnz exception_return ; 多重割り込みならリターン 825 ; 初段の割込み 826 pop r0 ; タスクのスタックに戻す 836 827 837 828 exception_return: 838 add #EXCINF_REG_SIZE, r0 ; CPUáOîñÌjü 839 popm r4-r5 ; AL 840 [^A 841 mvtaclo r5 ; ACCźÊ16bitÍ0ÅA 829 add #EXCINF_REG_SIZE, r0 ; CPU例外情報の破棄 830 popm r4-r5 ; アキュムレータ復帰 831 mvtaclo r5 ; ACC最下位16bitは0で復帰 842 832 mvtachi r4 843 popc fpsw ; FPU Xe[^XWX^A844 popm r14-r15 ; WX^A833 popc fpsw ; FPUステータスレジスタ復帰 834 popm r14-r15 ; レジスタ復帰 845 835 popm r1-r5 846 rte ; ÝOÌÉßé847 848 849 ; 850 ; ÷ÔÒ¿836 rte ; 割込み前の処理に戻る 837 838 839 ; 840 ; 微少時間待ち 851 841 ; 852 842 _sil_dly_nse: -
Property svn:mime-type
set to
Note:
See TracChangeset
for help on using the changeset viewer.