Ignore:
Timestamp:
Jun 8, 2018, 11:24:32 AM (6 years ago)
Author:
nmir-saito
Message:

set svn:mime-type to files

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ssp_aarch64/trunk/arm64_gcc/prc_support.S

    • Property svn:mime-type set to text/plain; charset=utf-8
    r353 r356  
    88 *             Nagoya Municipal Industrial Research Institute, JAPAN
    99 *
    10  *  上記著作権è€
    11 ã¯ï¼Œä»¥ä¸‹ã®(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
    12  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
    13  *  変・再é
    14 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    15  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    16  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
    17  *      スコード中に含まれていること.
    18  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    19  *      用できる形で再é
    20 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    21 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    22  *      è€
    23 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    24  *      の無保証規定を掲載すること.
    25  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    26  *      用できない形で再é
    27 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    28  *      と.
    29  *    (a) 再é
    30 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    31 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    32  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
    33  *    (b) 再é
    34 å¸ƒã®å½¢æ
    35 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    36  *        報告すること.
    37  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    38  *      害からも,上記著作権è€
    39 ãŠã‚ˆã³TOPPERSプロジェクトをå
    40 è²¬ã™ã‚‹ã“と.
    41  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
    42  *      由に基づく請求からも,上記著作権è€
    43 ãŠã‚ˆã³TOPPERSプロジェクトを
    44  *      å
    45 è²¬ã™ã‚‹ã“と.
    46  *
    47  *  本ソフトウェアは,無保証で提供されているものである.上記著作権è€
    48 ãŠ
    49  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    50  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
    51  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    52  *  の責任を負わない.
    53  *
    54  */
    55 
    56 /*
    57  *  プロセッサ依存モジュール アセンブリ言語部(ARM64用)
     10 *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
     11 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     12 *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     13 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     14 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     15 *      スコード中に含まれていること.
     16 *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     17 *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     18 *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     19 *      の無保証規定を掲載すること.
     20 *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     21 *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     22 *      と.
     23 *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     24 *        作権表示,この利用条件および下記の無保証規定を掲載すること.
     25 *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     26 *        報告すること.
     27 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     28 *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     29 *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     30 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     31 *      免責すること.
     32 *
     33 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     34 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     35 *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     36 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     37 *  の責任を負わない.
     38 *
     39 */
     40
     41/*
     42 *  プロセッサ依存モジュール アセンブリ言語部(ARM64用)
    5843 */
    5944
    6045#define TOPPERS_MACRO_ONLY
    61 #define UINT_C(val)     (val)           /* uint_t型の定数を作るマクロ */
    62 #define ULONG_C(val)    (val)           /* ulong_t型の定数を作るマクロ */
    63 #define CAST(type, val) (val)           /* 型キャストを行うマクロ */
     46#define UINT_C(val)     (val)           /* uint_t型の定数を作るマクロ */
     47#define ULONG_C(val)    (val)           /* ulong_t型の定数を作るマクロ */
     48#define CAST(type, val) (val)           /* 型キャストを行うマクロ */
    6449
    6550#include "kernel_impl.h"
    6651
    6752/*
    68  *  ディスパッチャの動作開始
     53 *  ディスパッチャの動作開始
    6954 */
    7055    .text
     
    7459start_dispatch:
    7560    /*
    76      *  このルーチンは,カーネル起動時に,すべての割込みを禁止した状æ
    77 ‹
    78      * (割込みロック状æ
    79 ‹ã¨åŒç­‰ï¼‰ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
     61     *  このルーチンは,カーネル起動時に,すべての割込みを禁止した状態
     62     * (割込みロック状態と同等)で呼び出される.
    8063     *
    81      *  ここでは dispatcher を呼び出す前の初期設定を行う.
    82      *  (1) システム状æ
    83 ‹ã®åˆæœŸåŒ–.以下の状æ
    84 ‹ã¸ç§»è¡Œã™ã‚‹ï¼Ž
    85      *    ・å
    86 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ
    87 ‹(カーネル管理外の割込み許可)
    88      *    ・CPUロック状æ
    89 ‹(カーネル管理の割込み禁止)
    90      *    ・割込み優å
    91 ˆåº¦ãƒžã‚¹ã‚¯å
    92 ¨è§£é™¤çŠ¶æ
    93 ‹
    94      *    ・ディスパッチ許可状æ
    95 ‹
     64     *  ここでは dispatcher を呼び出す前の初期設定を行う.
     65     *  (1) システム状態の初期化.以下の状態へ移行する.
     66     *    ・全割込みロック解除状態(カーネル管理外の割込み許可)
     67     *    ・CPUロック状態(カーネル管理の割込み禁止)
     68     *    ・割込み優先度マスク全解除状態
     69     *    ・ディスパッチ許可状態
    9670     *
    97      *    (1-1) 割込み優å
    98 ˆåº¦ãƒžã‚¹ã‚¯ã¯ gicc_initializeで,GICC_PMR を初期化することにより
    99      *          すでに(モデル上の)割込み優å
    100 ˆåº¦ãƒžã‚¹ã‚¯å
    101 ¨è§£é™¤çŠ¶æ
    102 ‹ã«ãªã£ã¦ã„る.
    103      *    (1-2) ディスパッチ禁止フラグは task_initialize で disdsp を false に初期化しているため
    104      *          すでにディスパッチ許可状æ
    105 ‹ã«ãªã£ã¦ã„る.
    106      *    (1-3) ここではカーネル管理の割込みを禁止する.
     71     *    (1-1) 割込み優先度マスクは gicc_initializeで,GICC_PMR を初期化することにより
     72     *          すでに(モデル上の)割込み優先度マスク全解除状態になっている.
     73     *    (1-2) ディスパッチ禁止フラグは task_initialize で disdsp を false に初期化しているため
     74     *          すでにディスパッチ許可状態になっている.
     75     *    (1-3) ここではカーネル管理の割込みを禁止する.
    10776     *
    108      *  (2) スタックポインタの初期化
    109      *      start_dispatch が呼び出されるとここに戻ってくることはないため
    110      *      スタックポインタをここで初期化する.
     77     *  (2) スタックポインタの初期化
     78     *      start_dispatch が呼び出されるとここに戻ってくることはないため
     79     *      スタックポインタをここで初期化する.
    11180     */
    11281    ldr x0, =_kernel_istkpt // setup stack
     
    11483    mov sp, x0
    11584
    116     // カーネル管理å†
    117 ã®å‰²è¾¼ã¿ç¦æ­¢
     85    // カーネル管理内の割込み禁止
    11886    msr    daifset, #3
    11987
    120     // dispatcher呼び出し
     88    // dispatcher呼び出し
    12189    b      dispatcher
    12290
    12391/*
    124  *  カーネルの終了処理の呼出し
    125  *
    126  *  スタックを非タスクコンテキスト用に切り替え.
     92 *  カーネルの終了処理の呼出し
     93 *
     94 *  スタックを非タスクコンテキスト用に切り替え.
    12795 *
    12896 */
     
    133101call_exit_kernel:
    134102    /*
    135      *  スタックポインタの初期化
     103     *  スタックポインタの初期化
    136104     */
    137105    ldr    x0, =_kernel_istkpt
     
    139107    mov    sp, x0
    140108
    141     b      exit_kernel       /* カーネルの終了処理を呼ぶ */
    142 
    143 
    144 /*
    145  * 割込み/例外コンテキスト保存処理
     109    b      exit_kernel       /* カーネルの終了処理を呼ぶ */
     110
     111
     112/*
     113 * 割込み/例外コンテキスト保存処理
    146114 */
    147115.macro __save_context
    148116    /*
    149      *  x0 - x29 の保存(x0,x1ペアからx28, x29まで)
     117     *  x0 - x29 の保存(x0,x1ペアからx28, x29まで)
    150118     */
    151119    stp    x1, x0, [sp, #-16]!
     
    166134
    167135    /*
    168      * spsr_el1, x30をペアで保存
     136     * spsr_el1, x30をペアで保存
    169137     */
    170138    mrs    x21, spsr_el1
     
    172140
    173141    /*
    174      * esr_el1, elr_el1 をペアで保存
     142     * esr_el1, elr_el1 をペアで保存
    175143     */
    176144    mrs    x21, esr_el1
     
    179147
    180148    /*
    181      *  SPの調整(16ビットアライメントにする)
     149     *  SPの調整(16ビットアライメントにする)
    182150     */
    183151    mov    x1, #8
    184152    mov    x2, sp
    185     and    x1, x2, x1    // 調整量の計算(0 or 8)
    186     sub    sp, sp, x1    // SPの調整
    187     stp    xzr, x1, [sp, #-16]!  // 調整量を保存
    188 
    189     /*
    190      * 追加の格納領域を確保するため,SPを減算しておく
     153    and    x1, x2, x1    // 調整量の計算(0 or 8)
     154    sub    sp, sp, x1    // SPの調整
     155    stp    xzr, x1, [sp, #-16]!  // 調整量を保存
     156
     157    /*
     158     * 追加の格納領域を確保するため,SPを減算しておく
    191159     */
    192160    sub     sp, sp, #16
     
    194162
    195163/*
    196  * コンテキスト復帰処理
     164 * コンテキスト復帰処理
    197165 */
    198166.macro __restore_context
    199167    /*
    200      * スタックに保存した一部データの破棄(アライメント調整分を考æ
    201 ®)
     168     * スタックに保存した一部データの破棄(アライメント調整分を考慮)
    202169     */
    203170    mov    x1, #40
     
    206173    add    sp, sp, x1
    207174    /*
    208      * ELR/SPSR の復å
    209 ƒ
     175     * ELR/SPSR の復元
    210176     */
    211177    ldp    x21, x22, [sp], #16
     
    213179    msr    spsr_el1, x22
    214180    /*
    215      * x0 - x30 の復å
    216 ƒ
     181     * x0 - x30 の復元
    217182     */
    218183    ldr    x30, [sp], #8
     
    235200
    236201/*
    237  *  割込み/例外の出口処理
    238  *    前提:CPUロック状æ
    239 ‹, ネストカウンタデクリメント済み
     202 *  割込み/例外の出口処理
     203 *    前提:CPUロック状態, ネストカウンタデクリメント済み
    240204 */
    241205    .text
     
    243207    .global ret_int
    244208ret_int:
    245     // 戻りå
    246 ˆã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’確認し,多段割込みならリターン
     209    // 戻り先のコンテキストを確認し,多段割込みならリターン
    247210    ldr    x1, =_kernel_intnest
    248211    ldrb   w3, [x1]
    249212    cbnz   w3, int_return
    250213
    251 ret_int_2:        // 初段の割込みの場合
    252     // reqflg が false なら呼び出しå
    253 ƒã¸æˆ»ã‚‹
     214ret_int_2:        // 初段の割込みの場合
     215    // reqflg が false なら呼び出し元へ戻る
    254216    ldr    x0, =reqflg
    255217    ldr    w1, [x0]
    256218    cbz    w1, int_return
    257219
    258 ret_int_3:        // reqflg が true の場合
     220ret_int_3:        // reqflg が true の場合
    259221    mov    w1, #0        // reqflg = false
    260222    str    w1, [x0]
    261223
    262     // ディスパッチ禁止なら呼び出しå
    263 ƒã¸æˆ»ã‚‹
     224    // ディスパッチ禁止なら呼び出し元へ戻る
    264225    ldr    x0, =disdsp
    265226    ldr    w1, [x0]
     
    267228
    268229    /*
    269      *  é
    270 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチ
    271      *    search_schedtsk の返値(x0)を引数として run_task を呼び出す
     230     *  遅延ディスパッチ
     231     *    search_schedtsk の返値(x0)を引数として run_task を呼び出す
    272232     */
    273233    bl    search_schedtsk
     
    275235
    276236    /*
    277      *  呼び出しå
    278 ƒã¸ãƒªã‚¿ãƒ¼ãƒ³
     237     *  呼び出し元へリターン
    279238     */
    280239int_return:
    281     __restore_context    // レジスタ復帰
     240    __restore_context    // レジスタ復帰
    282241    eret
    283242
    284243/*
    285  *  割込みベクタ
    286  *    最初に割込み発生前のスタックに戻してからレジスタを保存する
    287  *    ハードウェアによってPSTATE.{I,F} がセット済であることを前提とする
     244 *  割込みベクタ
     245 *    最初に割込み発生前のスタックに戻してからレジスタを保存する
     246 *    ハードウェアによってPSTATE.{I,F} がセット済であることを前提とする
    288247 */
    289248    .text
     
    296255
    297256    // Sync EL1
    298     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    299     __save_context
    300     mov    x22, #0                  // 例外番号をx22にセット
     257    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     258    __save_context
     259    mov    x22, #0                  // 例外番号をx22にセット
    301260    b      gic_exc_entry
    302261
    303262    // IRQ EL1
    304263    .align 7
    305     msr    spsel,   #0              // 例外発生前のスタック(SP_EL0)に戻す
     264    msr    spsel,   #0              // 例外発生前のスタック(SP_EL0)に戻す
    306265    __save_context
    307266    b      gic_int_entry
     
    309268    // FIQ EL1
    310269    .align 7
    311     msr    spsel, #0                // 例外発生前のスタック(SP_EL0)へ戻す
     270    msr    spsel, #0                // 例外発生前のスタック(SP_EL0)へ戻す
    312271    __save_context
    313272    b      gic_int_entry
     
    315274    // SError EL1
    316275    .align 7
    317     msr    spsel, #0                // 例外発生前のスタック(SP_EL0)へ戻す
    318     __save_context
    319     mov    x22, #1                  // 例外番号をx22にセット
     276    msr    spsel, #0                // 例外発生前のスタック(SP_EL0)へ戻す
     277    __save_context
     278    mov    x22, #1                  // 例外番号をx22にセット
    320279    b      gic_exc_entry
    321280
     
    327286    .align 7
    328287    __save_context
    329     mov    x22, #2                  // 例外番号をx22にセット
     288    mov    x22, #2                  // 例外番号をx22にセット
    330289    b      gic_exc_entry
    331290
     
    343302    .align 7
    344303    __save_context
    345     mov    x22, #3                  // 例外番号をx22にセット
     304    mov    x22, #3                  // 例外番号をx22にセット
    346305    b      gic_exc_entry
    347306
     
    352311    // Sync EL0
    353312    .align 7
    354     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    355     __save_context
    356     mov    x22, #4                  // 例外番号をx22にセット
     313    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     314    __save_context
     315    mov    x22, #4                  // 例外番号をx22にセット
    357316    b      gic_exc_entry
    358317
    359318   // IRQ EL0
    360319    .align 7
    361     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     320    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    362321    __save_context
    363322    b      gic_int_entry
     
    365324    // FIQ EL0
    366325    .align 7
    367     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     326    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    368327    __save_context
    369328    b      gic_int_entry
     
    371330    // Error EL0
    372331    .align 7
    373     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    374     __save_context
    375     mov    x22, #5                  // 例外番号をx22にセット
     332    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     333    __save_context
     334    mov    x22, #5                  // 例外番号をx22にセット
    376335    b      gic_exc_entry
    377336
     
    382341    // AArch32 sync
    383342    .align 7
    384     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    385     __save_context
    386     mov    x22, #6                  // 例外番号をx22にセット
     343    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     344    __save_context
     345    mov    x22, #6                  // 例外番号をx22にセット
    387346    b      gic_exc_entry
    388347
    389348    // AArch32 IRQ
    390349    .align 7
    391     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     350    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    392351    __save_context
    393352    b      gic_int_entry
     
    395354    // AArch32 FIQ
    396355    .align 7
    397     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     356    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    398357    __save_context
    399358    b      gic_int_entry
     
    401360    // AArch32 Error
    402361    .align 7
    403     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    404     __save_context
    405     mov    x22, #7                  // 例外番号をx22にセット
    406     b      gic_exc_entry
     362    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     363    __save_context
     364    mov    x22, #7                  // 例外番号をx22にセット
     365    b      gic_exc_entry
Note: See TracChangeset for help on using the changeset viewer.