3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
9 * TOPPERS/JSP for Blackfin
11 * Copyright (C) 2004,2006,2006 by Takemasa Nakamura
12 * Copyright (C) 2004 by Ujinosuke
14 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
15 * によって公表されている GNU General Public License の Version 2 に記
16 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
17 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
24 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
29 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
30 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
31 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
33 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
34 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
36 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
38 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
39 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
46 * プロセッサ依存のカーネル資源(BLACKfin用)
48 * このインクルードファイルは,t_config.h のみからインクルードされる.
49 * 他のファイルから直接インクルードしてはならない.
52 #ifndef _CPU_CONFIG_H_
53 #define _CPU_CONFIG_H_
60 * サービスコール選択は、configureスクリプトがおこなうので、gnu環境では不要
63 #elif defined(__ECC__)
65 * サービスコール選択は、IPAが行うので、VisualDSP++環境ではすべて選択しておく
69 #error "Compiler is not supported"
73 * イベントプライオリティ宣言. sys_config.h の device_dispatcher()で使う。
80 #define ik_hardware_err 5
86 #include <cpu_rename.h>
89 * BLACKfinのビットマップ検索機能を使う
92 #define CPU_BITMAP_SEARCH
93 #define PRIMAP_BIT(pri) (0x40000000u >> (pri))
99 * cpu_context.h に入れる方がエレガントだが,参照の依存性の関係で,
100 * cpu_context.h には入れられない.
102 #define TBIT_TCB_TSTAT 8 /* tstat フィールドのビット幅 */
103 #define TBIT_TCB_PRIORITY 8 /* priority フィールドのビット幅 */
107 * BLACKfinのIMASKへの設定パターン
110 #define IMASK_LOCK 0xc01f
111 #define IMASK_UNLOCK 0xffff
116 * カーネル内部のidle命令実行サイクル数
117 * この値にはidle命令の実行時間(cclk)が累積されていくので、適当にクリアして使うこと。
119 extern unsigned int idle_cycle;
122 * プロセッサの特殊命令のインライン関数定義
125 * レディキューサーチのためのビットマップサーチ関数
127 * ビットマップの下位16ビットを使用し,最下位ビットを最低優先度に対応
133 bitmap_search(UINT bitmap)
138 * このコードは,bitmap(UINT型)が32ビットであることを仮定し
139 * ている.Signbits 命令は32ビット整数を取ってMSBから連続する
140 * 符号ビット - 1 を返す。all 0のときは31を返す。LSBのみが1の
143 #ifdef __GNUC__ // gcc
144 // gcc 3.4.1 の時点では、オペランドに下位ハーフレジスタを指定
145 // できないため、余計なコードが必要になる。
146 Asm( "r0.L=signbits %1; %0 = r0.L;": "=d"(numOfSign) : "d"(bitmap) : "R0" );
147 #elif defined(__ECC__) // visualdsp
148 Asm( "%0=signbits %1;": "=l"(numOfSign) : "d"(bitmap) );
150 #error "Compiler is not supported"
160 typedef struct task_context_block {
161 VP sp; /* スタックポインタ */
162 FP pc; /* プログラムカウンタ */
171 * IPENDが$8000か$8010の時、タスクコンテキストである。それ以外のときは非タスクコンテキスト。
177 return( *__pIPEND & 0x7FEF );
181 * 現在のロック状態を調べる。管理外割り込みまでロックするsil_loc_int()に
182 * よるロック状態は、このsense_lock()では無視する。
188 return((*__pIMASK & ~UNMANAGED_INT )== 0xC01F );
190 return(*__pIMASK == 0xC01F );
194 #define t_sense_lock sense_lock
195 #define i_sense_lock sense_lock
199 * CPUロックとその解除(タスクコンテキスト用)
201 * task_intmask は,chg_ipm をサポートするための変数.chg_ipm をサポー
202 * トしない場合には,task_intmask が常に 0 になっていると考えればよい.
206 #ifdef SUPPORT_CHG_IPM
207 extern UH task_intmask; /* タスクコンテキストでの割込みマスク */
208 #endif /* SUPPORT_CHG_IPM */
211 #if UNMANAGED_INT & 0xC01F
212 // 管理外割り込みの範囲チェック。管理外割り込みはIVHWからIVG13の間でなければならない
213 #error "Illegal un-managed interrupt : must be IVHW-IVG13"
218 // BLACKfinではIMASKに0xC01Fを書き込んでCPUをロックする。
224 Asm( "cli %0;" :"=d"(imask) );
225 Asm( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) );
227 Asm( "cli r0;" : : :"R0" );
228 Asm( "sti %0;" : :"d"(0xC01F) );
237 Asm( "cli %0;" :"=d"(imask) );
238 Asm( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) );
240 Asm( "sti %0;" : :"d"(0xffff) );
245 * CPUロックとその解除(非タスクコンテキスト用)
254 Asm( "cli %0;" :"=d"(imask) );
255 Asm( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) );
257 Asm( "cli r0;" : : :"R0" );
258 Asm( "sti %0;" : :"d"(0xC01F) );
267 Asm( "cli %0;" :"=d"(imask) );
268 Asm( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) );
270 Asm( "sti %0;" : :"d"(0xffff) );
279 * 最高優先順位タスクへのディスパッチ(cpu_support.S)
281 * dispatch は,タスクコンテキストから呼び出されたサービスコール処理
282 * 内で,CPUロック状態で呼び出さなければならない.
284 extern void dispatch(void);
287 * 現在のコンテキストを捨ててディスパッチ(cpu_support.S)
289 * exit_and_dispatch は,CPUロック状態で呼び出さなければならない.
291 extern void exit_and_dispatch(void);
295 * ブート時にシステムリセットをするなら真。デフォルトでは偽。
297 extern unsigned int enable_boot_for_gdb;
299 * 割込みハンドラ/CPU例外ハンドラの設定
306 * ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.
307 * evtvector はstart.asmで定義されている。
309 extern void (* dev_vector[])(void) ;
311 extern void (* exc_vector)(VP) ;
313 define_inh(INHNO inhno, FP inthdr)
315 dev_vector[inhno] = inthdr;
321 * ベクトル番号 excno のCPU例外ハンドラの起動番地を exchdr に設定する.
324 define_exc(EXCNO excno, FP exchdr)
326 // exc_vector[excno] = exchdr; // 例外ハンドラを配列に格納
327 exc_vector = (void (*)(VP))exchdr; // 例外ハンドラを格納
331 * 割込みハンドラ/CPU例外ハンドラの出入口処理
335 * 割込みハンドラの出入口処理の生成マクロ
337 * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
338 * に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ
342 #define INTHDR_ENTRY(inthdr) extern void inthdr(void);
343 #define INT_ENTRY(inthdr) inthdr
346 * CPU例外ハンドラの出入口処理の生成マクロ
348 * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
349 * に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ
353 #define EXCHDR_ENTRY(exchdr) extern void exchdr( VP );
354 #define EXC_ENTRY(exchdr) exchdr
357 * CPU例外の発生した時のシステム状態の参照
361 * CPU例外の発生した時のコンテキストの参照
364 exc_sense_context(VP p_excinf)
366 return( *__pIPEND & 0x7FE6 ); // IVG15, GIE, EXP, EMU 以外のビットが立っていれば非タスクコンテキスト
370 * CPU例外の発生した時のCPUロック状態の参照。管理外割り込みの状態は無視する。
373 exc_sense_lock(VP p_excinf)
376 return((*__pIMASK | UNMANAGED_INT) != 0xFFFF ); // 0xFFFFならアンロック
378 return(*__pIMASK != 0xFFFF ); // 0xFFFFならアンロック
385 extern void cpu_initialize(void);
390 extern void cpu_terminate(void);
392 #endif /* _MACRO_ONLY */
393 #endif /* _CPU_CONFIG_H_ */