Ignore:
Timestamp:
Jun 2, 2015, 3:39:53 PM (9 years ago)
Author:
nmir-saito
Message:

ファイルの mime-type 変更

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ssp_qb_r5f100le_cs/trunk/arch/arm_m_gcc/prc_support.S

    • Property svn:mime-type set to text/plain; charset=shift_jis
    r93 r95  
    77 *  Copyright (C) 2010 by Meika Sugimoto
    88 *
    9  *  ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
    10  *  ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
    11  *  •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
    12  *  (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
    13  *      Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
    14  *      ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
    15  *  (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    16  *      —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ
    17 ƒƒ“ƒgi—˜—p
    18  *      ŽÒƒ}ƒjƒ
    19 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
    20  *      ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    21  *  (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
    22  *      —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
    23  *      ‚ƁD
    24  *    (a) Ä”z•z‚É”º‚¤ƒhƒLƒ
    25 ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ
    26 ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
    27  *        ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
    28  *    (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
    29  *        •ñ‚·‚邱‚ƁD
    30  *  (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
    31  *      ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
    32  *      ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
    33  *      —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
    34  *      –Ɛӂ·‚邱‚ƁD
     9 *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
     10 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     11 *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     12 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     13 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     14 *      スコード中に含まれていること.
     15 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     16 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     17 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     18 *      の無保証規定を掲載すること.
     19 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     20 *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     21 *      と.
     22 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     23 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     24 *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     25 *        報告すること.
     26 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     27 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     28 *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     29 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     30 *      免責すること.
    3531 *
    36  *  –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
    37  *  ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
    38  *  ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
    39  *  ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
    40  *  ‚̐ӔC‚𕉂í‚È‚¢D
     32 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     33 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     34 *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     35 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     36 *  の責任を負わない.
    4137 *
    4238 */
    4339
    4440/*
    45  *  ƒvƒƒZƒbƒTˆË‘¶ƒ‚ƒWƒ
    46 [ƒ‹ ƒAƒZƒ“ƒuƒŠŒ¾Œê•”iARM-M—pj
     41 *  プロセッサ依存モジュール アセンブリ言語部(ARM-M用)
    4742 */
    4843
    4944#define TOPPERS_MACRO_ONLY
    50 #define UINT_C(val)             (val)           /* uint_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒ */
    51 #define ULONG_C(val)    (val)           /* ulong_tŒ^‚̒萔‚ðì‚éƒ}ƒNƒ */
    52 #define CAST(type, val) (val)           /* Œ^ƒLƒƒƒXƒg‚ðs‚¤ƒ}ƒNƒ */
     45#define UINT_C(val)             (val)           /* uint_t型の定数を作るマクロ */
     46#define ULONG_C(val)    (val)           /* ulong_t型の定数を作るマクロ */
     47#define CAST(type, val) (val)           /* 型キャストを行うマクロ */
    5348
    5449#include "kernel_impl.h"
     
    5954
    6055/*
    61  *  ŠO•”ŽQÆ
     56 *  外部参照
    6257 */
    6358        .global         intnest
    6459
    6560/*
    66  *  CPU—áŠOƒGƒ“ƒgƒŠ
     61 *  CPU例外エントリ
    6762 *
    68  *  Š„ž‚݃Gƒ“ƒgƒŠ‚Əˆ—‚Ì“à—e‚Í“¯“™‚¾‚ªCƒƒO‚ÌŽí—Þ‚ªˆÙ‚Ȃ邽‚߁C
    69  *  •ª‚¯‚Ä‚¢‚éD
     63 *  割込みエントリと処理の内容は同等だが,ログの種類が異なるため,
     64 *  分けている.
    7065 */
    7166        .align 2
     
    7671exc_entry:
    7772        /*
    78          *  —áŠO/Š„ž‚Ý‚ª”­¶‚·‚é‚ƁC”­¶Žž‚ɃAƒNƒeƒBƒu‚ȃXƒ^ƒbƒN‚ɃXƒNƒ‰
    79          *  ƒbƒ`ƒŒƒWƒXƒ^“™‚ª•Û‘¶‚³‚ê‚éD
    80          *  ‚±‚Ì“à—e‚ɉÁ‚¦‚āCCPU—áŠOƒnƒ“ƒhƒ‰‚ւ̏î•ñ‚Æ‚µ‚āCbasepri ‚Ì’l‚ƁC
    81          *  EXC_RETURN‚̏î•ñ‚ð‰Á‚¦‚Ä•Û‘¶‚·‚éDbasepri‚Ì’l‚́CCPU—áŠO‚©‚ç‚Ì
    82          *  ƒŠƒ^[ƒ“Žž‚ÉŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚Ì’l‚ðŒ³‚É–ß‚·‚½‚ß‚É‚à—p‚¢‚ç‚ê‚éD
     73         *  例外/割込みが発生すると,発生時にアクティブなスタックにスクラ
     74         *  ッチレジスタ等が保存される.
     75         *  この内容に加えて,CPU例外ハンドラへの情報として,basepri の値と,
     76         *  EXC_RETURNの情報を加えて保存する.basepriの値は,CPU例外からの
     77         *  リターン時に割込み優先度マスクの値を元に戻すためにも用いられる.
    8378         *
    8479         *   -----------
     
    107102
    108103        /*
    109          *  Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðƒXƒ^ƒbƒN‚É•Û‘¶‚·‚邽‚ߎ擾
    110          */
    111         mrs   r2, basepri                       /* baepri‚Ì’l‚ðŽæ“¾ */
    112         push  {r2}                                      /* Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðÏ‚Þ */
    113         push  {lr}                                      /* EXC_RETURN ‚ðÏ‚Þ                      */
    114         mov   r0, sp                            /* CPU—áŠOƒnƒ“ƒhƒ‰‚ւ̈ø”‚Æ‚È‚é */
    115        
    116         ldr   r1 , =lock_flag           /* CPUƒƒbƒNƒtƒ‰ƒO‚ð•Û‘¶ */
     104         *  割込み発生時の割込み優先度マスクをスタックに保存するため取得
     105         */
     106        mrs   r2, basepri                       /* baepriの値を取得 */
     107        push  {r2}                                      /* 割込み発生時の割込み優先度マスクを積む */
     108        push  {lr}                                      /* EXC_RETURN を積む                         */
     109        mov   r0, sp                            /* CPU例外ハンドラへの引数となる */
     110       
     111        ldr   r1 , =lock_flag           /* CPUロックフラグを保存 */
    117112        ldr   r1 , [r1]
    118113        push  {r1}
    119114       
    120         /* Š„ž‚݃lƒXƒg”‚̉ÁŽZ */
     115        /* 割込みネスト数の加算 */
    121116        ldr r1 , =intnest
    122117        ldr r3 , [r1]
     
    125120
    126121        /*
    127          *  ‹¤’ʏˆ—
     122         *  共通処理
    128123         */
    129124exc_entry_2:
    130         mrs   r3, ipsr               /* ƒnƒ“ƒhƒ‰ƒAƒhƒŒƒX‚ðŽæ“¾ */
     125        mrs   r3, ipsr               /* ハンドラアドレスを取得 */
    131126        ldr   r1, =_kernel_exc_tbl
    132127        ldr   r2, [r1, r3, lsl #2]
     
    134129#ifdef LOG_EXC_ENTER
    135130        push  {r0, r2, r3}
    136         mov   r0, r3                 /* —áŠO”ԍ†‚ðƒpƒ‰ƒ[ƒ^‚É  */
    137         bl    log_exc_enter          /* log_exc_enter‚ðŒÄ‚яo‚· */
     131        mov   r0, r3                 /* 例外番号をパラメータに  */
     132        bl    log_exc_enter          /* log_exc_enterを呼び出す */
    138133        pop   {r0, r2, r3}
    139134#endif /* LOG_EXC_ENTER */
    140135
    141136#ifdef LOG_EXC_LEAVE
    142         push  { r3 }                   /* —áŠO”ԍ†‚ðƒXƒ^ƒbƒN‚Ö    */
     137        push  { r3 }                   /* 例外番号をスタックへ    */
    143138#endif /* LOG_EXC_LEAVE */
    144139
    145140        /*
    146          *  CPU—áŠOƒnƒ“ƒhƒ‰‚̌Ăяo‚µ
     141         *  CPU例外ハンドラの呼び出し
    147142         */
    148143        blx   r2
    149144
    150         /* CPUƒƒbƒNƒtƒ‰ƒO‚ðŒ³‚É–ß‚· */
     145        /* CPUロックフラグを元に戻す */
    151146        pop   {r0}
    152147        ldr   r1 , =lock_flag
     
    154149       
    155150#ifdef LOG_EXC_LEAVE
    156         pop   { r0 }                   /* —áŠO”ԍ†‚ðˆø”‚É        */
    157         bl    log_exc_leave          /* log_exc_leave‚ðŒÄ‚яo‚· */
     151        pop   { r0 }                   /* 例外番号を引数に        */
     152        bl    log_exc_leave          /* log_exc_leaveを呼び出す */
    158153#endif /* LOG_EXC_LEAVE */
    159154       
     
    162157
    163158/*
    164  *  Š„ž‚݃Gƒ“ƒgƒŠ
     159 *  割込みエントリ
    165160 */
    166161        .align 2
     
    171166int_entry:
    172167        /*
    173          *      Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðƒXƒ^ƒbƒN‚É•Û‘¶‚·‚邽‚ߎ擾
    174          */
    175         mrs   r2, basepri                         /* baepri‚Ì’l‚ðŽæ“¾ */
    176         push  {r2}                                       /* Š„ž‚Ý”­¶Žž‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðÏ‚Þ */
    177         push  {lr}                                       /* EXC_RETURN ‚ðÏ‚Þ                     */
    178         mov   r0, sp                             /* –¢’è‹`‚ÌŠ„ž‚Ý‚ª”­¶‚µ‚½ê‡‚̏î•ñ‚Æ‚·‚é */
    179        
    180         /*
    181          *      ‹¤’ʏˆ—
     168         *      割込み発生時の割込み優先度マスクをスタックに保存するため取得
     169         */
     170        mrs   r2, basepri                         /* baepriの値を取得 */
     171        push  {r2}                                       /* 割込み発生時の割込み優先度マスクを積む */
     172        push  {lr}                                       /* EXC_RETURN を積む                        */
     173        mov   r0, sp                             /* 未定義の割込みが発生した場合の情報とする */
     174       
     175        /*
     176         *      共通処理
    182177         */
    183178int_entry_2:
    184         /* Š„ž‚݃lƒXƒg”‚̉ÁŽZ */
     179        /* 割込みネスト数の加算 */
    185180        ldr r1 , =intnest
    186181        ldr r3 , [r1]
     
    188183        str r3 , [r1]
    189184       
    190         mrs   r3, ipsr                           /* ƒnƒ“ƒhƒ‰ƒAƒhƒŒƒX‚ðŽæ“¾ */
     185        mrs   r3, ipsr                           /* ハンドラアドレスを取得 */
    191186        ldr   r1, =_kernel_exc_tbl
    192187        ldr   r2, [r1, r3, lsl #2]
     
    194189#ifdef LOG_INH_ENTER
    195190        push  {r0,r2,r3}
    196         mov   r0, r3                 /* Š„ž‚ݔԍ†‚ðƒpƒ‰ƒ[ƒ^‚É  */
    197         bl    log_inh_enter          /* log_inh_enter‚ðŒÄ‚яo‚· */
     191        mov   r0, r3                 /* 割込み番号をパラメータに  */
     192        bl    log_inh_enter          /* log_inh_enterを呼び出す */
    198193        pop   { r0,r2,r3 }
    199194#endif /* LOG_INH_ENTER */
    200195
    201196#ifdef LOG_INH_LEAVE
    202         push  { r3 }                   /* Š„ž‚ݔԍ†‚ðƒXƒ^ƒbƒN‚Ö    */
     197        push  { r3 }                   /* 割込み番号をスタックへ    */
    203198#endif /* LOG_INH_LEAVE */
    204199
    205200        /*
    206          *  CPU—áŠOƒnƒ“ƒhƒ‰‚̌Ăяo‚µ
     201         *  CPU例外ハンドラの呼び出し
    207202         */
    208203        blx   r2
    209204       
    210205#ifdef LOG_INH_LEAVE
    211         pop   { r0 }                   /* Š„ž‚ݔԍ†‚ðˆø”‚É        */
    212         bl    log_inh_leave          /* log_inh_leave‚ðŒÄ‚яo‚· */
     206        pop   { r0 }                   /* 割込み番号を引数に        */
     207        bl    log_inh_leave          /* log_inh_leaveを呼び出す */
    213208#endif /* LOG_INH_LEAVE */
    214209
    215210/*
    216  *  Š„ž‚Ý/—áŠOoŒû
     211 *  割込み/例外出口
    217212 *
    218  *  ret_exc/ret_int‚́CCPU—áŠO/Š„ž‚݃nƒ“ƒhƒ‰‚©‚ç–ß‚Á‚½’¼Œã‚ÉŽÀs‚·‚é
    219  *  ƒ‹[ƒ`ƒ“‚Å‚ ‚éD
     213 *  ret_exc/ret_intは,CPU例外/割込みハンドラから戻った直後に実行する
     214 *  ルーチンである.
    220215 */
    221216ret_exc:
    222217ret_int:
    223218        /*
    224          *  Š„ž‚݃ƒbƒNó‘Ô‚Æ‚·‚éD‚±‚ÌŽž“_‚ł́CCPUƒƒbƒNó‘Ô‚É‚Í‚È‚ç‚È‚¢
    225          * ibasepri‚Ælock_flag‚Æsaved_iipm‚͍XV‚µ‚È‚¢jD
    226          *
    227          *  Š„ž‚݃ƒbƒNó‘Ô‚Æ‚·‚é‚̂́C–ß‚èæ‚̃Rƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN‚ƁC
    228          *  –ß‚èæ‚ª”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Å‚ ‚Á‚½ê‡‚̃Šƒ^[ƒ“‚ðƒAƒgƒ~ƒbƒN
    229          *  ‚ɍs‚¤‚½‚ß‚Å‚ ‚éDbsepri‚ðCPUƒƒbƒN‚Ì’l‚É‚·‚邱‚Æ‚Å‚àƒAƒgƒ~ƒb
    230          *  ƒN‚ȃ`ƒFƒbƒN‚Æ•œ‹A‚͉”\‚Å‚ ‚邪CŠ„ž‚Ý‚©‚烊ƒ^[ƒ“‚µ‚Ä‚àC
    231          *  basepri ‚̐ݒè“à—e‚ÍŒ³‚É–ß‚ç‚È‚¢‚½‚߁CŽg—p‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢D
    232          *  ˆê•ûCFAULTMASK‚́CŠ„ž‚Ý‚©‚ç‚̃Šƒ^[ƒ“ˆ—‚É‚æ‚Á‚āC'0'‚ɃNƒŠ
    233          *  ƒA‚³‚ê‚éD
     219         *  割込みロック状態とする.この時点では,CPUロック状態にはならない
     220         * (basepriとlock_flagとsaved_iipmは更新しない).
     221         *
     222         *  割込みロック状態とするのは,戻り先のコンテキストのチェックと,
     223         *  戻り先が非タスクコンテキストであった場合のリターンをアトミック
     224         *  に行うためである.bsepriをCPUロックの値にすることでもアトミッ
     225         *  クなチェックと復帰は可能であるが,割込みからリターンしても,
     226         *  basepri の設定内容は元に戻らないため,使用することができない.
     227         *  一方,FAULTMASKは,割込みからのリターン処理によって,'0'にクリ
     228         *  アされる.
    234229         */
    235230        cpsid f
    236231       
    237232        /*
    238          *  –ß‚èæ‚̃Rƒ“ƒeƒLƒXƒg‚Ì”»’è
     233         *  戻り先のコンテキストの判定
    239234         *
    240          *  intnest‚ª0‚©‚Ç‚¤‚©‚Å”»’f‚·‚é
     235         *  intnestが0かどうかで判断する
    241236         * 
    242237         */
    243         /* Š„ž‚݃lƒXƒg”‚ÌŒ¸ŽZ */
     238        /* 割込みネスト数の減算 */
    244239        ldr r1 , =intnest
    245240        ldr r3 , [r1]
     
    251246       
    252247        /*
    253          *  ˆê’i–Ú‚ÌŠ„ž‚݂̏oŒûˆ—
     248         *  一段目の割込みの出口処理
    254249         */
    255250ret_int_1:
    256251        /*
    257          *  ‚±‚±‚É‚ÍŠ„ž‚݃ƒbƒNó‘ԁiFAULTMASK‚ªƒZƒbƒgj‚³‚ꂽó‘Ô‚Å—ˆ‚éD
    258          *  Threadƒ‚[ƒh‚©‚ç‚̃Šƒ^[ƒ“‚É‚æ‚莩“®“I‚ÉŠ„ž‚݃ƒbƒN‰ðœó‘Ô‚É‚È‚éD
    259          *  Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ÍŠ„ž‚Ý‘O‚ɏó‘Ô‚É–ß‚·D
     252         *  ここには割込みロック状態(FAULTMASKがセット)された状態で来る.
     253         *  Threadモードからのリターンにより自動的に割込みロック解除状態になる.
     254         *  割込み優先度マスクは割込み前に状態に戻す.
    260255         */
    261256        pop             { r2 }
    262257        pop             { r1 }
    263         msr   basepri, r1                         /* Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðŠ„ž‚Ý‘O‚ɏó‘Ô‚Ö */
    264         bx        r2                                      /* ƒŠƒ^[ƒ“ */
     258        msr   basepri, r1                         /* 割込み優先度マスクを割込み前に状態へ */
     259        bx        r2                                      /* リターン */
    265260       
    266261ret_int_2:
    267         ldr   r0, =reqflg             /* reqflg‚ªfalse‚È‚ç‚»‚Ì‚Ü‚Ü–ß‚é */
     262        ldr   r0, =reqflg             /* reqflgがfalseならそのまま戻る */
    268263        ldr   r1, [r0]
    269264        cmp   r1 , #0
    270         beq    ret_int_1           /* false‚È‚çret_int_1‚Ö           */
     265        beq    ret_int_1           /* falseならret_int_1へ           */
    271266ret_int_3:
    272         mov   r1, #0                   /* reqflg‚ðfalse‚É */
     267        mov   r1, #0                   /* reqflgをfalseに */
    273268        str   r1, [r0]
    274269       
    275270        /*
    276          *  CPUƒƒbƒNó‘ԂɈڍs‚·‚éD
    277          *
    278          *  ƒJ[ƒlƒ‹‚ÌŠÇ—“à‚ÌŠ„ž‚Ý‚ð‹ÖŽ~‚·‚é‚悤‚Ébasepri‚ðÝ’肵C
    279          *  lock_flag‚ðXV‚·‚éD
    280          *  ‚±‚ÌŽž“_‚ÅCPUƒƒbƒNó‘Ô‚Æ‚·‚é‚̂́Cdispatcher‚Ö•ªŠò‚·‚鎞‚É
    281          *  CPUƒƒbƒNó‘Ô‚É‚È‚Á‚Ä‚¢‚é•K—v‚ª‚ ‚邽‚ß‚Å‚ ‚éD
    282      *  ‚È‚¨C‚±‚̏ˆ—‚ÌŒãCThreadƒ‚[ƒh‚ւ̈ڍsˆ—‚ðs‚È‚¤‚½‚߁CŠ„ž‚Ý
    283      *  ƒƒbƒNó‘Ô(FAULTMASK‚ð"1")‚Í•ÛŽ‚·‚éD
    284          */
    285         ldr   r1, =IIPM_LOCK              /* CPUƒƒbƒNó‘Ô */
     271         *  CPUロック状態に移行する.
     272         *
     273         *  カーネルの管理内の割込みを禁止するようにbasepriを設定し,
     274         *  lock_flagを更新する.
     275         *  この時点でCPUロック状態とするのは,dispatcherへ分岐する時に
     276         *  CPUロック状態になっている必要があるためである.
     277     *  なお,この処理の後,Threadモードへの移行処理を行なうため,割込み
     278     *  ロック状態(FAULTMASKを"1")は保持する.
     279         */
     280        ldr   r1, =IIPM_LOCK              /* CPUロック状態 */
    286281        msr   basepri, r1
    287         mov   r1, #0x01                           /* lock_flag ‚ð true‚É */
     282        mov   r1, #0x01                           /* lock_flag を trueに */
    288283        ldr   r0, =lock_flag
    289284        str   r1, [r0]
    290285       
    291286        /*
    292          *  lr‚ðŽæ‚èo‚·D‚½‚¾‚µ’x‰„ƒfƒBƒXƒpƒbƒ`‚̍ۂɂàŽg‚¤‚½‚߁C
    293          *  ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚Í‘€ì‚µ‚È‚¢D
     287         *  lrを取り出す.ただし遅延ディスパッチの際にも使うため,
     288         *  スタックポインタは操作しない.
    294289         */
    295290       
     
    297292       
    298293        /*
    299          *  Threadƒ‚[ƒh‚ֈڍs‚·‚éD
    300          *
    301          *  dispatcher‚âcall_texrn‚ðŒÄ‚яo‚·ê‡‚́CThreadƒ‚[ƒh‚Å‚ ‚é•K
    302          *  —v‚ª‚ ‚邽‚߁CPSPƒXƒ^ƒbƒNã‚Ƀ_ƒ~[‚Ì—áŠOƒtƒŒ[ƒ€‚ð’u‚¢‚āC
    303          *  ‹[Ž—“I‚ÉŠ„ž‚݃nƒ“ƒhƒ‰‚©‚烊ƒ^[ƒ“‚·‚éD
    304          *  ƒŠƒ^[ƒ“‚Æ“¯Žž‚ÉFAULTMASK‚ªŽ©“®“I‚ɃNƒŠƒA‚³‚êCƒJ[ƒlƒ‹ŠÇ—ŠO‚Ì
    305          *  Š„ž‚Ý‚ª‹–‰Â‚³‚ê‚éD
     294         *  Threadモードへ移行する.
     295         *
     296         *  dispatcherやcall_texrnを呼び出す場合は,Threadモードである必
     297         *  要があるため,PSPスタック上にダミーの例外フレームを置いて,
     298         *  擬似的に割込みハンドラからリターンする.
     299         *  リターンと同時にFAULTMASKが自動的にクリアされ,カーネル管理外の
     300         *  割込みが許可される.
    306301         */
    307302        ldr   r0, =ret_int_4              /* PC   */
    308         ldr   r1, =EPSR_T                         /* xPSR(Tƒrƒbƒg‚ª'1'‚Å‚ ‚é•K—v‚ª‚ ‚é) */
    309         stmfd sp!, {r0-r1}                        /* ƒ_ƒ~[ƒtƒŒ[ƒ€‚ðƒXƒ^ƒbƒNã‚ɐςޠ  */
    310         sub   sp, #(EXC_FRAME_SIZE - (4*2)) /* r0-r3,r12,lr‚Ì“à—e‚͐ݒ肷‚é•K—v‚ª‚È‚¢ */
    311         bx        r2                                      /* Threadƒ‚[ƒh‚ֈڍs */
     303        ldr   r1, =EPSR_T                         /* xPSR(Tビットが'1'である必要がある) */
     304        stmfd sp!, {r0-r1}                        /* ダミーフレームをスタック上に積む   */
     305        sub   sp, #(EXC_FRAME_SIZE - (4*2)) /* r0-r3,r12,lrの内容は設定する必要がない */
     306        bx        r2                                      /* Threadモードへ移行 */
    312307   
    313308ret_int_4:
    314         bl    search_schedtsk           /* Š„ž‚Ý’†‚Å‹N“®‚³‚ꂽƒ^ƒXƒN‚ðŽÀs */
     309        bl    search_schedtsk           /* 割込み中で起動されたタスクを実行 */
    315310        bl    run_task
    316311ret_int_r:
    317         svc   0                                    /* SVC‚̌Ăяo‚µ */
    318        
    319 /*
    320  *  ’x‰„ƒfƒBƒXƒpƒbƒ`‚©‚ç‚Ì•œ‹AŽž‚Ɉꎞ“I‚ÉŠ„ž‚Ý
    321  *  ƒRƒ“ƒeƒLƒXƒg‚Ɉڍs‚·‚邽‚ß‚ÌSVCƒR[ƒ‹ƒnƒ“ƒhƒ‰
     312        svc   0                                    /* SVCの呼び出し */
     313       
     314/*
     315 *  遅延ディスパッチからの復帰時に一時的に割込み
     316 *  コンテキストに移行するためのSVCコールハンドラ
    322317 */
    323318
     
    328323kernel_svc_handler:
    329324        /*
    330          *  Š„ž‚ݏˆ—‚©‚ç‚̃Šƒ^[ƒ“‚É‚æ‚èCCPUƒƒbƒN‰ðœó‘ԂɈڍs‚·‚é‚æ
    331          *  ‚¤€”õ‚·‚éD
    332          */
    333         cpsid f                                                                 /* Š„ž‚݃ƒbƒNó‘Ô‚Ö */
    334         ldr             r2 , [ sp , #(EXC_FRAME_SIZE) ] /* lr‚ðƒXƒ^ƒbƒN‚©‚çŽæ“¾ */
    335         add             sp, #EXC_FRAME_SIZE + 8                 /* ƒXƒ^ƒbƒN‚ðŽÌ‚Ä‚é     */
     325         *  割込み処理からのリターンにより,CPUロック解除状態に移行するよ
     326         *  う準備する.
     327         */
     328        cpsid f                                                                 /* 割込みロック状態へ */
     329        ldr             r2 , [ sp , #(EXC_FRAME_SIZE) ] /* lrをスタックから取得  */
     330        add             sp, #EXC_FRAME_SIZE + 8                 /* スタックを捨てる     */
    336331        mov             r0, #0
    337         ldr             r1, =lock_flag                                  /* CPUƒƒbƒN‰ðœó‘Ô‚Ö */
     332        ldr             r1, =lock_flag                                  /* CPUロック解除状態へ */
    338333        str             r0, [r1]
    339334        msr             basepri , r0
    340         bx              r2                                                              /* ƒŠƒ^[ƒ“       */
    341 
    342 /*
    343  *  ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ì“®ìŠJŽn
     335        bx              r2                                                              /* リターン   */
     336
     337/*
     338 *  ディスパッチャの動作開始
    344339 */
    345340        .align  2
     
    349344start_dispatch:
    350345        /*
    351          *  ‚±‚̃‹[ƒ`ƒ“‚́CƒJ[ƒlƒ‹‹N“®Žž‚ɁC‚·‚ׂĂ̊„ž‚Ý‚ð‹ÖŽ~‚µ‚½ó‘Ô
    352          * iŠ„ž‚݃ƒbƒNó‘Ô‚Æ“¯“™j‚ŌĂяo‚³‚ê‚éD‚Ü‚½CŠ„ž‚݃‚[ƒhi”ñ
    353          *  ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Æ“¯“™j‚ŌĂяo‚³‚ê‚邱‚Æ‚ð‘z’肵‚Ä‚¢‚éD
    354          *
    355          *  prc_initialize‚ŁClock_flag‚ðtrue‚ɁCsaved_iipm‚ðIIPM_ENAALL‚É
    356          *  ‰Šú‰»‚µ‚Ä‚¢‚邽‚߁CƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚ð‹–‰Â‚·‚邱‚ƂŁC
    357          *  CPUƒƒbƒNó‘ԁEiƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô‚É‚È‚éD
    358          *  ‚Ü‚½Ctask_initialize‚Ådisdsp‚ðfalse‚ɏ‰Šú‰»‚µ‚Ä‚¢‚邽‚߁CƒfƒB
    359          *  ƒXƒpƒbƒ`‹–‰Âó‘Ô‚É‚È‚Á‚Ä‚¢‚éD
    360          */
    361         ldr   r0,=istkpt              /* MSP‚ð‰Šú‰»   */
    362         ldr   r1,[r0]                 /* start_dispatchŒÄ‚яo‚µŽž‚ɌĂяo‚µ—p‚É */
    363         msr   msp, r1                 /* Žg—p‚µ‚Ä‚¢‚邽‚ߏ‰Šú‰»‚·‚é             */
    364         ldr   r1, =IIPM_LOCK          /* ƒJ[ƒlƒ‹ŠÇ—“à‚ÌŠ„ž‚Ý‚ð‹ÖŽ~ */
     346         *  このルーチンは,カーネル起動時に,すべての割込みを禁止した状態
     347         * (割込みロック状態と同等)で呼び出される.また,割込みモード(非
     348         *  タスクコンテキストと同等)で呼び出されることを想定している.
     349         *
     350         *  prc_initializeで,lock_flagをtrueに,saved_iipmをIIPM_ENAALLに
     351         *  初期化しているため,カーネル管理外の割込みを許可することで,
     352         *  CPUロック状態・(モデル上の)割込み優先度マスク全解除状態になる.
     353         *  また,task_initializeでdisdspをfalseに初期化しているため,ディ
     354         *  スパッチ許可状態になっている.
     355         */
     356        ldr   r0,=istkpt              /* MSPを初期化   */
     357        ldr   r1,[r0]                 /* start_dispatch呼び出し時に呼び出し用に */
     358        msr   msp, r1                 /* 使用しているため初期化する             */
     359        ldr   r1, =IIPM_LOCK          /* カーネル管理内の割込みを禁止 */
    365360        msr   basepri, r1
    366         cpsie f                       /* ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚ð‹–‰Â */
     361        cpsie f                       /* カーネル管理外の割込みを許可 */
    367362        b         dispatcher
    368363
    369364/*
    370  *  ƒJ[ƒlƒ‹‚̏I—¹ˆ—‚̌ďo‚µ
     365 *  カーネルの終了処理の呼出し
    371366 *
    372  *  ƒXƒ^ƒbƒN‚ð”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚ɐ؂è‘Ö‚¦D
     367 *  スタックを非タスクコンテキスト用に切り替え.
    373368 * 
    374369 */
     
    379374        .type call_exit_kernel, function
    380375call_exit_kernel:
    381         b     exit_kernel       /* ƒJ[ƒlƒ‹‚̏I—¹ˆ—‚ðŒÄ‚Ô */
    382 
    383 
    384 /*
    385  *  ”÷­ŽžŠÔ‘Ò‚¿
     376        b     exit_kernel       /* カーネルの終了処理を呼ぶ */
     377
     378
     379/*
     380 *  微少時間待ち
    386381 */
    387382        .text
Note: See TracChangeset for help on using the changeset viewer.