source: asp3_wo_tecs/trunk/arch/arm_gcc/doc/gic_design.txt@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 7.9 KB
Line 
1
2 TOPPERS/ASP3カーネル
3 GIC(ARM Generic Interrupt Controller)依存部 設計メモ
4
5 対応バージョン: Release 3.B.0
6 最終更新: 2015年7月24日
7
8----------------------------------------------------------------------
9
10○目次
11
12・参考文献
13・GIC依存部の位置づけ
14 - GIC依存部を構成するファイル
15・チップ依存のパラメータ
16・GICにおける割込みハンドラおよびCPU例外ハンドラの出å…
17¥å£å‡¦ç†
18 - GICにおける割込みハンドラの出å…
19¥å£å‡¦ç†
20
21○参考文献
22
23[1] TOPPERSプロジェクト 設計メモ「GIC(ARM Generic Interrupt
24Controller)に関するメモ」.
25
26○GIC依存部の位置づけ
27
28GIC依存部は,カーネルのターゲット依存部の中で,GICアーキテクチャ
29(GICv1およびGICv2)に準拠した割込みコントローラを持つチップにå…
30±é€šã«ä½¿
31用できる部分である.また,GICの前身と思われるARM11 MPCoreのDistributed
32Interrupt Controllerにも適用できるように実装
33する.
34
35TOPPERS_SAFEG_SECUREがマクロ定義されている場合には,GICがセキュリティ拡
36張されていることを想定し,セキュアモードで使用するものとする.
37
38GICv1とGICv2でレジスタ名が変更になっているが,ソースコード中では,
39GICv2のレジスタ名を使用する.
40
41●GIC依存部を構成するファイル
42
43GIC依存部は,次の3つのファイルで構成される.
44
45gic_kernel_impl.h
46gic_kernel_impl.c
47gic_support.S
48
49○チップ依存のパラメータ
50
51TMIN_INTPRI
52TMAX_INTPRI
53
54カーネルのターゲット依存部のヘッダファイルからgic_kernel_impl.hをインク
55ルードする前に,必
56要に応じて,以下の定数をマクロ定義しておく.
57
58(1) GIC_TNUM_INTNO 割込みの数
59
60ターゲットチップのGICがサポートする割込みの数.SGI(Software Generated
61Interrupt),PPI(Private Peripheral Interrupt),SPI(Shared
62Peripheral Interrupt)の合計数.
63
64(2) GIC_PRI_LEVEL 割込み優å…
65ˆåº¦ã®æ®µæ•°
66
67ターゲットチップのGICがサポートする割込み優å…
68ˆåº¦ã®æ®µæ•°ï¼Ž16,32,64,128,
69256のいずれか.
70
71(3) GICC_BASE CPUインタフェースのベースアドレス
72(4) GICD_BASE ディストリビュータのベースアドレス
73
74GICのCPUインタフェースおよびディストリビュータのベースアドレス.
75
76(5) TOPPERS_SAFEG_SECURE セキュアモード(オプション)
77
78セキュアモードでカーネルを動作させ,FIQをカーネル管理の割込みと扱う場合
79に,このシンボルをマクロ定義する.
80
81(6) GIC_ARM11MOCORE ARM11 MPCoreへの対応(オプション)
82
83ARM11 MPCoreのDistributed Interrupt Controllerの場合には,このシンボル
84をマクロ定義する.
85
86○GICにおける割込みハンドラおよびCPU例外ハンドラの出å…
87¥å£å‡¦ç†
88
89●GICにおける割込みハンドラの出å…
90¥å£å‡¦ç†
91
92GICにおける割込みハンドラの出å…
93¥å£å‡¦ç†ï¼ˆirc_begin_intおよびirc_end_int)
94の実現方法には,いくつかのアプローチがある.
95
96【アプローチ1】
97
98このアプローチは,GICの想定している(よって,最もシンプルな)ものである.
99割込みハンドラのå…
100¥å£ã§ã¯ä½•ã‚‚行わず,割込みハンドラの出口でEOIを発行する.
101
102----------------------------------------
103ALABEL(irc_begin_int)
104 /*
105 * 割込み要因を取得する.
106 */
107 ldr r1, =GICC_IAR
108 ldr r3, [r1]
109 push {r3} /* irc_end_intで用いる情
110報を保存 */
111
112 /*
113 * 割込み番号を返値としてリターンする.
114 */
115 lsl r0, r3, #22 /* 下位10ビットを取り出す */
116 lsr r0, r0, #22
117 bx lr
118
119ALABEL(irc_end_int)
120 /*
121 * EOIを発行してリターンする.
122 */
123 pop {r3} /* irc_begin_intで保存した情
124報を復帰 */
125 ldr r1, =GICC_EOIR /* EOIレジスタへの書込み */
126 str r3, [r1]
127 bx lr
128----------------------------------------
129
130このアプローチには,次の問題点がある.
131
132(1) 割込みハンドラからのリターン時に,割込み優å…
133ˆåº¦ãƒžã‚¹ã‚¯ã‚’å…
134ƒã«æˆ»ã™ã¨ã„
135う仕様を実装
136していると言えるか微妙である.特に,CPU例外ハンドラをこれと
137整合するように実装
138した場合,割込み優å…
139ˆåº¦ãƒžã‚¹ã‚¯ã‚’一切操作しないという実
140装
141になり,仕様に準拠していないように思われる.
142
143(2) 割込み優å…
144ˆåº¦ãŒ256段階ある時(この場合,ARM GICでは,割込み優å…
145ˆåº¦ã®
146すべてのビットをプリエンプションに使うという設定ができない)に,このア
147プローチでは,割込み優å…
148ˆåº¦ã®ã™ã¹ã¦ã®ãƒ“ットをプリエンプションに使うこと
149ができず,TOPPERS標準割込み処理モデルからの逸脱となる.
150
151(3) 割込みハンドラから割込み優å…
152ˆåº¦ãƒžã‚¹ã‚¯ã‚’参ç…
153§ï¼è¨­å®šã™ã‚‹ã“とができない.
154ASP3カーネルでは問題ないが,ATK2カーネルでは,このアプローチは用いるこ
155とができない.
156
157【アプローチ2】
158
159問題点(1)と(3)を解決するためには,発生した割込み要因の割込み優å…
160ˆåº¦ã‚’,
161割込み優å…
162ˆåº¦ãƒžã‚¹ã‚¯ã«è¨­å®šã—ておく方法が考えられる.
163
164----------------------------------------
165ALABEL(irc_begin_int)
166 /*
167 * 割込み要因を取得する.
168 */
169 ldr r1, =GICC_IAR
170 ldr r3, [r1]
171
172 /*
173 * 割込み要因の割込み優å…
174ˆåº¦ã‚’求め,割込み優å…
175ˆåº¦ãƒžã‚¹ã‚¯ã«è¨­å®šã™ã‚‹ï¼Ž
176 */
177 ldr r1, =GICC_RPR /* 受け付けた割込みの割込み優å…
178ˆåº¦ã‚’取得 */
179 ldr r0, [r1]
180 ldr r1, =GICC_PMR /* 割込み発生前の割込み優å…
181ˆåº¦ã‚’取得 */
182 ldr r2, [r1]
183 str r0, [r1] /* 新しい割込み優å…
184ˆåº¦ãƒžã‚¹ã‚¯ã‚’セットする */
185 DATA_SYNC_BARRIER /* 割込み優å…
186ˆåº¦ãƒžã‚¹ã‚¯ãŒã‚»ãƒƒãƒˆã•ã‚Œã‚‹ã®ã‚’å¾…
187つ */
188 push {r2,r3} /* irc_end_intで用いる情
189報を保存 */
190
191 /*
192 * 割込み番号を返値としてリターンする.
193 */
194 lsl r0, r3, #22 /* 下位10ビットを取り出す */
195 lsr r0, r0, #22
196 bx lr
197
198ALABEL(irc_end_int)
199 /*
200 * EOIを発行する.
201 */
202 pop {r2,r3} /* irc_begin_intで保存した情
203報を復帰 */
204 ldr r1, =GICC_EOIR /* EOIレジスタへの書込み */
205 str r3, [r1]
206
207 /*
208 * 割込み優å…
209ˆåº¦ãƒžã‚¹ã‚¯ã‚’å…
210ƒã«æˆ»ã—てリターンする.
211 */
212 ldr r1, =GICC_PMR
213 str r2, [r1]
214 bx lr
215----------------------------------------
216
217しかし,このアプローチでは,アプローチ1の2つめの欠点は解決できない.
218
219【アプローチ3】
220
221アプローチ1の2つめの欠点を解決するためには,割込みハンドラのå…
222¥å£å‡¦ç†ã§
223EOIを発行してしまう方法が考えられる.
224
225----------------------------------------
226ALABEL(irc_begin_int)
227 /*
228 * 割込み要因を取得する.
229 */
230 ldr r1, =GICC_IAR
231 ldr r3, [r1]
232
233 /*
234 * 割込み要因の割込み優å…
235ˆåº¦ã‚’求め,割込み優å…
236ˆåº¦ãƒžã‚¹ã‚¯ã«è¨­å®šã™ã‚‹ï¼Ž
237 */
238 ldr r1, =GICC_RPR /* 受け付けた割込みの割込み優å…
239ˆåº¦ã‚’取得 */
240 ldr r0, [r1]
241 ldr r1, =GICC_PMR /* 割込み発生前の割込み優å…
242ˆåº¦ã‚’取得 */
243 ldr r2, [r1]
244 str r0, [r1] /* 新しい割込み優å…
245ˆåº¦ãƒžã‚¹ã‚¯ã‚’セットする */
246 DATA_SYNC_BARRIER /* 割込み優å…
247ˆåº¦ãƒžã‚¹ã‚¯ãŒã‚»ãƒƒãƒˆã•ã‚Œã‚‹ã®ã‚’å¾…
248つ */
249 push {r2} /* irc_end_intで用いる情
250報を保存 */
251
252 /*
253 * EOIを発行する.
254 */
255 ldr r1, =GICC_EOIR /* EOIレジスタへの書込み */
256 str r3, [r1]
257
258 /*
259 * 割込み番号を返値としてリターンする.
260 */
261 lsl r0, r3, #22 /* 下位10ビットを取り出す */
262 lsr r0, r0, #22
263 bx lr
264
265ALABEL(irc_end_int)
266 /*
267 * 割込み優å…
268ˆåº¦ãƒžã‚¹ã‚¯ã‚’å…
269ƒã«æˆ»ã—てリターンする.
270 */
271 pop {r2} /* irc_begin_intで保存した情
272報を復帰 */
273 ldr r1, =GICC_PMR /* 割込み優å…
274ˆåº¦ãƒžã‚¹ã‚¯ã‚’å…
275ƒã«æˆ»ã™ */
276 str r2, [r1]
277 bx lr
278----------------------------------------
279
280現在の実装
281では,アプローチ3を採用している.
282
283●GICにおけるCPU例外ハンドラの出å…
284¥å£å‡¦ç†
285
286
287
288以上
Note: See TracBrowser for help on using the repository browser.