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_design.txt

    • Property svn:mime-type set to text/plain; charset=utf-8
    r384 r386  
    11=====================================================================
    2                          ARM64プロセッサ依存部設計メモ
     2                         ARM64プロセッサ依存部設計メモ
    33                                  Last Modified: 16 Apr 2019
    44=====================================================================
    55
    6 â—‹ このドキュメントの位置づけ
    7 
    8 ã“のドキュメントは,TOPPERS/SSPカーネルをARMv8-Aプロセッサに移植する際
    9 ã®è¨­è¨ˆãƒ¡ãƒ¢ã§ã‚る.
    10 
    11 
    12 â—‹ ARMv8-Aの仕様まとめ
    13 
    14 ARMv8-Aの仕様のうち,カーネルの設計に関係する事é 
    15 ã«ã¤ã„てまとめる.
    16 
    17 â— レジスタ
    18 
    19 æ±Žç”¨ãƒ¬ã‚¸ã‚¹ã‚¿ã¯r0〜r30 (特に64ビットレジスタはX0..X30で表現)の31種類からなる.
    20 ï¼ˆå‚考)「Procedure Call Standard for the ARM 64-bit Architecture」
    21 
    22 r0...r7    Parameter/result registers(引数および返値の受け渡し用)
    23 r8         Indirect result location register (大きなデータ構造を
    24            è¿”値として返す場合など,呼び出し側が結果を取り出すために
    25            é–“接アドレッシングを多用する際,そのベースアドレスを受け渡し
    26            ã™ã‚‹ãŸã‚ã«ä½¿ã‚ã‚Œã‚‹)
    27 r9..r15    Caller-saved Temporary registers(呼び出し側で保存すべきレジスタ)
     6○ このドキュメントの位置づけ
     7
     8このドキュメントは,TOPPERS/SSPカーネルをARMv8-Aプロセッサに移植する際
     9の設計メモである.
     10
     11
     12○ ARMv8-Aの仕様まとめ
     13
     14ARMv8-Aの仕様のうち,カーネルの設計に関係する事項についてまとめる.
     15
     16● レジスタ
     17
     18汎用レジスタはr0〜r30 (特に64ビットレジスタはX0..X30で表現)の31種類からなる.
     19(参考)「Procedure Call Standard for the ARM 64-bit Architecture」
     20
     21r0...r7    Parameter/result registers(引数および返値の受け渡し用)
     22r8         Indirect result location register (大きなデータ構造を
     23           返値として返す場合など,呼び出し側が結果を取り出すために
     24           間接アドレッシングを多用する際,そのベースアドレスを受け渡し
     25           するために使われる)
     26r9..r15    Caller-saved Temporary registers(呼び出し側で保存すべきレジスタ)
    2827r16(IP0)   The first intra-procedure-call scratch register
    29            ãƒªãƒ³ã‚«ã«ã‚ˆã£ã¦ veneer(注1) および PLT(Procedure Linkage Table,注2) コード
    30            ã®å‘¼ã³å‡ºã—で使われる.それ以外の時はテンポラリレジスタとして使われることもある.
    31            (注1)リンカによって挿å
    32 ¥ã•ã‚Œã‚‹å°ã•ãªã‚³ãƒ¼ãƒ‰ç‰‡ã§ï¼Œ
    33                 分岐命令のターゲットが範囲外の場合などに使われる
    34            (注2)å
    35 ±æœ‰ãƒ©ã‚¤ãƒ–ラリの呼び出しでシンボル解決を行うために使用される
    36                 関数テーブル
    37 r17(IP1)   The second intra-procedure-call temporary register(r16と役割は同じ)
    38 r18        The Platform Register(プラットフォームABIで使用されるレジスタ.
    39            ABIで使われない場合はテンポラリレジスタとして使われる)
    40 r19..r28   Callee-saved registers(呼び出された側で保存して使うレジスタ)
    41 r29(FP)    The Frame Pointer(フレームポインタ)
    42 r30(LR)    The Link Register(リンクレジスタ)
    43 
    44 SSPカーネルのアセンブラによる実è£
    45 ã§ã¯r8, r16...r18は使用していない.
    46 
    47 
    48 â— コーリングコンベンション
    49 
    50 r0...r7 が引数および返値に使われる.
    51 ARMにより規定されているため,コンパイラに依存せずこのルールとなる
    52 
    53 
    54 â— PSTATE
    55 
    56 AArch64ではプロセッサの状æ
    57 ‹ã‚’表すフラグの集まりをまとめてPSTATEと呼び,
    58 ãã‚Œãžã‚Œã®ãƒ•ãƒ©ã‚°ã¸åˆ¥ã€
    59 ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã®ç‰¹åˆ¥ãªãƒ¬ã‚¸ã‚¹ã‚¿åãŒå®šç¾©ã•ã‚Œã¦ã„る.
    60 
    61 PSTATEの詳細は,ARM Architecture Reference Manual
    62 ARMv8, for ARMv8-A architecture profile の D1.7 などを参ç
    63 §ã®ã“と.
    64 
    65 ãƒ»spsel
    66 EL1より上の例外レベルでは,spsel という特別な名称のレジスタにアクセスし,
    67 PSTATE.SPフラグの値をセットして使用スタックの切り替えを行う.
    68 
    69 ãƒ»daif
    70 daif という名称のレジスタを使用してPSTATEのD,A,I,Fビットを操作し,
    71 å„種例外および割込みの禁止/許可を制御する
    72 
    73 
    74 SSPカーネルの実è£
    75 ã§ã¯ï¼Œã‚¹ã‚¿ãƒƒã‚¯ã¯SP_EL1のみを使用する.
    76 ã¾ãŸï¼ŒCPUロック状æ
    77 ‹ãŠã‚ˆã³å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    78 ‹ã®å®Ÿè£
    79 ã«PSTATEのIおよびFフラグを
    80 åˆ©ç”¨ã—ている.
    81 
    82 
    83 â— 割込みベクタ
    84 
    85 ãƒ™ã‚¯ã‚¿ãƒ†ãƒ¼ãƒ–ルのアドレスはリセット時に,システムレジスタの一つVector Base
    86 Address Register(VBAR, システムレジスタ)にアドレスをセットすることで,
    87 2048バイト境界の任意のアドレスにé
    88 ç½®å¯èƒ½ã§ã‚る.
    89 
    90 SSPカーネルの実è£
    91 ã§ã¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚¢ãƒƒãƒ—ルーチンで設定している.
    92 
    93 
    94 â— 割込み
    95 
    96 ã“こではGICを搭載するプロセッサの場合について述べる.
    97 ãã‚Œä»¥å¤–の場合についてはチップ依存部のドキュメントに記載する.
    98 
    99 
    100 â—å‰²è¾¼ã¿å„ªå
    101 ˆåº¦
    102 
    103 GICにおいては割込み優å
    104 ˆåº¦ã¯è¨­å®šå€¤ã®å°ã•ã„方が高優å
    105 ˆåº¦ã¨ãªã‚‹ï¼Ž
    106 
    107ʌ㻌
    108 ˆåº¦ã¯æœ€å¤§8bitであり,SoC毎に実è£
    109 ã•ã‚Œã¦ã„るビットå¹
    110 ãŒç•°ãªã‚‹ï¼Žå®Ÿè£
    111 ã•
    112 ã‚Œã‚‹ãƒ“ットが8bit以下の場合は,LSBから無効になる.例えば,実è£
    113 ã•ã‚Œã¦ã„
    114 ã‚‹ãƒ“ットå¹
    115 ãŒ7bitの場合は,ビット0が無効となる.
    116 
    117ʌ㻌
    118 ˆåº¦ã®ãƒ“ットフィールドのLSBから数ビットをサブ優å
    119 ˆåº¦ã¨å‘¼ã¶ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰
    120 ã«è¨­å®šã™ã‚‹ã“とが可能である.残りの上位ビットをプリエンプション優å
    121 ˆåº¦ã¨
    122 å‘¼ã¶ï¼Žãƒ—リエンプション優å
    123 ˆåº¦ãŒåŒã˜ã§ï¼Œã‚µãƒ–優å
    124 ˆåº¦ãŒç•°ãªã‚‹å„ªå
    125 ˆåº¦ã®ã‚°ãƒ«ãƒ¼
    126 ãƒ—は,お互いをプリエンプトすることができない.
    127 
    128 ä¾‹ã¨ã—て,QEMU Virtボード向けSSPの実è£
    129 ã§ã¯ Cortex-A53プロセッサを
    130 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¨ã—ており,優å
    131 ˆåº¦ã¯16段階(4bit)でビット0から3が無効である.
    132 
    133 â—å‰²è¾¼ã¿/例外の受付
    134 
    135 GICの場合,割込みを受け付けると受け付けた割込みの番号がGICC_IARにセットされる.
    136 å‰²è¾¼ã¿ç•ªå·ã¯ã“のレジスタにセットされる値を使用する.
    137 
    138 ä¾‹å¤–番号は,例外発生時のプロセッサ状æ
    139 ‹ã«å¿œã˜ã¦æ±ºå®šã•ã‚Œã‚‹ï¼Œãƒ™ã‚¯ã‚¿ãƒ†ãƒ¼ãƒ–ル中の
    140 ã‚¸ãƒ£ãƒ³ãƒ—å
    141 ˆã‚ªãƒ•ã‚»ãƒƒãƒˆæ¯Žã«ç•°ãªã‚‹ç•ªå·ã‚’割り振ることにしている.
    142 
    143   例外発生時の状æ
    144 ‹             ä¾‹å¤–の種類      例外番号  例外ベクタå
    145 ˆé ­ã‹ã‚‰ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ
     28           リンカによって veneer(注1) および PLT(Procedure Linkage Table,注2) コード
     29           の呼び出しで使われる.それ以外の時はテンポラリレジスタとして使われることもある.
     30           (注1)リンカによって挿入される小さなコード片で,
     31                分岐命令のターゲットが範囲外の場合などに使われる
     32           (注2)共有ライブラリの呼び出しでシンボル解決を行うために使用される
     33                関数テーブル
     34r17(IP1)   The second intra-procedure-call temporary register(r16と役割は同じ)
     35r18        The Platform Register(プラットフォームABIで使用されるレジスタ.
     36           ABIで使われない場合はテンポラリレジスタとして使われる)
     37r19..r28   Callee-saved registers(呼び出された側で保存して使うレジスタ)
     38r29(FP)    The Frame Pointer(フレームポインタ)
     39r30(LR)    The Link Register(リンクレジスタ)
     40
     41SSPカーネルのアセンブラによる実装ではr8, r16...r18は使用していない.
     42
     43
     44● コーリングコンベンション
     45
     46r0...r7 が引数および返値に使われる.
     47ARMにより規定されているため,コンパイラに依存せずこのルールとなる
     48
     49
     50● PSTATE
     51
     52AArch64ではプロセッサの状態を表すフラグの集まりをまとめてPSTATEと呼び,
     53それぞれのフラグへ別々にアクセスするための特別なレジスタ名が定義されている.
     54
     55PSTATEの詳細は,ARM Architecture Reference Manual
     56ARMv8, for ARMv8-A architecture profile の D1.7 などを参照のこと.
     57
     58・spsel
     59EL1より上の例外レベルでは,spsel という特別な名称のレジスタにアクセスし,
     60PSTATE.SPフラグの値をセットして使用スタックの切り替えを行う.
     61
     62・daif
     63daif という名称のレジスタを使用してPSTATEのD,A,I,Fビットを操作し,
     64各種例外および割込みの禁止/許可を制御する
     65
     66
     67SSPカーネルの実装では,スタックはSP_EL1のみを使用する.
     68また,CPUロック状態および割込みロック状態の実装にPSTATEのIおよびFフラグを
     69利用している.
     70
     71
     72● 割込みベクタ
     73
     74ベクタテーブルのアドレスはリセット時に,システムレジスタの一つVector Base
     75Address Register(VBAR, システムレジスタ)にアドレスをセットすることで,
     762048バイト境界の任意のアドレスに配置可能である.
     77
     78SSPカーネルの実装ではスタートアップルーチンで設定している.
     79
     80
     81● 割込み
     82
     83ここではGICを搭載するプロセッサの場合について述べる.
     84それ以外の場合についてはチップ依存部のドキュメントに記載する.
     85
     86
     87●割込み優先度
     88
     89GICにおいては割込み優先度は設定値の小さい方が高優先度となる.
     90
     91優先度は最大8bitであり,SoC毎に実装されているビット幅が異なる.実装さ
     92れるビットが8bit以下の場合は,LSBから無効になる.例えば,実装されてい
     93るビット幅が7bitの場合は,ビット0が無効となる.
     94
     95優先度のビットフィールドのLSBから数ビットをサブ優先度と呼ぶフィールド
     96に設定することが可能である.残りの上位ビットをプリエンプション優先度と
     97呼ぶ.プリエンプション優先度が同じで,サブ優先度が異なる優先度のグルー
     98プは,お互いをプリエンプトすることができない.
     99
     100例として,QEMU Virtボード向けSSPの実装では Cortex-A53プロセッサを
     101ターゲットとしており,優先度は16段階(4bit)でビット0から3が無効である.
     102
     103●割込み/例外の受付
     104
     105GICの場合,割込みを受け付けると受け付けた割込みの番号がGICC_IARにセットされる.
     106割込み番号はこのレジスタにセットされる値を使用する.
     107
     108例外番号は,例外発生時のプロセッサ状態に応じて決定される,ベクタテーブル中の
     109ジャンプ先オフセット毎に異なる番号を割り振ることにしている.
     110
     111  例外発生時の状態             例外の種類      例外番号  例外ベクタ先頭からのオフセット
    146112  AArch64, EL1t(EL1, SP_EL0)  Synchronous         0        0x0000
    147113  AArch64, EL1t(EL1, SP_EL0)  SError              1        0x0180
     
    153119  AArch32, EL0 (EL0, SP_EL0)  SError              7        0x0780
    154120
    155 å‰²è¾¼ã¿ã‚’受け付けた際,受け付けた割込みに設定された優å
    156 ˆåº¦ã‚ˆã‚Šä½Žã„割込みを
    157 ç¦æ­¢ã™ã‚‹ãŸã‚ï¼ŒGICC_RPRから取得した割込み要因の割込み優å
    158 ˆåº¦ã‚’ GICC_PMRへ
    159 ã‚»ãƒƒãƒˆã—ている.そしてハンドラ終了後に割込み発生前の割り込み優å
    160 ˆåº¦ã«æˆ»ã™ï¼Ž
    161 
    162 
    163 [CPUモード]
    164 
    165 ãƒ—ロセッサは,EL0からEL3までの例外レベルのいずれかで動作する.
    166 ã¾ãŸãã‚Œãžã‚Œã®ãƒ¬ãƒ™ãƒ«ã§64ビットモード(AArch64) または32ビットモード(AArch32)を
    167 é¸æŠžã™ã‚‹ã“とができる.ただし,ある例外レベルが32ビットモードで動作する場合は
    168 ãã‚Œã‚ˆã‚Šä½Žã„例外レベルでは64ビットモードを選択することができない.
    169 
    170 ã¾ãŸï¼Œã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£æ‹¡å¼µæ©Ÿèƒ½ã‚’搭載するプロセッサではセキュアモードおよび
    171 éžã‚»ã‚­ãƒ¥ã‚¢ãƒ¢ãƒ¼ãƒ‰ã‚’選択することができる.
    172 
    173 SSPの実è£
    174 ã§ã¯ï¼Œ64ビットモード(AArch64),非セキュア,例外レベル1(EL1) で動作する.
    175 
    176 
    177 â—ãƒªã‚»ãƒƒãƒˆæ™‚の状æ
    178 ‹
    179 
    180 ãƒªã‚»ãƒƒãƒˆæ™‚はプロセッサチップがサポートする最大の例外レベルおよびそのレベルの
    181 ã‚¹ã‚¿ãƒƒã‚¯(SP_ELx)が有効となっている.
    182 
    183 ä¾‹ã¨ã—てQEMU向けVirtボード(Cortex-A53) では,既定でEL1が最大例外レベルのため
    184 ãƒªã‚»ãƒƒãƒˆç›´å¾Œã¯SP_EL1が有効となっている.
    185 
    186 
    187 â— スタックポインタ(SP_EL0とSP_ELx)
    188 
    189 ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ã¯ï¼Œä¾‹å¤–レベル0のスタックポインタ(SP_EL0)および実行中の
    190 ä¾‹å¤–レベルのスタックポインタ(SP_ELx)が選択可能である.
    191 ã‚¹ã‚¿ãƒƒã‚¯ã®é¸æŠžã¯spselレジスタへ1を設定するとSP_ELxを,0を設定すると
    192 SP_EL0 を選択する.
    193 
    194 SSPの実è£
    195 ã§ã¯ï¼ŒEL1 で SP_EL1 のみを使用して動作する.
    196 
    197 
    198 â—ä¾‹å¤–レベルの遷移
    199 
    200 ä¾‹å¤–レベル(EL)の遷移は割込み/例外の受付および例外リターン命令(eret)により行う.
    201 
    202 å‰²è¾¼ã¿ãŠã‚ˆã³ä¾‹å¤–を受け付けることで発生前と同じまたはより高い例外レベルへ遷移する.
    203 ä¸€æ–¹ï¼ŒåŒã˜ã¾ãŸã¯ã‚ˆã‚Šä½Žã„例外レベルへの遷移は例外リターン命令(eret)により行う.
    204 
    205 å—付時の遷移å
    206 ˆã¨ãªã‚‹ä¾‹å¤–レベルの指定はシステムレジスタにより設定することで行う.
    207 å‰²è¾¼ã¿/例外リターン時の遷移å
    208 ˆã¨ãªã‚‹ä¾‹å¤–レベルは,SPSR_ELxのビット2および3で
    209 æŒ‡å®šã™ã‚‹ï¼Žå‰²è¾¼ã¿/例外受付時,PSTATEの状æ
    210 ‹ãŒSPSR_ELxに,リターンアドレスがELR_ELxに,
    211 ãã‚Œãžã‚Œä¿å­˜ã•ã‚Œeret命令の実行によりその格納値が復帰されるため,eret実行前に
    212 ã‚らかじめSPSR_ELxにセットしておくことで指定した例外レベルへ遷移することが可能である.
    213 åŒã˜ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§ä½¿ç”¨ã‚¹ã‚¿ãƒƒã‚¯ã‚„64ビット/32ビットモードの指定も行うことができる.
    214 
    215 QEMU Virt向けSSPの実è£
    216 ã§ã¯EL1のみを使用するため,例外レベル間の遷移処理は行っていない.
    217 
    218 
    219 â—ä¾‹å¤–レベルの判定
    220 
    221 ç¾çŠ¶ã®ä¾‹å¤–レベルを判定するには,CPSRのビット2およびビット3の値を使用する.
    222 bit[3:2]の値が
    223     '11'の場合:EL3
    224     '10'の場合:EL2
    225     '01'の場合:EL1
    226     '00'の場合:EL0
    227 
    228 â—GICC_PMRレジスタ
    229 
    230 è¨­å®šã—た優å
    231 ˆåº¦ä»¥ä¸‹(値としては以上)の優å
    232 ˆåº¦ã®å‰²è¾¼ã¿ã®å—付を禁止する.
    233 è¨­å®šå¯èƒ½ãªæœ€å¤§å€¤ã‚’設定すると,å
    234 ¨ã¦ã®å‰²è¾¼ã¿ã‚’許可する.
    235 ä¾‹ãˆã°å„ªå
    236 ˆåº¦ãŒ16段階の場合は0xf0(=0x0f << 4)をセットするとすべての割込み許可
    237 ã¨ãªã‚‹ï¼Žå€¤ã¯ä¾‹å¤–/割込みの受付とリターンにより変化しないため,受け付けた割込み
    238 ã®å„ªå
    239 ˆåº¦ã‚’割込みのå
    240 ¥å£å‡¦ç†ã§è¨­å®šã™ã‚‹å¿
    241 è¦ãŒã‚る.
    242 
    243 â—ä¾‹å¤–/割込みの受付
    244 
    245 ãƒ»ä¾‹å¤–/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
    246   ンテキストを保存する.
     121割込みを受け付けた際,受け付けた割込みに設定された優先度より低い割込みを
     122禁止するため,GICC_RPRから取得した割込み要因の割込み優先度を GICC_PMRへ
     123セットしている.そしてハンドラ終了後に割込み発生前の割り込み優先度に戻す.
     124
     125
     126[CPUモード]
     127
     128プロセッサは,EL0からEL3までの例外レベルのいずれかで動作する.
     129またそれぞれのレベルで64ビットモード(AArch64) または32ビットモード(AArch32)を
     130選択することができる.ただし,ある例外レベルが32ビットモードで動作する場合は
     131それより低い例外レベルでは64ビットモードを選択することができない.
     132
     133また,セキュリティ拡張機能を搭載するプロセッサではセキュアモードおよび
     134非セキュアモードを選択することができる.
     135
     136SSPの実装では,64ビットモード(AArch64),非セキュア,例外レベル1(EL1) で動作する.
     137
     138
     139●リセット時の状態
     140
     141リセット時はプロセッサチップがサポートする最大の例外レベルおよびそのレベルの
     142スタック(SP_ELx)が有効となっている.
     143
     144例としてQEMU向けVirtボード(Cortex-A53) では,既定でEL1が最大例外レベルのため
     145リセット直後はSP_EL1が有効となっている.
     146
     147
     148● スタックポインタ(SP_EL0とSP_ELx)
     149
     150スタックポインタは,例外レベル0のスタックポインタ(SP_EL0)および実行中の
     151例外レベルのスタックポインタ(SP_ELx)が選択可能である.
     152スタックの選択はspselレジスタへ1を設定するとSP_ELxを,0を設定すると
     153SP_EL0 を選択する.
     154
     155SSPの実装では,EL1 で SP_EL1 のみを使用して動作する.
     156
     157
     158●例外レベルの遷移
     159
     160例外レベル(EL)の遷移は割込み/例外の受付および例外リターン命令(eret)により行う.
     161
     162割込みおよび例外を受け付けることで発生前と同じまたはより高い例外レベルへ遷移する.
     163一方,同じまたはより低い例外レベルへの遷移は例外リターン命令(eret)により行う.
     164
     165受付時の遷移先となる例外レベルの指定はシステムレジスタにより設定することで行う.
     166割込み/例外リターン時の遷移先となる例外レベルは,SPSR_ELxのビット2および3で
     167指定する.割込み/例外受付時,PSTATEの状態がSPSR_ELxに,リターンアドレスがELR_ELxに,
     168それぞれ保存されeret命令の実行によりその格納値が復帰されるため,eret実行前に
     169あらかじめSPSR_ELxにセットしておくことで指定した例外レベルへ遷移することが可能である.
     170同じタイミングで使用スタックや64ビット/32ビットモードの指定も行うことができる.
     171
     172QEMU Virt向けSSPの実装ではEL1のみを使用するため,例外レベル間の遷移処理は行っていない.
     173
     174
     175●例外レベルの判定
     176
     177現状の例外レベルを判定するには,CPSRのビット2およびビット3の値を使用する.
     178bit[3:2]の値が
     179    '11'の場合:EL3
     180    '10'の場合:EL2
     181    '01'の場合:EL1
     182    '00'の場合:EL0
     183
     184●GICC_PMRレジスタ
     185
     186設定した優先度以下(値としては以上)の優先度の割込みの受付を禁止する.
     187設定可能な最大値を設定すると,全ての割込みを許可する.
     188例えば優先度が16段階の場合は0xf0(=0x0f << 4)をセットするとすべての割込み許可
     189となる.値は例外/割込みの受付とリターンにより変化しないため,受け付けた割込み
     190の優先度を割込みの入口処理で設定する必要がある.
     191
     192●例外/割込みの受付
     193
     194・例外/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
     195  ンテキストを保存する.
    247196
    248197   ---------------    <- new SP
    249198  |   GICC_PMR     |
    250199   ----------------
    251   | 割込み/例外番号|
     200  | 割込み/例外番号|
    252201   ----------------
    253202  |    ESR_ELx     |
     
    261210  |      X29       |
    262211   ----------------
    263   |      :        |
    264   |      :        |
     212  |              |
     213  |              |
    265214   ----------------
    266215  |      X1        |
     
    271220
    272221
    273 å‰²è¾¼ã¿/例外発生時の主なシーケンスは次のようになる(遷移å
    274 ˆã®ä¾‹å¤–レベルをELxと表現する)
    275 
    276 ï¼ˆãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®å‡¦ç†ï¼‰
    277   ・PSTATEをSPSR_ELxに保存する
    278   ・リターンアドレスをELR_ELxに保存する
    279   ・PSTATE.{D,A,I,F}を1にセットする
    280   ・同期例外およびSError割込みのとき,例外要因æƒ
    281 å ±ã‚’ESR_ELxに保存する
    282   ・スタックポインタをSP_ELxに切り替える
    283   ・ELxへ遷移する
    284 
    285 ï¼ˆã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã®å‡¦ç†ï¼‰
    286   ・(発生時にSP_EL0を使用していた場合)スタックを割込み発生前(SP_EL0)に戻す
    287   ・汎用レジスタ(X0-X30)をスタックに保存
    288   ・SPSR_ELx, ESR_ELx, ELR_ELxをスタックに保存
    289   ・スタックポインタのアライメントを調整
    290   ・割込み番号(GICC_IARから取得),例外番号(オフセット毎に定義した値)をスタックに保存
    291   ・割込み発生前の割込み優å
    292 ˆåº¦ãƒžã‚¹ã‚¯ã‚’スタックに保存
    293   ・GICC_PMRに受け付けた割込みの割込み優å
    294 ˆåº¦ã‚’セット
    295   ・割込み/例外ネストカウンタのインクリメント
    296   ・(割込みの場合)CPUロック解除
    297   ・ベクタテーブルを読み込みハンドラを実行する
    298 
    299 â—ä¾‹å¤–/割込みからのリターン
    300 
    301 ï¼ˆã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã®å‡¦ç†ï¼‰
    302   ・CPUロック状æ
    303 ‹ã¸ç§»è¡Œ
    304   ・割込み/例外ネスとカウンタのデクリメント
    305   ・GICC_PMRに割込み発生前の優å
    306 ˆåº¦ãƒžã‚¹ã‚¯ã‚’戻す
    307   ・スタックポインタのアライメント調整分を戻す
    308   ・戻りå
    309 ˆã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚„システム状æ
    310 ‹ã«å¿œã˜ã¦å‰²è¾¼ã¿/例外発生å
    311 ƒã¸ãƒªã‚¿ãƒ¼ãƒ³
    312     またはé
    313 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチを実行する
    314   ・ELR_ELxに戻りå
    315 ˆã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ŒSPSR_ELxにプロセッサ状æ
    316 ‹ãŒãã‚Œãžã‚Œ
    317     セットされている状æ
    318 ‹ã§eret命令を実行し,割込み/例外からリターン
    319 
    320 
    321 â—‹OSの実è£
    322 
    323 
    324 1.コア依存部名称: arm64
    325 
    326 ARMv8 では,64ビットモード(AArch64)および32ビットモード(AArch32)の両方をサポートするが
    327 æœ¬å®Ÿè£
    328 ã¯64ビットモードのみをサポートすることを明示するためプロセッサ依存部名称を arm64 とした
    329 
    330 2. 例外モードの使い分け
    331 
    332 æœ¬å®Ÿè£
    333 ã§ã¯ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã„ずれも例外レベル1(EL1)で動作する.
    334 ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’EL0で動作する案も考えられる.その場合は割込み/例外の出口処理において
    335 é
    336 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチの前に例外レベルの切り替えがå¿
    337 è¦ã¨ãªã‚‹ï¼Ž
    338 
    339 3.ディスパッチャの実行モード
    340 
    341 æœ¬å®Ÿè£
    342 ã§ã¯ã™ã¹ã¦ä¾‹å¤–レベル1で動作するため,ディスパッチャは例外レベル1(EL1)で動作する.
    343 
    344 
    345 4.スタックの使い分け
    346 
    347 SSPではタスクコンテキスト,非タスクコンテキストå
    348 ±ã«ä¸€ã¤ã®ã‚¹ã‚¿ãƒƒã‚¯ã‚’å
    349 ±ç”¨ã™ã‚‹ï¼Ž
    350 æœ¬å®Ÿè£
    351 ã§ã¯SP_ELxを使用している.
    352 ã“の他にSP_EL0を使用する実è£
    353 ã‚‚考えられる.その場合は割込み/例外のå
    354 ¥å£å‡¦ç†ã«ã¦
    355 ãƒ¬ã‚¸ã‚¹ã‚¿ã‚’保存する前にSP_EL0へのスタック切り替えを行う.
    356 
    357 5.コンテキストの判定
    358 
    359 å‰²è¾¼ã¿/例外のネスト回数を保持する変数(intnest)が0ならタスクタスクコンテキスト,
    360 1以上なら非タスクコンテキストとする.
    361 ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆæ¯Žã«ä¾‹å¤–レベルを分ける実è£
    362 ã‚’取る場合はPSTATEのビット2および3で
    363 ä¾‹å¤–レベルを読み出すことにより判別するという方法も考えられる.
    364 æœ¬å®Ÿè£
    365 ã§ã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«ã‚ˆã‚‰ãšåŒã˜ä¾‹å¤–レベルを使用し,プロセッサの
    366 ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒ¬ã‚¸ã‚¹ã‚¿ã§ã¯åˆ¤åˆ¥ãŒã§ããªã„ため変数で判別する.
    367 
    368 6. CPUロック
    369 
    370 CPUロックPSTATE.IによりCPUロックを実現する.
    371 
    372 7. 割込みロックとCPU例外の関係
    373 
    374 FIQをカーネル管理外の割込みとするため,割込みロックはPSTATE.Iに加えて
    375 PSTATE.Fも用いて実現する.ただし,フラグをお互いに独立させるため,
    376 å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    377 ‹ã®è¨­å®š/解除の際は,ロック前にCPUロックフラグ(=PSTATE.I)の
    378 çŠ¶æ
    379 ‹ã‚’保存し,解除前にå
    380 ƒã®çŠ¶æ
    381 ‹ã«æˆ»ã™ã‚ˆã†ã«ã—ている.
    382 
    383 8. 外部優å
    384 ˆåº¦ã¨å†
    385 éƒ¨å„ªå
    386 ˆåº¦
    387 
    388 å¤–部優å
    389 ˆåº¦ã¨ã¯APIで指定する割込み優å
    390 ˆåº¦(PRI型)のことであり,値が小さい
    391 ã»ã©å„ªå
    392 ˆåº¦ãŒé«˜ã„.割込みハンドラには,-1から連続した負の値を設定可能で
    393 ã‚る.GICの場合,å†
    394 éƒ¨å„ªå
    395 ˆåº¦ã¯ï¼ŒGICC_PMRレジスタに設定する値である.
    396 å¤–部優å
    397 ˆåº¦ã¨å†
    398 éƒ¨å„ªå
    399 ˆåº¦ã®å¤‰æ›ã¯ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã§è¡¨ç¾ã•ã‚Œã‚‹ï¼Ž
    400 
    401 /* 外部表現への変換 */
     222割込み/例外発生時の主なシーケンスは次のようになる(遷移先の例外レベルをELxと表現する)
     223
     224(ハードウェアの処理)
     225  ・PSTATEをSPSR_ELxに保存する
     226  ・リターンアドレスをELR_ELxに保存する
     227  ・PSTATE.{D,A,I,F}を1にセットする
     228  ・同期例外およびSError割込みのとき,例外要因情報をESR_ELxに保存する
     229  ・スタックポインタをSP_ELxに切り替える
     230  ・ELxへ遷移する
     231
     232(ソフトウェアでの処理)
     233  ・(発生時にSP_EL0を使用していた場合)スタックを割込み発生前(SP_EL0)に戻す
     234  ・汎用レジスタ(X0-X30)をスタックに保存
     235  ・SPSR_ELx, ESR_ELx, ELR_ELxをスタックに保存
     236  ・スタックポインタのアライメントを調整
     237  ・割込み番号(GICC_IARから取得),例外番号(オフセット毎に定義した値)をスタックに保存
     238  ・割込み発生前の割込み優先度マスクをスタックに保存
     239  ・GICC_PMRに受け付けた割込みの割込み優先度をセット
     240  ・割込み/例外ネストカウンタのインクリメント
     241  ・(割込みの場合)CPUロック解除
     242  ・ベクタテーブルを読み込みハンドラを実行する
     243
     244●例外/割込みからのリターン
     245
     246(ソフトウェアでの処理)
     247  ・CPUロック状態へ移行
     248  ・割込み/例外ネスとカウンタのデクリメント
     249  ・GICC_PMRに割込み発生前の優先度マスクを戻す
     250  ・スタックポインタのアライメント調整分を戻す
     251  ・戻り先のコンテキストやシステム状態に応じて割込み/例外発生元へリターン
     252    または遅延ディスパッチを実行する
     253  ・ELR_ELxに戻り先アドレス,SPSR_ELxにプロセッサ状態がそれぞれ
     254    セットされている状態でeret命令を実行し,割込み/例外からリターン
     255
     256
     257○OSの実装
     258
     2591.コア依存部名称: arm64
     260
     261ARMv8 では,64ビットモード(AArch64)および32ビットモード(AArch32)の両方をサポートするが
     262本実装は64ビットモードのみをサポートすることを明示するためプロセッサ依存部名称を arm64 とした
     263
     2642. 例外モードの使い分け
     265
     266本実装ではタスクコンテキスト,非タスクコンテキストいずれも例外レベル1(EL1)で動作する.
     267タスクコンテキストをEL0で動作する案も考えられる.その場合は割込み/例外の出口処理において
     268遅延ディスパッチの前に例外レベルの切り替えが必要となる.
     269
     2703.ディスパッチャの実行モード
     271
     272本実装ではすべて例外レベル1で動作するため,ディスパッチャは例外レベル1(EL1)で動作する.
     273
     274
     2754.スタックの使い分け
     276
     277SSPではタスクコンテキスト,非タスクコンテキスト共に一つのスタックを共用する.
     278本実装ではSP_ELxを使用している.
     279この他にSP_EL0を使用する実装も考えられる.その場合は割込み/例外の入口処理にて
     280レジスタを保存する前にSP_EL0へのスタック切り替えを行う.
     281
     2825.コンテキストの判定
     283
     284割込み/例外のネスト回数を保持する変数(intnest)が0ならタスクタスクコンテキスト,
     2851以上なら非タスクコンテキストとする.
     286コンテキスト毎に例外レベルを分ける実装を取る場合はPSTATEのビット2および3で
     287例外レベルを読み出すことにより判別するという方法も考えられる.
     288本実装ではコンテキストによらず同じ例外レベルを使用し,プロセッサの
     289ステータスレジスタでは判別ができないため変数で判別する.
     290
     2916. CPUロック
     292
     293CPUロックPSTATE.IによりCPUロックを実現する.
     294
     2957. 割込みロックとCPU例外の関係
     296
     297FIQをカーネル管理外の割込みとするため,割込みロックはPSTATE.Iに加えて
     298PSTATE.Fも用いて実現する.ただし,フラグをお互いに独立させるため,
     299割込みロック状態の設定/解除の際は,ロック前にCPUロックフラグ(=PSTATE.I)の
     300状態を保存し,解除前に元の状態に戻すようにしている.
     301
     3028. 外部優先度と内部優先度
     303
     304外部優先度とはAPIで指定する割込み優先度(PRI型)のことであり,値が小さい
     305ほど優先度が高い.割込みハンドラには,-1から連続した負の値を設定可能で
     306ある.GICの場合,内部優先度は,GICC_PMRレジスタに設定する値である.
     307外部優先度と内部優先度の変換は以下のマクロで表現される.
     308
     309/* 外部表現への変換 */
    402310#define EXT_IPM(pri) \
    403311                        (((PRI)((pri) >> GIC_PRI_SHIFT)) - (GIC_PRI_LEVEL - 1))
    404312
    405 /* å†
    406 éƒ¨è¡¨ç¾ã¸ã®å¤‰æ› */
     313/* 内部表現への変換 */
    407314#define INT_IPM(ipm) \
    408315                        (((uint_t)((ipm) + (GIC_PRI_LEVEL - 1))) << GIC_PRI_SHIFT)
    409316
    410 ã“こでGIC_PRI_LEVELはサポートする割込み優å
    411 ˆåº¦ã®æ•°ï¼ŒGIC_PRI_SHIFTはGICC_PMRレジスタå†
    412 
    413 ã®ï¼Œå†
    414 éƒ¨å„ªå
    415 ˆåº¦ã®å€¤ãŒæ ¼ç´ã•ã‚Œã‚‹ä½ç½®ï¼ˆãƒ“ット0からのオフセット)を表す.
    416 
    417 
    418 9. カーネル管理å†
    419 ã®æœ€é«˜å„ªå
    420 ˆåº¦(CPUロック状æ
    421 ‹ã§ã®å„ªå
    422 ˆåº¦ãƒžã‚¹ã‚¯)
    423 
    424 GICの場合,カーネル管理å†
    425 ã®å‰²è¾¼ã¿ã®æœ€é«˜å„ªå
    426 ˆåº¦ã¯è¨­å®šå¯èƒ½ãªå¤–部優å
    427 ˆåº¦ã®æœ€é«˜å€¤ã¨åŒã˜ã¨ã™ã‚‹ï¼Ž
    428 
    429 
    430 ä»¥ä¸Šï¼Ž
     317ここでGIC_PRI_LEVELはサポートする割込み優先度の数,GIC_PRI_SHIFTはGICC_PMRレジスタ内
     318の,内部優先度の値が格納される位置(ビット0からのオフセット)を表す.
     319
     320
     3219. カーネル管理内の最高優先度(CPUロック状態での優先度マスク)
     322
     323GICの場合,カーネル管理内の割込みの最高優先度は設定可能な外部優先度の最高値と同じとする.
     324
     325
     326以上.
Note: See TracChangeset for help on using the changeset viewer.