Ignore:
Timestamp:
May 22, 2019, 10:03:37 PM (5 years ago)
Author:
coas-nagasima
Message:

ビルドが通るよう更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub/trunk/asp3_dcre/arch/rx630_gcc/prc_support.S

    • Property svn:keywords deleted
    • Property svn:mime-type changed from text/plain to text/plain;charset=UTF-8
    r388 r389  
    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 ¨å‰²è¾¼ã¿è¨±å¯
     411        setpsw  i                                                       ; 全割込み許可
    486412        wait
    487         clrpsw  i                                                       ; å
    488 ¨å‰²è¾¼ã¿ç¦æ­¢
     413        clrpsw  i                                                       ; 全割込み禁止
    489414
    490415        mov.l   #__kernel_p_schedtsk, r4
     
    492417        mov.l   #__kernel_p_runtsk, r5
    493418        mov.l   [r5], r5                                        ; p_runtsk -> r5
    494         cmp             r4, r5                                          ; p_schedtsk と p_runtsk が同じでディスパッチ要求無しなら
    495         beq             dispatcher_idle_loop            ; アイドルループを繰り返す
    496         mov.l   #0, [r5]                                        ; reqflgがtrueならfalseにする
     419        cmp             r4, r5                                          ; p_schedtsk と p_runtsk が同じでディスパッチ要求無しなら
     420        beq             dispatcher_idle_loop            ; アイドルループを繰り返す
     421        mov.l   #0, [r5]                                        ; reqflgがtrueならfalseにする
    497422        mov.l   #__kernel_intnest, r5
    498         mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
     423        mov.w   #0, [r5]                                        ; タスクコンテキストに切換え
    499424#if     TIPM_LOCK != -15
    500         mov.l   #__kernel_lock_flag, r5         ; CPUロック状æ
    501 ‹ã¸
     425        mov.l   #__kernel_lock_flag, r5         ; CPUロック状態へ
    502426        mov.l   #1, [r5]
    503427        mov.l   #__kernel_saved_ipl, r5
    504428        mov.l   #0, [r5]
    505         mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; å
    506 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ
    507 ‹
    508                                                                                 ; 割込み優å
    509 ˆåº¦ãƒžã‚¹ã‚¯å
    510 ¨è§£é™¤ã§ãªã„状æ
    511 ‹
    512 #endif
    513         bra             dispatcher                                      ; dispatcher へ戻る
    514 
    515 
    516 ;
    517 ; カーネルの終了処理の呼出し
    518 ;
    519 ; モードとスタックを非タスクコンテキスト用に切り替え.
     429        mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; 全割込みロック解除状態
     430                                                                                ; 割込み優先度マスク全解除でない状態
     431#endif
     432        bra             dispatcher                                      ; dispatcher へ戻る
     433
     434
     435;
     436; カーネルの終了処理の呼出し
     437;
     438; モードとスタックを非タスクコンテキスト用に切り替え.
    520439;
    521440        .global __kernel_call_exit_kernel
    522441__kernel_call_exit_kernel:
    523442#if     TIPM_LOCK != -15
    524         clrpsw  i                                                       ; å
    525 ¨å‰²è¾¼ã¿ç¦æ­¢
    526         mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状æ
    527 ‹ã¸
     443        clrpsw  i                                                       ; 全割込み禁止
     444        mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状態へ
    528445        mov.l   #0, [r5]
    529446#endif
    530447        mov.l   #__kernel_istkpt, r5
    531         mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
     448        mov.l   [r5], r0                                        ; 割込み用のスタックへ切替え
    532449        mov.l   #__kernel_intnest, r5
    533         mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
     450        mov.w   #1, [r5]                                        ; 非タスクコンテキストに切換え
    534451        bsr             __kernel_exit_kernel
    535452        bra             __kernel_call_exit_kernel
     
    537454
    538455;
    539 ;  割込み(CPU例外)からのタスクディスパッチャå
    540 ¥å£
    541 ;
    542 ;       å‘¼å‡ºã—条件:
    543 ;       ãƒ»å
    544 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    545 ‹(PSWレジスタIビット = 0)
    546 ;       ãƒ»å‰²è¾¼ã¿å„ªå
    547 ˆåº¦ãƒžã‚¹ã‚¯å
    548 ¨è§£é™¤ã§ãªã„状æ
    549 ‹(IPL != 0)
    550 ;       ãƒ»ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆ(intnest=0)
    551 ;       ãƒ»ä½¿ç”¨ã‚¹ã‚¿ãƒƒã‚¯ã¯ã‚¿ã‚¹ã‚¯ã‚¹ã‚¿ãƒƒã‚¯
    552 ;       ãƒ»reqflg = true
    553 ;
    554 ;  ここでは, ディスパッチャモードに変更し, reqflgをOFFにしてから,
    555 ;  é
    556 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチの有無を判断する.
    557 ;
    558 
    559 ;
    560 ;  ret_intå
    561 ˆé ­ã§ã‚¹ã‚¿ãƒƒã‚¯ã«ç©ã¾ã‚Œã¦ã„ã‚‹PSWレジスタへのオフセット
     456;  割込み(CPU例外)からのタスクディスパッチャ入口
     457;
     458;       呼出し条件:
     459;       ・全割込みロック状態(PSWレジスタIビット = 0)
     460;       ・割込み優先度マスク全解除でない状態(IPL != 0)
     461;       ・タスクコンテキスト(intnest=0)
     462;       ・使用スタックはタスクスタック
     463;       ・reqflg = true
     464;
     465;  ここでは, ディスパッチャモードに変更し, reqflgをOFFにしてから,
     466;  遅延ディスパッチの有無を判断する.
     467;
     468
     469;
     470;  ret_int先頭でスタックに積まれているPSWレジスタへのオフセット
    562471;  ACC + FPSW + R14--R15 + R1--R5 + PC
    563472;
     
    566475ret_int:
    567476.if     TIPM_LOCK == -15
    568         mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; 割込み/CPU例外発生前のIPL値取得
     477        mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; 割込み/CPU例外発生前のIPL値取得
    569478        and             #PSW_IPL_MASK, r5
    570         mvtc    r5, psw                                         ; å
    571 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯(CPUロック)状æ
    572 ‹
    573                                                                                 ; 割込み/CPU例外発生前の割込み優å
    574 ˆåº¦
     479        mvtc    r5, psw                                         ; 全割込みロック(CPUロック)状態
     480                                                                                ; 割込み/CPU例外発生前の割込み優先度
    575481.else
    576         mov.l   #__kernel_lock_flag, r5         ; CPUロック状æ
    577 ‹ã¸
     482        mov.l   #__kernel_lock_flag, r5         ; CPUロック状態へ
    578483        mov.l   #1, [r5]
    579         mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; 割込み/CPU例外発生前のIPL値取得
     484        mov.l   RET_INT_GET_PSW_OFFSET[r0], r5  ; 割込み/CPU例外発生前のIPL値取得
    580485        and             #PSW_IPL_MASK, r5
    581486        mov.l   #__kernel_saved_ipl, r4
    582487        mov.l   r5, [r4]
    583         mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; å
    584 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ
    585 ‹
    586                                                                                 ; 割込み優å
    587 ˆåº¦ãƒžã‚¹ã‚¯å
    588 ¨è§£é™¤ã§ãªã„状æ
    589 ‹
     488        mvtc    #(IPL_LOCK | PSW_I_MASK), psw   ; 全割込みロック解除状態
     489                                                                                ; 割込み優先度マスク全解除でない状態
    590490.endif
    591491        mov.l   #__kernel_p_runtsk, r15     
     
    593493        mov.l   #__kernel_p_schedtsk, r5
    594494        mov.l   [r5], r5
    595         cmp             r5, r14                                         ; p_schedtsk と p_runtsk が同じなら
    596         beq     ret_int_r_call_tex                      ; ret_int_r_call_tex へ
    597         pushm   r6-r13                                          ; 非スクラッチレジスタ保存
    598         st_TCB_sp       r0, r14, r5                             ; スタックポインタをTCBに保存
    599         st_TCB_pc       #ret_int_r, r14, r5             ; 実行再開番地をTCBに保存
     495        cmp             r5, r14                                         ; p_schedtsk と p_runtsk が同じなら
     496        beq     ret_int_r_call_tex                      ; ret_int_r_call_tex
     497        pushm   r6-r13                                          ; 非スクラッチレジスタ保存
     498        st_TCB_sp       r0, r14, r5                             ; スタックポインタをTCBに保存
     499        st_TCB_pc       #ret_int_r, r14, r5             ; 実行再開番地をTCBに保存
    600500        bra             dispatcher
    601501
    602502;
    603 ;  割込み(CPU例外)へのタスクディスパッチャ出口
    604 ;
    605 ;  呼び出し条件:
    606 ;       ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチャモード(ファイルヘッダ参ç
    607 §)
    608 ;
    609 ;  ここでは, タスク例外ハンドラ呼出しと, 割込み(CPU例外)処理モードへの
    610 ;  変更と, コンテキストの復帰を行い, 割込み(CUP例外)発生å
    611 ƒã¸æˆ»ã‚‹.
    612 ;
    613 __kernel_break_wait:                                    ;タスクモニタ用ラベル
     503;  割込み(CPU例外)へのタスクディスパッチャ出口
     504;
     505;  呼び出し条件:
     506;       ・ディスパッチャモード(ファイルヘッダ参照)
     507;
     508;  ここでは, タスク例外ハンドラ呼出しと, 割込み(CPU例外)処理モードへの
     509;  変更と, コンテキストの復帰を行い, 割込み(CUP例外)発生元へ戻る.
     510;
     511__kernel_break_wait:                                    ;タスクモニタ用ラベル
    614512ret_int_r:
    615         popm    r6-r13                                          ; 非スクラッチレジスタ復帰
     513        popm    r6-r13                                          ; 非スクラッチレジスタ復帰
    616514ret_int_r_call_tex:
    617515#ifdef TOPPERS_SUPPORT_OVRHDR /* 6.6.1 & 6.7.1 */
     
    622520ret_int_r_rte:
    623521#if     TIPM_LOCK != -15
    624         clrpsw  i                                                       ; å
    625 ¨å‰²è¾¼ã¿ç¦æ­¢
    626         mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状æ
    627 ‹ã¸
     522        clrpsw  i                                                       ; 全割込み禁止
     523        mov.l   #__kernel_lock_flag, r5         ; CPUロック解除状態へ
    628524        mov.l   #0, [r5]
    629525#endif
    630         popm    r4-r5                                           ; アキュムレータ復帰
    631         mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
     526        popm    r4-r5                                           ; アキュムレータ復帰
     527        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    632528        mvtachi r4
    633         popc    fpsw                                            ; FPUステータスレジスタ復帰
    634         popm    r14-r15                                         ; レジスタ復帰
     529        popc    fpsw                                            ; FPUステータスレジスタ復帰
     530        popm    r14-r15                                         ; レジスタ復帰
    635531        popm    r1-r5
    636         rte                                                                     ; 割込み前の処理に戻る
    637 
    638 
    639 ;
    640 ;  割込みの出å
    641 ¥å£å‡¦ç†(アセンブリ言語記述部分)
    642 ;
    643 ;  呼出し条件:
    644 ;  ・割込み発生時のH/W処理により, PSWレジスタのIビット=0, IPLは受付け
    645 ;    た割込みのIPL.
    646 ;  ・スタックは多重割り込みなら割込みスタック, そうでなければ
    647 ;    タスクスタック
    648 ;  ・割込み発生時のH/W処理により,スタックに割込みからの復帰PCとPSWが
    649 ;    保存されている.
    650 ;  ・ベクタテーブルに登録された個別のå
    651 ¥ã‚Šå£å‡¦ç†ã«ã‚ˆã‚Š, スタックに
    652 ;    スクラッチレジスタ(R1-R5)が保存されている.
    653 ;
    654 ;  引数:
    655 ;  ・r1:割込み要因番号
    656 ;  ・r2:割込みハンドラのアドレス
    657 ;
    658 ;  レジスタがスタック上にどのように保存されているかを以下に示す.
    659 ;  この図では上が低位, 下が高位のアドレスで, スタックは下から
    660 ;  上方向に向かって積み上げられるものとする.
     532        rte                                                                     ; 割込み前の処理に戻る
     533
     534
     535;
     536;  割込みの出入口処理(アセンブリ言語記述部分)
     537;
     538;  呼出し条件:
     539;  ・割込み発生時のH/W処理により, PSWレジスタのIビット=0, IPLは受付け
     540;    た割込みのIPL.
     541;  ・スタックは多重割り込みなら割込みスタック, そうでなければ
     542;    タスクスタック
     543;  ・割込み発生時のH/W処理により,スタックに割込みからの復帰PCとPSWが
     544;    保存されている.
     545;  ・ベクタテーブルに登録された個別の入り口処理により, スタックに
     546;    スクラッチレジスタ(R1-R5)が保存されている.
     547;
     548;  引数:
     549;  ・r1:割込み要因番号
     550;  ・r2:割込みハンドラのアドレス
     551;
     552;  レジスタがスタック上にどのように保存されているかを以下に示す.
     553;  この図では上が低位, 下が高位のアドレスで, スタックは下から
     554;  上方向に向かって積み上げられるものとする.
    661555;
    662556;       -------------------------
     
    686580;       -------------------------(SP + 44)
    687581;
    688 ;  ここでは, 割込み処理モードに変更してハンドラを実行する.
    689 ;
    690 ;  ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
    691 ;  TRUE になった時に,ret_int へ分岐(é
    692 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチ)する.
    693 ;
    694 ;  多重割込みかどうかは割込みネストカウンタの値で判定する.
    695 ;  intnest != 0 ならば多重割込みであると判定する.
    696 ;
    697 ;  reqflg はCPUロック状æ
    698 ‹ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹. そうでないと,
    699 ;  reqflg チェック後に起動された割込みハンドラå†
    700 ã§
    701 ;  ディスパッチが要求された場合に,ディスパッチされない.
     582;  ここでは, 割込み処理モードに変更してハンドラを実行する.
     583;
     584;  ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
     585;  TRUE になった時に,ret_int へ分岐(遅延ディスパッチ)する.
     586;
     587;  多重割込みかどうかは割込みネストカウンタの値で判定する.
     588;  intnest != 0 ならば多重割込みであると判定する.
     589;
     590;  reqflg はCPUロック状態でチェックする. そうでないと,
     591;  reqflg チェック後に起動された割込みハンドラ内で
     592;  ディスパッチが要求された場合に,ディスパッチされない.
    702593;
    703594_kernel_interrupt:
    704         pushm   r14-r15                                         ; スクラッチレジスタを退避
    705         pushc   fpsw                                            ; FPUステータスレジスタ退避
     595        pushm   r14-r15                                         ; スクラッチレジスタを退避
     596        pushc   fpsw                                            ; FPUステータスレジスタ退避
    706597        mvfacmi r5
    707         shll    #16, r5                                         ; ACC最下位16bitは0とする
     598        shll    #16, r5                                         ; ACC最下位16bitは0とする
    708599        mvfachi r4
    709         pushm   r4-r5                                           ; アキュムレータ退避
     600        pushm   r4-r5                                           ; アキュムレータ退避
    710601        mov.l   #__kernel_intnest, r5
    711602        mov.w   [r5], r4
    712         add             #1, r4                                          ; ネスト回数をインクリメント
     603        add             #1, r4                                          ; ネスト回数をインクリメント
    713604        mov.w   r4, [r5]
    714         cmp             #1, r4                                          ; 多重割り込みかどうか
    715         bnz             interrupt_from_int                      ; 加算前が0でなければ多重割込み
    716                                                 ; 初段の割込み
     605        cmp             #1, r4                                          ; 多重割り込みかどうか
     606        bnz             interrupt_from_int                      ; 加算前が0でなければ多重割込み
     607                                                ; 初段の割込み
    717608#ifdef TOPPERS_SUPPORT_OVRHDR /* 6.6.1 */
    718609        pushm   r1-r5
    719         bsr             __kernel_ovrtimer_stop          ; r1に割込み番号
     610        bsr             __kernel_ovrtimer_stop          ; r1に割込み番号
    720611        popm    r1-r5
    721612#endif /* TOPPERS_SUPPORT_OVRHDR */
    722         mov.l   r0, r3                                          ; スタックポインタを取り出し
    723         mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
     613        mov.l   r0, r3                                          ; スタックポインタを取り出し
     614        mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
    724615        mov.l   [r5], r0
    725         push.l  r3                                                      ; タスクスタックを保持
    726 interrupt_from_int:             ; 多重割込み
    727         setpsw  i                                                       ; 割込み許可(CPUロック解除状æ
    728 ‹)
     616        push.l  r3                                                      ; タスクスタックを保持
     617interrupt_from_int:             ; 多重割込み
     618        setpsw  i                                                       ; 割込み許可(CPUロック解除状態)
    729619
    730620.if     LOG_INH_LEAVE == 1
    731         push.l  r1                                                      ; ログトレースの引数を保持
     621        push.l  r1                                                      ; ログトレースの引数を保持
    732622.endif
    733623
    734624.if     LOG_INH_ENTER == 1
    735625        push.l  r2
    736         bsr             __kernel_log_inh_enter          ; ログトレース関数の呼出し
    737                                                         ; 引数の割込み要因番号は既にr1にå
    738 ¥ã£ã¦ã„ã‚‹
     626        bsr             __kernel_log_inh_enter          ; ログトレース関数の呼出し
     627                                                        ; 引数の割込み要因番号は既にr1に入っている
    739628        pop             r2
    740629.endif
    741630
    742         jsr     r2                                                      ; Cルーチン呼び出し
     631        jsr     r2                                                      ; Cルーチン呼び出し
    743632
    744633.if     LOG_INH_LEAVE == 1
    745         pop             r1                                                      ; 引数に割込み要因番号を設定
    746         bsr             __kernel_log_inh_leave          ; ログトレース関数の呼出し
     634        pop             r1                                                      ; 引数に割込み要因番号を設定
     635        bsr             __kernel_log_inh_leave          ; ログトレース関数の呼出し
    747636.endif
    748637
    749         clrpsw  i                                                       ; 割込み禁止(CPUロック状æ
    750 ‹)
     638        clrpsw  i                                                       ; 割込み禁止(CPUロック状態)
    751639        mov.l   #__kernel_intnest, r5
    752640        mov.w   [r5], r4
    753         sub             #1, r4                                          ; ネスト回数をデクリメント
     641        sub             #1, r4                                          ; ネスト回数をデクリメント
    754642        mov.w   r4, [r5]
    755         cmp             #0, r4                                          ; 多重割り込みかどうか
    756         bnz             interrupt_return                        ; 多重割り込みならリターン
    757         ; 初段の割込み
    758         pop             r0                                                      ; タスクのスタックに戻す
     643        cmp             #0, r4                                          ; 多重割り込みかどうか
     644        bnz             interrupt_return                        ; 多重割り込みならリターン
     645        ; 初段の割込み
     646        pop             r0                                                      ; タスクのスタックに戻す
    759647        mov.l   #__kernel_p_schedtsk, r4
    760648        mov.l   [r4], r4                                        ; p_schedtsk -> r4
    761649        mov.l   #__kernel_p_runtsk, r5
    762650        mov.l   [r5], r5                                        ; p_runtsk -> r5
    763         cmp             r4, r5                                          ; p_schedtsk と p_runtsk が異なりディスパッチ要求有りなら
    764         bne             ret_int                                         ; ret_int へジャンプ
     651        cmp             r4, r5                                          ; p_schedtsk と p_runtsk が異なりディスパッチ要求有りなら
     652        bne             ret_int                                         ; ret_int へジャンプ
    765653#ifdef TOPPERS_SUPPORT_OVRHDR /* 6.6.1 */
    766654        mov.l   #__kernel_p_runtsk, r5
     
    771659#endif /* TOPPERS_SUPPORT_OVRHDR */
    772660interrupt_return:
    773         popm    r4-r5                                           ; アキュムレータ復帰
    774         mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
     661        popm    r4-r5                                           ; アキュムレータ復帰
     662        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    775663        mvtachi r4
    776         popc    fpsw                                            ; FPUステータスレジスタ復帰
    777         popm    r14-r15                                         ; レジスタ復帰
     664        popc    fpsw                                            ; FPUステータスレジスタ復帰
     665        popm    r14-r15                                         ; レジスタ復帰
    778666        popm    r1-r5
    779         rte                                                                     ; 割込み前の処理に戻る
    780 
    781 
    782 ;
    783 ;  CPU例外の出å
    784 ¥å£å‡¦ç†(アセンブリ言語記述部分)
    785 ;
    786 ;  呼出し条件:
    787 ;  ・CPU例外発生時のH/W処理により, PSWレジスタのIビット=0, IPL=0.
    788 ;  ・スタックは多重割り込みなら割込みスタック, そうでなければ
    789 ;    タスクスタック
    790 ;  ・CPU例外発生時のH/W処理により,スタックにCPU例外からの復帰PCと
    791 ;    PSWが保存されている.
    792 ;  ・ベクタテーブルに登録された個別のå
    793 ¥ã‚Šå£å‡¦ç†ã«ã‚ˆã‚Š, スタックに
    794 ;    スクラッチレジスタ(R1-R5)が保存されている.
    795 ;
    796 ;  引数:
    797 ;  ・r1:CPU例外要因番号
    798 ;  ・r2:CPU例外ハンドラのアドレス
    799 ;
    800 ;  レジスタがスタック上にどのように保存されているかを以下に示す.
    801 ;  この図では上が低位, 下が高位のアドレスで, スタックは下から
    802 ;  上方向に向かって積み上げられるものとする.
    803 ;  なお, CPU例外要因番号とR6-R13はCPU例外ハンドラå†
    804 ã§æƒ
    805 å ±ã‚’取得
    806 ;  する目的で退避しており, 出口処理では保存å†
    807 å®¹ã‚’破棄すればよい.
     667        rte                                                                     ; 割込み前の処理に戻る
     668
     669
     670;
     671;  CPU例外の出入口処理(アセンブリ言語記述部分)
     672;
     673;  呼出し条件:
     674;  ・CPU例外発生時のH/W処理により, PSWレジスタのIビット=0, IPL=0.
     675;  ・スタックは多重割り込みなら割込みスタック, そうでなければ
     676;    タスクスタック
     677;  ・CPU例外発生時のH/W処理により,スタックにCPU例外からの復帰PCと
     678;    PSWが保存されている.
     679;  ・ベクタテーブルに登録された個別の入り口処理により, スタックに
     680;    スクラッチレジスタ(R1-R5)が保存されている.
     681;
     682;  引数:
     683;  ・r1:CPU例外要因番号
     684;  ・r2:CPU例外ハンドラのアドレス
     685;
     686;  レジスタがスタック上にどのように保存されているかを以下に示す.
     687;  この図では上が低位, 下が高位のアドレスで, スタックは下から
     688;  上方向に向かって積み上げられるものとする.
     689;  なお, CPU例外要因番号とR6-R13はCPU例外ハンドラ内で情報を取得
     690;  する目的で退避しており, 出口処理では保存内容を破棄すればよい.
    808691;
    809692;       -------------------------
    810 ;       |    CPU例外要因番号    | <----- p_excinf
     693;       |    CPU例外要因番号    | <----- p_excinf
    811694;       ------------------------- (intptr_t)(p_excinf + 0)
    812695;       |       R6(4byte)       |
     
    851734;       ------------------------- (intptr_t)(p_excinf + 80)
    852735;
    853 ;  ここでは, 割込み処理モードに変更してハンドラを実行する.
    854 ;  CPU例外ハンドラに渡すVP型の変数 p_excinf としてISPの値渡す.
    855 ;
    856 ;  ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
    857 ;  TRUE になった時に,ret_int へ分岐(é
    858 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチ)する.
    859 ;
    860 ;  多重割込みかどうかは割込みネストカウンタの値で判定する.
    861 ;  intnest != 0 ならば多重割込みであると判定する.
    862 ;
    863 ;  reqflg はCPUロック状æ
    864 ‹ã§ãƒã‚§ãƒƒã‚¯ã™ã‚‹. そうでないと,
    865 ;  reqflg チェック後に起動された割込みハンドラå†
    866 ã§
    867 ;  ディスパッチが要求された場合に,ディスパッチされない.
    868 ;
    869 ;
    870 ;  CPU例外å
    871 ¥å£å‡¦ç†
    872 ;
    873 ;  ここでは, 割込み処理モードに変更してハンドラを実行する.
    874 ;
    875 
    876 ;
    877 ;  CPU例外ハンドラ呼出し後に不要となるスタックæƒ
    878 å ±ã®ã‚µã‚¤ã‚º
     736;  ここでは, 割込み処理モードに変更してハンドラを実行する.
     737;  CPU例外ハンドラに渡すVP型の変数 p_excinf としてISPの値渡す.
     738;
     739;  ハンドラからリターンした後は, 多重割込みでなく, かつ reqflg が
     740;  TRUE になった時に,ret_int へ分岐(遅延ディスパッチ)する.
     741;
     742;  多重割込みかどうかは割込みネストカウンタの値で判定する.
     743;  intnest != 0 ならば多重割込みであると判定する.
     744;
     745;  reqflg はCPUロック状態でチェックする. そうでないと,
     746;  reqflg チェック後に起動された割込みハンドラ内で
     747;  ディスパッチが要求された場合に,ディスパッチされない.
     748;
     749;
     750;  CPU例外入口処理
     751;
     752;  ここでは, 割込み処理モードに変更してハンドラを実行する.
     753;
     754
     755;
     756;  CPU例外ハンドラ呼出し後に不要となるスタック情報のサイズ
    879757;  EXCNO + R6--R13
    880758;
     
    882760
    883761_kernel_exception:
    884         pushm   r14-r15                                         ; スクラッチレジスタを退避
     762        pushm   r14-r15                                         ; スクラッチレジスタを退避
    885763        pushc   fpsw
    886764        mvfacmi r5
    887         shll    #16, r5                                         ; ACC最下位16bitは0とする
     765        shll    #16, r5                                         ; ACC最下位16bitは0とする
    888766        mvfachi r4
    889         pushm   r4-r5                                           ; アキュムレータ退避
    890         pushm   r6-r13                                          ; 非スクラッチレジスタ保存
    891         push.l  r1                                                      ; CPU例外要因番号を保持
    892         mov.l   r0, r3                                          ; スタックポインタを取り出し
     767        pushm   r4-r5                                           ; アキュムレータ退避
     768        pushm   r6-r13                                          ; 非スクラッチレジスタ保存
     769        push.l  r1                                                      ; CPU例外要因番号を保持
     770        mov.l   r0, r3                                          ; スタックポインタを取り出し
    893771        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    894772        and             #PSW_I_MASK, r5
    895         bz              exception_nonkernel                     ; å
    896 ¨å‰²è¾¼ã¿ç¦æ­¢(CPUロック)状æ
    897 ‹ãªã‚‰ç®¡ç†å¤–
     773        bz              exception_nonkernel                     ; 全割込み禁止(CPUロック)状態なら管理外
    898774#if     TIPM_LOCK != -15
    899775        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    900776        and             #PSW_IPL_MASK, r5
    901777        cmp             #IPL_LOCK, r5
    902         bgt     exception_nonkernel                     ; IPLがCPUロックレベル以上なら管理外
     778        bgt     exception_nonkernel                     ; IPLがCPUロックレベル以上なら管理外
    903779#endif
    904780        mov.l   #__kernel_intnest, r5
    905781        mov.w   [r5], r4
    906         add             #1, r4                                          ; ネスト回数をインクリメント
     782        add             #1, r4                                          ; ネスト回数をインクリメント
    907783        mov.w   r4, [r5]
    908         cmp             #1, r4                                          ; 多重割り込みかどうか
    909         bnz             exception_from_int                      ; 加算前が0でなければ多重割込み
    910                                                 ; 初段の割込み
     784        cmp             #1, r4                                          ; 多重割り込みかどうか
     785        bnz             exception_from_int                      ; 加算前が0でなければ多重割込み
     786                                                ; 初段の割込み
    911787#ifdef TOPPERS_SUPPORT_OVRHDR /* 6.7.1 */
    912788        pushm   r1-r5
    913         mov.l   #255, r1                                        ; r1にダミー割込み番号
     789        mov.l   #255, r1                                        ; r1にダミー割込み番号
    914790        bsr             __kernel_ovrtimer_stop
    915791        popm    r1-r5
    916792#endif /* TOPPERS_SUPPORT_OVRHDR */
    917         mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
     793        mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
    918794        mov.l   [r5], r0
    919         push.l  r3                                                      ; タスクスタックを保持
    920 exception_from_int:             ; 多重割込み
     795        push.l  r3                                                      ; タスクスタックを保持
     796exception_from_int:             ; 多重割込み
    921797        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    922         mvtc    r5, psw                                         ; CPU例外発生前の状æ
    923 ‹ã«æˆ»ã™
     798        mvtc    r5, psw                                         ; CPU例外発生前の状態に戻す
    924799#if     LOG_EXC_LEAVE == 1
    925         push.l  r1                                                      ; ログトレースの引数を保持
     800        push.l  r1                                                      ; ログトレースの引数を保持
    926801#endif
    927802
    928803#if     LOG_EXC_ENTER == 1
    929804        pushm   r2-r3
    930         bsr             __kernel_log_exc_enter          ; ログトレース関数の呼出し
    931                                                         ; 引数の割込み要因番号は既にr1にå
    932 ¥ã£ã¦ã„ã‚‹
     805        bsr             __kernel_log_exc_enter          ; ログトレース関数の呼出し
     806                                                        ; 引数の割込み要因番号は既にr1に入っている
    933807        popm    r2-r3
    934808#endif
    935809
    936         mov.l   r3, r1                                          ; 引数のp_excinfを設定
    937         jsr     r2                                                      ; Cルーチン呼び出し
     810        mov.l   r3, r1                                          ; 引数のp_excinfを設定
     811        jsr     r2                                                      ; Cルーチン呼び出し
    938812
    939813.if     LOG_EXC_LEAVE == 1
    940         pop             r1                                                      ; 引数に割込み要因番号を設定
    941         bsr             __kernel_log_exc_leave          ; ログトレース関数の呼出し
     814        pop             r1                                                      ; 引数に割込み要因番号を設定
     815        bsr             __kernel_log_exc_leave          ; ログトレース関数の呼出し
    942816.endif
    943817
    944         clrpsw  i                                                       ; ここからはå¿
    945 ãšå‰²è¾¼ã¿ç¦æ­¢
     818        clrpsw  i                                                       ; ここからは必ず割込み禁止
    946819        mov.l   #__kernel_intnest, r5
    947820        mov.w   [r5], r4
    948         sub             #1, r4                                          ; ネスト回数をデクリメント
     821        sub             #1, r4                                          ; ネスト回数をデクリメント
    949822        mov.w   r4, [r5]
    950         cmp             #0, r4                                          ; 多重割り込みかどうか
    951         bnz             exception_return                        ; 多重割り込みならリターン
    952         ; 初段の割込み
    953         pop             r0                                                      ; タスクのスタックに戻す
     823        cmp             #0, r4                                          ; 多重割り込みかどうか
     824        bnz             exception_return                        ; 多重割り込みならリターン
     825        ; 初段の割込み
     826        pop             r0                                                      ; タスクのスタックに戻す
    954827        mov.l   #__kernel_p_schedtsk, r4
    955828        mov.l   [r4], r4                                        ; p_schedtsk -> r4
    956829        mov.l   #__kernel_p_runtsk, r5
    957830        mov.l   [r5], r5                                        ; p_runtsk -> r5
    958         cmp             r4, r5                                          ; p_schedtsk と p_runtsk が同じでディスパッチ要求無しか
     831        cmp             r4, r5                                          ; p_schedtsk と p_runtsk が同じでディスパッチ要求無しか
    959832#ifndef TOPPERS_SUPPORT_OVRHDR /* 6.7.1 */
    960         beq             exception_return                        ; なければリターン
    961         add             #EXCINF_REG_SIZE, r0            ; CPU例外æƒ
    962 å ±ã®ç ´æ£„
    963         bra             ret_int                                         ; あれば ret_int へジャンプ
     833        beq             exception_return                        ; なければリターン
     834        add             #EXCINF_REG_SIZE, r0            ; CPU例外情報の破棄
     835        bra             ret_int                                         ; あれば ret_int へジャンプ
    964836#else /* TOPPERS_SUPPORT_OVRHDR */
    965         beq             exception_return_ovr            ; なければリターン
    966         add             #EXCINF_REG_SIZE, r0            ; CPU例外æƒ
    967 å ±ã®ç ´æ£„
    968         bra             ret_int                                         ; あれば ret_int へジャンプ
     837        beq             exception_return_ovr            ; なければリターン
     838        add             #EXCINF_REG_SIZE, r0            ; CPU例外情報の破棄
     839        bra             ret_int                                         ; あれば ret_int へジャンプ
    969840exception_return_ovr:
    970841        mov.l   #__kernel_p_runtsk, r5
     
    979850        mov.l   #__kernel_intnest, r5
    980851        mov.w   [r5], r4
    981         add             #1, r4                                          ; ネスト回数をインクリメント
     852        add             #1, r4                                          ; ネスト回数をインクリメント
    982853        mov.w   r4, [r5]
    983         cmp             #1, r4                                          ; 多重割り込みかどうか
    984         bnz             exception_from_nonkernelint     ; 加算前が0でなければ多重割込み
    985                                                 ; 初段の割込み
    986         mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
     854        cmp             #1, r4                                          ; 多重割り込みかどうか
     855        bnz             exception_from_nonkernelint     ; 加算前が0でなければ多重割込み
     856                                                ; 初段の割込み
     857        mov.l   #__kernel_istkpt, r5            ; 割込み用のスタックへ切替える
    987858        mov.l   [r5], r0
    988         push.l  r3                                                      ; タスクスタックを保持
    989 exception_from_nonkernelint:    ; 多重割込み
     859        push.l  r3                                                      ; タスクスタックを保持
     860exception_from_nonkernelint:    ; 多重割込み
    990861        mov.l   EXC_GET_PSW_OFFSET[r3], r5
    991         mvtc    r5, psw                                         ; CPU例外発生前の状æ
    992 ‹ã«æˆ»ã™
    993 
    994         mov.l   r3, r1                                          ; 引数のp_excinfを設定
    995         jsr     r2                                                      ; Cルーチン呼び出し
    996 
    997         clrpsw  i                                                       ; ここからはå¿
    998 ãšå‰²è¾¼ã¿ç¦æ­¢
     862        mvtc    r5, psw                                         ; CPU例外発生前の状態に戻す
     863
     864        mov.l   r3, r1                                          ; 引数のp_excinfを設定
     865        jsr     r2                                                      ; Cルーチン呼び出し
     866
     867        clrpsw  i                                                       ; ここからは必ず割込み禁止
    999868        mov.l   #__kernel_intnest, r5
    1000869        mov.w   [r5], r4
    1001         sub             #1, r4                                          ; ネスト回数をデクリメント
     870        sub             #1, r4                                          ; ネスト回数をデクリメント
    1002871        mov.w   r4, [r5]
    1003         cmp             #0, r4                                          ; 多重割り込みかどうか
    1004         bnz             exception_return                        ; 多重割り込みならリターン
    1005         ; 初段の割込み
    1006         pop             r0                                                      ; タスクのスタックに戻す
     872        cmp             #0, r4                                          ; 多重割り込みかどうか
     873        bnz             exception_return                        ; 多重割り込みならリターン
     874        ; 初段の割込み
     875        pop             r0                                                      ; タスクのスタックに戻す
    1007876
    1008877exception_return:
    1009         add             #EXCINF_REG_SIZE, r0            ; CPU例外æƒ
    1010 å ±ã®ç ´æ£„
    1011         popm    r4-r5                                           ; アキュムレータ復帰
    1012         mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
     878        add             #EXCINF_REG_SIZE, r0            ; CPU例外情報の破棄
     879        popm    r4-r5                                           ; アキュムレータ復帰
     880        mvtaclo r5                                                      ; ACC最下位16bitは0で復帰
    1013881        mvtachi r4
    1014         popc    fpsw                                            ; FPUステータスレジスタ復帰
    1015         popm    r14-r15                                         ; レジスタ復帰
     882        popc    fpsw                                            ; FPUステータスレジスタ復帰
     883        popm    r14-r15                                         ; レジスタ復帰
    1016884        popm    r1-r5
    1017         rte                                                                     ; 割込み前の処理に戻る
    1018 
    1019 
    1020 ;
    1021 ;  微少時間å¾
    1022 ã¡
     885        rte                                                                     ; 割込み前の処理に戻る
     886
     887
     888;
     889;  微少時間待ち
    1023890;
    1024891_sil_dly_nse:
Note: See TracChangeset for help on using the changeset viewer.