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

    • Property svn:mime-type set to text/plain; charset=utf-8
    r353 r356  
    11=====================================================================
    2                          ARM64プロセッサ依存部設計メモ
     2                         ARM64プロセッサ依存部設計メモ
    33                                  Last Modified: 5 Jun 2018
    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 â—PSTATE
    54 
    55 AArch64ではプロセッサの状æ
    56 ‹ã‚’表すフラグの集まりをまとめてPSTATEと呼び,
    57 ãã‚Œãžã‚Œã®ãƒ•ãƒ©ã‚°ã¸åˆ¥ã€
    58 ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã®ç‰¹åˆ¥ãªãƒ¬ã‚¸ã‚¹ã‚¿åãŒå®šç¾©ã•ã‚Œã¦ã„る.
    59 
    60 PSTATEの詳細は,ARM Architecture Reference Manual
    61 ARMv8, for ARMv8-A architecture profile の D1.7 などを参ç
    62 §ã®ã“と.
    63 
    64 ãƒ»spsel
    65 EL1より上の例外レベルでは,spsel という特別な名称のレジスタにアクセスし,
    66 PSTATE.SPフラグの値をセットして使用スタックの切り替えを行う.
    67 
    68 ãƒ»daif
    69 daif という名称のレジスタを使用してPSTATEのD,A,I,Fビットを操作し,
    70 å„種例外および割込みの禁止/許可を制御する
    71 
    72 
    73 SSPカーネルの実è£
    74 ã§ã¯ï¼Œã‚¹ã‚¿ãƒƒã‚¯ã¯SP_EL1のみを使用する.
    75 ã¾ãŸï¼ŒCPUロック状æ
    76 ‹ãŠã‚ˆã³å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    77 ‹ã®å®Ÿè£
    78 ã«PSTATEのIおよびFフラグを
    79 åˆ©ç”¨ã—ている.
    80 
    81 
    82 â—å‰²è¾¼ã¿ãƒ™ã‚¯ã‚¿
    83 
    84 ãƒ™ã‚¯ã‚¿ãƒ†ãƒ¼ãƒ–ルのアドレスはリセット時に,システムレジスタの一つVector Base
    85 Address Register(VBAR, システムレジスタ)にアドレスをセットすることで,
    86 2048バイト境界の任意のアドレスにé
    87 ç½®å¯èƒ½ã§ã‚る.
    88 
    89 SSPカーネルの実è£
    90 ã§ã¯ã‚¹ã‚¿ãƒ¼ãƒˆã‚¢ãƒƒãƒ—ルーチンで設定している.
    91 
    92 
    93 â—å‰²è¾¼ã¿å„ªå
    94 ˆåº¦
    95 
    96 è¨­å®šå€¤ã®å°ã•ã„方が高優å
    97 ˆåº¦ã¨ãªã‚‹ï¼Ž
    98 
    99ʌ㻌
    100 ˆåº¦ã¯æœ€å¤§8bitであり,SoC毎に実è£
    101 ã•ã‚Œã¦ã„るビットå¹
    102 ãŒç•°ãªã‚‹ï¼Žå®Ÿè£
    103 ã•
    104 ã‚Œã‚‹ãƒ“ットが8bit以下の場合は,LSBから無効になる.例えば,実è£
    105 ã•ã‚Œã¦ã„
    106 ã‚‹ãƒ“ットå¹
    107 ãŒ7bitの場合は,ビット0が無効となる.
    108 
    109ʌ㻌
    110 ˆåº¦ã®ãƒ“ットフィールドのLSBから数ビットをサブ優å
    111 ˆåº¦ã¨å‘¼ã¶ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰
    112 ã«è¨­å®šã™ã‚‹ã“とが可能である.残りの上位ビットをプリエンプション優å
    113 ˆåº¦ã¨
    114 å‘¼ã¶ï¼Žãƒ—リエンプション優å
    115 ˆåº¦ãŒåŒã˜ã§ï¼Œã‚µãƒ–優å
    116 ˆåº¦ãŒç•°ãªã‚‹å„ªå
    117 ˆåº¦ã®ã‚°ãƒ«ãƒ¼
    118 ãƒ—は,お互いをプリエンプトすることができない.
    119 
    120 ä¾‹ã¨ã—て,QEMU Virtボード向けSSPの実è£
    121 ã§ã¯ Cortex-A53プロセッサを
    122 ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¨ã—ており,優å
    123 ˆåº¦ã¯16段階(4bit)でビット0から3が無効である.
    124 
    125 â—CPUモード
    126 
    127 ãƒ—ロセッサは,EL0からEL3までの例外レベルのいずれかで動作する.
    128 ã¾ãŸãã‚Œãžã‚Œã®ãƒ¬ãƒ™ãƒ«ã§64ビットモード(AArch64) または32ビットモード(AArch32)を
    129 é¸æŠžã™ã‚‹ã“とができる.ただし,ある例外レベルが32ビットモードで動作する場合は
    130 ãã‚Œã‚ˆã‚Šä½Žã„例外レベルでは64ビットモードを選択することができない.
    131 
    132 ã¾ãŸï¼Œã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£æ‹¡å¼µæ©Ÿèƒ½ã‚’搭載するプロセッサではセキュアモードおよび
    133 éžã‚»ã‚­ãƒ¥ã‚¢ãƒ¢ãƒ¼ãƒ‰ã‚’選択することができる.
    134 
    135 SSPの実è£
    136 ã§ã¯ï¼Œ64ビットモード(AArch64),非セキュア,例外レベル1(EL1) で動作する.
    137 
    138 
    139 â—ãƒªã‚»ãƒƒãƒˆæ™‚の状æ
    140 ‹
    141 
    142 ãƒªã‚»ãƒƒãƒˆæ™‚はプロセッサチップがサポートする最大の例外レベルおよびそのレベルの
    143 ã‚¹ã‚¿ãƒƒã‚¯(SP_ELx)が有効となっている.
    144 
    145 ä¾‹ã¨ã—てQEMU向けVirtボード(Cortex-A53) では,既定でEL1が最大例外レベルのため
    146 ãƒªã‚»ãƒƒãƒˆç›´å¾Œã¯SP_EL1が有効となっている.
    147 
    148 â—å‰²è¾¼ã¿/例外の受付
    149 
    150 å‰²è¾¼ã¿ã‚’受け付けると受け付けた割込みの番号が,GICC_IARにセットされる.
    151 å‰²è¾¼ã¿ç•ªå·ã¯ã“のレジスタにセットされる値を使用する.
    152 
    153 ä¾‹å¤–番号は,例外発生時のプロセッサ状æ
    154 ‹ã«å¿œã˜ã¦æ±ºå®šã•ã‚Œã‚‹ï¼Œãƒ™ã‚¯ã‚¿ãƒ†ãƒ¼ãƒ–ル中の
    155 ã‚¸ãƒ£ãƒ³ãƒ—å
    156 ˆã‚ªãƒ•ã‚»ãƒƒãƒˆæ¯Žã«ç•°ãªã‚‹ç•ªå·ã‚’割り振ることにしている.
    157 
    158   例外発生時の状æ
    159 ‹             ä¾‹å¤–の種類      例外番号  例外ベクタå
    160 ˆé ­ã‹ã‚‰ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ
     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●PSTATE
     50
     51AArch64ではプロセッサの状態を表すフラグの集まりをまとめてPSTATEと呼び,
     52それぞれのフラグへ別々にアクセスするための特別なレジスタ名が定義されている.
     53
     54PSTATEの詳細は,ARM Architecture Reference Manual
     55ARMv8, for ARMv8-A architecture profile の D1.7 などを参照のこと.
     56
     57・spsel
     58EL1より上の例外レベルでは,spsel という特別な名称のレジスタにアクセスし,
     59PSTATE.SPフラグの値をセットして使用スタックの切り替えを行う.
     60
     61・daif
     62daif という名称のレジスタを使用してPSTATEのD,A,I,Fビットを操作し,
     63各種例外および割込みの禁止/許可を制御する
     64
     65
     66SSPカーネルの実装では,スタックはSP_EL1のみを使用する.
     67また,CPUロック状態および割込みロック状態の実装にPSTATEのIおよびFフラグを
     68利用している.
     69
     70
     71●割込みベクタ
     72
     73ベクタテーブルのアドレスはリセット時に,システムレジスタの一つVector Base
     74Address Register(VBAR, システムレジスタ)にアドレスをセットすることで,
     752048バイト境界の任意のアドレスに配置可能である.
     76
     77SSPカーネルの実装ではスタートアップルーチンで設定している.
     78
     79
     80●割込み優先度
     81
     82設定値の小さい方が高優先度となる.
     83
     84優先度は最大8bitであり,SoC毎に実装されているビット幅が異なる.実装さ
     85れるビットが8bit以下の場合は,LSBから無効になる.例えば,実装されてい
     86るビット幅が7bitの場合は,ビット0が無効となる.
     87
     88優先度のビットフィールドのLSBから数ビットをサブ優先度と呼ぶフィールド
     89に設定することが可能である.残りの上位ビットをプリエンプション優先度と
     90呼ぶ.プリエンプション優先度が同じで,サブ優先度が異なる優先度のグルー
     91プは,お互いをプリエンプトすることができない.
     92
     93例として,QEMU Virtボード向けSSPの実装では Cortex-A53プロセッサを
     94ターゲットとしており,優先度は16段階(4bit)でビット0から3が無効である.
     95
     96●CPUモード
     97
     98プロセッサは,EL0からEL3までの例外レベルのいずれかで動作する.
     99またそれぞれのレベルで64ビットモード(AArch64) または32ビットモード(AArch32)を
     100選択することができる.ただし,ある例外レベルが32ビットモードで動作する場合は
     101それより低い例外レベルでは64ビットモードを選択することができない.
     102
     103また,セキュリティ拡張機能を搭載するプロセッサではセキュアモードおよび
     104非セキュアモードを選択することができる.
     105
     106SSPの実装では,64ビットモード(AArch64),非セキュア,例外レベル1(EL1) で動作する.
     107
     108
     109●リセット時の状態
     110
     111リセット時はプロセッサチップがサポートする最大の例外レベルおよびそのレベルの
     112スタック(SP_ELx)が有効となっている.
     113
     114例としてQEMU向けVirtボード(Cortex-A53) では,既定でEL1が最大例外レベルのため
     115リセット直後はSP_EL1が有効となっている.
     116
     117●割込み/例外の受付
     118
     119割込みを受け付けると受け付けた割込みの番号が,GICC_IARにセットされる.
     120割込み番号はこのレジスタにセットされる値を使用する.
     121
     122例外番号は,例外発生時のプロセッサ状態に応じて決定される,ベクタテーブル中の
     123ジャンプ先オフセット毎に異なる番号を割り振ることにしている.
     124
     125  例外発生時の状態             例外の種類      例外番号  例外ベクタ先頭からのオフセット
    161126  AArch64, EL1t(EL1, SP_EL0)  Synchronous         0        0x0000
    162127  AArch64, EL1t(EL1, SP_EL0)  SError              1        0x0180
     
    168133  AArch32, EL0 (EL0, SP_EL0)  SError              7        0x0780
    169134
    170 å‰²è¾¼ã¿ã‚’受け付けた際,受け付けた割込みに設定された優å
    171 ˆåº¦ã‚ˆã‚Šä½Žã„割込みを
    172 ç¦æ­¢ã™ã‚‹ãŸã‚ï¼ŒGICC_RPRから取得した割込み要因の割込み優å
    173 ˆåº¦ã‚’ GICC_PMRへ
    174 ã‚»ãƒƒãƒˆã—ている.そしてハンドラ終了後に割込み発生前の割り込み優å
    175 ˆåº¦ã«æˆ»ã™ï¼Ž
    176 
    177 â— スタックポインタ(SP_EL0とSP_ELx)
    178 
    179 ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ã¯ï¼Œä¾‹å¤–レベル0のスタックポインタ(SP_EL0)および実行中の
    180 ä¾‹å¤–レベルのスタックポインタ(SP_ELx)が選択可能である.
    181 ã‚¹ã‚¿ãƒƒã‚¯ã®é¸æŠžã¯spselレジスタへ1を設定するとSP_ELxを,0を設定すると
    182 SP_EL0 を選択する.
    183 
    184 SSPの実è£
    185 ã§ã¯ï¼ŒEL1 で SP_EL1 のみを使用して動作する.
    186 
    187 â—ä¾‹å¤–レベルの遷移
    188 
    189 ä¾‹å¤–レベル(EL)の遷移は割込み/例外の受付および例外リターン命令(eret)により行う.
    190 
    191 å‰²è¾¼ã¿ãŠã‚ˆã³ä¾‹å¤–を受け付けることで発生前と同じまたはより高い例外レベルへ遷移する.
    192 ä¸€æ–¹ï¼ŒåŒã˜ã¾ãŸã¯ã‚ˆã‚Šä½Žã„例外レベルへの遷移は例外リターン命令(eret)により行う.
    193 
    194 å—付時の遷移å
    195 ˆã¨ãªã‚‹ä¾‹å¤–レベルの指定はシステムレジスタにより設定することで行う.
    196 å‰²è¾¼ã¿/例外リターン時の遷移å
    197 ˆã¨ãªã‚‹ä¾‹å¤–レベルは,SPSR_ELxのビット2および3で
    198 æŒ‡å®šã™ã‚‹ï¼Žå‰²è¾¼ã¿/例外受付時,PSTATEの状æ
    199 ‹ãŒSPSR_ELxに,リターンアドレスがELR_ELxに,
    200 ãã‚Œãžã‚Œä¿å­˜ã•ã‚Œeret命令の実行によりその格納値が復帰されるため,eret実行前に
    201 ã‚らかじめSPSR_ELxにセットしておくことで指定した例外レベルへ遷移することが可能である.
    202 åŒã˜ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§ä½¿ç”¨ã‚¹ã‚¿ãƒƒã‚¯ã‚„64ビット/32ビットモードの指定も行うことができる.
    203 
    204 QEMU Virt向けSSPの実è£
    205 ã§ã¯EL1のみを使用するため,例外レベル間の遷移処理は行っていない.
    206 
    207 â—ä¾‹å¤–レベルの判定
    208 
    209 ç¾çŠ¶ã®ä¾‹å¤–レベルを判定するには,CPSRのビット2およびビット3の値を使用する.
    210 bit[3:2]の値が
    211     '11'の場合:EL3
    212     '10'の場合:EL2
    213     '01'の場合:EL1
    214     '00'の場合:EL0
    215 
    216 â—GICC_PMRレジスタ
    217 
    218 è¨­å®šã—た優å
    219 ˆåº¦ä»¥ä¸‹(値としては以上)の優å
    220 ˆåº¦ã®å‰²è¾¼ã¿ã®å—付を禁止する.
    221 è¨­å®šå¯èƒ½ãªæœ€å¤§å€¤ã‚’設定すると,å
    222 ¨ã¦ã®å‰²è¾¼ã¿ã‚’許可する.
    223 ä¾‹ãˆã°å„ªå
    224 ˆåº¦ãŒ16段階の場合は0xf0(=0x0f << 4)をセットするとすべての割込み許可
    225 ã¨ãªã‚‹ï¼Žå€¤ã¯ä¾‹å¤–/割込みの受付とリターンにより変化しないため,受け付けた割込み
    226 ã®å„ªå
    227 ˆåº¦ã‚’割込みのå
    228 ¥å£å‡¦ç†ã§è¨­å®šã™ã‚‹å¿
    229 è¦ãŒã‚る.
    230 
    231 â—ä¾‹å¤–/割込みの受付
    232 
    233 ãƒ»ä¾‹å¤–/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
    234   ンテキストを保存する.
     135割込みを受け付けた際,受け付けた割込みに設定された優先度より低い割込みを
     136禁止するため,GICC_RPRから取得した割込み要因の割込み優先度を GICC_PMRへ
     137セットしている.そしてハンドラ終了後に割込み発生前の割り込み優先度に戻す.
     138
     139● スタックポインタ(SP_EL0とSP_ELx)
     140
     141スタックポインタは,例外レベル0のスタックポインタ(SP_EL0)および実行中の
     142例外レベルのスタックポインタ(SP_ELx)が選択可能である.
     143スタックの選択はspselレジスタへ1を設定するとSP_ELxを,0を設定すると
     144SP_EL0 を選択する.
     145
     146SSPの実装では,EL1 で SP_EL1 のみを使用して動作する.
     147
     148●例外レベルの遷移
     149
     150例外レベル(EL)の遷移は割込み/例外の受付および例外リターン命令(eret)により行う.
     151
     152割込みおよび例外を受け付けることで発生前と同じまたはより高い例外レベルへ遷移する.
     153一方,同じまたはより低い例外レベルへの遷移は例外リターン命令(eret)により行う.
     154
     155受付時の遷移先となる例外レベルの指定はシステムレジスタにより設定することで行う.
     156割込み/例外リターン時の遷移先となる例外レベルは,SPSR_ELxのビット2および3で
     157指定する.割込み/例外受付時,PSTATEの状態がSPSR_ELxに,リターンアドレスがELR_ELxに,
     158それぞれ保存されeret命令の実行によりその格納値が復帰されるため,eret実行前に
     159あらかじめSPSR_ELxにセットしておくことで指定した例外レベルへ遷移することが可能である.
     160同じタイミングで使用スタックや64ビット/32ビットモードの指定も行うことができる.
     161
     162QEMU Virt向けSSPの実装ではEL1のみを使用するため,例外レベル間の遷移処理は行っていない.
     163
     164●例外レベルの判定
     165
     166現状の例外レベルを判定するには,CPSRのビット2およびビット3の値を使用する.
     167bit[3:2]の値が
     168    '11'の場合:EL3
     169    '10'の場合:EL2
     170    '01'の場合:EL1
     171    '00'の場合:EL0
     172
     173●GICC_PMRレジスタ
     174
     175設定した優先度以下(値としては以上)の優先度の割込みの受付を禁止する.
     176設定可能な最大値を設定すると,全ての割込みを許可する.
     177例えば優先度が16段階の場合は0xf0(=0x0f << 4)をセットするとすべての割込み許可
     178となる.値は例外/割込みの受付とリターンにより変化しないため,受け付けた割込み
     179の優先度を割込みの入口処理で設定する必要がある.
     180
     181●例外/割込みの受付
     182
     183・例外/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
     184  ンテキストを保存する.
    235185
    236186   ---------------
    237187  |   GICC_PMR     |  <- new SP
    238188   ----------------
    239   | 割込み/例外番号|
    240    ----------------
    241   |    ダミー(0)   |
    242    ----------------
    243   | 調整量(0 or 8) |
    244    ----------------
    245   |調整領域(å¿
    246 è¦æ™‚)| (*)アライメント調整がå¿
    247 è¦ãªã¨ãã®ã¿
     189  | 割込み/例外番号|
     190   ----------------
     191  |    ダミー(0)   |
     192   ----------------
     193  | 調整量(0 or 8) |
     194   ----------------
     195  |調整領域(必要時)| (*)アライメント調整が必要なときのみ
    248196   ----------------
    249197  |    ESR_ELx     |
     
    257205  |      X29       |
    258206   ----------------
    259   |      :        |
    260   |      :        |
     207  |              |
     208  |              |
    261209   ----------------
    262210  |      X1        |
     
    267215
    268216
    269 å‰²è¾¼ã¿/例外発生時の主なシーケンスは次のようになる(遷移å
    270 ˆã®ä¾‹å¤–レベルをELxと表現する)
    271 
    272 ï¼ˆãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®å‡¦ç†ï¼‰
    273   ・PSTATEをSPSR_ELxに保存する
    274   ・リターンアドレスをELR_ELxに保存する
    275   ・PSTATE.{D,A,I,F}を1にセットする
    276   ・同期例外およびSError割込みのとき,例外要因æƒ
    277 å ±ã‚’ESR_ELxに保存する
    278   ・スタックポインタをSP_ELxに切り替える
    279   ・ELxへ遷移する
    280 
    281 ï¼ˆã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã®å‡¦ç†ï¼‰
    282   ・(発生時にSP_EL0を使用していた場合)スタックを割込み発生前(SP_EL0)に戻す
    283   ・汎用レジスタ(X0-X30)をスタックに保存
    284   ・SPSR_ELx, ESR_ELx, ELR_ELxをスタックに保存
    285   ・スタックポインタのアライメントを調整
    286   ・割込み番号(GICC_IARから取得),例外番号(オフセット毎に定義した値)をスタックに保存
    287   ・割込み発生前の割込み優å
    288 ˆåº¦ãƒžã‚¹ã‚¯ã‚’スタックに保存
    289   ・GICC_PMRに受け付けた割込みの割込み優å
    290 ˆåº¦ã‚’セット
    291   ・割込み/例外ネストカウンタのインクリメント
    292   ・(割込みの場合)CPUロック解除
    293   ・ベクタテーブルを読み込みハンドラを実行する
    294 
    295 â—ä¾‹å¤–/割込みからのリターン
    296 
    297 ï¼ˆã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã®å‡¦ç†ï¼‰
    298   ・CPUロック状æ
    299 ‹ã¸ç§»è¡Œ
    300   ・割込み/例外ネスとカウンタのデクリメント
    301   ・GICC_PMRに割込み発生前の優å
    302 ˆåº¦ãƒžã‚¹ã‚¯ã‚’戻す
    303   ・スタックポインタのアライメント調整分を戻す
    304   ・戻りå
    305 ˆã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚„システム状æ
    306 ‹ã«å¿œã˜ã¦å‰²è¾¼ã¿/例外発生å
    307 ƒã¸ãƒªã‚¿ãƒ¼ãƒ³
    308     またはé
    309 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチを実行する
    310   ・ELR_ELxに戻りå
    311 ˆã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ŒSPSR_ELxにプロセッサ状æ
    312 ‹ãŒãã‚Œãžã‚Œ
    313     セットされている状æ
    314 ‹ã§eret命令を実行し,割込み/例外からリターン
    315 
    316 â—ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ã®ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆèª¿æ•´
    317 
    318 AArch64では,外部インタフェースにおいてスタックポインタは16バイト境界に
    319 ã‚¢ãƒ©ã‚¤ãƒ³ã•ã›ã‚‹å¿
    320 è¦ãŒã‚る.しかし例外発生時にそれが満たされているとは限らないため,
    321 å‰²è¾¼ã¿/CPU例外のå
    322 ¥å£å‡¦ç†ã§ï¼Œã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ãŒã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆæ¡ä»¶ã‚’満たしていない場合には,
    323 ã‚¹ã‚¿ãƒƒã‚¯ãƒã‚¤ãƒ³ã‚¿ã‚’調整する.また,出口処理でスタックポインタをå
    324 ƒã«æˆ»ã›ã‚‹ã‚ˆã†ã«ï¼Œèª¿æ•´é‡ã‚’保存する.
    325 
    326 
    327 â—‹OSの実è£
    328 
    329 
    330 1.プロセッサ依存部名称: arm64
    331 
    332 ARMv8 では,64ビットモード(AArch64)および32ビットモード(AArch32)の両方をサポートするが
    333 æœ¬å®Ÿè£
    334 ã¯64ビットモードのみをサポートすることを明示するためプロセッサ依存部名称を arm64 とした
    335 
    336 2. 例外モードの使い分け
    337 
    338 æœ¬å®Ÿè£
    339 ã§ã¯ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã„ずれも例外レベル1(EL1)で動作する.
    340 ã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’EL0で動作する案も考えられる.その場合は割込み/例外の出口処理において
    341 é
    342 å»¶ãƒ‡ã‚£ã‚¹ãƒ‘ッチの前に例外レベルの切り替えがå¿
    343 è¦ã¨ãªã‚‹ï¼Ž
    344 
    345 3.ディスパッチャの実行モード
    346 
    347 æœ¬å®Ÿè£
    348 ã§ã¯ã™ã¹ã¦ä¾‹å¤–レベル1で動作するため,ディスパッチャは例外レベル1(EL1)で動作する.
    349 
    350 
    351 4.スタックの使い分け
    352 
    353 SSPではタスクコンテキスト,非タスクコンテキストå
    354 ±ã«ä¸€ã¤ã®ã‚¹ã‚¿ãƒƒã‚¯ã‚’å
    355 ±ç”¨ã™ã‚‹ï¼Ž
    356 æœ¬å®Ÿè£
    357 ã§ã¯SP_ELxを使用している.
    358 ã“の他にSP_EL0を使用する実è£
    359 ã‚‚考えられる.その場合は割込み/例外のå
    360 ¥å£å‡¦ç†ã«ã¦
    361 ãƒ¬ã‚¸ã‚¹ã‚¿ã‚’保存する前にSP_EL0へのスタック切り替えを行う.
    362 
    363 5.コンテキストの判定
    364 
    365 å‰²è¾¼ã¿/例外のネスト回数を保持する変数(intnest)が0ならタスクタスクコンテキスト,
    366 1以上なら非タスクコンテキストとする.
    367 ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆæ¯Žã«ä¾‹å¤–レベルを分ける実è£
    368 ã‚’取る場合はPSTATEのビット2および3で
    369 ä¾‹å¤–レベルを読み出すことにより判別するという方法も考えられる.
    370 æœ¬å®Ÿè£
    371 ã§ã¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«ã‚ˆã‚‰ãšåŒã˜ä¾‹å¤–レベルを使用し,プロセッサの
    372 ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒ¬ã‚¸ã‚¹ã‚¿ã§ã¯åˆ¤åˆ¥ãŒã§ããªã„ため変数で判別する.
    373 
    374 6. CPUロック
    375 
    376 CPUロックPSTATE.IおよびPSTATE.FによりCPUロックを実現する.
    377 
    378 7. 割込みロックとCPU例外の関係
    379 
    380 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みはサポートしないため,割込みロックとCPUロックがマスクする
    381 å‰²è¾¼ã¿ã®ç¯„囲は同じとする.ただし,フラグ自体はお互いに独立させるため,
    382 å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ
    383 ‹ã®è¨­å®š/解除の際は,ロック前にCPUロックフラグの状æ
    384 ‹ã‚’保存し,
    385 è§£é™¤å‰ã«å
    386 ƒã®çŠ¶æ
    387 ‹ã«æˆ»ã™ã‚ˆã†ã«ã—ている.
    388 
    389 8. 外部優å
    390 ˆåº¦ã¨å†
    391 éƒ¨å„ªå
    392 ˆåº¦
    393 
    394 å¤–部優å
    395 ˆåº¦ã¨ã¯APIで指定する割込み優å
    396 ˆåº¦(PRI型)のことであり,値が小さい
    397 ã»ã©å„ªå
    398 ˆåº¦ãŒé«˜ã„.割込みハンドラには,-1から連続した負の値を設定可能で
    399 ã‚る.å†
    400 éƒ¨å„ªå
    401 ˆåº¦ã¯ï¼ŒGICC_PMRレジスタに設定する値である.
    402 å¤–部優å
    403 ˆåº¦ã¨å†
    404 éƒ¨å„ªå
    405 ˆåº¦ã®å¤‰æ›ã¯ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã§è¡¨ç¾ã•ã‚Œã‚‹ï¼Ž
    406 
    407 /* 外部表現への変換 */
     217割込み/例外発生時の主なシーケンスは次のようになる(遷移先の例外レベルをELxと表現する)
     218
     219(ハードウェアの処理)
     220  ・PSTATEをSPSR_ELxに保存する
     221  ・リターンアドレスをELR_ELxに保存する
     222  ・PSTATE.{D,A,I,F}を1にセットする
     223  ・同期例外およびSError割込みのとき,例外要因情報をESR_ELxに保存する
     224  ・スタックポインタをSP_ELxに切り替える
     225  ・ELxへ遷移する
     226
     227(ソフトウェアでの処理)
     228  ・(発生時にSP_EL0を使用していた場合)スタックを割込み発生前(SP_EL0)に戻す
     229  ・汎用レジスタ(X0-X30)をスタックに保存
     230  ・SPSR_ELx, ESR_ELx, ELR_ELxをスタックに保存
     231  ・スタックポインタのアライメントを調整
     232  ・割込み番号(GICC_IARから取得),例外番号(オフセット毎に定義した値)をスタックに保存
     233  ・割込み発生前の割込み優先度マスクをスタックに保存
     234  ・GICC_PMRに受け付けた割込みの割込み優先度をセット
     235  ・割込み/例外ネストカウンタのインクリメント
     236  ・(割込みの場合)CPUロック解除
     237  ・ベクタテーブルを読み込みハンドラを実行する
     238
     239●例外/割込みからのリターン
     240
     241(ソフトウェアでの処理)
     242  ・CPUロック状態へ移行
     243  ・割込み/例外ネスとカウンタのデクリメント
     244  ・GICC_PMRに割込み発生前の優先度マスクを戻す
     245  ・スタックポインタのアライメント調整分を戻す
     246  ・戻り先のコンテキストやシステム状態に応じて割込み/例外発生元へリターン
     247    または遅延ディスパッチを実行する
     248  ・ELR_ELxに戻り先アドレス,SPSR_ELxにプロセッサ状態がそれぞれ
     249    セットされている状態でeret命令を実行し,割込み/例外からリターン
     250
     251●スタックポインタのアライメント調整
     252
     253AArch64では,外部インタフェースにおいてスタックポインタは16バイト境界に
     254アラインさせる必要がある.しかし例外発生時にそれが満たされているとは限らないため,
     255割込み/CPU例外の入口処理で,スタックポインタがアライメント条件を満たしていない場合には,
     256スタックポインタを調整する.また,出口処理でスタックポインタを元に戻せるように,調整量を保存する.
     257
     258
     259○OSの実装
     260
     2611.プロセッサ依存部名称: arm64
     262
     263ARMv8 では,64ビットモード(AArch64)および32ビットモード(AArch32)の両方をサポートするが
     264本実装は64ビットモードのみをサポートすることを明示するためプロセッサ依存部名称を arm64 とした
     265
     2662. 例外モードの使い分け
     267
     268本実装ではタスクコンテキスト,非タスクコンテキストいずれも例外レベル1(EL1)で動作する.
     269タスクコンテキストをEL0で動作する案も考えられる.その場合は割込み/例外の出口処理において
     270遅延ディスパッチの前に例外レベルの切り替えが必要となる.
     271
     2723.ディスパッチャの実行モード
     273
     274本実装ではすべて例外レベル1で動作するため,ディスパッチャは例外レベル1(EL1)で動作する.
     275
     276
     2774.スタックの使い分け
     278
     279SSPではタスクコンテキスト,非タスクコンテキスト共に一つのスタックを共用する.
     280本実装ではSP_ELxを使用している.
     281この他にSP_EL0を使用する実装も考えられる.その場合は割込み/例外の入口処理にて
     282レジスタを保存する前にSP_EL0へのスタック切り替えを行う.
     283
     2845.コンテキストの判定
     285
     286割込み/例外のネスト回数を保持する変数(intnest)が0ならタスクタスクコンテキスト,
     2871以上なら非タスクコンテキストとする.
     288コンテキスト毎に例外レベルを分ける実装を取る場合はPSTATEのビット2および3で
     289例外レベルを読み出すことにより判別するという方法も考えられる.
     290本実装ではコンテキストによらず同じ例外レベルを使用し,プロセッサの
     291ステータスレジスタでは判別ができないため変数で判別する.
     292
     2936. CPUロック
     294
     295CPUロックPSTATE.IおよびPSTATE.FによりCPUロックを実現する.
     296
     2977. 割込みロックとCPU例外の関係
     298
     299カーネル管理外の割込みはサポートしないため,割込みロックとCPUロックがマスクする
     300割込みの範囲は同じとする.ただし,フラグ自体はお互いに独立させるため,
     301割込みロック状態の設定/解除の際は,ロック前にCPUロックフラグの状態を保存し,
     302解除前に元の状態に戻すようにしている.
     303
     3048. 外部優先度と内部優先度
     305
     306外部優先度とはAPIで指定する割込み優先度(PRI型)のことであり,値が小さい
     307ほど優先度が高い.割込みハンドラには,-1から連続した負の値を設定可能で
     308ある.内部優先度は,GICC_PMRレジスタに設定する値である.
     309外部優先度と内部優先度の変換は以下のマクロで表現される.
     310
     311/* 外部表現への変換 */
    408312#define EXT_IPM(pri) \
    409313                        (((PRI)((pri) >> GIC_PRI_SHIFT)) - (GIC_PRI_LEVEL - 1))
    410314
    411 /* å†
    412 éƒ¨è¡¨ç¾ã¸ã®å¤‰æ› */
     315/* 内部表現への変換 */
    413316#define INT_IPM(ipm) \
    414317                        (((uint_t)((ipm) + (GIC_PRI_LEVEL - 1))) << GIC_PRI_SHIFT)
    415318
    416 ã“こでGIC_PRI_LEVELはサポートする割込み優å
    417 ˆåº¦ã®æ•°ï¼ŒGIC_PRI_SHIFTはGICC_PMRレジスタå†
    418 
    419 ã®ï¼Œå†
    420 éƒ¨å„ªå
    421 ˆåº¦ã®å€¤ãŒæ ¼ç´ã•ã‚Œã‚‹ä½ç½®ï¼ˆãƒ“ット0からのオフセット)を表す.
    422 
    423 
    424 9. カーネル管理å†
    425 ã®æœ€é«˜å„ªå
    426 ˆåº¦(CPUロック状æ
    427 ‹ã§ã®å„ªå
    428 ˆåº¦ãƒžã‚¹ã‚¯)
    429 
    430 ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å†
    431 ã®å‰²è¾¼ã¿ã®æœ€é«˜å„ªå
    432 ˆåº¦ã¯è¨­å®šå¯èƒ½ãªå¤–部優å
    433 ˆåº¦ã®æœ€é«˜å€¤ã¨åŒã˜ã¨ã™ã‚‹ï¼Ž
    434 
    435 
    436 ä»¥ä¸Šï¼Ž
     319ここでGIC_PRI_LEVELはサポートする割込み優先度の数,GIC_PRI_SHIFTはGICC_PMRレジスタ内
     320の,内部優先度の値が格納される位置(ビット0からのオフセット)を表す.
     321
     322
     3239. カーネル管理内の最高優先度(CPUロック状態での優先度マスク)
     324
     325カーネル管理内の割込みの最高優先度は設定可能な外部優先度の最高値と同じとする.
     326
     327
     328以上.
Note: See TracChangeset for help on using the changeset viewer.