1 | =====================================================================
|
---|
2 | BCM283x チップ依存部設計メモ
|
---|
3 | Last Modified: 16 Apr 2019
|
---|
4 | =====================================================================
|
---|
5 |
|
---|
6 | ○このドキュメントの位置づけ
|
---|
7 |
|
---|
8 | このドキュメントは,TOPPERS/SSPカーネルをBCM283xに移植する際の
|
---|
9 | チップ固有事項に関する設計メモである.
|
---|
10 |
|
---|
11 | (参考)
|
---|
12 |
|
---|
13 | (a) QA7(ARM Quad A7 core)
|
---|
14 | https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2836/QA7_rev3.4.pdf
|
---|
15 |
|
---|
16 | (b) BCM2835 ARM Peripherals
|
---|
17 | https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/BCM2835-ARM-Peripherals.
|
---|
18 | pdf
|
---|
19 |
|
---|
20 |
|
---|
21 | [CPUモード]
|
---|
22 |
|
---|
23 | ●リセット時の状態
|
---|
24 |
|
---|
25 | リセット時,BCM283x (Cortex-A53) は,EL3h (使用スタック SP_EL3)で起動する.
|
---|
26 |
|
---|
27 |
|
---|
28 | [割込み]
|
---|
29 |
|
---|
30 |
|
---|
31 | ●割込み優先度
|
---|
32 |
|
---|
33 | BCM283x の割込みコントローラは優先度が実装されていない.そのため
|
---|
34 | 優先度に基づく割込みのマスクをソフトウェアで擬似的に実装している.
|
---|
35 | 割込みの内部優先度の値は外部優先度の符号を反転したものを用いるため,
|
---|
36 | 値の大きい方が高優先度となる.
|
---|
37 |
|
---|
38 | 優先度の範囲は自由に決めることができる.既定の最高値は15となっている.
|
---|
39 |
|
---|
40 |
|
---|
41 | ●割込み/例外の受付
|
---|
42 |
|
---|
43 | 割込み信号を受信すると,BCM283xのペンディングレジスタの該当するビットがセットされる.
|
---|
44 | 割込み番号はこのレジスタにセットされる値を使用する.
|
---|
45 |
|
---|
46 | 割込みハンドラ番号と割込み番号は,BCM2835及びBCM2836の
|
---|
47 | ペリフェラルマニュアル(下記a及びb)から,ペンディングレジスタのビット位置に基づいて
|
---|
48 | 0から127の番号を割り当てる.(個々の定義は bcm2837.h を参照)
|
---|
49 |
|
---|
50 | 0 ... 31 Core interrupt (下記aのP16 「Core0 interrupt source」に対応)
|
---|
51 | 32 ... 63 ARM peripherals interrupt(bのP113「Basic pending register」に対応)
|
---|
52 | 64 ... 95 ARM peripherals interrupt(bのP115「GPU pending register 1」に対応)
|
---|
53 | 96 ...127 ARM peripherals interrupt(bのP115「GPU pending register 2」に対応)
|
---|
54 |
|
---|
55 | 割込みを受け付けると例外レベルと例外の種類に応じた所定の位置から
|
---|
56 | 実行を開始する点はコア依存部の説明と同様であるが,割込みの優先度の
|
---|
57 | 処理内容については以下のようになる.
|
---|
58 |
|
---|
59 | まず割込みの入口処理では以下の処理を行う:
|
---|
60 | ・割込み発生時,割込み要因を元に優先度を取得する
|
---|
61 | ・優先度を元に,その割込み優先レベルで当該の割込み要因をマスクするかどうかを決定する.
|
---|
62 | ・その優先度でマスクする必要のある割込みを全てマスクする.
|
---|
63 | ・CPUロックを解除し,割込みハンドラを呼び出す.
|
---|
64 |
|
---|
65 | 割込みハンドラからのリターン後,出口処理に入る前に優先度を元に戻す:
|
---|
66 | ・割込み発生前の割込み優先度をスタックから取得する
|
---|
67 | ・割込み発生前の優先度を元に,その割込み優先度でマスク解除の対象となる割込みを決める
|
---|
68 | ・対象となる割込みの割込みマスクをすべて解除する.
|
---|
69 |
|
---|
70 | 割込み要因と優先度との対応,および優先度とマスクパターンとの対応には
|
---|
71 | それぞれ intpri_table,及び iipm_mask_table という配列を使用する.
|
---|
72 | これらは CFG_INT の設定値をもとにコンフィギュレータが kernel_cfg.c に出力する.
|
---|
73 |
|
---|
74 |
|
---|
75 | CPU例外の例外番号については,コア依存部と同様のため省略する.
|
---|
76 |
|
---|
77 |
|
---|
78 | ●例外/割込みの受付
|
---|
79 |
|
---|
80 | ・例外/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
|
---|
81 | ンテキストを保存する.
|
---|
82 |
|
---|
83 | ---------------
|
---|
84 | | GICC_PMR | <- new SP
|
---|
85 | ----------------
|
---|
86 | | 割込み/例外番号|
|
---|
87 | ----------------
|
---|
88 | | ESR_ELx |
|
---|
89 | ----------------
|
---|
90 | | ELR_ELx |
|
---|
91 | ----------------
|
---|
92 | | SPSR_ELx |
|
---|
93 | ----------------
|
---|
94 | | X30 |
|
---|
95 | ----------------
|
---|
96 | | X29 |
|
---|
97 | ----------------
|
---|
98 | | : |
|
---|
99 | | : |
|
---|
100 | ----------------
|
---|
101 | | X1 |
|
---|
102 | ----------------
|
---|
103 | | X0 |
|
---|
104 | ----------------
|
---|
105 | | | <- old SP
|
---|
106 |
|
---|
107 |
|
---|
108 | 割込み/例外発生時の主なシーケンスは次のようになる(遷移先の例外レベルをELxと表現する)
|
---|
109 |
|
---|
110 | (ハードウェアの処理)
|
---|
111 | ・PSTATEをSPSR_ELxに保存する
|
---|
112 | ・リターンアドレスをELR_ELxに保存する
|
---|
113 | ・PSTATE.{D,A,I,F}を1にセットする
|
---|
114 | ・同期例外およびSError割込みのとき,例外要因情報をESR_ELxに保存する
|
---|
115 | ・スタックポインタをSP_ELxに切り替える
|
---|
116 | ・(CPU例外の場合)例外番号をx22に格納
|
---|
117 | ・ELxへ遷移する
|
---|
118 |
|
---|
119 | (ソフトウェアでの処理)
|
---|
120 | ・(発生時にSP_EL0を使用していた場合)スタックを割込み発生前(SP_EL0)に戻す
|
---|
121 | ・汎用レジスタ(X0-X30)をスタックに保存
|
---|
122 | ・SPSR_ELx, ESR_ELx, ELR_ELxをスタックに保存
|
---|
123 | ・(割込み)ペンディングレジスタから割込み番号を取得
|
---|
124 | (CPU例外)例外番号をx22から取得
|
---|
125 | ・割込み番号,例外番号をスタックに保存
|
---|
126 | ・割込み発生前の割込み優先度マスクをスタックに保存
|
---|
127 | ・受け付けた割込みの割込み優先度を変数 current_intpri にセット
|
---|
128 | ・(割込みの場合)割込み優先度の値を元に,割込みをマスクする
|
---|
129 | ・割込み/例外ネストカウンタのインクリメント
|
---|
130 | ・(割込みの場合)CPUロック解除
|
---|
131 | (カーネル管理のCPU例外の場合)例外発生前のPSTATE状態に設定
|
---|
132 | ・ハンドラの配列からアドレスを読み込みハンドラを実行する
|
---|
133 |
|
---|
134 | ●例外/割込みからのリターン
|
---|
135 |
|
---|
136 | (ソフトウェアでの処理)
|
---|
137 | ・CPUロック状態へ移行
|
---|
138 | ・割込み/例外ネストカウンタのデクリメント
|
---|
139 | ・(割込みの場合)割込み発生前の優先度マスクを戻し,優先度に応じて割込みのマスクを解除する
|
---|
140 | (CPU例外の場合)CPU管理外の例外の場合,例外発生元へリターンする
|
---|
141 | ・戻り先のコンテキストやシステム状態に応じて割込み/例外発生元へリターン
|
---|
142 | または遅延ディスパッチを実行する
|
---|
143 | ・ELR_ELxに戻り先アドレス,SPSR_ELxにプロセッサ状態がそれぞれ
|
---|
144 | セットされている状態でeret命令を実行し,割込み/例外からリターン
|
---|
145 |
|
---|
146 |
|
---|
147 | ○ OSの実装
|
---|
148 |
|
---|
149 | 1.チップ依存部名称: bcm283x
|
---|
150 |
|
---|
151 | 現状では Raspberry Pi3B に搭載されるBCM2837のみサポートするが,
|
---|
152 | Raspberry Pi に搭載されるプロセッサBCM283x (x=5,6,7)は周辺回路について
|
---|
153 | 共通する部分が多く,まとめて扱うことにするため依存部名称を bcm283x とした
|
---|
154 |
|
---|
155 |
|
---|
156 | 2. 外部優先度と内部優先度
|
---|
157 |
|
---|
158 | 外部優先度とはAPIで指定する割込み優先度(PRI型)のことであり,値が小さい
|
---|
159 | ほど優先度が高い.割込みハンドラには,-1から連続した負の値を設定可能で
|
---|
160 | ある.内部優先度は外部優先度の符号を反転した値とする.
|
---|
161 | 外部優先度と内部優先度の変換は以下のマクロで表現される.
|
---|
162 |
|
---|
163 | /* 外部表現への変換 */
|
---|
164 | #define EXT_IPM(pri) (-pri)
|
---|
165 |
|
---|
166 | /* 内部表現への変換 */
|
---|
167 | #define INT_IPM(ipm) (-ipm)
|
---|
168 |
|
---|
169 |
|
---|
170 | 3. カーネル管理内の最高優先度(CPUロック状態での優先度マスク)
|
---|
171 |
|
---|
172 | CPUロック状態の実装に優先度は用いていない.
|
---|
173 | また優先度制御はソフトウェアで実装しているため,
|
---|
174 | カーネル管理内の割込みの最高優先度は自由に設定可能である.
|
---|
175 |
|
---|
176 | チップ依存部で既定値として-15に定義しているが,必要に応じて
|
---|
177 | ターゲット毎に必要な値を設定することができる.
|
---|
178 |
|
---|
179 |
|
---|
180 | 以上.
|
---|