OSDN Git Service

Initial Commit. Toppers/JSP for Blackfin 3.3.1
[trx-305dsp/dsp.git] / trx305 / kernel / config / blackfin / cpu_config.h
1 /*
2  *  TOPPERS/JSP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Just Standard Profile Kernel
5  *
6  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  *
9  *  TOPPERS/JSP for Blackfin
10  *
11  *  Copyright (C) 2004,2006,2006 by Takemasa Nakamura
12  *  Copyright (C) 2004 by Ujinosuke
13  *
14  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
15  *  によって公表されている GNU General Public License の Version 2 に記
16  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
17  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
18  *  利用と呼ぶ)することを無償で許諾する.
19  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21  *      スコード中に含まれていること.
22  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
24  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
25  *      の無保証規定を掲載すること.
26  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
28  *      と.
29  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
30  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
31  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
32  *        報告すること.
33  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
35  *
36  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
38  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
39  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
40  *
41  *
42  */
43
44
45 /*
46  *  プロセッサ依存のカーネル資源(BLACKfin用)
47  *
48  *  このインクルードファイルは,t_config.h のみからインクルードされる.
49  *  他のファイルから直接インクルードしてはならない.
50  */
51
52 #ifndef _CPU_CONFIG_H_
53 #define _CPU_CONFIG_H_
54
55 /*
56  *  サービスコール選択マクロの読み込み
57  */
58 #ifdef __GNUC__
59 /*
60 * サービスコール選択は、configureスクリプトがおこなうので、gnu環境では不要
61 */
62 //#include <api.h>
63 #elif defined(__ECC__)
64 /*
65 * サービスコール選択は、IPAが行うので、VisualDSP++環境ではすべて選択しておく
66 */
67 #include <api.h>
68 #else
69 #error "Compiler is not supported"
70 #endif
71
72 /*
73 *  イベントプライオリティ宣言. sys_config.h の device_dispatcher()で使う。
74 */
75 #ifndef ik_timer
76 #define ik_timer 6
77 #endif
78
79 #ifndef ik_hardware
80 #define ik_hardware_err 5
81 #endif
82
83 /*
84  *  カーネルの内部識別名のリネーム
85  */
86 #include <cpu_rename.h>
87
88 /*
89 *   BLACKfinのビットマップ検索機能を使う
90 *   BLACKfinはMSBから数える。
91 */
92 #define CPU_BITMAP_SEARCH
93 #define PRIMAP_BIT(pri)     (0x40000000u >> (pri))
94
95
96 /*
97  *  TCB 中のフィールドのビット幅の定義
98  *
99  *  cpu_context.h に入れる方がエレガントだが,参照の依存性の関係で,
100  *  cpu_context.h には入れられない.
101  */
102 #define TBIT_TCB_TSTAT      8   /* tstat フィールドのビット幅 */
103 #define TBIT_TCB_PRIORITY   8   /* priority フィールドのビット幅 */
104
105
106 /*
107 *   BLACKfinのIMASKへの設定パターン
108 *
109 */
110 #define IMASK_LOCK   0xc01f
111 #define IMASK_UNLOCK 0xffff
112
113 #ifndef _MACRO_ONLY
114 /*
115  *  プロセッサの特殊命令のインライン関数定義
116  */
117 /*
118  *  レディキューサーチのためのビットマップサーチ関数
119  *
120  *  ビットマップの下位16ビットを使用し,最下位ビットを最低優先度に対応
121  *  させる.
122  */
123
124
125 Inline UINT
126 bitmap_search(UINT bitmap)
127 {
128     UINT    numOfSign;
129
130     /*
131      *  このコードは,bitmap(UINT型)が32ビットであることを仮定し
132      *  ている.Signbits 命令は32ビット整数を取ってMSBから連続する
133      *  符号ビット - 1 を返す。all 0のときは31を返す。LSBのみが1の
134      *  ときは30を返す。
135      */
136 #ifdef __GNUC__         // gcc
137     // gcc 3.4.1 の時点では、オペランドに下位ハーフレジスタを指定
138     // できないため、余計なコードが必要になる。
139     Asm( "r0.L=signbits %1; %0 = r0.L;": "=d"(numOfSign) : "d"(bitmap) : "R0" );
140 #elif defined(__ECC__)  // visualdsp
141     Asm( "%0=signbits %1;": "=l"(numOfSign) : "d"(bitmap) );
142 #else
143 #error "Compiler is not supported"
144 #endif
145     return( numOfSign );
146 }
147
148
149
150 /*
151  *  タスクコンテキストブロックの定義
152  */
153 typedef struct task_context_block {
154     VP  sp;     /* スタックポインタ */
155     FP  pc;     /* プログラムカウンタ */
156 } CTXB;
157
158
159 /*
160  *  システム状態参照
161  *  返す値は以下のとおり
162  *  TRUE : 非タスクコンテキスト
163  *  FALSE: タスクコンテキスト
164  *              IPENDが$8000か$8010の時、タスクコンテキストである。それ以外のときは非タスクコンテキスト。
165  */
166
167 Inline BOOL
168 sense_context()
169 {
170     return( *__pIPEND & 0x7FEF );
171 }
172
173 /*
174 * 現在のロック状態を調べる。管理外割り込みまでロックするsil_loc_int()に
175 * よるロック状態は、このsense_lock()では無視する。
176 */
177 Inline BOOL
178 sense_lock()
179 {
180 #ifdef UNMANAGED_INT
181     return((*__pIMASK & ~UNMANAGED_INT )== 0xC01F );
182 #else
183     return(*__pIMASK == 0xC01F );
184 #endif
185 }
186
187 #define t_sense_lock    sense_lock
188 #define i_sense_lock    sense_lock
189
190
191 /*
192  *  CPUロックとその解除(タスクコンテキスト用)
193  *
194  *  task_intmask は,chg_ipm をサポートするための変数.chg_ipm をサポー
195  *  トしない場合には,task_intmask が常に 0 になっていると考えればよい.
196  *
197  */
198
199 #ifdef SUPPORT_CHG_IPM
200 extern UH   task_intmask;   /* タスクコンテキストでの割込みマスク */
201 #endif /* SUPPORT_CHG_IPM */
202
203 #ifdef UNMANAGED_INT
204 #if UNMANAGED_INT & 0xC01F
205 // 管理外割り込みの範囲チェック。管理外割り込みはIVHWからIVG13の間でなければならない
206 #error "Illegal un-managed interrupt : must be IVHW-IVG13"
207 #endif
208 #endif
209
210
211 // BLACKfinではIMASKに0xC01Fを書き込んでCPUをロックする。
212 Inline void
213 t_lock_cpu()
214 {
215 #ifdef UNMANAGED_INT
216     unsigned int imask;
217     Asm( "cli %0;" :"=d"(imask) );
218     Asm( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) );
219 #else
220     Asm( "cli r0;" : : :"R0" );
221     Asm( "sti %0;" : :"d"(0xC01F) );
222 #endif
223 }
224
225 Inline void
226 t_unlock_cpu()
227 {
228 #ifdef UNMANAGED_INT
229     unsigned int imask;
230     Asm( "cli %0;" :"=d"(imask) );
231     Asm( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) );
232 #else
233     Asm( "sti %0;" : :"d"(0xffff) );
234 #endif
235 }
236
237 /*
238  *  CPUロックとその解除(非タスクコンテキスト用)
239  */
240
241
242 Inline void
243 i_lock_cpu()
244 {
245 #ifdef UNMANAGED_INT
246     unsigned int imask;
247     Asm( "cli %0;" :"=d"(imask) );
248     Asm( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) );
249 #else
250     Asm( "cli r0;" : : :"R0" );
251     Asm( "sti %0;" : :"d"(0xC01F) );
252 #endif
253 }
254
255 Inline void
256 i_unlock_cpu()
257 {
258 #ifdef UNMANAGED_INT
259     unsigned int imask;
260     Asm( "cli %0;" :"=d"(imask) );
261     Asm( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) );
262 #else
263     Asm( "sti %0;" : :"d"(0xffff) );
264 #endif
265 }
266
267 /*
268  *  タスクディスパッチャ
269  */
270
271 /*
272  *  最高優先順位タスクへのディスパッチ(cpu_support.S)
273  *
274  *  dispatch は,タスクコンテキストから呼び出されたサービスコール処理
275  *  内で,CPUロック状態で呼び出さなければならない.
276  */
277 extern void dispatch(void);
278
279 /*
280  *  現在のコンテキストを捨ててディスパッチ(cpu_support.S)
281  *
282  *  exit_and_dispatch は,CPUロック状態で呼び出さなければならない.
283  */
284 extern void exit_and_dispatch(void);
285
286
287 /*
288  * ブート時にシステムリセットをするなら真。デフォルトでは偽。
289  */
290 extern unsigned int enable_boot_for_gdb;
291 /*
292  *  割込みハンドラ/CPU例外ハンドラの設定
293  */
294
295
296 /*
297  *  割込みハンドラの設定
298  *
299  *  ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.
300  * evtvector はstart.asmで定義されている。
301  */
302 extern void (* dev_vector[])(void) ;
303
304 extern void (* exc_vector)(VP) ;
305 Inline void
306 define_inh(INHNO inhno, FP inthdr)
307 {
308     dev_vector[inhno] = inthdr;
309 }
310
311 /*
312  *  CPU例外ハンドラの設定
313  *
314  *  ベクトル番号 excno のCPU例外ハンドラの起動番地を exchdr に設定する.
315  */
316 Inline void
317 define_exc(EXCNO excno, FP exchdr)
318 {
319 //  exc_vector[excno] = exchdr;     // 例外ハンドラを配列に格納
320     exc_vector = (void (*)(VP))exchdr;      // 例外ハンドラを格納
321 }
322
323 /*
324  *  割込みハンドラ/CPU例外ハンドラの出入口処理
325  */
326
327 /*
328  *  割込みハンドラの出入口処理の生成マクロ
329  *
330  *  reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
331  *  に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ
332  *  スパッチされない.
333  */
334
335 #define INTHDR_ENTRY(inthdr)    extern void inthdr(void);
336 #define INT_ENTRY(inthdr)   inthdr
337
338 /*
339  *  CPU例外ハンドラの出入口処理の生成マクロ
340  *
341  *  reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
342  *  に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ
343  *  スパッチされない.
344  */
345
346 #define EXCHDR_ENTRY(exchdr)    extern void exchdr( VP );
347 #define EXC_ENTRY(exchdr)   exchdr
348
349 /*
350  *  CPU例外の発生した時のシステム状態の参照
351  */
352
353 /*
354  *  CPU例外の発生した時のコンテキストの参照
355  */
356 Inline BOOL
357 exc_sense_context(VP p_excinf)
358 {
359     return( *__pIPEND & 0x7FE6 );               // IVG15, GIE, EXP, EMU 以外のビットが立っていれば非タスクコンテキスト
360 }
361
362 /*
363  *  CPU例外の発生した時のCPUロック状態の参照。管理外割り込みの状態は無視する。
364  */
365 Inline BOOL
366 exc_sense_lock(VP p_excinf)
367 {
368 #ifdef UNMANAGED_INT
369     return((*__pIMASK | UNMANAGED_INT) != 0xFFFF );     // 0xFFFFならアンロック
370 #else
371     return(*__pIMASK != 0xFFFF );               // 0xFFFFならアンロック
372 #endif
373 }
374
375 /*
376  *  プロセッサ依存の初期化
377  */
378 extern void cpu_initialize(void);
379
380 /*
381  *  プロセッサ依存の終了時処理
382  */
383 extern void cpu_terminate(void);
384
385 #endif /* _MACRO_ONLY */
386 #endif /* _CPU_CONFIG_H_ */