Ignore:
Timestamp:
Aug 3, 2017, 10:46:41 PM (7 years ago)
Author:
coas-nagasima
Message:

プロパティの文字コードにUTF-8を追加、キーワードを削除

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 to text/plain; charset=UTF-8
    r317 r318  
    1212;   Copyright (C) 2017      by Cores Co., Ltd. Japan
    1313
    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;       免責すること.
    5036
    51 ;   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    52 ãŠ
    53 ;   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    54 ;   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    55 ;   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    56 ;   ã®è²¬ä»»ã‚’負わない.
     37;   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     38;   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     39;   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     40;   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     41;   の責任を負わない.
    5742
    5843;  @(#) $Id$
     
    6045
    6146;
    62 ãƒ—ロセッサ依存モジュール アセンブリ言語部(RX630用)
     47プロセッサ依存モジュール アセンブリ言語部(RX630用)
    6348;
    6449#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)           /* 型キャストを行うマクロ */
    6853#include "kernel_impl.h"
    6954
    7055;
    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
    12385;                                       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
    12990;                                       add             #TCB_sp, r15, r5
    13091;                                       mov.l   r0, [r5]
    131 ;               å„オフセット値を判断し, 条件アセンブルによりコードを切り替える
    132 ;
    133 
    134 ;
    135 æ§‹é€ ä½“アクセスのオフセット定義
     92;               各オフセット値を判断し, 条件アセンブルによりコードを切り替える
     93;
     94
     95;
     96構造体アクセスのオフセット定義
    13697;
    13798#include "offset.h"
    13899
    139100;
    140 å„種EQU定義(Hファイルの#define定義)
     101各種EQU定義(Hファイルの#define定義)
    141102;
    142103#include "target_kernel_impl.h"
     
    194155
    195156;
    196 ;  TCB_sp への書込みマクロ
     157;  TCB_sp への書込みマクロ
    197158;
    198159.macro  st_TCB_sp       src, tcb, tmp
     
    206167
    207168;
    208 ;  TCB_sp からの読出しマクロ
     169;  TCB_sp からの読出しマクロ
    209170;
    210171.macro  ld_TCB_sp       dst, tcb, tmp
     
    218179
    219180;
    220 ;  TCB_pc への書込みマクロ
     181;  TCB_pc への書込みマクロ
    221182;
    222183.macro  st_TCB_pc       src, tcb, tmp
     
    230191
    231192;
    232 ;  TCB_pc からの読出しマクロ
     193;  TCB_pc からの読出しマクロ
    233194;
    234195.macro  ld_TCB_pc       dst, tcb, tmp
     
    242203
    243204;
    244 ;  TCB_texptn からの読出しマクロ
     205;  TCB_texptn からの読出しマクロ
    245206;
    246207.macro  ld_TCB_texptn   dst, tcb, tmp
     
    254215
    255216;
    256 ;  TCB_p_tinib からの読出しマクロ
     217;  TCB_p_tinib からの読出しマクロ
    257218;
    258219.macro  ld_TCB_p_tinib  dst, tcb, tmp
     
    266227
    267228;
    268 ;  TINIB_exinf からの読出しマクロ
     229;  TINIB_exinf からの読出しマクロ
    269230;
    270231.macro  ld_TINIB_exinf  dst, tinib, tmp
     
    278239
    279240;
    280 ;  TINIB_task からの読出しマクロ
     241;  TINIB_task からの読出しマクロ
    281242;
    282243.macro  ld_TINIB_task   dst, tinib, tmp
     
    293254
    294255;
    295 ;  APIからのタスクディスパッチャå
    296 ¥å£
    297 ;
    298 ;  呼び出し条件:
    299 ;       ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード(ファイルヘッダ参ç
    300 §)
    301 ;
    302 ;  ここでは, コンテキストの退避と, 実行再開番地の設定をする.
     256;  APIからのタスクディスパッチャ入口
     257;
     258;  呼び出し条件:
     259;       ・ディスパッチャモード(ファイルヘッダ参照)
     260;
     261;  ここでは, コンテキストの退避と, 実行再開番地の設定をする.
    303262;
    304263__kernel_dispatch:
    305264#ifdef TOPPERS_SUPPORT_OVRHDR /* (6-5-3-1) */
    306         mov.l   #255, r1                                        ; r1にダミー割込み番号
     265        mov.l   #255, r1                                        ; r1にダミー割込み番号
    307266        bsr             __kernel_ovrtimer_stop
    308267#endif /* TOPPERS_SUPPORT_OVRHDR */
    309         pushm   r6-r13                                          ; 非スクラッチレジスタ保存
     268        pushm   r6-r13                                          ; 非スクラッチレジスタ保存
    310269        mov.l   #__kernel_p_runtsk, r15
    311270        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に保存
    314273        bra             dispatcher
    315274
    316275;
    317 ;  APIへのタスクディスパッチャ出口
    318 ;
    319 ;  呼び出し条件:
    320 ;       ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード(ファイルヘッダ参ç
    321 §)
    322 ;
    323 ;  ここでは, タスク例外ハンドラ呼出しと, コンテキストの復帰をする.
     276;  APIへのタスクディスパッチャ出口
     277;
     278;  呼び出し条件:
     279;       ・ディスパッチャモード(ファイルヘッダ参照)
     280;
     281;  ここでは, タスク例外ハンドラ呼出しと, コンテキストの復帰をする.
    324282;
    325283dispatch_r:
    326284dispatch_r_rts:
    327         popm    r6-r13                                          ; 非スクラッチレジスタ復帰
     285        popm    r6-r13                                          ; 非スクラッチレジスタ復帰
    328286#ifdef TOPPERS_SUPPORT_OVRHDR /* (6-5-3-2) */
    329287        bsr             __kernel_ovrtimer_start
    330288#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ロック解除状態にし, タスクを起動する.
    344298;
    345299__kernel_start_r:
     
    350304#endif /* TOPPERS_SUPPORT_OVRHDR */
    351305        mov.l   #_ext_tsk, r5
    352         push.l  r5                                                      ; 戻り番地をスタックに積む
     306        push.l  r5                                                      ; 戻り番地をスタックに積む
    353307        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                      ; タスクの起動番地を取得
    357310.if     TIPM_LOCK == -15
    358         setpsw  i                                                       ; 割込み許可(CPUロック解除状æ
    359 ‹)
     311        setpsw  i                                                       ; 割込み許可(CPUロック解除状態)
    360312.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 )
    373318.endif
    374319        jmp             r5
    375320
    376321;
    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;  ここでは, ディスパッチャモードに変更する.
    391332;
    392333__kernel_start_dispatch:
    393334        mov.l   #__kernel_intnest, r5
    394         mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
     335        mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
    395336#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 のアドレス取得だけは行なう.
    415349;
    416350__exit_and_dispatch:
     
    420354.endif
    421355;
    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 からきた場合                    : 割込みスタック
    434368;
    435369dispatcher:
    436370.if     LOG_DSP_ENTER == 1
    437371        push.l  r15
    438         mov.l   r14, r1                                         ; 引数(ディスパッチå
    439 ƒTCB)を設定
     372        mov.l   r14, r1                                         ; 引数(ディスパッチ元TCB)を設定
    440373        bsr             __kernel_log_dsp_enter
    441374        pop             r15
    442375.endif
    443376        mov.l   #__kernel_p_schedtsk, r5     
    444         mov.l   [r5], [r15]                                     ; p_schedtsk を p_runtsk に
     377        mov.l   [r5], [r15]                                     ; p_schedtsk を p_runtsk に
    445378        mov.l   [r15], r14
    446379        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                             ; タスクスタックポインタを復帰
    449382.if     LOG_DSP_LEAVE == 1
    450383        push.l  r14
    451         mov.l   r14, r1                                         ; 引数(ディスパッチå
    452 ˆTCB)を設定
     384        mov.l   r14, r1                                         ; 引数(ディスパッチ先TCB)を設定
    453385        bsr             __kernel_log_dsp_leave
    454386        pop             r14
    455387.endif
    456388        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つの意味がある.
    468398;
    469399dispatcher_pre_idle:
    470400        mov.l   #__kernel_istkpt,r5
    471         mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
     401        mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
    472402        mov.l   #__kernel_intnest, r5
    473         mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
     403        mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
    474404#if     TIPM_LOCK != -15
    475         mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状æ
    476 ‹ã¸
     405        mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状態へ
    477406        mov.l   #0, [r5]
    478         mvtc    #0, psw                                         ; 優å
    479 ˆåº¦0の割込み処理中を偽è£
    480 
     407        mvtc    #0, psw                                         ; 優先度0の割込み処理中を偽装
    481408#endif
    482409
    483410dispatcher_idle_loop:
    484         setpsw  i                                                       ; å
    485 ¨å‰²è¾¼ã¿è¨±å¯
    486         clrpsw  i                                                       ; å
    487 ¨å‰²è¾¼ã¿ç¦æ­¢
     411        setpsw  i                                                       ; 全割込み許可
     412        clrpsw  i                                                       ; 全割込み禁止
    488413
    489414        mov.l   #__kernel_p_schedtsk, r4
     
    491416        mov.l   #__kernel_p_runtsk, r5
    492417        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にする
    496421        mov.l   #__kernel_intnest, r5
    497         mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
     422        mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
    498423#if     TIPM_LOCK != -15
    499         mov.l   #__kernel_lock_flag, r5         ; CPUロック状æ
    500 ‹ã¸
     424        mov.l   #__kernel_lock_flag, r5         ; CPUロック状態へ
    501425        mov.l   #1, [r5]
    502426        mov.l   #__kernel_saved_ipl, r5
    503427        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; モードとスタックを非タスクコンテキスト用に切り替え.
    519438;
    520439        .global __kernel_call_exit_kernel
    521440__kernel_call_exit_kernel:
    522441#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ロック解除状態へ
    527444        mov.l   #0, [r5]
    528445#endif
    529446        mov.l   #__kernel_istkpt, r5
    530         mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
     447        mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
    531448        mov.l   #__kernel_intnest, r5
    532         mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
     449        mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
    533450        bsr             __kernel_exit_kernel
    534451        bra             __kernel_call_exit_kernel
     
    536453
    537454;
    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レジスタへのオフセット
    561470;  ACC + FPSW + R14--R15 + R1--R5 + PC
    562471;
     
    565474ret_int:
    566475.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値取得
    568477        and             #PSW_IPL_MASK, r5
    569         mvtc    r5, psw                                         ; å
    570 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯(CPUロック)状æ
    571 ‹
    572                                                                                 ; 割込み/CPU例外発生前の割込み優å
    573 ˆåº¦
     478        mvtc    r5, psw                                         ; 全割込みロック(CPUロック)状態
     479                                                                                ; 割込み/CPU例外発生前の割込み優先度
    574480.else
    575         mov.l   #__kernel_lock_flag, r5         ; CPUロック状æ
    576 ‹ã¸
     481        mov.l   #__kernel_lock_flag, r5         ; CPUロック状態へ
    577482        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値取得
    579484        and             #PSW_IPL_MASK, r5
    580485        mov.l   #__kernel_saved_ipl, r4
    581486        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                                                                                ; 割込み優先度マスク全解除でない状態
    589489.endif
    590490        mov.l   #__kernel_p_runtsk, r15     
     
    592492        mov.l   #__kernel_p_schedtsk, r5
    593493        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に保存
    599499        bra             dispatcher
    600500
    601501;
    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:                                    ;タスクモニタ用ラベル
    613511ret_int_r:
    614         popm    r6-r13                                          ; 非スクラッチレジスタ復帰
     512        popm    r6-r13                                          ; 非スクラッチレジスタ復帰
    615513ret_int_r_call_tex:
    616514#ifdef TOPPERS_SUPPORT_OVRHDR /* 6.6.1 & 6.7.1 */
     
    621519ret_int_r_rte:
    622520#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ロック解除状態へ
    627523        mov.l   #0, [r5]
    628524#endif
    629         popm    r4-r5                                           ; アキュムレータ復帰
    630         mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
     525        popm    r4-r5                                           ; アキュムレータ復帰
     526        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    631527        mvtachi r4
    632         popc    fpsw                                            ; FPUステータスレジスタ復帰
    633         popm    r14-r15                                         ; レジスタ復帰
     528        popc    fpsw                                            ; FPUステータスレジスタ復帰
     529        popm    r14-r15                                         ; レジスタ復帰
    634530        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;  上方向に向かって積み上げられるものとする.
    660554;
    661555;       -------------------------
     
    685579;       -------------------------(SP + 44)
    686580;
    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;  ディスパッチが要求された場合に,ディスパッチされない.
    701592;
    702593_kernel_interrupt:
    703         pushm   r14-r15                                         ; スクラッチレジスタを退避
    704         pushc   fpsw                                            ; FPUステータスレジスタ退避
     594        pushm   r14-r15                                         ; スクラッチレジスタを退避
     595        pushc   fpsw                                            ; FPUステータスレジスタ退避
    705596        mvfacmi r5
    706         shll    #16, r5                                         ; ACC最下位16bitは0とする
     597        shll    #16, r5                                         ; ACC最下位16bitは0とする
    707598        mvfachi r4
    708         pushm   r4-r5                                           ; アキュムレータ退避
     599        pushm   r4-r5                                           ; アキュムレータ退避
    709600        mov.l   #__kernel_intnest, r5
    710601        mov.w   [r5], r4
    711         add             #1, r4                                          ; ネスト回数をインクリメント
     602        add             #1, r4                                          ; ネスト回数をインクリメント
    712603        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                                                ; 初段の割込み
    716607#ifdef TOPPERS_SUPPORT_OVRHDR /* 6.6.1 */
    717608        pushm   r1-r5
    718         bsr             __kernel_ovrtimer_stop          ; r1に割込み番号
     609        bsr             __kernel_ovrtimer_stop          ; r1に割込み番号
    719610        popm    r1-r5
    720611#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            ; 割込み用のスタックへ切替える
    723614        mov.l   [r5], r0
    724         push.l  r3                                                      ; タスクスタックを保持
    725 interrupt_from_int:             ; 多重割込み
    726         setpsw  i                                                       ; 割込み許可(CPUロック解除状æ
    727 ‹)
     615        push.l  r3                                                      ; タスクスタックを保持
     616interrupt_from_int:             ; 多重割込み
     617        setpsw  i                                                       ; 割込み許可(CPUロック解除状態)
    728618
    729619.if     LOG_INH_LEAVE == 1
    730         push.l  r1                                                      ; ログトレースの引数を保持
     620        push.l  r1                                                      ; ログトレースの引数を保持
    731621.endif
    732622
    733623.if     LOG_INH_ENTER == 1
    734624        push.l  r2
    735         bsr             __kernel_log_inh_enter          ; ログトレース関数の呼出し
    736                                                         ; 引数の割込み要因番号は既にr1にå
    737 ¥ã£ã¦ã„ã‚‹
     625        bsr             __kernel_log_inh_enter          ; ログトレース関数の呼出し
     626                                                        ; 引数の割込み要因番号は既にr1に入っている
    738627        pop             r2
    739628.endif
    740629
    741         jsr     r2                                                      ; Cルーチン呼び出し
     630        jsr     r2                                                      ; Cルーチン呼び出し
    742631
    743632.if     LOG_INH_LEAVE == 1
    744         pop             r1                                                      ; 引数に割込み要因番号を設定
    745         bsr             __kernel_log_inh_leave          ; ログトレース関数の呼出し
     633        pop             r1                                                      ; 引数に割込み要因番号を設定
     634        bsr             __kernel_log_inh_leave          ; ログトレース関数の呼出し
    746635.endif
    747636
    748         clrpsw  i                                                       ; 割込み禁止(CPUロック状æ
    749 ‹)
     637        clrpsw  i                                                       ; 割込み禁止(CPUロック状態)
    750638        mov.l   #__kernel_intnest, r5
    751639        mov.w   [r5], r4
    752         sub             #1, r4                                          ; ネスト回数をデクリメント
     640        sub             #1, r4                                          ; ネスト回数をデクリメント
    753641        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                                                      ; タスクのスタックに戻す
    758646        mov.l   #__kernel_p_schedtsk, r4
    759647        mov.l   [r4], r4                                        ; p_schedtsk -> r4
    760648        mov.l   #__kernel_p_runtsk, r5
    761649        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 へジャンプ
    764652#ifdef TOPPERS_SUPPORT_OVRHDR /* 6.6.1 */
    765653        mov.l   #__kernel_p_runtsk, r5
     
    770658#endif /* TOPPERS_SUPPORT_OVRHDR */
    771659interrupt_return:
    772         popm    r4-r5                                           ; アキュムレータ復帰
    773         mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
     660        popm    r4-r5                                           ; アキュムレータ復帰
     661        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    774662        mvtachi r4
    775         popc    fpsw                                            ; FPUステータスレジスタ復帰
    776         popm    r14-r15                                         ; レジスタ復帰
     663        popc    fpsw                                            ; FPUステータスレジスタ復帰
     664        popm    r14-r15                                         ; レジスタ復帰
    777665        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;  する目的で退避しており, 出口処理では保存内容を破棄すればよい.
    807690;
    808691;       -------------------------
    809 ;       |    CPU例外要因番号    | <----- p_excinf
     692;       |    CPU例外要因番号    | <----- p_excinf
    810693;       ------------------------- (intptr_t)(p_excinf + 0)
    811694;       |       R6(4byte)       |
     
    850733;       ------------------------- (intptr_t)(p_excinf + 80)
    851734;
    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例外ハンドラ呼出し後に不要となるスタック情報のサイズ
    878756;  EXCNO + R6--R13
    879757;
     
    881759
    882760_kernel_exception:
    883         pushm   r14-r15                                         ; スクラッチレジスタを退避
     761        pushm   r14-r15                                         ; スクラッチレジスタを退避
    884762        pushc   fpsw
    885763        mvfacmi r5
    886         shll    #16, r5                                         ; ACC最下位16bitは0とする
     764        shll    #16, r5                                         ; ACC最下位16bitは0とする
    887765        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                                          ; スタックポインタを取り出し
    892770        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    893771        and             #PSW_I_MASK, r5
    894         bz              exception_nonkernel                     ; å
    895 ¨å‰²è¾¼ã¿ç¦æ­¢(CPUロック)状æ
    896 ‹ãªã‚‰ç®¡ç†å¤–
     772        bz              exception_nonkernel                     ; 全割込み禁止(CPUロック)状態なら管理外
    897773#if     TIPM_LOCK != -15
    898774        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    899775        and             #PSW_IPL_MASK, r5
    900776        cmp             #IPL_LOCK, r5
    901         bgt     exception_nonkernel                     ; IPLがCPUロックレベル以上なら管理外
     777        bgt     exception_nonkernel                     ; IPLがCPUロックレベル以上なら管理外
    902778#endif
    903779        mov.l   #__kernel_intnest, r5
    904780        mov.w   [r5], r4
    905         add             #1, r4                                          ; ネスト回数をインクリメント
     781        add             #1, r4                                          ; ネスト回数をインクリメント
    906782        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                                                ; 初段の割込み
    910786#ifdef TOPPERS_SUPPORT_OVRHDR /* 6.7.1 */
    911787        pushm   r1-r5
    912         mov.l   #255, r1                                        ; r1にダミー割込み番号
     788        mov.l   #255, r1                                        ; r1にダミー割込み番号
    913789        bsr             __kernel_ovrtimer_stop
    914790        popm    r1-r5
    915791#endif /* TOPPERS_SUPPORT_OVRHDR */
    916         mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
     792        mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
    917793        mov.l   [r5], r0
    918         push.l  r3                                                      ; タスクスタックを保持
    919 exception_from_int:             ; 多重割込み
     794        push.l  r3                                                      ; タスクスタックを保持
     795exception_from_int:             ; 多重割込み
    920796        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    921         mvtc    r5, psw                                         ; CPU例外発生前の状æ
    922 ‹ã«æˆ»ã™
     797        mvtc    r5, psw                                         ; CPU例外発生前の状態に戻す
    923798#if     LOG_EXC_LEAVE == 1
    924         push.l  r1                                                      ; ログトレースの引数を保持
     799        push.l  r1                                                      ; ログトレースの引数を保持
    925800#endif
    926801
    927802#if     LOG_EXC_ENTER == 1
    928803        pushm   r2-r3
    929         bsr             __kernel_log_exc_enter          ; ログトレース関数の呼出し
    930                                                         ; 引数の割込み要因番号は既にr1にå
    931 ¥ã£ã¦ã„ã‚‹
     804        bsr             __kernel_log_exc_enter          ; ログトレース関数の呼出し
     805                                                        ; 引数の割込み要因番号は既にr1に入っている
    932806        popm    r2-r3
    933807#endif
    934808
    935         mov.l   r3, r1                                          ; 引数のp_excinfを設定
    936         jsr     r2                                                      ; Cルーチン呼び出し
     809        mov.l   r3, r1                                          ; 引数のp_excinfを設定
     810        jsr     r2                                                      ; Cルーチン呼び出し
    937811
    938812.if     LOG_EXC_LEAVE == 1
    939         pop             r1                                                      ; 引数に割込み要因番号を設定
    940         bsr             __kernel_log_exc_leave          ; ログトレース関数の呼出し
     813        pop             r1                                                      ; 引数に割込み要因番号を設定
     814        bsr             __kernel_log_exc_leave          ; ログトレース関数の呼出し
    941815.endif
    942816
    943         clrpsw  i                                                       ; ここからはå¿
    944 ãšå‰²è¾¼ã¿ç¦æ­¢
     817        clrpsw  i                                                       ; ここからは必ず割込み禁止
    945818        mov.l   #__kernel_intnest, r5
    946819        mov.w   [r5], r4
    947         sub             #1, r4                                          ; ネスト回数をデクリメント
     820        sub             #1, r4                                          ; ネスト回数をデクリメント
    948821        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                                                      ; タスクのスタックに戻す
    953826        mov.l   #__kernel_p_schedtsk, r4
    954827        mov.l   [r4], r4                                        ; p_schedtsk -> r4
    955828        mov.l   #__kernel_p_runtsk, r5
    956829        mov.l   [r5], r5                                        ; p_runtsk -> r5
    957         cmp             r4, r5                                          ; p_schedtsk と p_runtsk が同じでディスパッチ要求無しか
     830        cmp             r4, r5                                          ; p_schedtsk と p_runtsk が同じでディスパッチ要求無しか
    958831#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 へジャンプ
    963835#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 へジャンプ
    968839exception_return_ovr:
    969840        mov.l   #__kernel_p_runtsk, r5
     
    978849        mov.l   #__kernel_intnest, r5
    979850        mov.w   [r5], r4
    980         add             #1, r4                                          ; ネスト回数をインクリメント
     851        add             #1, r4                                          ; ネスト回数をインクリメント
    981852        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            ; 割込み用のスタックへ切替える
    986857        mov.l   [r5], r0
    987         push.l  r3                                                      ; タスクスタックを保持
    988 exception_from_nonkernelint:    ; 多重割込み
     858        push.l  r3                                                      ; タスクスタックを保持
     859exception_from_nonkernelint:    ; 多重割込み
    989860        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                                                       ; ここからは必ず割込み禁止
    998867        mov.l   #__kernel_intnest, r5
    999868        mov.w   [r5], r4
    1000         sub             #1, r4                                          ; ネスト回数をデクリメント
     869        sub             #1, r4                                          ; ネスト回数をデクリメント
    1001870        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                                                      ; タスクのスタックに戻す
    1006875
    1007876exception_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で復帰
    1012880        mvtachi r4
    1013         popc    fpsw                                            ; FPUステータスレジスタ復帰
    1014         popm    r14-r15                                         ; レジスタ復帰
     881        popc    fpsw                                            ; FPUステータスレジスタ復帰
     882        popm    r14-r15                                         ; レジスタ復帰
    1015883        popm    r1-r5
    1016         rte                                                                     ; 割込み前の処理に戻る
    1017 
    1018 
    1019 ;
    1020 ;  微少時間å¾
    1021 ã¡
     884        rte                                                                     ; 割込み前の処理に戻る
     885
     886
     887;
     888;  微少時間待ち
    1022889;
    1023890_sil_dly_nse:
Note: See TracChangeset for help on using the changeset viewer.