Ignore:
Timestamp:
Apr 17, 2019, 12:13:00 PM (5 years ago)
Author:
nmir-saito
Message:

modify svn:mimetype of files

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ssp_rpi3/trunk/arch/arm64_gcc/common/core_support.S

    • Property svn:mime-type set to text/plain; charset=utf-8
    r384 r386  
    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 UINT64_C(val)   (val)           /* uint64_t型の定数を作るマクロ */
    64 #define CAST(type, val) (val)           /* 型キャストを行うマクロ */
     46#define UINT_C(val)     (val)           /* uint_t型の定数を作るマクロ */
     47#define ULONG_C(val)    (val)           /* ulong_t型の定数を作るマクロ */
     48#define UINT64_C(val)   (val)           /* uint64_t型の定数を作るマクロ */
     49#define CAST(type, val) (val)           /* 型キャストを行うマクロ */
    6550
    6651#include "kernel_impl.h"
    6752
    6853/*
    69  *  ディスパッチャの動作開始
     54 *  ディスパッチャの動作開始
    7055 */
    7156    .text
     
    7560start_dispatch:
    7661    /*
    77      *  このルーチンは,カーネル起動時に,以下の状æ
    78 ‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
    79      *    ・すべての割込みを禁止した状æ
    80 ‹å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    81 ‹ã¨åŒç­‰ï¼‰
    82      *    ・割込み優å
    83 ˆåº¦ãƒžã‚¹ã‚¯å
    84 ¨è§£é™¤çŠ¶æ
    85 ‹
     62     *  このルーチンは,カーネル起動時に,以下の状態で呼び出される.
     63     *    ・すべての割込みを禁止した状態割込みロック状態と同等)
     64     *    ・割込み優先度マスク全解除状態
    8665     *
    87      *  ここでは dispatcher を呼び出す前の初期設定を行う.
    88      *  (1) システム状æ
    89 ‹ã®åˆæœŸåŒ–.以下の状æ
    90 ‹ã¸ç§»è¡Œã™ã‚‹ï¼Ž
    91      *    ・å
    92 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯è§£é™¤çŠ¶æ
    93 ‹(カーネル管理外の割込み許可)
    94      *    ・CPUロック状æ
    95 ‹(カーネル管理の割込み禁止)
    96      *    ・割込み優å
    97 ˆåº¦ãƒžã‚¹ã‚¯å
    98 ¨è§£é™¤çŠ¶æ
    99 ‹
    100      *    ・ディスパッチ許可状æ
    101 ‹
     66     *  ここでは dispatcher を呼び出す前の初期設定を行う.
     67     *  (1) システム状態の初期化.以下の状態へ移行する.
     68     *    ・全割込みロック解除状態(カーネル管理外の割込み許可)
     69     *    ・CPUロック状態(カーネル管理の割込み禁止)
     70     *    ・割込み優先度マスク全解除状態
     71     *    ・ディスパッチ許可状態
    10272     *
    103      *    (1-1) 割込み優å
    104 ˆåº¦ãƒžã‚¹ã‚¯ã¯å‰æã‚ˆã‚Šã™ã§ã«
    105      *          モデル上の)割込み優å
    106 ˆåº¦ãƒžã‚¹ã‚¯å
    107 ¨è§£é™¤çŠ¶æ
    108 ‹ã«ãªã£ã¦ã„る.
    109      *    (1-2) ディスパッチ禁止フラグは task_initialize で disdsp を false に
    110      *          初期化しているため,すでにディスパッチ許可状æ
    111 ‹ã«ãªã£ã¦ã„る.
    112      *    (1-3) ここでは割込みロック状æ
    113 ‹ã‚’解除し,CPUロック状æ
    114 ‹ã®è¨­å®šã‚’行う.
     73     *    (1-1) 割込み優先度マスクは前提よりすでに
     74     *          モデル上の)割込み優先度マスク全解除状態になっている.
     75     *    (1-2) ディスパッチ禁止フラグは task_initialize で disdsp を false に
     76     *          初期化しているため,すでにディスパッチ許可状態になっている.
     77     *    (1-3) ここでは割込みロック状態を解除し,CPUロック状態の設定を行う.
    11578     *
    116      *  (2) スタックポインタの初期化
    117      *      start_dispatch が呼び出されると,今後ここに戻ってくることはないため
    118      *      スタックポインタをここで初期化する.
     79     *  (2) スタックポインタの初期化
     80     *      start_dispatch が呼び出されると,今後ここに戻ってくることはないため
     81     *      スタックポインタをここで初期化する.
    11982     */
    12083    ldr x0, =_kernel_istkpt // setup stack
     
    12285    mov sp, x0
    12386
    124     // F フラグをクリア(割込みロック解除,CPUロック相当)
     87    // F フラグをクリア(割込みロック解除,CPUロック相当)
    12588    msr   daifclr, #AARCH64_DAIF_FIQ
    12689
    127     // dispatcher呼び出し
     90    // dispatcher呼び出し
    12891    b      dispatcher
    12992
    13093/*
    131  *  カーネルの終了処理の呼出し
    132  *
    133  *  スタックを非タスクコンテキスト用に切り替え.
     94 *  カーネルの終了処理の呼出し
     95 *
     96 *  スタックを非タスクコンテキスト用に切り替え.
    13497 *
    13598 */
     
    140103call_exit_kernel:
    141104    /*
    142      *  スタックポインタの初期化
     105     *  スタックポインタの初期化
    143106     */
    144107    ldr    x0, =_kernel_istkpt
     
    146109    mov    sp, x0
    147110
    148     // å
    149 ¨ã¦ã®ä¾‹å¤–をマスク(å
    150 ¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ç›¸å½“)
     111    // 全ての例外をマスク(全割込みロック相当)
    151112    msr    daifset, #(AARCH64_DAIF_ALL)
    152113
    153     b      exit_kernel       /* カーネルの終了処理を呼ぶ */
    154 
    155 
    156 /*
    157  * 割込み/例外コンテキスト保存処理
     114    b      exit_kernel       /* カーネルの終了処理を呼ぶ */
     115
     116
     117/*
     118 * 割込み/例外コンテキスト保存処理
    158119 */
    159120.macro __save_context
    160121    /*
    161      *  x0 - x29 の保存(x0,x1ペアからx28, x29まで)
     122     *  x0 - x29 の保存(x0,x1ペアからx28, x29まで)
    162123     */
    163124    stp    x1, x0, [sp, #-16]!
     
    178139
    179140    /*
    180      * spsr_el1, x30をペアで保存
     141     * spsr_el1, x30をペアで保存
    181142     */
    182143    mrs    x21, spsr_el1
     
    184145
    185146    /*
    186      * esr_el1, elr_el1 をペアで保存
     147     * esr_el1, elr_el1 をペアで保存
    187148     */
    188149    mrs    x21, esr_el1
     
    191152
    192153    /*
    193      * 追加の格納領域を確保するため,SPを減算しておく
     154     * 追加の格納領域を確保するため,SPを減算しておく
    194155     */
    195156    sub     sp, sp, #16
     
    197158
    198159/*
    199  * コンテキスト復帰処理
     160 * コンテキスト復帰処理
    200161 */
    201162.macro __restore_context
    202163    /*
    203      * スタックに保存した一部データの破棄
     164     * スタックに保存した一部データの破棄
    204165     */
    205166    mov    x1, #16
    206167    add    sp, sp, x1
    207168    /*
    208      * ELR の復å
    209 ƒ(ESRは破棄)
     169     * ELR の復元(ESRは破棄)
    210170     */
    211171    ldp    x21, x22, [sp], #16
    212172    msr    elr_el1, x22
    213173    /*
    214      * SPSR/x30 の復å
    215 ƒ
     174     * SPSR/x30 の復元
    216175     */
    217176    ldp    x21, x30, [sp], #16
     
    219178
    220179    /*
    221      * x0 - x29 の復å
    222 ƒ
     180     * x0 - x29 の復元
    223181     */
    224182    ldp    x29, x28, [sp], #16
     
    240198
    241199/*
    242  *  (カーネル管理外の)CPU例外/FIQの出口処理
     200 *  (カーネル管理外の)CPU例外/FIQの出口処理
    243201 */
    244202    .text
     
    248206ret_exc:
    249207ret_fiq:
    250     __restore_context    // レジスタ復帰
     208    __restore_context    // レジスタ復帰
    251209    eret
    252210
    253211/*
    254  *  割込み/(カーネル管理の)CPU例外の出口処理
    255  *    前提:CPUロック状æ
    256 ‹, ネストカウンタデクリメント済み
     212 *  割込み/(カーネル管理の)CPU例外の出口処理
     213 *    前提:CPUロック状態, ネストカウンタデクリメント済み
    257214 */
    258215    .text
     
    260217    .global ret_int
    261218ret_int:
    262     // 戻りå
    263 ˆã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’確認し,多段割込みならリターン
     219    // 戻り先のコンテキストを確認し,多段割込みならリターン
    264220    ldr    x1, =_kernel_intnest
    265221    ldrb   w3, [x1]
    266222    cbnz   w3, int_return
    267223
    268 ret_int_2:        // 初段の割込みの場合
    269     // reqflg が false なら呼び出しå
    270 ƒã¸æˆ»ã‚‹
     224ret_int_2:        // 初段の割込みの場合
     225    // reqflg が false なら呼び出し元へ戻る
    271226    ldr    x0, =reqflg
    272227    ldr    w1, [x0]
    273228    cbz    w1, int_return
    274229
    275 ret_int_3:        // reqflg が true の場合
     230ret_int_3:        // reqflg が true の場合
    276231    mov    w1, #0        // reqflg = false
    277232    str    w1, [x0]
    278233
    279     // ディスパッチ禁止なら呼び出しå
    280 ƒã¸æˆ»ã‚‹
     234    // ディスパッチ禁止なら呼び出し元へ戻る
    281235    ldr    x0, =disdsp
    282236    ldr    w1, [x0]
     
    284238
    285239    /*
    286      *  é
    287 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチ
    288      *    search_schedtsk の返値(x0)を引数として run_task を呼び出す
     240     *  遅延ディスパッチ
     241     *    search_schedtsk の返値(x0)を引数として run_task を呼び出す
    289242     */
    290243    bl    search_schedtsk
     
    292245
    293246    /*
    294      *  呼び出しå
    295 ƒã¸ãƒªã‚¿ãƒ¼ãƒ³
     247     *  呼び出し元へリターン
    296248     */
    297249int_return:
    298     __restore_context    // レジスタ復帰
     250    __restore_context    // レジスタ復帰
    299251    eret
    300252
    301253/*
    302  *  割込みベクタ
    303  *    最初に割込み発生前のスタックに戻してからレジスタを保存する
    304  *    ハードウェアによってPSTATE.{I,F} がセット済であることを前提とする
     254 *  割込みベクタ
     255 *    最初に割込み発生前のスタックに戻してからレジスタを保存する
     256 *    ハードウェアによってPSTATE.{I,F} がセット済であることを前提とする
    305257 */
    306258    .text
     
    313265
    314266    // Sync EL1
    315     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    316     __save_context
    317     mov    x22, #0                  // 例外番号をx22にセット
     267    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     268    __save_context
     269    mov    x22, #0                  // 例外番号をx22にセット
    318270    b      chip_exc_entry
    319271
    320272    // IRQ EL1
    321273    .align 7
    322     msr    spsel,   #0              // 例外発生前のスタック(SP_EL0)に戻す
     274    msr    spsel,   #0              // 例外発生前のスタック(SP_EL0)に戻す
    323275    __save_context
    324276    b      chip_int_entry
     
    326278    // FIQ EL1
    327279    .align 7
    328     msr    spsel, #0                // 例外発生前のスタック(SP_EL0)へ戻す
     280    msr    spsel, #0                // 例外発生前のスタック(SP_EL0)へ戻す
    329281    __save_context
    330282    b      chip_fiq_entry
     
    332284    // SError EL1
    333285    .align 7
    334     msr    spsel, #0                // 例外発生前のスタック(SP_EL0)へ戻す
    335     __save_context
    336     mov    x22, #1                  // 例外番号をx22にセット
     286    msr    spsel, #0                // 例外発生前のスタック(SP_EL0)へ戻す
     287    __save_context
     288    mov    x22, #1                  // 例外番号をx22にセット
    337289    b      chip_exc_entry
    338290
     
    344296    .align 7
    345297    __save_context
    346     mov    x22, #2                  // 例外番号をx22にセット
     298    mov    x22, #2                  // 例外番号をx22にセット
    347299    b      chip_exc_entry
    348300
     
    360312    .align 7
    361313    __save_context
    362     mov    x22, #3                  // 例外番号をx22にセット
     314    mov    x22, #3                  // 例外番号をx22にセット
    363315    b      chip_exc_entry
    364316
     
    369321    // Sync EL0
    370322    .align 7
    371     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    372     __save_context
    373     mov    x22, #4                  // 例外番号をx22にセット
     323    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     324    __save_context
     325    mov    x22, #4                  // 例外番号をx22にセット
    374326    b      chip_exc_entry
    375327
    376328   // IRQ EL0
    377329    .align 7
    378     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     330    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    379331    __save_context
    380332    b      chip_int_entry
     
    382334    // FIQ EL0
    383335    .align 7
    384     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     336    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    385337    __save_context
    386338    b      chip_fiq_entry
     
    388340    // Error EL0
    389341    .align 7
    390     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    391     __save_context
    392     mov    x22, #5                  // 例外番号をx22にセット
     342    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     343    __save_context
     344    mov    x22, #5                  // 例外番号をx22にセット
    393345    b      chip_exc_entry
    394346
     
    399351    // AArch32 sync
    400352    .align 7
    401     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    402     __save_context
    403     mov    x22, #6                  // 例外番号をx22にセット
     353    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     354    __save_context
     355    mov    x22, #6                  // 例外番号をx22にセット
    404356    b      chip_exc_entry
    405357
    406358    // AArch32 IRQ
    407359    .align 7
    408     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     360    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    409361    __save_context
    410362    b      chip_int_entry
     
    412364    // AArch32 FIQ
    413365    .align 7
    414     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     366    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    415367    __save_context
    416368    b      chip_fiq_entry
     
    418370    // AArch32 Error
    419371    .align 7
    420     msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
    421     __save_context
    422     mov    x22, #7                  // 例外番号をx22にセット
    423     b      chip_exc_entry
     372    msr    spsel,  #0               // 例外発生前のスタック(SP_EL0)に戻す
     373    __save_context
     374    mov    x22, #7                  // 例外番号をx22にセット
     375    b      chip_exc_entry
Note: See TracChangeset for help on using the changeset viewer.