Ignore:
Timestamp:
Aug 23, 2017, 9:27:43 AM (7 years ago)
Author:
coas-nagasima
Message:

文字コードを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_support.S

    • Property svn:keywords deleted
    • Property svn:mime-type changed from text/plain to text/plain;charset=UTF-8
    r279 r321  
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
    11  *  上記著作権è€
    12 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    13  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
    14  *  変・再é
    15 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    16  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    17  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
    18  *      スコード中に含まれていること.
    19  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    20  *      用できる形で再é
    21 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    22 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    23  *      è€
    24 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    25  *      の無保証規定を掲載すること.
    26  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    27  *      用できない形で再é
    28 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    29  *      と.
    30  *    (a) 再é
    31 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    32 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    33  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
    34  *    (b) 再é
    35 å¸ƒã®å½¢æ
    36 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    37  *        報告すること.
    38  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    39  *      害からも,上記著作権è€
    40 ãŠã‚ˆã³TOPPERSプロジェクトをå
    41 è²¬ã™ã‚‹ã“と.
    42  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
    43  *      由に基づく請求からも,上記著作権è€
    44 ãŠã‚ˆã³TOPPERSプロジェクトを
    45  *      å
    46 è²¬ã™ã‚‹ã“と.
     11 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     12 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     13 *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     14 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     15 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     16 *      スコード中に含まれていること.
     17 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     18 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     19 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     20 *      の無保証規定を掲載すること.
     21 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     22 *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     23 *      と.
     24 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     25 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     26 *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     27 *        報告すること.
     28 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     29 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     30 *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     31 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     32 *      免責すること.
    4733 *
    48  *  本ソフトウェアは,無保証で提供されているものである.上記著作権è€
    49 ãŠ
    50  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    51  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
    52  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    53  *  の責任を負わない.
     34 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     35 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     36 *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     37 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     38 *  の責任を負わない.
    5439 *
    5540 *  $Id$
     
    5742
    5843/*
    59  *              カーネルのコア依存部のアセンブリ言語部(ARM用)
     44 *              カーネルのコア依存部のアセンブリ言語部(ARM用)
    6045 */
    6146
    6247#define TOPPERS_MACRO_ONLY
    6348#define TOPPERS_ASM_MACRO
    64 #define UINT_C(val)                     (val)           /* uint_t型の定数を作るマクロ */
    65 #define ULONG_C(val)            (val)           /* ulong_t型の定数を作るマクロ */
    66 #define CAST(type, val)         (val)           /* 型キャストを行うマクロ */
     49#define UINT_C(val)                     (val)           /* uint_t型の定数を作るマクロ */
     50#define ULONG_C(val)            (val)           /* ulong_t型の定数を作るマクロ */
     51#define CAST(type, val)         (val)           /* 型キャストを行うマクロ */
    6752#include "kernel_impl.h"
    6853#include "offset.h"
     
    7055
    7156/*
    72  *  例外ベクタ
     57 *  例外ベクタ
    7358 */
    7459        ASECTION(.vector)
     
    7661        AGLOBAL(vector_table)
    7762ALABEL(vector_table)
    78         ldr             pc, reset_vector                /* リセット */
    79         ldr             pc, undef_vector                /* 未定義命令 */
    80         ldr             pc, svc_vector                  /* ソフトウェア割込み */
    81         ldr             pc, pabort_vector               /* プリフェッチアボート */
    82         ldr             pc, dabort_vector               /* データアボート */
    83         ldr             pc, reset_vector                /* 未使用 */
     63        ldr             pc, reset_vector                /* リセット */
     64        ldr             pc, undef_vector                /* 未定義命令 */
     65        ldr             pc, svc_vector                  /* ソフトウェア割込み */
     66        ldr             pc, pabort_vector               /* プリフェッチアボート */
     67        ldr             pc, dabort_vector               /* データアボート */
     68        ldr             pc, reset_vector                /* 未使用 */
    8469        ldr             pc, irq_vector                  /* IRQ */
    8570        ldr             pc, fiq_vector                  /* FIQ */
    8671
    8772/*
    88  *  例外ベクタの命令から参ç
    89 §ã•ã‚Œã‚‹ã‚¸ãƒ£ãƒ³ãƒ—å
    90 ˆã‚¢ãƒ‰ãƒ¬ã‚¹
     73 *  例外ベクタの命令から参照されるジャンプ先アドレス
    9174 */
    9275        AGLOBAL(vector_ref_table)
     
    10891
    10992/*
    110  *  タスクディスパッチャ
     93 *  タスクディスパッチャ
    11194 */
    11295        ATEXT
     
    11598ALABEL(dispatch)
    11699        /*
    117          *  このルーチンは,タスクコンテキスト・CPUロック状æ
    118 ‹ãƒ»å‰²è¾¼ã¿å„ªå
    119 ˆåº¦
    120          *  マスクå
    121 ¨è§£é™¤çŠ¶æ
    122 ‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ
    123 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
    124          */
    125         push    {r12,lr}                                /* 戻り番地を保存,r12はダミー */
     100         *  このルーチンは,タスクコンテキスト・CPUロック状態・割込み優先度
     101         *  マスク全解除状態・ディスパッチ許可状態で呼び出される.
     102         */
     103        push    {r12,lr}                                /* 戻り番地を保存,r12はダミー */
    126104#ifdef TOPPERS_SUPPORT_OVRHDR
    127105        bl              ovrtimer_stop
    128106#endif /* TOPPERS_SUPPORT_OVRHDR */
    129         stmfd   sp!, {r4-r11}                   /* 非スクラッチレジスタの保存 */
    130         ldr             r0, =p_runtsk                   /* p_runtsk → r0 */
     107        stmfd   sp!, {r4-r11}                   /* 非スクラッチレジスタの保存 */
     108        ldr             r0, =p_runtsk                   /* p_runtsk r0 */
    131109        ldr             r0, [r0]
    132         str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
     110        str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
    133111        adr             r1, dispatch_r
    134         str             r1, [r0,#TCB_pc]                /* 実行再開番地を保存 */
    135         b               dispatcher                              /* r0にはp_runtskが格納されている */
     112        str             r1, [r0,#TCB_pc]                /* 実行再開番地を保存 */
     113        b               dispatcher                              /* r0にはp_runtskが格納されている */
    136114
    137115ALABEL(dispatch_r)
    138         ldmfd   sp!, {r4-r11}                   /* 非スクラッチレジスタの復帰 */
     116        ldmfd   sp!, {r4-r11}                   /* 非スクラッチレジスタの復帰 */
    139117#ifdef TOPPERS_SUPPORT_OVRHDR
    140118        bl              ovrtimer_start
    141119#endif /* TOPPERS_SUPPORT_OVRHDR */
    142         pop             {r12,lr}                                /* 戻り番地を復帰 */
     120        pop             {r12,lr}                                /* 戻り番地を復帰 */
    143121        bx              lr
    144122
    145123/*
    146  *  ディスパッチャの動作開始
     124 *  ディスパッチャの動作開始
    147125 */
    148126        AGLOBAL(start_dispatch)
    149127ALABEL(start_dispatch)
    150128        /*
    151          *  このルーチンは,カーネル起動時に,非タスクコンテキストで,NMIを
    152          *  除くすべての割込みを禁止した状æ
    153 ‹ï¼ˆå
    154 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    155 ‹ã¨åŒç­‰ï¼‰ã§
    156          *  呼び出される.
     129         *  このルーチンは,カーネル起動時に,非タスクコンテキストで,NMIを
     130         *  除くすべての割込みを禁止した状態(全割込みロック状態と同等)で
     131         *  呼び出される.
    157132         *
    158          *  dispatcher_0へ分岐する前に,タスクコンテキスト・CPUロック状æ
    159 ‹ãƒ»
    160          *  割込み優å
    161 ˆåº¦ãƒžã‚¹ã‚¯å
    162 ¨è§£é™¤çŠ¶æ
    163 ‹ã«ã—,使用するスタックを,IDが1のタ
    164          *  スクのスタック領域に切り換えなければならない.
    165          */
    166 
    167         /*
    168          *      タスクコンテキストに切り換える.
    169          */
    170         ldr             r2, =excpt_nest_count   /* 例外ネストカウントを0に */
     133         *  dispatcher_0へ分岐する前に,タスクコンテキスト・CPUロック状態・
     134         *  割込み優先度マスク全解除状態にし,使用するスタックを,IDが1のタ
     135         *  スクのスタック領域に切り換えなければならない.
     136         */
     137
     138        /*
     139         *      タスクコンテキストに切り換える.
     140         */
     141        ldr             r2, =excpt_nest_count   /* 例外ネストカウントを0に */
    171142        mov             r0, #0
    172143        str             r0, [r2]
    173144
    174145        /*
    175          *  IDが1のタスクのスタック領域に切り換える.
    176          */
    177         ldr             r0, =tcb_table                  /* tcb_table[0] → r0 */
    178         ldr             r2, [r0,#TCB_p_tinib]   /* tcb_table[0].p_tinib → r2 */
     146         *  IDが1のタスクのスタック領域に切り換える.
     147         */
     148        ldr             r0, =tcb_table                  /* tcb_table[0] r0 */
     149        ldr             r2, [r0,#TCB_p_tinib]   /* tcb_table[0].p_tinib r2 */
    179150        ldr             r0, [r2,#TINIB_stk]
    180151        ldr             r1, [r2,#TINIB_stksz]
     
    182153
    183154        /*
    184          *  CPUロック状æ
    185 ‹ã«ã—て,ディスパッチャ本体へ分岐する.
     155         *  CPUロック状態にして,ディスパッチャ本体へ分岐する.
    186156         */
    187157        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_CPULOCK)
     
    189159
    190160/*
    191  *  現在のコンテキストを捨ててディスパッチ
     161 *  現在のコンテキストを捨ててディスパッチ
    192162 */
    193163        AGLOBAL(exit_and_dispatch)
    194164ALABEL(exit_and_dispatch)
    195165        /*
    196          *  このルーチンは,タスクコンテキスト・CPUロック状æ
    197 ‹ãƒ»å‰²è¾¼ã¿å„ªå
    198 ˆåº¦
    199          *  マスクå
    200 ¨è§£é™¤çŠ¶æ
    201 ‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ
    202 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
     166         *  このルーチンは,タスクコンテキスト・CPUロック状態・割込み優先度
     167         *  マスク全解除状態・ディスパッチ許可状態で呼び出される.
    203168         */
    204169#ifdef LOG_DSP_ENTER
    205         ldr             r0, =p_runtsk                   /* p_runtsk → r0 */
     170        ldr             r0, =p_runtsk                   /* p_runtsk r0 */
    206171        ldr             r0, [r0]
    207172#endif /* LOG_DSP_ENTER */
    208         /* ディスパッチャ本体(dispatcher)へ */
    209 
    210 /*
    211  *  ディスパッチャ本体
     173        /* ディスパッチャ本体(dispatcher)へ */
     174
     175/*
     176 *  ディスパッチャ本体
    212177 */
    213178ALABEL(dispatcher)
    214179#ifdef LOG_DSP_ENTER
    215180        /*
    216          * 【この時点のレジスタ状æ
    217 ‹ã€‘
    218          *  r0:p_runtsk(タスク切換え前)
     181         * 【この時点のレジスタ状態】
     182         *  r0:p_runtsk(タスク切換え前)
    219183         */
    220184        bl              log_dsp_enter
     
    223187ALABEL(dispatcher_0)
    224188        /*
    225          *  このルーチンは,タスクコンテキスト・CPUロック状æ
    226 ‹ãƒ»å‰²è¾¼ã¿å„ªå
    227 ˆåº¦
    228          *  マスクå
    229 ¨è§£é™¤çŠ¶æ
    230 ‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ
    231 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žå®Ÿè¡Œå†é–‹ç•ª
    232          *  地へもこの状æ
    233 ‹ã®ã¾ã¾åˆ†å²ã™ã‚‹ï¼Ž
    234          */
    235         ldr             r0, =p_schedtsk         /* p_schedtsk → r4 → p_runtsk */
     189         *  このルーチンは,タスクコンテキスト・CPUロック状態・割込み優先度
     190         *  マスク全解除状態・ディスパッチ許可状態で呼び出される.実行再開番
     191         *  地へもこの状態のまま分岐する.
     192         */
     193        ldr             r0, =p_schedtsk         /* p_schedtsk → r4 → p_runtsk */
    236194        ldr             r4, [r0]
    237195        ldr             r1, =p_runtsk
    238196        str             r4, [r1]
    239         tst             r4, r4                          /* p_runtskがNULLならdispatcher_1へ */
     197        tst             r4, r4                          /* p_runtskがNULLならdispatcher_1へ */
    240198        beq             dispatcher_1
    241         ldr             sp, [r4,#TCB_sp]        /* タスクスタックを復帰 */
     199        ldr             sp, [r4,#TCB_sp]        /* タスクスタックを復帰 */
    242200#ifdef LOG_DSP_LEAVE
    243         mov             r0, r4                          /* p_runtskをパラメータに渡す */
     201        mov             r0, r4                          /* p_runtskをパラメータに渡す */
    244202        bl              log_dsp_leave
    245203#endif /* LOG_DSP_LEAVE */
    246         ldr             r0, [r4,#TCB_pc]        /* 実行再開番地を復帰 */
    247         bx              r0                                      /* p_runtskをr4にå
    248 ¥ã‚ŒãŸçŠ¶æ
    249 ‹ã§åˆ†å²ã™ã‚‹ */
    250 
    251         /*
    252          *  アイドル処理
     204        ldr             r0, [r4,#TCB_pc]        /* 実行再開番地を復帰 */
     205        bx              r0                                      /* p_runtskをr4に入れた状態で分岐する */
     206
     207        /*
     208         *  アイドル処理
    253209         *
    254          *  割込みをすべて許可し,CPUロック解除状æ
    255 ‹ã«ã—て割込みをå¾
    256 ã¤ï¼Ž
     210         *  割込みをすべて許可し,CPUロック解除状態にして割込みを待つ.
    257211         *
    258          *  ターゲットによっては,省電力モード等に移行するため,標準の方法
    259          *  と異なる手順がå¿
    260 è¦ãªå ´åˆãŒã‚る.そのようなターゲットでは,ター
    261          *  ゲット依存部でTOPPERS_CUSTOM_IDLEを定義し,アセンブラマクロとし
    262          *  て,toppers_asm_custom_idleを用意すればよい.
     212         *  ターゲットによっては,省電力モード等に移行するため,標準の方法
     213         *  と異なる手順が必要な場合がある.そのようなターゲットでは,ター
     214         *  ゲット依存部でTOPPERS_CUSTOM_IDLEを定義し,アセンブラマクロとし
     215         *  て,toppers_asm_custom_idleを用意すればよい.
    263216         */
    264217ALABEL(dispatcher_1)
     
    266219        toppers_asm_custom_idle
    267220#else /* TOPPERS_CUSTOM_IDLE */
    268         msr             cpsr_c, #CPSR_SVC_MODE  /* 割込みを許可(スーパバイザモード)*/
     221        msr             cpsr_c, #CPSR_SVC_MODE  /* 割込みを許可(スーパバイザモード)*/
    269222#endif /* TOPPERS_CUSTOM_IDLE */
    270         b               dispatcher_1                    /* 割込みå¾
    271 ã¡ */
    272 
    273 /*
    274  *  カーネルの終了処理の呼出し
     223        b               dispatcher_1                    /* 割込み待ち */
     224
     225/*
     226 *  カーネルの終了処理の呼出し
    275227 *
    276  *  割込みロック状æ
    277 ‹ã«ã—,使用するスタックを非タスクコンテキスト用のスタッ
    278  *  ク領域に切り替え,exit_kernelを呼び出す.
     228 *  割込みロック状態にし,使用するスタックを非タスクコンテキスト用のスタッ
     229 *  ク領域に切り替え,exit_kernelを呼び出す.
    279230 */
    280231        AGLOBAL(call_exit_kernel)
    281232ALABEL(call_exit_kernel)
    282233        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_INTLOCK)
    283         ldr             r0, =istkpt                             /* 非タスクコンテキストのスタックへ */
     234        ldr             r0, =istkpt                             /* 非タスクコンテキストのスタックへ */
    284235        ldr             sp, [r0]
    285236        b               exit_kernel
    286237
    287238/*
    288  *  タスクの実行開始時処理
     239 *  タスクの実行開始時処理
    289240 */
    290241        ATEXT
     
    292243        AGLOBAL(start_r)
    293244        /*
    294          *  ディスパッチャ本体から呼び出されるため,p_runtskはr4にå
    295 ¥ã£ã¦ã„る.
     245         *  ディスパッチャ本体から呼び出されるため,p_runtskはr4に入っている.
    296246         */
    297247ALABEL(start_r)
     
    300250#endif /* TOPPERS_SUPPORT_OVRHDR */
    301251        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_UNLOCK)
    302                                                                         /* CPUロック解除状æ
    303 ‹ã« */
    304         ldr             lr, =ext_tsk                    /* タスク本体からの戻り番地を設定 */
    305         ldr             r2, [r4,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
    306         ldr             r0, [r2,#TINIB_exinf]   /* exinfをパラメータに */
    307         ldr             r1, [r2,#TINIB_task]    /* タスク起動番地にジャンプ */
     252                                                                        /* CPUロック解除状態に */
     253        ldr             lr, =ext_tsk                    /* タスク本体からの戻り番地を設定 */
     254        ldr             r2, [r4,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
     255        ldr             r0, [r2,#TINIB_exinf]   /* exinfをパラメータに */
     256        ldr             r1, [r2,#TINIB_task]    /* タスク起動番地にジャンプ */
    308257        bx              r1
    309258
    310259/*
    311  *  割込みハンドラの出å
    312 ¥å£å‡¦ç†
     260 *  割込みハンドラの出入口処理
    313261 */
    314262#ifndef OMIT_IRQ_HANDLER
     
    318266ALABEL(irq_handler)
    319267        /*
    320          *  ここには,IRQモードで分岐してくる.
    321          */
    322 #if __TARGET_ARCH_ARM < 6
    323         /*
    324          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     268         *  ここには,IRQモードで分岐してくる.
     269         */
     270#if __TARGET_ARCH_ARM < 6
     271        /*
     272         *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
    325273         */
    326274        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_IRQ_BIT)
    327         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    328 
    329         /*
    330          *  IRQモードに戻して,戻り番地とspsr(戻りå
    331 ˆã®cpsr)を取得する.
     275        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
     276
     277        /*
     278         *  IRQモードに戻して,戻り番地とspsr(戻り先のcpsr)を取得する.
    332279         */
    333280        msr             cpsr_c, #(CPSR_IRQ_MODE AOR CPSR_IRQ_BIT)
     
    336283
    337284        /*
    338          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     285         *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
    339286         */
    340287        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_IRQ_BIT)
    341         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    342         push    {r1}                                    /* spsrをスタックに保存 */
    343 #else /* __TARGET_ARCH_ARM < 6 */
    344         /*
    345          *  戻りå
    346 ˆï¼ˆlr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    347          *  保存する.
    348          */
    349         sub             lr, lr, #4                              /* 戻り番地の算出 */
     288        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
     289        push    {r1}                                    /* spsrをスタックに保存 */
     290#else /* __TARGET_ARCH_ARM < 6 */
     291        /*
     292         *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
     293         *  保存する.
     294         */
     295        sub             lr, lr, #4                              /* 戻り番地の算出 */
    350296        srsfd   #CPSR_SVC_MODE!
    351297
    352298        /*
    353          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     299         *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
    354300         */
    355301        cps             #CPSR_SVC_MODE
     
    358304
    359305        /*
    360          *  スタックポインタの調整
     306         *  スタックポインタの調整
    361307         */
    362308        and             r1, sp, #4
    363309        sub             sp, sp, r1
    364         push    {r0,r1}                                 /* r0はスペース確保のため */
    365 
    366         /*
    367          *  例外ネストカウントをインクリメントする.割込みが非タスクコンテキ
    368          *  ストで発生した場合には,irq_handler_1へ分岐する.
     310        push    {r0,r1}                                 /* r0はスペース確保のため */
     311
     312        /*
     313         *  例外ネストカウントをインクリメントする.割込みが非タスクコンテキ
     314         *  ストで発生した場合には,irq_handler_1へ分岐する.
    369315         */
    370316        ldr             r2, =excpt_nest_count
     
    372318        add             r3, r3, #1
    373319        str             r3, [r2]
    374         teq             r3, #1                                  /* 割込みが非タスクコンテキストで発生 */
    375         bne             irq_handler_1                   /*                        ならirq_handler_1に分岐 */
     320        teq             r3, #1                                  /* 割込みが非タスクコンテキストで発生 */
     321        bne             irq_handler_1                   /*                        ならirq_handler_1に分岐 */
    376322
    377323#ifdef TOPPERS_SUPPORT_OVRHDR
    378324        /*
    379          *  オーバランタイマを停止する.
     325         *  オーバランタイマを停止する.
    380326         */
    381327        bl              ovrtimer_stop
     
    383329
    384330        /*
    385          *  非タスクコンテキスト用のスタックに切り換える.
    386          */
    387         mov             r3, sp                                  /* この時点のスタックポインタをr3に */
    388         ldr             r2, =istkpt                             /* 非タスクコンテキスト用のスタックに */
     331         *  非タスクコンテキスト用のスタックに切り換える.
     332         */
     333        mov             r3, sp                                  /* この時点のスタックポインタをr3に */
     334        ldr             r2, =istkpt                             /* 非タスクコンテキスト用のスタックに */
    389335        ldr             sp, [r2]
    390         push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
    391                                                                         /* r0はスペース確保のため */
     336        push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
     337                                                                        /* r0はスペース確保のため */
    392338ALABEL(irq_handler_1)
    393339        /*
    394          *  割込みコントローラを操作し,割込み番号を取得する.
     340         *  割込みコントローラを操作し,割込み番号を取得する.
    395341         */
    396342        bl              irc_begin_int
    397343#if TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6
    398         cmp             r4, #TNUM_INHNO                 /* TNUM_INHNOの値によってはエラーになる */
     344        cmp             r4, #TNUM_INHNO                 /* TNUM_INHNOの値によってはエラーになる */
    399345#else /* TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6 */
    400346        movw    r3, #TNUM_INHNO
    401347        cmp             r4, r3                 
    402348#endif /* TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6 */
    403         bhs             irq_handler_2                   /* スプリアス割込みなら */
    404                                                                         /*  irq_handler_2に分岐 */
    405         /*
    406          *  CPUロック解除状æ
    407 ‹ã«ã™ã‚‹ï¼Ž
     349        bhs             irq_handler_2                   /* スプリアス割込みなら */
     350                                                                        /*  irq_handler_2に分岐 */
     351        /*
     352         *  CPUロック解除状態にする.
    408353         */
    409354#if __TARGET_ARCH_ARM < 6
     
    419364#ifdef LOG_INH_ENTER
    420365        /*
    421          *  ログ出力の呼出し
    422          */
    423         mov             r0, r4                                  /* 割込み番号をパラメータに渡す */
     366         *  ログ出力の呼出し
     367         */
     368        mov             r0, r4                                  /* 割込み番号をパラメータに渡す */
    424369        bl              log_inh_enter
    425370#endif /* LOG_INH_ENTER */
    426371
    427372        /*
    428          *  割込みハンドラの呼出し
    429          */
    430         ldr             r2, =inh_table                  /* 割込みハンドラテーブルの読込み */
    431         ldr             r1, [r2,r4,lsl #2]              /* 割込みハンドラの番地 → r1 */
    432         mov             lr, pc                                  /* 割込みハンドラの呼出し */
     373         *  割込みハンドラの呼出し
     374         */
     375        ldr             r2, =inh_table                  /* 割込みハンドラテーブルの読込み */
     376        ldr             r1, [r2,r4,lsl #2]              /* 割込みハンドラの番地 → r1 */
     377        mov             lr, pc                                  /* 割込みハンドラの呼出し */
    433378        bx              r1
    434379
    435380#ifdef LOG_INH_LEAVE
    436381        /*
    437          *  ログ出力の呼出し
    438          */
    439         mov             r0, r4                                  /* 割込み番号をパラメータに渡す */
     382         *  ログ出力の呼出し
     383         */
     384        mov             r0, r4                                  /* 割込み番号をパラメータに渡す */
    440385        bl              log_inh_leave
    441386#endif /* LOG_INH_LEAVE */
    442387
    443388        /*
    444          *  カーネル管理の割込みを禁止する.
     389         *  カーネル管理の割込みを禁止する.
    445390         */
    446391#if __TARGET_ARCH_ARM < 6
     
    455400
    456401        /*
    457          *  割込みコントローラを操作する.
     402         *  割込みコントローラを操作する.
    458403         */
    459404ALABEL(irq_handler_2)
     
    461406
    462407        /*
    463          *  例外ネストカウントをデクリメントする.
     408         *  例外ネストカウントをデクリメントする.
    464409         */
    465410        ldr             r2, =excpt_nest_count
    466411        ldr             r3, [r2]
    467412        subs    r3, r3, #1
    468         str             r3, [r2]                                /* 戻りå
    469 ˆãŒéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãªã‚‰ */
    470         bne             irq_handler_5                   /*                              irq_handler_5に分岐 */
    471 
    472         /*
    473          *  タスク用のスタックに戻す.
     413        str             r3, [r2]                                /* 戻り先が非タスクコンテキストなら */
     414        bne             irq_handler_5                   /*                              irq_handler_5に分岐 */
     415
     416        /*
     417         *  タスク用のスタックに戻す.
    474418         */
    475419        pop             {r0,r3}
     
    477421
    478422        /*
    479          *  p_runtskがNULLか判定する.
    480          */
    481         ldr             r0, =p_runtsk                   /* p_runtsk → r0 */
     423         *  p_runtskがNULLか判定する.
     424         */
     425        ldr             r0, =p_runtsk                   /* p_runtsk r0 */
    482426        ldr             r0, [r0]
    483         tst             r0, r0                                  /* p_runtskがNULLでなければ */
    484         bne             irq_handler_3                   /*              irq_handler_3に分岐 */
    485 
    486         /*
    487          *  タスクのスタックに保存したスクラッチレジスタ等を捨てる.
    488          */
    489         pop             {r0,r1}                                 /* スタックポインタの調整をå
    490 ƒã«æˆ»ã™ */
     427        tst             r0, r0                                  /* p_runtskがNULLでなければ */
     428        bne             irq_handler_3                   /*              irq_handler_3に分岐 */
     429
     430        /*
     431         *  タスクのスタックに保存したスクラッチレジスタ等を捨てる.
     432         */
     433        pop             {r0,r1}                                 /* スタックポインタの調整を元に戻す */
    491434        add             sp, sp, r1
    492         add             sp, sp, #40                             /* スクラッチレジスタを捨てる */
     435        add             sp, sp, #40                             /* スクラッチレジスタを捨てる */
    493436        b               dispatcher_0
    494437
    495438        /*
    496          *  ディスパッチがå¿
    497 è¦ã‹åˆ¤å®šã™ã‚‹ï¼Ž
     439         *  ディスパッチが必要か判定する.
    498440         */
    499441ALABEL(irq_handler_3)
    500         ldr             r1, =p_schedtsk                 /* p_schedtsk → r1 */
     442        ldr             r1, =p_schedtsk                 /* p_schedtsk r1 */
    501443        ldr             r1, [r1]
    502         teq             r0, r1                                  /* p_runtskとp_schedtskが同じなら */
    503         beq             irq_handler_4                   /*                                irq_handler_4へ */
    504 
    505         /*
    506          *  コンテキストを保存する.
    507          */
    508         stmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの保存 */
    509         str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
    510         adr             r1, ret_int_r                   /* 実行再開番地を保存 */
     444        teq             r0, r1                                  /* p_runtskとp_schedtskが同じなら */
     445        beq             irq_handler_4                   /*                                irq_handler_4 */
     446
     447        /*
     448         *  コンテキストを保存する.
     449         */
     450        stmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの保存 */
     451        str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
     452        adr             r1, ret_int_r                   /* 実行再開番地を保存 */
    511453        str             r1, [r0,#TCB_pc]
    512         b               dispatcher                              /* r0にはp_runtskが格納されている */
     454        b               dispatcher                              /* r0にはp_runtskが格納されている */
    513455
    514456ALABEL(ret_int_r)
    515457        /*
    516          *  コンテキストを復帰する.
    517          */
    518         ldmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの復帰 */
     458         *  コンテキストを復帰する.
     459         */
     460        ldmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの復帰 */
    519461
    520462ALABEL(irq_handler_4)
    521463#ifdef TOPPERS_SUPPORT_OVRHDR
    522464        /*
    523          *  オーバランタイマを動作開始する.
     465         *  オーバランタイマを動作開始する.
    524466         */
    525467        bl              ovrtimer_start
     
    527469
    528470        /*
    529          *  割込み/CPU例外処理からのリターン
     471         *  割込み/CPU例外処理からのリターン
    530472         *
    531          *  割込み/CPU例外処理からのリターンにより,CPUロック解除状æ
    532 ‹ã«é·
    533          *  移するようにするå¿
    534 è¦ãŒã‚るが,ARMはCPSRのビットによってCPUロッ
    535          *  ク状æ
    536 ‹ã‚’表しているため,CPSRをå
    537 ƒã«æˆ»ã—てリターンすればよい.
     473         *  割込み/CPU例外処理からのリターンにより,CPUロック解除状態に遷
     474         *  移するようにする必要があるが,ARMはCPSRのビットによってCPUロッ
     475         *  ク状態を表しているため,CPSRを元に戻してリターンすればよい.
    538476         */
    539477ALABEL(irq_handler_5)
    540         pop             {r0,r1}                                 /* スタックポインタの調整をå
    541 ƒã«æˆ»ã™ */
     478        pop             {r0,r1}                                 /* スタックポインタの調整を元に戻す */
    542479        add             sp, sp, r1
    543480
    544481#if __TARGET_ARCH_ARM < 6
    545         ldmfd   sp!, {r0}                               /* 戻りå
    546 ˆã®cpsrをspsrに設定 */
     482        ldmfd   sp!, {r0}                               /* 戻り先のcpsrをspsrに設定 */
    547483        msr             spsr_cxsf, r0
    548         ldmfd   sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */
    549                                                                         /* ^付きなので,spsr → cpsr */
     484        ldmfd   sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */
     485                                                                        /* ^付きなので,spsr → cpsr */
    550486#else /* __TARGET_ARCH_ARM < 6 */
    551487        ldmfd   sp!, {r0-r5,r12,lr}
     
    555491
    556492/*
    557  *  CPU例外ハンドラ出å
    558 ¥å£å‡¦ç†
     493 *  CPU例外ハンドラ出入口処理
    559494 */
    560495ALABEL(start_exc_entry)
    561496
    562497/*
    563  *  未定義命令
     498 *  未定義命令
    564499 */
    565500#ifndef OMIT_UNDEF_HANDLER
     
    569504ALABEL(undef_handler)
    570505        /*
    571          *  ここには,未定義モードで分岐してくる.
    572          */
    573 #if __TARGET_ARCH_ARM < 6
    574         /*
    575          *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    576          *  ラッチレジスタを保存する.
     506         *  ここには,未定義モードで分岐してくる.
     507         */
     508#if __TARGET_ARCH_ARM < 6
     509        /*
     510         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
     511         *  ラッチレジスタを保存する.
    577512         */
    578513        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    579         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    580 
    581         /*
    582          *  未定義モードに戻して,戻り番地とspsrを取得する.
     514        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
     515
     516        /*
     517         *  未定義モードに戻して,戻り番地とspsrを取得する.
    583518         */
    584519        msr             cpsr_c, #(CPSR_UND_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    587522
    588523        /*
    589          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     524         *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
    590525         */
    591526        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    592         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    593         push    {r1}                                    /* spsrをスタックに保存 */
    594 #else /* __TARGET_ARCH_ARM < 6 */
    595         /*
    596          *  戻りå
    597 ˆï¼ˆlr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    598          *  保存する.
     527        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
     528        push    {r1}                                    /* spsrをスタックに保存 */
     529#else /* __TARGET_ARCH_ARM < 6 */
     530        /*
     531         *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
     532         *  保存する.
    599533         */
    600534        srsfd   #CPSR_SVC_MODE!
    601535
    602536        /*
    603          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     537         *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
    604538         */
    605539        cps             #CPSR_SVC_MODE
     
    611545
    612546/*
    613  *  スーパバイザコール
     547 *  スーパバイザコール
    614548 */
    615549#ifndef OMIT_SVC_HANDLER
     
    619553ALABEL(svc_handler)
    620554        /*
    621          *  ここには,スーパバイザモードで分岐してくる.
    622          */
    623 #if __TARGET_ARCH_ARM < 6
    624         /*
    625          *  IビットとFビットをセットし,スクラッチレジスタを保存する.
     555         *  ここには,スーパバイザモードで分岐してくる.
     556         */
     557#if __TARGET_ARCH_ARM < 6
     558        /*
     559         *  IビットとFビットをセットし,スクラッチレジスタを保存する.
    626560         */
    627561        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    628         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    629 
    630         /*
    631          *  戻り番地とspsrを取得する.
     562        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
     563
     564        /*
     565         *  戻り番地とspsrを取得する.
    632566         */
    633567        mov             r2, lr
     
    635569
    636570        /*
    637          *  戻り番地とspsrを保存する.
    638          */
    639         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    640         push    {r1}                                    /* spsrをスタックに保存 */
    641 #else /* __TARGET_ARCH_ARM < 6 */
    642         /*
    643          *  戻りå
    644 ˆï¼ˆlr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    645          *  保存する.
     571         *  戻り番地とspsrを保存する.
     572         */
     573        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
     574        push    {r1}                                    /* spsrをスタックに保存 */
     575#else /* __TARGET_ARCH_ARM < 6 */
     576        /*
     577         *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
     578         *  保存する.
    646579         */
    647580        srsfd   #CPSR_SVC_MODE!
    648581
    649582        /*
    650          *  スーパバイザモードで,スクラッチレジスタを保存する.
    651          */
    652         cps             #CPSR_SVC_MODE                  /* 不要と思われる */
     583         *  スーパバイザモードで,スクラッチレジスタを保存する.
     584         */
     585        cps             #CPSR_SVC_MODE                  /* 不要と思われる */
    653586        stmfd   sp!, {r0-r5,r12,lr}
    654587#endif /* __TARGET_ARCH_ARM < 6 */
     
    658591
    659592/*
    660  *  プリフェッチアボート
     593 *  プリフェッチアボート
    661594 */
    662595#ifndef OMIT_PABORT_HANDLER
     
    666599ALABEL(pabort_handler)
    667600        /*
    668          *  ここには,アボートモードで分岐してくる.
    669          */
    670 #if __TARGET_ARCH_ARM < 6
    671         /*
    672          *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    673          *  ラッチレジスタを保存する.
     601         *  ここには,アボートモードで分岐してくる.
     602         */
     603#if __TARGET_ARCH_ARM < 6
     604        /*
     605         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
     606         *  ラッチレジスタを保存する.
    674607         */
    675608        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    676         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    677 
    678         /*
    679          *  アボートモードに戻して,戻り番地とspsrを取得する.
     609        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
     610
     611        /*
     612         *  アボートモードに戻して,戻り番地とspsrを取得する.
    680613         */
    681614        msr             cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    684617
    685618        /*
    686          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     619         *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
    687620         */
    688621        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    689         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    690         push    {r1}                                    /* spsrをスタックに保存 */
    691 #else /* __TARGET_ARCH_ARM < 6 */
    692         /*
    693          *  戻りå
    694 ˆï¼ˆlr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    695          *  保存する.
     622        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
     623        push    {r1}                                    /* spsrをスタックに保存 */
     624#else /* __TARGET_ARCH_ARM < 6 */
     625        /*
     626         *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
     627         *  保存する.
    696628         */
    697629        srsfd   #CPSR_SVC_MODE!
    698630
    699631        /*
    700          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     632         *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
    701633         */
    702634        cps             #CPSR_SVC_MODE
     
    708640
    709641/*
    710  *  データアボート
     642 *  データアボート
    711643 */
    712644#ifndef OMIT_DABORT_HANDLER
     
    716648ALABEL(dabort_handler)
    717649        /*
    718          *  ここには,アボートモードで分岐してくる.
     650         *  ここには,アボートモードで分岐してくる.
    719651         *
    720          *  データアボートが,CPU例外のå
    721 ¥å£ï¼ˆstart_exc_entryとend_exc_entry
    722          *  の間)で発生した場合には,fatal_dabort_handlerに分岐する.アボー
    723          *  トモードのspを汎用レジスタの代わりに使用する.
     652         *  データアボートが,CPU例外の入口(start_exc_entryとend_exc_entry
     653         *  の間)で発生した場合には,fatal_dabort_handlerに分岐する.アボー
     654         *  トモードのspを汎用レジスタの代わりに使用する.
    724655         */
    725656        ldr             sp, =start_exc_entry+8
     
    733664#if __TARGET_ARCH_ARM < 6
    734665        /*
    735          *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    736          *  ラッチレジスタを保存する.
     666         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
     667         *  ラッチレジスタを保存する.
    737668         */
    738669        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    739         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    740 
    741         /*
    742          *  アボートモードに戻して,戻り番地とspsrを取得する.
     670        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
     671
     672        /*
     673         *  アボートモードに戻して,戻り番地とspsrを取得する.
    743674         */
    744675        msr             cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    747678
    748679        /*
    749          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     680         *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
    750681         */
    751682        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    752         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    753         push    {r1}                                    /* spsrをスタックに保存 */
    754 #else /* __TARGET_ARCH_ARM < 6 */
    755         /*
    756          *  戻りå
    757 ˆï¼ˆlr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    758          *  保存する.
     683        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
     684        push    {r1}                                    /* spsrをスタックに保存 */
     685#else /* __TARGET_ARCH_ARM < 6 */
     686        /*
     687         *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
     688         *  保存する.
    759689         */
    760690        srsfd   #CPSR_SVC_MODE!
    761691
    762692        /*
    763          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     693         *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
    764694         */
    765695        cps             #CPSR_SVC_MODE
     
    771701
    772702/*
    773  *  CPU例外のå
    774 ¥å£ã§ç™ºç”Ÿã—たデータアボート
     703 *  CPU例外の入口で発生したデータアボート
    775704 */
    776705ALABEL(fatal_dabort_handler)
    777706#if __TARGET_ARCH_ARM < 6
    778707        /*
    779          *  IビットとFビットをセットし,スーパバイザモードに切り換え,スタッ
    780          *  クポインタを初期化し,スクラッチレジスタを保存する.
     708         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スタッ
     709         *  クポインタを初期化し,スクラッチレジスタを保存する.
    781710         */
    782711        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    783712        ldr             sp, =istkpt
    784713        ldr             sp, [sp]
    785         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    786 
    787         /*
    788          *  アボートモードに戻して,戻り番地とspsrを取得する.
     714        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
     715
     716        /*
     717         *  アボートモードに戻して,戻り番地とspsrを取得する.
    789718         */
    790719        msr             cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    793722
    794723        /*
    795          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     724         *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
    796725         */
    797726        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    798         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    799         push    {r1}                                    /* spsrをスタックに保存 */
    800 #else /* __TARGET_ARCH_ARM < 6 */
    801         /*
    802          *  IビットとFビットをセットし,スーパバイザモードに切り換え,スタッ
    803          *  クポインタを初期化する.
     727        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
     728        push    {r1}                                    /* spsrをスタックに保存 */
     729#else /* __TARGET_ARCH_ARM < 6 */
     730        /*
     731         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スタッ
     732         *  クポインタを初期化する.
    804733         */
    805734        cpsid   if, #CPSR_SVC_MODE
     
    808737
    809738        /*
    810          *  アボートモードに戻して,戻りå
    811 ˆï¼ˆlr)とspsr(cpsr_svc)をスーパ
    812          *  バイザモードのスタックに保存する.
     739         *  アボートモードに戻して,戻り先(lr)とspsr(cpsr_svc)をスーパ
     740         *  バイザモードのスタックに保存する.
    813741         */
    814742        cps             #CPSR_ABT_MODE
     
    816744
    817745        /*
    818          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     746         *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
    819747         */
    820748        cps             #CPSR_SVC_MODE
     
    823751
    824752        /*
    825          *  例外ネストカウントの最上位ビットを1にする.
     753         *  例外ネストカウントの最上位ビットを1にする.
    826754         */
    827755        ldr             r2, =excpt_nest_count
     
    842770ALABEL(fiq_handler)
    843771        /*
    844          *  ここには,FIQモードで分岐してくる.
    845          */
    846 #if __TARGET_ARCH_ARM < 6
    847         /*
    848          *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    849          *  ラッチレジスタを保存する.
     772         *  ここには,FIQモードで分岐してくる.
     773         */
     774#if __TARGET_ARCH_ARM < 6
     775        /*
     776         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
     777         *  ラッチレジスタを保存する.
    850778         */
    851779        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    852         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    853 
    854         /*
    855          *  FIQモードに戻して,戻り番地とspsrを取得する.
     780        stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
     781
     782        /*
     783         *  FIQモードに戻して,戻り番地とspsrを取得する.
    856784         */
    857785        msr             cpsr_c, #(CPSR_FIQ_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    860788
    861789        /*
    862          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     790         *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
    863791         */
    864792        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    865         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    866         push    {r1}                                    /* spsrをスタックに保存 */
    867 #else /* __TARGET_ARCH_ARM < 6 */
    868         /*
    869          *  戻りå
    870 ˆï¼ˆlr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    871          *  保存する.
     793        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
     794        push    {r1}                                    /* spsrをスタックに保存 */
     795#else /* __TARGET_ARCH_ARM < 6 */
     796        /*
     797         *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
     798         *  保存する.
    872799         */
    873800        srsfd   #CPSR_SVC_MODE!
    874801
    875802        /*
    876          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     803         *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
    877804         */
    878805        cps             #CPSR_SVC_MODE
     
    886813
    887814/*
    888  *  CPU例外ハンドラ出å
    889 ¥å£å‡¦ç†ã®å
    890 ±é€šéƒ¨åˆ†
     815 *  CPU例外ハンドラ出入口処理の共通部分
    891816 *
    892  * 【この時点のレジスタ状æ
    893 ‹ã€‘
    894  *  r4:CPU例外ハンドラ番号
     817 * 【この時点のレジスタ状態】
     818 *  r4:CPU例外ハンドラ番号
    895819 */
    896820ALABEL(exc_handler_1)
    897821        /*
    898          *  CPU例外が発生した状況の判断に用いるために,CPU例外発生前の割
    899          *  込み優å
    900 ˆåº¦ãƒžã‚¹ã‚¯ã¨ä¾‹å¤–ネストカウントをスタックに保存する.
     822         *  CPU例外が発生した状況の判断に用いるために,CPU例外発生前の割
     823         *  込み優先度マスクと例外ネストカウントをスタックに保存する.
    901824         */
    902825        bl              irc_get_intpri
    903         push    {r0}                                    /* 割込み優å
    904 ˆåº¦ãƒžã‚¹ã‚¯ã‚’保存 */
     826        push    {r0}                                    /* 割込み優先度マスクを保存 */
    905827        ldr             r2, =excpt_nest_count
    906828        ldr             r3, [r2]
    907         push    {r3}                                    /* 例外ネストカウントを保存 */
    908         mov             r5, sp                                  /* CPU例外のæƒ
    909 å ±ã‚’記憶している領域の */
    910                                                                         /*                                å
    911 ˆé ­ç•ªåœ°ã‚’r5に保存 */
    912         /*
    913          *  スタックポインタの調整
     829        push    {r3}                                    /* 例外ネストカウントを保存 */
     830        mov             r5, sp                                  /* CPU例外の情報を記憶している領域の */
     831                                                                        /*                                先頭番地をr5に保存 */
     832        /*
     833         *  スタックポインタの調整
    914834         */
    915835        and             r1, sp, #4
    916836        sub             sp, sp, r1
    917         push    {r0,r1}                                 /* r0はスペース確保のため */
    918 
    919         /*
    920          *  カーネル管理外のCPU例外か判定する
     837        push    {r0,r1}                                 /* r0はスペース確保のため */
     838
     839        /*
     840         *  カーネル管理外のCPU例外か判定する
    921841         *
    922          *  カーネル管理外のCPU例外は,カーネル実行中,å
    923 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    924 ‹ï¼Œ
    925          *  CPUロック状æ
    926 ‹ï¼Œã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みハンドラ実行中に発生した
    927          *  CPU例外である.ARMコアの場合は,戻りå
    928 ˆã®CPSRのIビットかFビット
    929          *  のいずれかがセットされているなら,これ該当する.
    930          */
    931         ldr             r1, [r5,#T_EXCINF_cpsr]         /* 例外フレームからcpsrを取得 */
     842         *  カーネル管理外のCPU例外は,カーネル実行中,全割込みロック状態,
     843         *  CPUロック状態,カーネル管理外の割込みハンドラ実行中に発生した
     844         *  CPU例外である.ARMコアの場合は,戻り先のCPSRのIビットかFビット
     845         *  のいずれかがセットされているなら,これ該当する.
     846         */
     847        ldr             r1, [r5,#T_EXCINF_cpsr]         /* 例外フレームからcpsrを取得 */
    932848        ands    r1, r1, #CPSR_FIQ_IRQ_BIT
    933         bne             nk_exc_handler_1                /* カーネル管理外のCPU例外の処理へ */
    934 
    935         /*
    936          * 【この時点のレジスタ状æ
    937 ‹ã€‘
    938          *  r2:excpt_nest_countの番地
    939          *  r3:excpt_nest_countの値
    940          *  r4:CPU例外ハンドラ番号
    941          *  r5:CPU例外のæƒ
    942 å ±ã‚’記憶している領域のå
    943 ˆé ­ç•ªåœ°
    944          */
    945 
    946         /*
    947          *  例外ネストカウントをインクリメントする.
     849        bne             nk_exc_handler_1                /* カーネル管理外のCPU例外の処理へ */
     850
     851        /*
     852         * 【この時点のレジスタ状態】
     853         *  r2:excpt_nest_countの番地
     854         *  r3:excpt_nest_countの値
     855         *  r4:CPU例外ハンドラ番号
     856         *  r5:CPU例外の情報を記憶している領域の先頭番地
     857         */
     858
     859        /*
     860         *  例外ネストカウントをインクリメントする.
    948861         */
    949862        add             r3, r3, #1
    950863        str             r3, [r2]
    951         teq             r3, #1                                  /* CPU例外発生前が非タスクコンテキスト */
    952         bne             exc_handler_2                   /*                         ãªã‚‰exc_handler_2に分岐 */
     864        teq             r3, #1                                  /* CPU例外発生前が非タスクコンテキスト */
     865        bne             exc_handler_2                   /*                         ならexc_handler_2に分岐 */
    953866
    954867#ifdef TOPPERS_SUPPORT_OVRHDR
    955868        /*
    956          *  オーバランタイマを停止する.
     869         *  オーバランタイマを停止する.
    957870         */
    958871        bl              ovrtimer_stop
     
    960873
    961874        /*
    962          *  非タスクコンテキスト用のスタックに切り換える.
    963          */
    964         mov             r3, sp                                  /* この時点のスタックポインタをr3に */
    965         ldr             r2, =istkpt                             /* 非タスクコンテキスト用のスタックに */
     875         *  非タスクコンテキスト用のスタックに切り換える.
     876         */
     877        mov             r3, sp                                  /* この時点のスタックポインタをr3に */
     878        ldr             r2, =istkpt                             /* 非タスクコンテキスト用のスタックに */
    966879        ldr             sp, [r2]
    967         push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
    968                                                                         /* r0はスペース確保のため */
     880        push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
     881                                                                        /* r0はスペース確保のため */
    969882ALABEL(exc_handler_2)
    970883        /*
    971          * 【この時点のレジスタ状æ
    972 ‹ã€‘
    973          *  r4:CPU例外ハンドラ番号
    974          *  r5:CPU例外のæƒ
    975 å ±ã‚’記憶している領域のå
    976 ˆé ­ç•ªåœ°
    977          */
    978 
    979         /*
    980          *  (å¿
    981 è¦ãªã‚‰ï¼‰å‰²è¾¼ã¿ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ©ã‚’操作する.
     884         * 【この時点のレジスタ状態】
     885         *  r4:CPU例外ハンドラ番号
     886         *  r5:CPU例外の情報を記憶している領域の先頭番地
     887         */
     888
     889        /*
     890         *  (必要なら)割込みコントローラを操作する.
    982891         */
    983892        bl              irc_begin_exc
    984893
    985894        /*
    986          *  CPUロック解除状æ
    987 ‹ã«ã™ã‚‹ï¼Ž
     895         *  CPUロック解除状態にする.
    988896         *
    989          *  カーネル管理外のCPU例外ハンドラは別ルーチンで呼び出すため,単純
    990          *  に割込みを許可するだけでよい.
     897         *  カーネル管理外のCPU例外ハンドラは別ルーチンで呼び出すため,単純
     898         *  に割込みを許可するだけでよい.
    991899         */
    992900#if __TARGET_ARCH_ARM < 6
     
    1001909
    1002910        /*
    1003          *  ログ出力の呼出し
     911         *  ログ出力の呼出し
    1004912         */
    1005913#ifdef LOG_EXC_ENTER
    1006         mov             r0, r4                                  /* CPU例外番号をパラメータに渡す */
     914        mov             r0, r4                                  /* CPU例外番号をパラメータに渡す */
    1007915        bl              log_exc_enter
    1008916#endif /* LOG_EXC_ENTER */
    1009917
    1010918        /*
    1011          *  CPU例外ハンドラの呼出し
    1012          */
    1013         ldr             r2, =exc_table                  /* CPU例外ハンドラテーブルの読込み */
    1014         ldr             r3, [r2,r4,lsl #2]              /* CPU例外ハンドラの番地 → r3 */
    1015         mov             r0, r5                                  /* CPU例外のæƒ
    1016 å ±ã‚’記憶している領域の */
    1017                                                                         /*              å
    1018 ˆé ­ç•ªåœ°ã‚’第1パラメータに渡す */
    1019         mov             r1, r4                                  /* CPU例外番号を第2パラメータに渡す */
    1020         mov             lr, pc                                  /* CPU例外ハンドラの呼出し */
     919         *  CPU例外ハンドラの呼出し
     920         */
     921        ldr             r2, =exc_table                  /* CPU例外ハンドラテーブルの読込み */
     922        ldr             r3, [r2,r4,lsl #2]              /* CPU例外ハンドラの番地 → r3 */
     923        mov             r0, r5                                  /* CPU例外の情報を記憶している領域の */
     924                                                                        /*              先頭番地を第1パラメータに渡す */
     925        mov             r1, r4                                  /* CPU例外番号を第2パラメータに渡す */
     926        mov             lr, pc                                  /* CPU例外ハンドラの呼出し */
    1021927        bx              r3
    1022928
    1023929        /*
    1024          *  ログ出力の呼出し
     930         *  ログ出力の呼出し
    1025931         */
    1026932#ifdef LOG_EXC_LEAVE
    1027         mov             r0, r4                                  /* CPU例外番号をパラメータに渡す */
     933        mov             r0, r4                                  /* CPU例外番号をパラメータに渡す */
    1028934        bl              log_exc_leave
    1029935#endif /* LOG_EXC_LEAVE */
    1030936
    1031937        /*
    1032          *  カーネル管理の割込みを禁止する.
     938         *  カーネル管理の割込みを禁止する.
    1033939         */
    1034940#if __TARGET_ARCH_ARM < 6
     
    1043949
    1044950        /*
    1045          *  割込みコントローラを操作して,割込み優å
    1046 ˆåº¦ãƒžã‚¹ã‚¯ã‚’,CPU例外発
    1047          *  生時の値に設定する.
     951         *  割込みコントローラを操作して,割込み優先度マスクを,CPU例外発
     952         *  生時の値に設定する.
    1048953         */
    1049954        bl              irc_end_exc
    1050955
    1051956        /*
    1052          *  例外ネストカウントをデクリメントする.
     957         *  例外ネストカウントをデクリメントする.
    1053958         */
    1054959        ldr             r2, =excpt_nest_count
    1055960        ldr             r3, [r2]
    1056961        subs    r3, r3, #1
    1057         str             r3, [r2]                                /* 戻りå
    1058 ˆãŒéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãªã‚‰ */
    1059         bne             exc_handler_5                   /*                              exc_handler_5に分岐 */
    1060 
    1061         /*
    1062          *  タスク用のスタックに戻す.
     962        str             r3, [r2]                                /* 戻り先が非タスクコンテキストなら */
     963        bne             exc_handler_5                   /*                              exc_handler_5に分岐 */
     964
     965        /*
     966         *  タスク用のスタックに戻す.
    1063967         */
    1064968        pop             {r0,r3}
     
    1066970
    1067971        /*
    1068          *  p_runtskがNULLか判定する.
    1069          */
    1070         ldr             r0, =p_runtsk                   /* p_runtsk → r0 */
     972         *  p_runtskがNULLか判定する.
     973         */
     974        ldr             r0, =p_runtsk                   /* p_runtsk r0 */
    1071975        ldr             r0, [r0]
    1072         tst             r0, r0                                  /* p_runtskがNULLでなければ */
    1073         bne             exc_handler_3                   /*              exc_handler_3に分岐 */
    1074 
    1075         /*
    1076          *  タスクのスタックに保存したスクラッチレジスタ等を捨てる.
    1077          */
    1078         pop             {r0,r1}                                 /* スタックポインタの調整をå
    1079 ƒã«æˆ»ã™ */
     976        tst             r0, r0                                  /* p_runtskがNULLでなければ */
     977        bne             exc_handler_3                   /*              exc_handler_3に分岐 */
     978
     979        /*
     980         *  タスクのスタックに保存したスクラッチレジスタ等を捨てる.
     981         */
     982        pop             {r0,r1}                                 /* スタックポインタの調整を元に戻す */
    1080983        add             sp, sp, r1
    1081         add             sp, sp, #48                             /* スクラッチレジスタとCPU例外が発生した */
    1082         b               dispatcher_0                    /*      状況を判断するための追加æƒ
    1083 å ±ã‚’捨てる */
    1084 
    1085         /*
    1086          *  ディスパッチがå¿
    1087 è¦ã‹åˆ¤å®šã™ã‚‹ï¼Ž
     984        add             sp, sp, #48                             /* スクラッチレジスタとCPU例外が発生した */
     985        b               dispatcher_0                    /*      状況を判断するための追加情報を捨てる */
     986
     987        /*
     988         *  ディスパッチが必要か判定する.
    1088989         */
    1089990ALABEL(exc_handler_3)
    1090         ldr             r1, =p_schedtsk                 /* p_schedtsk → r1 */
     991        ldr             r1, =p_schedtsk                 /* p_schedtsk r1 */
    1091992        ldr             r1, [r1]
    1092         teq             r0, r1                                  /* p_runtskとp_schedtskが同じなら */
    1093         beq             exc_handler_4                   /*                                exc_handler_4へ */
    1094 
    1095         /*
    1096          *  コンテキストを保存する.
    1097          */
    1098         stmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの保存 */
    1099         str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
    1100         adr             r1, ret_exc_r                   /* 実行再開番地を保存 */
     993        teq             r0, r1                                  /* p_runtskとp_schedtskが同じなら */
     994        beq             exc_handler_4                   /*                                exc_handler_4 */
     995
     996        /*
     997         *  コンテキストを保存する.
     998         */
     999        stmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの保存 */
     1000        str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
     1001        adr             r1, ret_exc_r                   /* 実行再開番地を保存 */
    11011002        str             r1, [r0,#TCB_pc]
    1102         b               dispatcher                              /* r0にはp_runtskが格納されている */
     1003        b               dispatcher                              /* r0にはp_runtskが格納されている */
    11031004
    11041005ALABEL(ret_exc_r)
    11051006        /*
    1106          *  コンテキストを復帰する.
    1107          */
    1108         ldmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの復帰 */
     1007         *  コンテキストを復帰する.
     1008         */
     1009        ldmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの復帰 */
    11091010
    11101011ALABEL(exc_handler_4)
    11111012#ifdef TOPPERS_SUPPORT_OVRHDR
    11121013        /*
    1113          *  オーバランタイマを動作開始する.
     1014         *  オーバランタイマを動作開始する.
    11141015         */
    11151016        bl              ovrtimer_start
     
    11171018
    11181019        /*
    1119          *  CPU例外処理からのリターン
     1020         *  CPU例外処理からのリターン
    11201021         *
    1121          *  CPU例外処理からのリターンにより,CPUロック解除状æ
    1122 ‹ã«é·ç§»ã™ã‚‹ã‚ˆ
    1123          *  うにするå¿
    1124 è¦ãŒã‚るが,ARMはCPSRのビットによってCPUロック状æ
    1125 ‹ã‚’
    1126          *  表しているため,CPSRをå
    1127 ƒã«æˆ»ã—てリターンすればよい.
     1022         *  CPU例外処理からのリターンにより,CPUロック解除状態に遷移するよ
     1023         *  うにする必要があるが,ARMはCPSRのビットによってCPUロック状態を
     1024         *  表しているため,CPSRを元に戻してリターンすればよい.
    11281025         */
    11291026ALABEL(exc_handler_5)
    1130         pop             {r0,r1}                                 /* スタックポインタの調整をå
    1131 ƒã«æˆ»ã™ */
     1027        pop             {r0,r1}                                 /* スタックポインタの調整を元に戻す */
    11321028        add             sp, sp, r1
    1133         add             sp, sp, #8                              /* スタック上のæƒ
    1134 å ±ã‚’捨てる */
    1135 
    1136 #if __TARGET_ARCH_ARM < 6
    1137         ldmfd   sp!, {r0}                               /* 戻りå
    1138 ˆã®cpsrをspsrに設定 */
     1029        add             sp, sp, #8                              /* スタック上の情報を捨てる */
     1030
     1031#if __TARGET_ARCH_ARM < 6
     1032        ldmfd   sp!, {r0}                               /* 戻り先のcpsrをspsrに設定 */
    11391033        msr             spsr_cxsf, r0
    1140         ldmfd   sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */
    1141                                                                         /* ^付きなので,spsr → cpsr */
     1034        ldmfd   sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */
     1035                                                                        /* ^付きなので,spsr → cpsr */
    11421036#else /* __TARGET_ARCH_ARM < 6 */
    11431037        ldmfd   sp!, {r0-r5,r12,lr}
     
    11461040
    11471041/*
    1148  *  カーネル管理外のCPU例外の出å
    1149 ¥å£å‡¦ç†
     1042 *  カーネル管理外のCPU例外の出入口処理
    11501043 */
    11511044ALABEL(nk_exc_handler_1)
    11521045        /*
    1153          * 【この時点のレジスタ状æ
    1154 ‹ã€‘
    1155          *  r1:CPU例外発生前のCPSRのFビットとIビットの値
    1156          *  r2:excpt_nest_countの番地
    1157          *  r3:excpt_nest_countの値
    1158          *  r4:CPU例外ハンドラ番号
    1159          *  r5:CPU例外のæƒ
    1160 å ±ã‚’記憶している領域のå
    1161 ˆé ­ç•ªåœ°
    1162          */
    1163 
    1164         /*
    1165          *  例外ネストカウントをインクリメントする.
     1046         * 【この時点のレジスタ状態】
     1047         *  r1:CPU例外発生前のCPSRのFビットとIビットの値
     1048         *  r2:excpt_nest_countの番地
     1049         *  r3:excpt_nest_countの値
     1050         *  r4:CPU例外ハンドラ番号
     1051         *  r5:CPU例外の情報を記憶している領域の先頭番地
     1052         */
     1053
     1054        /*
     1055         *  例外ネストカウントをインクリメントする.
    11661056         */
    11671057        add             r3, r3, #1
    11681058        str             r3, [r2]
    1169         teq             r3, #1                                  /* CPU例外発生前が非タスクコンテキスト */
    1170         bne             nk_exc_handler_2                /*                      ならnk_exc_handler_2に分岐 */
    1171 
    1172         /*
    1173          *  非タスクコンテキスト用のスタックに切り換える.
    1174          */
    1175         mov             r3, sp                                  /* この時点のスタックポインタをr3に */
    1176         ldr             r2, =istkpt                             /* 非タスクコンテキスト用のスタックに */
     1059        teq             r3, #1                                  /* CPU例外発生前が非タスクコンテキスト */
     1060        bne             nk_exc_handler_2                /*                      ならnk_exc_handler_2に分岐 */
     1061
     1062        /*
     1063         *  非タスクコンテキスト用のスタックに切り換える.
     1064         */
     1065        mov             r3, sp                                  /* この時点のスタックポインタをr3に */
     1066        ldr             r2, =istkpt                             /* 非タスクコンテキスト用のスタックに */
    11771067        ldr             sp, [r2]
    1178         push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
    1179                                                                         /* r0はスペース確保のため */
     1068        push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
     1069                                                                        /* r0はスペース確保のため */
    11801070ALABEL(nk_exc_handler_2)
    11811071        /*
    1182          *  システム状æ
    1183 ‹ï¼ˆã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯é™¤ãï¼‰ã‚’,CPU例外発生時の状æ
    1184 ‹ã¸
     1072         *  システム状態(コンテキストは除く)を,CPU例外発生時の状態へ
    11851073         */
    11861074        orr             r1, r1, #CPSR_SVC_MODE
     
    11881076
    11891077        /*
    1190          *  CPU例外ハンドラの呼出し
    1191          */
    1192         ldr             r2, =exc_table                  /* CPU例外ハンドラテーブルの読込み */
    1193         ldr             r3, [r2,r4,lsl #2]              /* CPU例外ハンドラの番地 → r3 */
    1194         mov             r0, r5                                  /* CPU例外のæƒ
    1195 å ±ã‚’記憶している領域の */
    1196                                                                         /*              å
    1197 ˆé ­ç•ªåœ°ã‚’第1パラメータに渡す */
    1198         mov             r1, r4                                  /* CPU例外番号を第2パラメータに渡す */
    1199         mov             lr, pc                                  /* CPU例外ハンドラの呼出し */
     1078         *  CPU例外ハンドラの呼出し
     1079         */
     1080        ldr             r2, =exc_table                  /* CPU例外ハンドラテーブルの読込み */
     1081        ldr             r3, [r2,r4,lsl #2]              /* CPU例外ハンドラの番地 → r3 */
     1082        mov             r0, r5                                  /* CPU例外の情報を記憶している領域の */
     1083                                                                        /*              先頭番地を第1パラメータに渡す */
     1084        mov             r1, r4                                  /* CPU例外番号を第2パラメータに渡す */
     1085        mov             lr, pc                                  /* CPU例外ハンドラの呼出し */
    12001086        bx              r3
    12011087
    12021088        /*
    1203          *  例外ネストカウントをデクリメントする.
     1089         *  例外ネストカウントをデクリメントする.
    12041090         */
    12051091        ldr             r2, =excpt_nest_count
    12061092        ldr             r3, [r2]
    12071093        subs    r3, r3, #1
    1208         str             r3, [r2]                                /* 戻りå
    1209 ˆãŒéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãªã‚‰ */
    1210         bne             exc_handler_5                   /*                              exc_handler_5に分岐 */
    1211 
    1212         /*
    1213          *  タスク用のスタックに戻す.
     1094        str             r3, [r2]                                /* 戻り先が非タスクコンテキストなら */
     1095        bne             exc_handler_5                   /*                              exc_handler_5に分岐 */
     1096
     1097        /*
     1098         *  タスク用のスタックに戻す.
    12141099         */
    12151100        pop             {r0,r3}
     
    12181103
    12191104/*
    1220  *  ステータスレジスタの操作関数
     1105 *  ステータスレジスタの操作関数
    12211106 *
    1222  *  Thumbモードではmrs/msr命令が使用できないため,関数として実現して,
    1223  *  ARMモードに移行して実行する.
     1107 *  Thumbモードではmrs/msr命令が使用できないため,関数として実現して,
     1108 *  ARMモードに移行して実行する.
    12241109 */
    12251110#ifdef __thumb__
     
    12411126
    12421127/*
    1243  *  微少時間å¾
    1244 ã¡
     1128 *  微少時間待ち
    12451129 *
    1246  *  キャッシュラインのどの場所にあるかのよって実行時間が変わるため,大
    1247  *  きめの単位でアラインしている.
     1130 *  キャッシュラインのどの場所にあるかのよって実行時間が変わるため,大
     1131 *  きめの単位でアラインしている.
    12481132 */
    12491133        ATEXT
     
    12521136ALABEL(sil_dly_nse)
    12531137        mov             r1, #0
    1254         mcr             p15, 0, r1, c7, c5, 6           /* 分岐予測å
    1255 ¨ä½“の無効化 */
     1138        mcr             p15, 0, r1, c7, c5, 6           /* 分岐予測全体の無効化 */
    12561139        asm_inst_sync_barrier r3
    12571140        subs    r0, r0, #SIL_DLY_TIM1
    12581141        bxls    lr
    12591142ALABEL(sil_dly_nse1)
    1260         mcr             p15, 0, r1, c7, c5, 6           /* 分岐予測å
    1261 ¨ä½“の無効化 */
     1143        mcr             p15, 0, r1, c7, c5, 6           /* 分岐予測全体の無効化 */
    12621144        asm_inst_sync_barrier r3
    12631145        subs    r0, r0, #SIL_DLY_TIM2
Note: See TracChangeset for help on using the changeset viewer.