Ignore:
Timestamp:
Jul 23, 2017, 2:29:40 PM (7 years ago)
Author:
coas-nagasima
Message:

SVNプロパティを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • rubycfg_asp/trunk/asp_dcre/arch/rx630_gcc/prc_support.S

    • Property svn:mime-type changed from text/plain to text/gas; charset=UTF-8
    r313 r315  
    1111;   Copyright (C) 2013      by Mitsuhiro Matsuura
    1212
    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 è²¬ã™ã‚‹ã“と.
     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;       免責すること.
    4935
    50 ;   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    51 ãŠ
    52 ;   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    53 ;   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    54 ;   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    55 ;   ã®è²¬ä»»ã‚’負わない.
     36;   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     37;   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     38;   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     39;   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     40;   の責任を負わない.
    5641
    5742;  @(#) $Id$
     
    5944
    6045;
    61 ãƒ—ロセッサ依存モジュール アセンブリ言語部(RX630用)
     46プロセッサ依存モジュール アセンブリ言語部(RX630用)
    6247;
    6348#define TOPPERS_MACRO_ONLY
    64 #define UINT_C(val)                     (val)           /* uint_t型の定数を作るマクロ */
    65 #define ULONG_C(val)            (val)           /* ulong_t型の定数を作るマクロ */
    66 #define CAST(type, val)         (val)           /* 型キャストを行うマクロ */
     49#define UINT_C(val)                     (val)           /* uint_t型の定数を作るマクロ */
     50#define ULONG_C(val)            (val)           /* ulong_t型の定数を作るマクロ */
     51#define CAST(type, val)         (val)           /* 型キャストを行うマクロ */
    6752#include "kernel_impl.h"
    6853
    6954;
    70 ;  ディスパッチャおよび割込み(CPU例外)出å
    71 ¥ã‚Šå£ã®ãƒ«ãƒ¼ãƒ«:
    72 ;       å‹•ä½œãƒ¢ãƒ¼ãƒ‰ã‚’以下のように定義する.
    73 ;               ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード:
    74 ;                       CPUロック状æ
    75 ‹, 割込み優å
    76 ˆåº¦ãƒžã‚¹ã‚¯å
    77 ¨è§£é™¤çŠ¶æ
    78 ‹,
    79 ;                       ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ(intnest = 0), タスクスタック
    80 ;               å‰²è¾¼ã¿(CPU例外)処理モード
    81 ;                       å
    82 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    83 ‹(PSWレジスタIビット = 0),
    84 ;                       å‰²è¾¼ã¿å„ªå
    85 ˆåº¦ãƒžã‚¹ã‚¯å
    86 ¨è§£é™¤ã§ãªã„状æ
    87 ‹(IPL != 0)
    88 ;                       å‰²è¾¼ã¿ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ(intnest != 0), 割込みスタック
    89 ;
    90 ;       ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–割込みのサポート有無と, CPUロック状æ
    91 ‹, 割込み優å
    92 ˆåº¦
    93 ;       ãƒžã‚¹ã‚¯å
    94 ¨è§£é™¤çŠ¶æ
    95 ‹ã®é–¢ä¿‚は以下の通りである.
    96 ;               ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–割込み未サポート時:
    97 ;                       CPUロック状æ
    98 ‹(PSWレジスタIビット = 0)
    99 ;                       å‰²è¾¼ã¿å„ªå
    100 ˆåº¦ãƒžã‚¹ã‚¯å
    101 ¨è§£é™¤çŠ¶æ
    102 ‹(IPL = 0)
    103 ;               ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–割込みサポート時:
    104 ;                       CPUロック状æ
    105 ‹
    106 ;                               (PSWレジスタIビット = 0, IPL = IPL_LOCK, lock_flag = true)
    107 ;                       å‰²è¾¼ã¿å„ªå
    108 ˆåº¦ãƒžã‚¹ã‚¯å
    109 ¨è§£é™¤çŠ¶æ
    110 ‹(saved_ipl = 0)
    111 ;
    112 ;       å„構造体ポインタを以下のように各レジスタにアサインする.
    113 ;               r15 = p_runtsk  ただしディスパッチャの各出口では無効
    114 ;               r14 = *p_runtsk dispatcher の中では p_runtsk 確定時に再取得する
    115 ;       å„å
    116 ¥ã‚Šå£ã‹ã‚‰æœ€åˆã«å¤‰æ•°ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã¨ãã«ä¸Šè¨˜ãƒ¬ã‚¸ã‚¹ã‚¿ã«ä¿å­˜ã™ã‚‹.
    117 ;
    118 ;       æ§‹é€ ä½“アライメントへの対応
    119 ;               æ§‹é€ ä½“アライメントが4Byte(アンパック)の場合:
    120 ;                       ä¸€èˆ¬çš„なレジスタ相対アドレッシングが可能
    121 ;                               ä¾‹:    mov.l   #__kernel_p_runtsk, r15
     55;  ディスパッチャおよび割込み(CPU例外)出入り口のルール:
     56;       動作モードを以下のように定義する.
     57;               ディスパッチャモード:
     58;                       CPUロック状態, 割込み優先度マスク全解除状態,
     59;                       タスクコンテキスト(intnest = 0), タスクスタック
     60;               割込み(CPU例外)処理モード
     61;                       全割込みロック状態(PSWレジスタIビット = 0),
     62;                       割込み優先度マスク全解除でない状態(IPL != 0)
     63;                       割込みコンテキスト(intnest != 0), 割込みスタック
     64;
     65;       カーネル管理外割込みのサポート有無と, CPUロック状態, 割込み優先度
     66;       マスク全解除状態の関係は以下の通りである.
     67;               カーネル管理外割込み未サポート時:
     68;                       CPUロック状態(PSWレジスタIビット = 0)
     69;                       割込み優先度マスク全解除状態(IPL = 0)
     70;               カーネル管理外割込みサポート時:
     71;                       CPUロック状態
     72;                               (PSWレジスタIビット = 0, IPL = IPL_LOCK, lock_flag = true)
     73;                       割込み優先度マスク全解除状態(saved_ipl = 0)
     74;
     75;       各構造体ポインタを以下のように各レジスタにアサインする.
     76;               r15 = p_runtsk  ただしディスパッチャの各出口では無効
     77;               r14 = *p_runtsk dispatcher の中では p_runtsk 確定時に再取得する
     78;       各入り口から最初に変数アクセスするときに上記レジスタに保存する.
     79;
     80;       構造体アライメントへの対応
     81;               構造体アライメントが4Byte(アンパック)の場合:
     82;                       一般的なレジスタ相対アドレッシングが可能
     83;                               例:      mov.l   #__kernel_p_runtsk, r15
    12284;                                       mov.l   r0, TCB_sp[r15]
    123 ;               æ§‹é€ ä½“アライメントが4Byteではない(パック)の場合:
    124 ;                       mov.lのようにロングサイズ指定の場合、相対値は4の倍数のみ有効
    125 ;                       ã“のため, 一度対象アドレスを求めてからアクセスするå¿
    126 è¦ãŒã‚ã‚‹
    127 ;                               ä¾‹:    mov.l   #__kernel_p_runtsk, r15
     85;               構造体アライメントが4Byteではない(パック)の場合:
     86;                       mov.lのようにロングサイズ指定の場合、相対値は4の倍数のみ有効
     87;                       このため, 一度対象アドレスを求めてからアクセスする必要がある
     88;                               例:      mov.l   #__kernel_p_runtsk, r15
    12889;                                       add             #TCB_sp, r15, r5
    12990;                                       mov.l   r0, [r5]
    130 ;               å„オフセット値を判断し, 条件アセンブルによりコードを切り替える
    131 ;
    132 
    133 ;
    134 æ§‹é€ ä½“アクセスのオフセット定義
     91;               各オフセット値を判断し, 条件アセンブルによりコードを切り替える
     92;
     93
     94;
     95構造体アクセスのオフセット定義
    13596;
    13697#include "offset.h"
    13798
    13899;
    139 å„種EQU定義(Hファイルの#define定義)
     100各種EQU定義(Hファイルの#define定義)
    140101;
    141102#include "target_config.h"
     
    190151
    191152;
    192 ;  TCB_sp への書込みマクロ
     153;  TCB_sp への書込みマクロ
    193154;
    194155.macro  st_TCB_sp       src, tcb, tmp
     
    202163
    203164;
    204 ;  TCB_sp からの読出しマクロ
     165;  TCB_sp からの読出しマクロ
    205166;
    206167.macro  ld_TCB_sp       dst, tcb, tmp
     
    214175
    215176;
    216 ;  TCB_pc への書込みマクロ
     177;  TCB_pc への書込みマクロ
    217178;
    218179.macro  st_TCB_pc       src, tcb, tmp
     
    226187
    227188;
    228 ;  TCB_pc からの読出しマクロ
     189;  TCB_pc からの読出しマクロ
    229190;
    230191.macro  ld_TCB_pc       dst, tcb, tmp
     
    238199
    239200;
    240 ;  TCB_texptn からの読出しマクロ
     201;  TCB_texptn からの読出しマクロ
    241202;
    242203.macro  ld_TCB_texptn   dst, tcb, tmp
     
    250211
    251212;
    252 ;  TCB_p_tinib からの読出しマクロ
     213;  TCB_p_tinib からの読出しマクロ
    253214;
    254215.macro  ld_TCB_p_tinib  dst, tcb, tmp
     
    262223
    263224;
    264 ;  TINIB_exinf からの読出しマクロ
     225;  TINIB_exinf からの読出しマクロ
    265226;
    266227.macro  ld_TINIB_exinf  dst, tinib, tmp
     
    274235
    275236;
    276 ;  TINIB_task からの読出しマクロ
     237;  TINIB_task からの読出しマクロ
    277238;
    278239.macro  ld_TINIB_task   dst, tinib, tmp
     
    289250
    290251;
    291 ;  APIからのタスクディスパッチャå
    292 ¥å£
    293 ;
    294 ;  呼び出し条件:
    295 ;       ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード(ファイルヘッダ参ç
    296 §)
    297 ;
    298 ;  ここでは, コンテキストの退避と, 実行再開番地の設定をする.
     252;  APIからのタスクディスパッチャ入口
     253;
     254;  呼び出し条件:
     255;       ・ディスパッチャモード(ファイルヘッダ参照)
     256;
     257;  ここでは, コンテキストの退避と, 実行再開番地の設定をする.
    299258;
    300259__kernel_dispatch:
    301         pushm   r6-r13                                          ; 非スクラッチレジスタ保存
     260        pushm   r6-r13                                          ; 非スクラッチレジスタ保存
    302261        mov.l   #__kernel_p_runtsk, r15
    303262        mov.l   [r15], r14
    304         st_TCB_sp       r0, r14, r5                             ; スタックポインタをTCBに保存
    305         st_TCB_pc       #dispatch_r, r14, r5    ; 実行再開番地をTCBに保存
     263        st_TCB_sp       r0, r14, r5                             ; スタックポインタをTCBに保存
     264        st_TCB_pc       #dispatch_r, r14, r5    ; 実行再開番地をTCBに保存
    306265        bra             dispatcher
    307266
    308267;
    309 ;  APIへのタスクディスパッチャ出口
    310 ;
    311 ;  呼び出し条件:
    312 ;       ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード(ファイルヘッダ参ç
    313 §)
    314 ;
    315 ;  ここでは, タスク例外ハンドラ呼出しと, コンテキストの復帰をする.
     268;  APIへのタスクディスパッチャ出口
     269;
     270;  呼び出し条件:
     271;       ・ディスパッチャモード(ファイルヘッダ参照)
     272;
     273;  ここでは, タスク例外ハンドラ呼出しと, コンテキストの復帰をする.
    316274;
    317275dispatch_r:
    318         btst    #TCB_enatex_bit, TCB_enatex[r14].b      ; タスク例外処理許可?
     276        btst    #TCB_enatex_bit, TCB_enatex[r14].b      ; タスク例外処理許可?
    319277        bz      dispatch_r_rts
    320         ld_TCB_texptn   r5, r14, r4                     ; 保留例外要因があるか?
     278        ld_TCB_texptn   r5, r14, r4                     ; 保留例外要因があるか?
    321279        cmp             #0, r5
    322280        bz      dispatch_r_rts
    323         bsr             __kernel_call_texrtn            ; タスク例外ハンドラ呼出し処理実行
     281        bsr             __kernel_call_texrtn            ; タスク例外ハンドラ呼出し処理実行
    324282dispatch_r_rts:
    325         popm    r6-r13                                          ; 非スクラッチレジスタ復帰
    326         rts                                     ; dispatch 呼び出しå
    327 ƒã¸æˆ»ã‚‹.
    328 
    329 ;
    330 ;  タスク起動処理(タスクå
    331 ˆé ­ã¸ã®ã‚¿ã‚¹ã‚¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチャ出口)
    332 ;
    333 ;  呼び出し条件:
    334 ;       ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード(ファイルヘッダ参ç
    335 §)
    336 ;
    337 ;  ここでは, CPUロック解除状æ
    338 ‹ã«ã—, タスクを起動する.
     283        popm    r6-r13                                          ; 非スクラッチレジスタ復帰
     284        rts                                     ; dispatch 呼び出し元へ戻る.
     285
     286;
     287;  タスク起動処理(タスク先頭へのタスクディスパッチャ出口)
     288;
     289;  呼び出し条件:
     290;       ・ディスパッチャモード(ファイルヘッダ参照)
     291;
     292;  ここでは, CPUロック解除状態にし, タスクを起動する.
    339293;
    340294__kernel_start_r:
    341295        mov.l   #_ext_tsk, r5
    342         push.l  r5                                                      ; 戻り番地をスタックに積む
     296        push.l  r5                                                      ; 戻り番地をスタックに積む
    343297        ld_TCB_p_tinib  r5, r14, r4
    344         ld_TINIB_exinf  r1, r5, r4                      ; 拡張æƒ
    345 å ±ã‚’第一引数に設定
    346         ld_TINIB_task   r5, r5, r4                      ; タスクの起動番地を取得
     298        ld_TINIB_exinf  r1, r5, r4                      ; 拡張情報を第一引数に設定
     299        ld_TINIB_task   r5, r5, r4                      ; タスクの起動番地を取得
    347300.if     TIPM_LOCK == -15
    348         setpsw  i                                                       ; 割込み許可(CPUロック解除状æ
    349 ‹)
     301        setpsw  i                                                       ; 割込み許可(CPUロック解除状態)
    350302.else
    351         mov.l   #__kernel_lock_flag, r4         ; CPUロック解除状æ
    352 ‹ã¸
    353         mov.l   #0, [r4]                                        ; ここに来るときはå¿
    354 ãš saved_ipl の
    355         mvtc    #00010000H, psw                         ; 値は 0 のため, 直値を設定する.
    356                                                                 ; å
    357 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ
    358 ‹( I = 1 )
    359                                                                 ; 割込み優å
    360 ˆåº¦ãƒžã‚¹ã‚¯å
    361 ¨è§£é™¤çŠ¶æ
    362 ‹( IPL = 0 )
     303        mov.l   #__kernel_lock_flag, r4         ; CPUロック解除状態へ
     304        mov.l   #0, [r4]                                        ; ここに来るときは必ず saved_ipl の
     305        mvtc    #00010000H, psw                         ; 値は 0 のため, 直値を設定する.
     306                                                                ; 全割込みロック解除状態( I = 1 )
     307                                                                ; 割込み優先度マスク全解除状態( IPL = 0 )
    363308.endif
    364309        jmp             r5
    365310
    366311;
    367 ;  カーネル起動からのタスクディスパッチャå
    368 ¥å£
    369 ;
    370 ;  このルーチンは,カーネル起動時に,すべての割込みを禁止した状æ
    371 ‹
    372 ; (割込みロック状æ
    373 ‹ã¨åŒç­‰ï¼‰ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žã¾ãŸï¼Œå‰²è¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ï¼ˆéž
    374 ;  タスクコンテキストと同等)で呼び出されることを想定している.
    375 ;
    376 ;  呼び出し条件:
    377 ;       ãƒ»å‰²è¾¼ã¿(CPU例外)処理モード(ファイルヘッダ参ç
    378 §)
    379 ;
    380 ;  ここでは, ディスパッチャモードに変更する.
     312;  カーネル起動からのタスクディスパッチャ入口
     313;
     314;  このルーチンは,カーネル起動時に,すべての割込みを禁止した状態
     315; (割込みロック状態と同等)で呼び出される.また,割込みモード(非
     316;  タスクコンテキストと同等)で呼び出されることを想定している.
     317;
     318;  呼び出し条件:
     319;       ・割込み(CPU例外)処理モード(ファイルヘッダ参照)
     320;
     321;  ここでは, ディスパッチャモードに変更する.
    381322;
    382323__kernel_start_dispatch:
    383324        mov.l   #__kernel_intnest, r5
    384         mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
     325        mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
    385326#if     TIPM_LOCK != -15
    386         mvtc    #(IPL_LOCK | 00010000H), psw    ; å
    387 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ
    388 ‹
    389                                                                                 ; 割込み優å
    390 ˆåº¦ãƒžã‚¹ã‚¯å
    391 ¨è§£é™¤ã§ãªã„状æ
    392 ‹
    393 #endif
    394 
    395 ;
    396 ; タスク終了(現在のコンテキストを捨てる)からのタスクディスパッチャå
    397 ¥å£
    398 ;
    399 ;  呼び出し条件:
    400 ;       ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード(ファイルヘッダ参ç
    401 §)
    402 ;
    403 ;  ここでは, 何もすることはない.
    404 ;  なお, p_runtsk のアドレス取得だけは行なう.
     327        mvtc    #(IPL_LOCK | 00010000H), psw    ; 全割込みロック解除状態
     328                                                                                ; 割込み優先度マスク全解除でない状態
     329#endif
     330
     331;
     332; タスク終了(現在のコンテキストを捨てる)からのタスクディスパッチャ入口
     333;
     334;  呼び出し条件:
     335;       ・ディスパッチャモード(ファイルヘッダ参照)
     336;
     337;  ここでは, 何もすることはない.
     338;  なお, p_runtsk のアドレス取得だけは行なう.
    405339;
    406340__exit_and_dispatch:
     
    408342
    409343;
    410 ; ディスパッチャ本体
    411 ;
    412 å‘¼ã³å‡ºã—条件:
    413 ;       ãƒ»ã™ã¹ã¦ã®ã‚¿ã‚¹ã‚¯ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯ä¿å­˜ã•ã‚Œã¦ã„ã‚‹.
    414 ;
    415 ;  dispatcher 呼出時のスタック:
    416 ;       ãƒ»__kernel_dispatch からきた場合                 : タスクスタック
    417 ;       ãƒ»exit_and_dispatch からきた場合:
    418 ;               exit_task からきた場合                                    : タスクスタック
    419 ;               ã‚«ãƒ¼ãƒãƒ«èµ·å‹•æ™‚(__kernel_start_dispatch)  : 割込みスタック
    420 ;       ãƒ»ret_int からきた場合                                           : タスクスタック
    421 ;       ãƒ»dispatcher_idle_loop からきた場合                      : 割込みスタック
     344; ディスパッチャ本体
     345;
     346呼び出し条件:
     347;       ・すべてのタスクのコンテキストは保存されている.
     348;
     349;  dispatcher 呼出時のスタック:
     350;       ・__kernel_dispatch からきた場合                       : タスクスタック
     351;       ・exit_and_dispatch からきた場合:
     352;               exit_task からきた場合                                        : タスクスタック
     353;               カーネル起動時(__kernel_start_dispatch)        : 割込みスタック
     354;       ・ret_int からきた場合                                         : タスクスタック
     355;       ・dispatcher_idle_loop からきた場合                    : 割込みスタック
    422356;
    423357dispatcher:
    424358.if     LOG_DSP_ENTER == 1
    425359        push.l  r15
    426         mov.l   r14, r1                                         ; 引数(ディスパッチå
    427 ƒTCB)を設定
     360        mov.l   r14, r1                                         ; 引数(ディスパッチ元TCB)を設定
    428361        bsr             _kernel_log_dsp_enter
    429362        pop.l   r15
    430363.endif
    431364        mov.l   #__kernel_p_schedtsk, r5     
    432         mov.l   [r5], [r15]                                     ; p_schedtsk を p_runtsk に
     365        mov.l   [r5], [r15]                                     ; p_schedtsk を p_runtsk に
    433366        mov.l   [r15], r14
    434367        cmp             #0, r14
    435         bz              dispatcher_pre_idle                     ; schedtsk がなければアイドルループへ
    436         ld_TCB_sp       r0, r14, r5                             ; タスクスタックポインタを復帰
     368        bz              dispatcher_pre_idle                     ; schedtsk がなければアイドルループへ
     369        ld_TCB_sp       r0, r14, r5                             ; タスクスタックポインタを復帰
    437370.if     LOG_DSP_LEAVE == 1
    438371        push.l  r14
    439         mov.l   r14, r1                                         ; 引数(ディスパッチå
    440 ˆTCB)を設定
     372        mov.l   r14, r1                                         ; 引数(ディスパッチ先TCB)を設定
    441373        bsr             _kernel_log_dsp_leave
    442374        pop.l   r14
    443375.endif
    444376        ld_TCB_pc       r5, r14, r4
    445         jmp             r5                                      ; 実行再開番地へジャンプ
    446 
    447 ;
    448 ;  schdedtskがNULLの場合はアイドルループにå
    449 ¥ã‚‹
    450 ;  アイドルループは割込み処理モードで動作させる
    451 ;
    452 ;  ここで割込みモードに切り換えるのは,ここで発生する割込み処理に
    453 ;  どのスタックを使うかという問題の解決と,割込みハンドラå†
    454 ã§ã®ã‚¿
    455 ;  スクディスパッチの防止という2つの意味がある.
     377        jmp             r5                                      ; 実行再開番地へジャンプ
     378
     379;
     380;  schdedtskがNULLの場合はアイドルループに入る
     381;  アイドルループは割込み処理モードで動作させる
     382;
     383;  ここで割込みモードに切り換えるのは,ここで発生する割込み処理に
     384;  どのスタックを使うかという問題の解決と,割込みハンドラ内でのタ
     385;  スクディスパッチの防止という2つの意味がある.
    456386;
    457387dispatcher_pre_idle:
    458388        mov.l   #__kernel_istkpt,r5
    459         mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
    460         mov.l   #__kernel_intnest, r5
    461         mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
     389        mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
     390        mov.l   #__kernel_intnest, r5
     391        mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
    462392#if     TIPM_LOCK != -15
    463         mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状æ
    464 ‹ã¸
     393        mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状態へ
    465394        mov.l   #0, [r5]
    466         mvtc    #0, psw                                         ; 優å
    467 ˆåº¦0の割込み処理中を偽è£
    468 
     395        mvtc    #0, psw                                         ; 優先度0の割込み処理中を偽装
    469396#endif
    470397
    471398dispatcher_idle_loop:
    472         setpsw  i                                                       ; å
    473 ¨å‰²è¾¼ã¿è¨±å¯
    474         clrpsw  i                                                       ; å
    475 ¨å‰²è¾¼ã¿ç¦æ­¢
    476 
    477         mov.l   #__kernel_reqflg, r5            ; reqflg が FALSE なら
     399        setpsw  i                                                       ; 全割込み許可
     400        clrpsw  i                                                       ; 全割込み禁止
     401
     402        mov.l   #__kernel_reqflg, r5            ; reqflg が FALSE なら
    478403        mov.l   [r5], r4
    479404        cmp             #0, r4
    480         bz      dispatcher_idle_loop            ; アイドルループを繰り返す
    481         mov.l   #0, [r5]                                        ; reqflgがtrueならfalseにする
    482         mov.l   #__kernel_intnest, r5
    483         mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
     405        bz      dispatcher_idle_loop            ; アイドルループを繰り返す
     406        mov.l   #0, [r5]                                        ; reqflgがtrueならfalseにする
     407        mov.l   #__kernel_intnest, r5
     408        mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
    484409#if     TIPM_LOCK != -15
    485         mov.l   #__kernel_lock_flag, r5         ; CPUロック状æ
    486 ‹ã¸
     410        mov.l   #__kernel_lock_flag, r5         ; CPUロック状態へ
    487411        mov.l   #1, [r5]
    488412        mov.l   #__kernel_saved_ipl, r5
    489413        mov.l   #0, [r5]
    490         mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; å
    491 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ
    492 ‹
    493                                                                                 ; 割込み優å
    494 ˆåº¦ãƒžã‚¹ã‚¯å
    495 ¨è§£é™¤ã§ãªã„状æ
    496 ‹
    497 #endif
    498         bra             dispatcher                                      ; dispatcher へ戻る
    499 
    500 
    501 ;
    502 ; カーネルの終了処理の呼出し
    503 ;
    504 ; モードとスタックを非タスクコンテキスト用に切り替え.
     414        mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; 全割込みロック解除状態
     415                                                                                ; 割込み優先度マスク全解除でない状態
     416#endif
     417        bra             dispatcher                                      ; dispatcher へ戻る
     418
     419
     420;
     421; カーネルの終了処理の呼出し
     422;
     423; モードとスタックを非タスクコンテキスト用に切り替え.
    505424;
    506425        .global __kernel_call_exit_kernel
    507426__kernel_call_exit_kernel:
    508427#if     TIPM_LOCK != -15
    509         clrpsw  i                                                       ; å
    510 ¨å‰²è¾¼ã¿ç¦æ­¢
    511         mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状æ
    512 ‹ã¸
     428        clrpsw  i                                                       ; 全割込み禁止
     429        mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状態へ
    513430        mov.l   #0, [r5]
    514431#endif
    515432        mov.l   #__kernel_istkpt, r5
    516         mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
    517         mov.l   #__kernel_intnest, r5
    518         mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
     433        mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
     434        mov.l   #__kernel_intnest, r5
     435        mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
    519436        bsr             __kernel_exit_kernel
    520437        bra             __kernel_call_exit_kernel
     
    522439
    523440;
    524 ;  割込み(CPU例外)からのタスクディスパッチャå
    525 ¥å£
    526 ;
    527 ;       å‘¼å‡ºã—条件:
    528 ;       ãƒ»å
    529 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    530 ‹(PSWレジスタIビット = 0)
    531 ;       ãƒ»å‰²è¾¼ã¿å„ªå
    532 ˆåº¦ãƒžã‚¹ã‚¯å
    533 ¨è§£é™¤ã§ãªã„状æ
    534 ‹(IPL != 0)
    535 ;       ãƒ»ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ(intnest=0)
    536 ;       ãƒ»ä½¿ç”¨ã‚¹ã‚¿ãƒƒã‚¯ã¯ã‚¿ã‚¹ã‚¯ã‚¹ã‚¿ãƒƒã‚¯
    537 ;       ãƒ»reqflg = true
    538 ;
    539 ;  ここでは, ディスパッチャモードに変更し, reqflgをOFFにしてから,
    540 ;  é
    541 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチの有無を判断する.
    542 ;
    543 
    544 ;
    545 ;  ret_intå
    546 ˆé ­ã§ã‚¹ã‚¿ãƒƒã‚¯ã«ç©ã¾ã‚Œã¦ã„ã‚‹PSWレジスタへのオフセット
     441;  割込み(CPU例外)からのタスクディスパッチャ入口
     442;
     443;       呼出し条件:
     444;       ・全割込みロック状態(PSWレジスタIビット = 0)
     445;       ・割込み優先度マスク全解除でない状態(IPL != 0)
     446;       ・タスクコンテキスト(intnest=0)
     447;       ・使用スタックはタスクスタック
     448;       ・reqflg = true
     449;
     450;  ここでは, ディスパッチャモードに変更し, reqflgをOFFにしてから,
     451;  遅延ディスパッチの有無を判断する.
     452;
     453
     454;
     455;  ret_int先頭でスタックに積まれているPSWレジスタへのオフセット
    547456;  ACC + FPSW + R14--R15 + R1--R5 + PC
    548457;
     
    551460ret_int:
    552461.if     TIPM_LOCK == -15
    553         mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; 割込み/CPU例外発生前のIPL値取得
     462        mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; 割込み/CPU例外発生前のIPL値取得
    554463        and             #PSW_IPL_MASK, r5
    555         mvtc    r5, psw                                         ; å
    556 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯(CPUロック)状æ
    557 ‹
    558                                                                                 ; 割込み/CPU例外発生前の割込み優å
    559 ˆåº¦
     464        mvtc    r5, psw                                         ; 全割込みロック(CPUロック)状態
     465                                                                                ; 割込み/CPU例外発生前の割込み優先度
    560466.else
    561         mov.l   #__kernel_lock_flag, r5         ; CPUロック状æ
    562 ‹ã¸
     467        mov.l   #__kernel_lock_flag, r5         ; CPUロック状態へ
    563468        mov.l   #1, [r5]
    564         mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; 割込み/CPU例外発生前のIPL値取得
     469        mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; 割込み/CPU例外発生前のIPL値取得
    565470        and             #PSW_IPL_MASK, r5
    566471        mov.l   #__kernel_saved_ipl, r4
    567472        mov.l   r5, [r4]
    568         mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; å
    569 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ
    570 ‹
    571                                                                                 ; 割込み優å
    572 ˆåº¦ãƒžã‚¹ã‚¯å
    573 ¨è§£é™¤ã§ãªã„状æ
    574 ‹
     473        mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; 全割込みロック解除状態
     474                                                                                ; 割込み優先度マスク全解除でない状態
    575475.endif
    576476        mov.l   #__kernel_reqflg, r5
     
    578478        mov.l   #__kernel_p_runtsk, r15     
    579479        mov.l   [r15], r14
    580         mov.l   #__kernel_dspflg, r5            ; dspflg が FALSE なら ret_int_r へ
     480        mov.l   #__kernel_dspflg, r5            ; dspflg が FALSE なら ret_int_r へ
    581481        mov.l   [r5], r5
    582482        cmp             #0, r5
     
    584484        mov.l   #__kernel_p_schedtsk, r5
    585485        mov.l   [r5], r5
    586         cmp             r5, r14                                         ; p_schedtsk と p_runtsk が同じなら
    587         beq     ret_int_r_call_tex                      ; ret_int_r_call_tex へ
    588         pushm   r6-r13                                          ; 非スクラッチレジスタ保存
    589         st_TCB_sp       r0, r14, r5                             ; スタックポインタをTCBに保存
    590         st_TCB_pc       #ret_int_r, r14, r5             ; 実行再開番地をTCBに保存
     486        cmp             r5, r14                                         ; p_schedtsk と p_runtsk が同じなら
     487        beq     ret_int_r_call_tex                      ; ret_int_r_call_tex
     488        pushm   r6-r13                                          ; 非スクラッチレジスタ保存
     489        st_TCB_sp       r0, r14, r5                             ; スタックポインタをTCBに保存
     490        st_TCB_pc       #ret_int_r, r14, r5             ; 実行再開番地をTCBに保存
    591491        bra             dispatcher
    592492
    593493;
    594 ;  割込み(CPU例外)へのタスクディスパッチャ出口
    595 ;
    596 ;  呼び出し条件:
    597 ;       ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード(ファイルヘッダ参ç
    598 §)
    599 ;
    600 ;  ここでは, タスク例外ハンドラ呼出しと, 割込み(CPU例外)処理モードへの
    601 ;  変更と, コンテキストの復帰を行い, 割込み(CUP例外)発生å
    602 ƒã¸æˆ»ã‚‹.
    603 ;
    604 __kernel_break_wait:                                    ;タスクモニタ用ラベル
     494;  割込み(CPU例外)へのタスクディスパッチャ出口
     495;
     496;  呼び出し条件:
     497;       ・ディスパッチャモード(ファイルヘッダ参照)
     498;
     499;  ここでは, タスク例外ハンドラ呼出しと, 割込み(CPU例外)処理モードへの
     500;  変更と, コンテキストの復帰を行い, 割込み(CUP例外)発生元へ戻る.
     501;
     502__kernel_break_wait:                                    ;タスクモニタ用ラベル
    605503ret_int_r:
    606         popm    r6-r13                                          ; 非スクラッチレジスタ復帰
     504        popm    r6-r13                                          ; 非スクラッチレジスタ復帰
    607505ret_int_r_call_tex:
    608         btst    #TCB_enatex_bit, TCB_enatex[r14].b      ; タスク例外処理許可?
     506        btst    #TCB_enatex_bit, TCB_enatex[r14].b      ; タスク例外処理許可?
    609507        bz      ret_int_r_rte
    610         ld_TCB_texptn   r5, r14, r4                     ; 保留例外要因があるか?
     508        ld_TCB_texptn   r5, r14, r4                     ; 保留例外要因があるか?
    611509        cmp             #0, r5
    612510        bz      ret_int_r_rte
    613         bsr             __kernel_call_texrtn            ; タスク例外ハンドラ呼出し処理実行
     511        bsr             __kernel_call_texrtn            ; タスク例外ハンドラ呼出し処理実行
    614512ret_int_r_rte:
    615513#if     TIPM_LOCK != -15
    616         clrpsw  i                                                       ; å
    617 ¨å‰²è¾¼ã¿ç¦æ­¢
    618         mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状æ
    619 ‹ã¸
     514        clrpsw  i                                                       ; 全割込み禁止
     515        mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状態へ
    620516        mov.l   #0, [r5]
    621517#endif
    622         popm    r4-r5                                           ; アキュムレータ復帰
    623         mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
     518        popm    r4-r5                                           ; アキュムレータ復帰
     519        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    624520        mvtachi r4
    625         popc    fpsw                                            ; FPUステータスレジスタ復帰
    626         popm    r14-r15                                         ; レジスタ復帰
     521        popc    fpsw                                            ; FPUステータスレジスタ復帰
     522        popm    r14-r15                                         ; レジスタ復帰
    627523        popm    r1-r5
    628         rte                                                                     ; 割込み前の処理に戻る
    629 
    630 
    631 ;
    632 ;  割込みの出å
    633 ¥å£å‡¦ç†(アセンブリ言語記述部分)
    634 ;
    635 ;  呼出し条件:
    636 ;  ・割込み発生時のH/W処理により, PSWレジスタのIビット=0, IPLは受付け
    637 ;    た割込みのIPL.
    638 ;  ・スタックは多重割り込みなら割込みスタック, そうでなければ
    639 ;    タスクスタック
    640 ;  ・割込み発生時のH/W処理により,スタックに割込みからの復帰PCとPSWが
    641 ;    保存されている.
    642 ;  ・ベクタテーブルに登録された個別のå
    643 ¥ã‚Šå£å‡¦ç†ã«ã‚ˆã‚Š, スタックに
    644 ;    スクラッチレジスタ(R1-R5)が保存されている.
    645 ;
    646 ;  引数:
    647 ;  ・r1:割込み要因番号
    648 ;  ・r2:割込みハンドラのアドレス
    649 ;
    650 ;  レジスタがスタック上にどのように保存されているかを以下に示す.
    651 ;  この図では上が低位, 下が高位のアドレスで, スタックは下から
    652 ;  上方向に向かって積み上げられるものとする.
     524        rte                                                                     ; 割込み前の処理に戻る
     525
     526
     527;
     528;  割込みの出入口処理(アセンブリ言語記述部分)
     529;
     530;  呼出し条件:
     531;  ・割込み発生時のH/W処理により, PSWレジスタのIビット=0, IPLは受付け
     532;    た割込みのIPL.
     533;  ・スタックは多重割り込みなら割込みスタック, そうでなければ
     534;    タスクスタック
     535;  ・割込み発生時のH/W処理により,スタックに割込みからの復帰PCとPSWが
     536;    保存されている.
     537;  ・ベクタテーブルに登録された個別の入り口処理により, スタックに
     538;    スクラッチレジスタ(R1-R5)が保存されている.
     539;
     540;  引数:
     541;  ・r1:割込み要因番号
     542;  ・r2:割込みハンドラのアドレス
     543;
     544;  レジスタがスタック上にどのように保存されているかを以下に示す.
     545;  この図では上が低位, 下が高位のアドレスで, スタックは下から
     546;  上方向に向かって積み上げられるものとする.
    653547;
    654548;       -------------------------
     
    678572;       -------------------------(SP + 44)
    679573;
    680 ;  ここでは, 割込み処理モードに変更してハンドラを実行する.
    681 ;
    682 ;  ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
    683 ;  TRUE になった時に,ret_int へ分岐(é
    684 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチ)する.
    685 ;
    686 ;  多重割込みかどうかは割込みネストカウンタの値で判定する.
    687 ;  intnest != 0 ならば多重割込みであると判定する.
    688 ;
    689 ;  reqflg はCPUロック状æ
    690 ‹ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹. そうでないと,
    691 ;  reqflg チェック後に起動された割込みハンドラå†
    692 ã§
    693 ;  ディスパッチが要求された場合に,ディスパッチされない.
     574;  ここでは, 割込み処理モードに変更してハンドラを実行する.
     575;
     576;  ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
     577;  TRUE になった時に,ret_int へ分岐(遅延ディスパッチ)する.
     578;
     579;  多重割込みかどうかは割込みネストカウンタの値で判定する.
     580;  intnest != 0 ならば多重割込みであると判定する.
     581;
     582;  reqflg はCPUロック状態でチェックする. そうでないと,
     583;  reqflg チェック後に起動された割込みハンドラ内で
     584;  ディスパッチが要求された場合に,ディスパッチされない.
    694585;
    695586_kernel_interrupt:
    696         pushm   r14-r15                                         ; スクラッチレジスタを退避
    697         pushc   fpsw                                            ; FPUステータスレジスタ退避
     587        pushm   r14-r15                                         ; スクラッチレジスタを退避
     588        pushc   fpsw                                            ; FPUステータスレジスタ退避
    698589        mvfacmi r5
    699         shll    #16, r5                                         ; ACC最下位16bitは0とする
     590        shll    #16, r5                                         ; ACC最下位16bitは0とする
    700591        mvfachi r4
    701         pushm   r4-r5                                           ; アキュムレータ退避
     592        pushm   r4-r5                                           ; アキュムレータ退避
    702593        mov.l   #__kernel_intnest, r5
    703594        mov.w   [r5], r4
    704         add             #1, r4                                          ; ネスト回数をインクリメント
     595        add             #1, r4                                          ; ネスト回数をインクリメント
    705596        mov.w   r4, [r5]
    706         cmp             #1, r4                                          ; 多重割り込みかどうか
    707         bnz             interrupt_from_int                      ; 加算前が0でなければ多重割込み
    708                                                 ; 初段の割込み
    709         mov.l   r0, r3                                          ; スタックポインタを取り出し
    710         mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
     597        cmp             #1, r4                                          ; 多重割り込みかどうか
     598        bnz             interrupt_from_int                      ; 加算前が0でなければ多重割込み
     599                                                ; 初段の割込み
     600        mov.l   r0, r3                                          ; スタックポインタを取り出し
     601        mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
    711602        mov.l   [r5], r0
    712         push.l  r3                                                      ; タスクスタックを保持
    713 interrupt_from_int:             ; 多重割込み
    714         setpsw  i                                                       ; 割込み許可(CPUロック解除状æ
    715 ‹)
     603        push.l  r3                                                      ; タスクスタックを保持
     604interrupt_from_int:             ; 多重割込み
     605        setpsw  i                                                       ; 割込み許可(CPUロック解除状態)
    716606
    717607.if     LOG_INH_LEAVE == 1
    718         push.l  r1                                                      ; ログトレースの引数を保持
     608        push.l  r1                                                      ; ログトレースの引数を保持
    719609.endif
    720610
    721611.if     LOG_INH_ENTER == 1
    722612        push.l  r2
    723         bsr             _kernel_log_inh_enter           ; ログトレース関数の呼出し
    724                                                         ; 引数の割込み要因番号は既にr1にå
    725 ¥ã£ã¦ã„ã‚‹
     613        bsr             _kernel_log_inh_enter           ; ログトレース関数の呼出し
     614                                                        ; 引数の割込み要因番号は既にr1に入っている
    726615        pop             r2
    727616.endif
    728617
    729         jsr     r2                                                      ; Cルーチン呼び出し
     618        jsr     r2                                                      ; Cルーチン呼び出し
    730619
    731620.if     LOG_INH_LEAVE == 1
    732         pop             r1                                                      ; 引数に割込み要因番号を設定
    733         bsr             _kernel_log_inh_leave           ; ログトレース関数の呼出し
     621        pop             r1                                                      ; 引数に割込み要因番号を設定
     622        bsr             _kernel_log_inh_leave           ; ログトレース関数の呼出し
    734623.endif
    735624
    736         clrpsw  i                                                       ; 割込み禁止(CPUロック状æ
    737 ‹)
     625        clrpsw  i                                                       ; 割込み禁止(CPUロック状態)
    738626        mov.l   #__kernel_intnest, r5
    739627        mov.w   [r5], r4
    740         sub             #1, r4                                          ; ネスト回数をデクリメント
     628        sub             #1, r4                                          ; ネスト回数をデクリメント
    741629        mov.w   r4, [r5]
    742         cmp             #0, r4                                          ; 多重割り込みかどうか
    743         bnz             interrupt_return                        ; 多重割り込みならリターン
    744         ; 初段の割込み
    745         pop             r0                                                      ; タスクのスタックに戻す
    746         mov.l   #__kernel_reqflg, r5            ; ディスパッチ要求がないか?
     630        cmp             #0, r4                                          ; 多重割り込みかどうか
     631        bnz             interrupt_return                        ; 多重割り込みならリターン
     632        ; 初段の割込み
     633        pop             r0                                                      ; タスクのスタックに戻す
     634        mov.l   #__kernel_reqflg, r5            ; ディスパッチ要求がないか?
    747635        mov.l   [r5], r5
    748636        cmp             #1, r5
    749         bz              ret_int                                         ; あれば ret_int へジャンプ
     637        bz              ret_int                                         ; あれば ret_int へジャンプ
    750638interrupt_return:
    751         popm    r4-r5                                           ; アキュムレータ復帰
    752         mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
     639        popm    r4-r5                                           ; アキュムレータ復帰
     640        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    753641        mvtachi r4
    754         popc    fpsw                                            ; FPUステータスレジスタ復帰
    755         popm    r14-r15                                         ; レジスタ復帰
     642        popc    fpsw                                            ; FPUステータスレジスタ復帰
     643        popm    r14-r15                                         ; レジスタ復帰
    756644        popm    r1-r5
    757         rte                                                                     ; 割込み前の処理に戻る
    758 
    759 
    760 ;
    761 ;  CPU例外の出å
    762 ¥å£å‡¦ç†(アセンブリ言語記述部分)
    763 ;
    764 ;  呼出し条件:
    765 ;  ・CPU例外発生時のH/W処理により, PSWレジスタのIビット=0, IPL=0.
    766 ;  ・スタックは多重割り込みなら割込みスタック, そうでなければ
    767 ;    タスクスタック
    768 ;  ・CPU例外発生時のH/W処理により,スタックにCPU例外からの復帰PCと
    769 ;    PSWが保存されている.
    770 ;  ・ベクタテーブルに登録された個別のå
    771 ¥ã‚Šå£å‡¦ç†ã«ã‚ˆã‚Š, スタックに
    772 ;    スクラッチレジスタ(R1-R5)が保存されている.
    773 ;
    774 ;  引数:
    775 ;  ・r1:CPU例外要因番号
    776 ;  ・r2:CPU例外ハンドラのアドレス
    777 ;
    778 ;  レジスタがスタック上にどのように保存されているかを以下に示す.
    779 ;  この図では上が低位, 下が高位のアドレスで, スタックは下から
    780 ;  上方向に向かって積み上げられるものとする.
    781 ;  なお, CPU例外要因番号とR6-R13はCPU例外ハンドラå†
    782 ã§æƒ
    783 å ±ã‚’取得
    784 ;  する目的で退避しており, 出口処理では保存å†
    785 å®¹ã‚’破棄すればよい.
     645        rte                                                                     ; 割込み前の処理に戻る
     646
     647
     648;
     649;  CPU例外の出入口処理(アセンブリ言語記述部分)
     650;
     651;  呼出し条件:
     652;  ・CPU例外発生時のH/W処理により, PSWレジスタのIビット=0, IPL=0.
     653;  ・スタックは多重割り込みなら割込みスタック, そうでなければ
     654;    タスクスタック
     655;  ・CPU例外発生時のH/W処理により,スタックにCPU例外からの復帰PCと
     656;    PSWが保存されている.
     657;  ・ベクタテーブルに登録された個別の入り口処理により, スタックに
     658;    スクラッチレジスタ(R1-R5)が保存されている.
     659;
     660;  引数:
     661;  ・r1:CPU例外要因番号
     662;  ・r2:CPU例外ハンドラのアドレス
     663;
     664;  レジスタがスタック上にどのように保存されているかを以下に示す.
     665;  この図では上が低位, 下が高位のアドレスで, スタックは下から
     666;  上方向に向かって積み上げられるものとする.
     667;  なお, CPU例外要因番号とR6-R13はCPU例外ハンドラ内で情報を取得
     668;  する目的で退避しており, 出口処理では保存内容を破棄すればよい.
    786669;
    787670;       -------------------------
    788 ;       |    CPU例外要因番号    | <----- p_excinf
     671;       |    CPU例外要因番号    | <----- p_excinf
    789672;       ------------------------- (intptr_t)(p_excinf + 0)
    790673;       |       R6(4byte)       |
     
    829712;       ------------------------- (intptr_t)(p_excinf + 80)
    830713;
    831 ;  ここでは, 割込み処理モードに変更してハンドラを実行する.
    832 ;  CPU例外ハンドラに渡すVP型の変数 p_excinf としてISPの値渡す.
    833 ;
    834 ;  ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
    835 ;  TRUE になった時に,ret_int へ分岐(é
    836 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチ)する.
    837 ;
    838 ;  多重割込みかどうかは割込みネストカウンタの値で判定する.
    839 ;  intnest != 0 ならば多重割込みであると判定する.
    840 ;
    841 ;  reqflg はCPUロック状æ
    842 ‹ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹. そうでないと,
    843 ;  reqflg チェック後に起動された割込みハンドラå†
    844 ã§
    845 ;  ディスパッチが要求された場合に,ディスパッチされない.
    846 ;
    847 ;
    848 ;  CPU例外å
    849 ¥å£å‡¦ç†
    850 ;
    851 ;  ここでは, 割込み処理モードに変更してハンドラを実行する.
    852 ;
    853 
    854 ;
    855 ;  CPU例外ハンドラ呼出し後に不要となるスタックæƒ
    856 å ±ã®ã‚µã‚¤ã‚º
     714;  ここでは, 割込み処理モードに変更してハンドラを実行する.
     715;  CPU例外ハンドラに渡すVP型の変数 p_excinf としてISPの値渡す.
     716;
     717;  ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
     718;  TRUE になった時に,ret_int へ分岐(遅延ディスパッチ)する.
     719;
     720;  多重割込みかどうかは割込みネストカウンタの値で判定する.
     721;  intnest != 0 ならば多重割込みであると判定する.
     722;
     723;  reqflg はCPUロック状態でチェックする. そうでないと,
     724;  reqflg チェック後に起動された割込みハンドラ内で
     725;  ディスパッチが要求された場合に,ディスパッチされない.
     726;
     727;
     728;  CPU例外入口処理
     729;
     730;  ここでは, 割込み処理モードに変更してハンドラを実行する.
     731;
     732
     733;
     734;  CPU例外ハンドラ呼出し後に不要となるスタック情報のサイズ
    857735;  EXCNO + R6--R13
    858736;
     
    860738
    861739_kernel_exception:
    862         pushm   r14-r15                                         ; スクラッチレジスタを退避
     740        pushm   r14-r15                                         ; スクラッチレジスタを退避
    863741        pushc   fpsw
    864742        mvfacmi r5
    865         shll    #16, r5                                         ; ACC最下位16bitは0とする
     743        shll    #16, r5                                         ; ACC最下位16bitは0とする
    866744        mvfachi r4
    867         pushm   r4-r5                                           ; アキュムレータ退避
    868         pushm   r6-r13                                          ; 非スクラッチレジスタ保存
    869         push.l  r1                                                      ; CPU例外要因番号を保持
    870         mov.l   r0, r3                                          ; スタックポインタを取り出し
     745        pushm   r4-r5                                           ; アキュムレータ退避
     746        pushm   r6-r13                                          ; 非スクラッチレジスタ保存
     747        push.l  r1                                                      ; CPU例外要因番号を保持
     748        mov.l   r0, r3                                          ; スタックポインタを取り出し
    871749        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    872750        and             #PSW_I_MASK, r5
    873         bz              exception_nonkernel                     ; å
    874 ¨å‰²è¾¼ã¿ç¦æ­¢(CPUロック)状æ
    875 ‹ãªã‚‰ç®¡ç†å¤–
     751        bz              exception_nonkernel                     ; 全割込み禁止(CPUロック)状態なら管理外
    876752#if     TIPM_LOCK != -15
    877753        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    878754        and             #PSW_IPL_MASK, r5
    879755        cmp             #IPL_LOCK, r5
    880         bgt     exception_nonkernel                     ; IPLがCPUロックレベル以上なら管理外
     756        bgt     exception_nonkernel                     ; IPLがCPUロックレベル以上なら管理外
    881757#endif
    882758        mov.l   #__kernel_intnest, r5
    883759        mov.w   [r5], r4
    884         add             #1, r4                                          ; ネスト回数をインクリメント
     760        add             #1, r4                                          ; ネスト回数をインクリメント
    885761        mov.w   r4, [r5]
    886         cmp             #1, r4                                          ; 多重割り込みかどうか
    887         bnz             exception_from_int                      ; 加算前が0でなければ多重割込み
    888                                                 ; 初段の割込み
    889         mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
     762        cmp             #1, r4                                          ; 多重割り込みかどうか
     763        bnz             exception_from_int                      ; 加算前が0でなければ多重割込み
     764                                                ; 初段の割込み
     765        mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
    890766        mov.l   [r5], r0
    891         push.l  r3                                                      ; タスクスタックを保持
    892 exception_from_int:             ; 多重割込み
     767        push.l  r3                                                      ; タスクスタックを保持
     768exception_from_int:             ; 多重割込み
    893769        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    894         mvtc    r5, psw                                         ; CPU例外発生前の状æ
    895 ‹ã«æˆ»ã™
     770        mvtc    r5, psw                                         ; CPU例外発生前の状態に戻す
    896771#if     LOG_EXC_LEAVE == 1
    897         push.l  r1                                                      ; ログトレースの引数を保持
     772        push.l  r1                                                      ; ログトレースの引数を保持
    898773#endif
    899774
    900775#if     LOG_EXC_ENTER == 1
    901776        pushm   r2-r3
    902         bsr             _kernel_log_exc_enter           ; ログトレース関数の呼出し
    903                                                         ; 引数の割込み要因番号は既にr1にå
    904 ¥ã£ã¦ã„ã‚‹
     777        bsr             _kernel_log_exc_enter           ; ログトレース関数の呼出し
     778                                                        ; 引数の割込み要因番号は既にr1に入っている
    905779        popm    r2-r3
    906780#endif
    907781
    908         mov.l   r3, r1                                          ; 引数のp_excinfを設定
    909         jsr     r2                                                      ; Cルーチン呼び出し
     782        mov.l   r3, r1                                          ; 引数のp_excinfを設定
     783        jsr     r2                                                      ; Cルーチン呼び出し
    910784
    911785.if     LOG_EXC_LEAVE == 1
    912         pop             r1                                                      ; 引数に割込み要因番号を設定
    913         bsr             _kernel_log_exc_leave           ; ログトレース関数の呼出し
     786        pop             r1                                                      ; 引数に割込み要因番号を設定
     787        bsr             _kernel_log_exc_leave           ; ログトレース関数の呼出し
    914788.endif
    915789
    916         clrpsw  i                                                       ; ここからはå¿
    917 ãšå‰²è¾¼ã¿ç¦æ­¢
     790        clrpsw  i                                                       ; ここからは必ず割込み禁止
    918791        mov.l   #__kernel_intnest, r5
    919792        mov.w   [r5], r4
    920         sub             #1, r4                                          ; ネスト回数をデクリメント
     793        sub             #1, r4                                          ; ネスト回数をデクリメント
    921794        mov.w   r4, [r5]
    922         cmp             #0, r4                                          ; 多重割り込みかどうか
    923         bnz             exception_return                        ; 多重割り込みならリターン
    924         ; 初段の割込み
    925         pop             r0                                                      ; タスクのスタックに戻す
    926         mov.l   #__kernel_reqflg, r5            ; ディスパッチ要求がないか?
     795        cmp             #0, r4                                          ; 多重割り込みかどうか
     796        bnz             exception_return                        ; 多重割り込みならリターン
     797        ; 初段の割込み
     798        pop             r0                                                      ; タスクのスタックに戻す
     799        mov.l   #__kernel_reqflg, r5            ; ディスパッチ要求がないか?
    927800        mov.l   [r5], r5
    928801        cmp             #1, r5
    929         bnz             exception_return                        ; なければリターン
    930         add             #EXCINF_REG_SIZE, r0            ; CPU例外æƒ
    931 å ±ã®ç ´æ£„
    932         bra             ret_int                                         ; あれば ret_int へジャンプ
     802        bnz             exception_return                        ; なければリターン
     803        add             #EXCINF_REG_SIZE, r0            ; CPU例外情報の破棄
     804        bra             ret_int                                         ; あれば ret_int へジャンプ
    933805
    934806exception_nonkernel:
    935807        mov.l   #__kernel_intnest, r5
    936808        mov.w   [r5], r4
    937         add             #1, r4                                          ; ネスト回数をインクリメント
     809        add             #1, r4                                          ; ネスト回数をインクリメント
    938810        mov.w   r4, [r5]
    939         cmp             #1, r4                                          ; 多重割り込みかどうか
    940         bnz             exception_from_nonkernelint     ; 加算前が0でなければ多重割込み
    941                                                 ; 初段の割込み
    942         mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
     811        cmp             #1, r4                                          ; 多重割り込みかどうか
     812        bnz             exception_from_nonkernelint     ; 加算前が0でなければ多重割込み
     813                                                ; 初段の割込み
     814        mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
    943815        mov.l   [r5], r0
    944         push.l  r3                                                      ; タスクスタックを保持
    945 exception_from_nonkernelint:    ; 多重割込み
     816        push.l  r3                                                      ; タスクスタックを保持
     817exception_from_nonkernelint:    ; 多重割込み
    946818        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    947         mvtc    r5, psw                                         ; CPU例外発生前の状æ
    948 ‹ã«æˆ»ã™
    949 
    950         mov.l   r3, r1                                          ; 引数のp_excinfを設定
    951         jsr     r2                                                      ; Cルーチン呼び出し
    952 
    953         clrpsw  i                                                       ; ここからはå¿
    954 ãšå‰²è¾¼ã¿ç¦æ­¢
     819        mvtc    r5, psw                                         ; CPU例外発生前の状態に戻す
     820
     821        mov.l   r3, r1                                          ; 引数のp_excinfを設定
     822        jsr     r2                                                      ; Cルーチン呼び出し
     823
     824        clrpsw  i                                                       ; ここからは必ず割込み禁止
    955825        mov.l   #__kernel_intnest, r5
    956826        mov.w   [r5], r4
    957         sub             #1, r4                                          ; ネスト回数をデクリメント
     827        sub             #1, r4                                          ; ネスト回数をデクリメント
    958828        mov.w   r4, [r5]
    959         cmp             #0, r4                                          ; 多重割り込みかどうか
    960         bnz             exception_return                        ; 多重割り込みならリターン
    961         ; 初段の割込み
    962         pop             r0                                                      ; タスクのスタックに戻す
     829        cmp             #0, r4                                          ; 多重割り込みかどうか
     830        bnz             exception_return                        ; 多重割り込みならリターン
     831        ; 初段の割込み
     832        pop             r0                                                      ; タスクのスタックに戻す
    963833
    964834exception_return:
    965         add             #EXCINF_REG_SIZE, r0            ; CPU例外æƒ
    966 å ±ã®ç ´æ£„
    967         popm    r4-r5                                           ; アキュムレータ復帰
    968         mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
     835        add             #EXCINF_REG_SIZE, r0            ; CPU例外情報の破棄
     836        popm    r4-r5                                           ; アキュムレータ復帰
     837        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    969838        mvtachi r4
    970         popc    fpsw                                            ; FPUステータスレジスタ復帰
    971         popm    r14-r15                                         ; レジスタ復帰
     839        popc    fpsw                                            ; FPUステータスレジスタ復帰
     840        popm    r14-r15                                         ; レジスタ復帰
    972841        popm    r1-r5
    973         rte                                                                     ; 割込み前の処理に戻る
    974 
    975 
    976 ;
    977 ;  微少時間å¾
    978 ã¡
     842        rte                                                                     ; 割込み前の処理に戻る
     843
     844
     845;
     846;  微少時間待ち
    979847;
    980848_sil_dly_nse:
Note: See TracChangeset for help on using the changeset viewer.