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
115 * プロセッサの特殊命令のインライン関数定義
118 * レディキューサーチのためのビットマップサーチ関数
120 * ビットマップの下位16ビットを使用し,最下位ビットを最低優先度に対応
126 bitmap_search(UINT bitmap)
131 * このコードは,bitmap(UINT型)が32ビットであることを仮定し
132 * ている.Signbits 命令は32ビット整数を取ってMSBから連続する
133 * 符号ビット - 1 を返す。all 0のときは31を返す。LSBのみが1の
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) );
143 #error "Compiler is not supported"
153 typedef struct task_context_block {
154 VP sp; /* スタックポインタ */
155 FP pc; /* プログラムカウンタ */
164 * IPENDが$8000か$8010の時、タスクコンテキストである。それ以外のときは非タスクコンテキスト。
170 return( *__pIPEND & 0x7FEF );
174 * 現在のロック状態を調べる。管理外割り込みまでロックするsil_loc_int()に
175 * よるロック状態は、このsense_lock()では無視する。
181 return((*__pIMASK & ~UNMANAGED_INT )== 0xC01F );
183 return(*__pIMASK == 0xC01F );
187 #define t_sense_lock sense_lock
188 #define i_sense_lock sense_lock
192 * CPUロックとその解除(タスクコンテキスト用)
194 * task_intmask は,chg_ipm をサポートするための変数.chg_ipm をサポー
195 * トしない場合には,task_intmask が常に 0 になっていると考えればよい.
199 #ifdef SUPPORT_CHG_IPM
200 extern UH task_intmask; /* タスクコンテキストでの割込みマスク */
201 #endif /* SUPPORT_CHG_IPM */
204 #if UNMANAGED_INT & 0xC01F
205 // 管理外割り込みの範囲チェック。管理外割り込みはIVHWからIVG13の間でなければならない
206 #error "Illegal un-managed interrupt : must be IVHW-IVG13"
211 // BLACKfinではIMASKに0xC01Fを書き込んでCPUをロックする。
217 Asm( "cli %0;" :"=d"(imask) );
218 Asm( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) );
220 Asm( "cli r0;" : : :"R0" );
221 Asm( "sti %0;" : :"d"(0xC01F) );
230 Asm( "cli %0;" :"=d"(imask) );
231 Asm( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) );
233 Asm( "sti %0;" : :"d"(0xffff) );
238 * CPUロックとその解除(非タスクコンテキスト用)
247 Asm( "cli %0;" :"=d"(imask) );
248 Asm( "sti %0;" : :"d"(0xC01f | (imask & UNMANAGED_INT) ) );
250 Asm( "cli r0;" : : :"R0" );
251 Asm( "sti %0;" : :"d"(0xC01F) );
260 Asm( "cli %0;" :"=d"(imask) );
261 Asm( "sti %0;" : :"d"( (0xffff & ~UNMANAGED_INT) | (imask & UNMANAGED_INT) ) );
263 Asm( "sti %0;" : :"d"(0xffff) );
272 * 最高優先順位タスクへのディスパッチ(cpu_support.S)
274 * dispatch は,タスクコンテキストから呼び出されたサービスコール処理
275 * 内で,CPUロック状態で呼び出さなければならない.
277 extern void dispatch(void);
280 * 現在のコンテキストを捨ててディスパッチ(cpu_support.S)
282 * exit_and_dispatch は,CPUロック状態で呼び出さなければならない.
284 extern void exit_and_dispatch(void);
288 * ブート時にシステムリセットをするなら真。デフォルトでは偽。
290 extern unsigned int enable_boot_for_gdb;
292 * 割込みハンドラ/CPU例外ハンドラの設定
299 * ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.
300 * evtvector はstart.asmで定義されている。
302 extern void (* dev_vector[])(void) ;
304 extern void (* exc_vector)(VP) ;
306 define_inh(INHNO inhno, FP inthdr)
308 dev_vector[inhno] = inthdr;
314 * ベクトル番号 excno のCPU例外ハンドラの起動番地を exchdr に設定する.
317 define_exc(EXCNO excno, FP exchdr)
319 // exc_vector[excno] = exchdr; // 例外ハンドラを配列に格納
320 exc_vector = (void (*)(VP))exchdr; // 例外ハンドラを格納
324 * 割込みハンドラ/CPU例外ハンドラの出入口処理
328 * 割込みハンドラの出入口処理の生成マクロ
330 * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
331 * に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ
335 #define INTHDR_ENTRY(inthdr) extern void inthdr(void);
336 #define INT_ENTRY(inthdr) inthdr
339 * CPU例外ハンドラの出入口処理の生成マクロ
341 * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
342 * に起動された割込みハンドラ内でディスパッチが要求された場合に,ディ
346 #define EXCHDR_ENTRY(exchdr) extern void exchdr( VP );
347 #define EXC_ENTRY(exchdr) exchdr
350 * CPU例外の発生した時のシステム状態の参照
354 * CPU例外の発生した時のコンテキストの参照
357 exc_sense_context(VP p_excinf)
359 return( *__pIPEND & 0x7FE6 ); // IVG15, GIE, EXP, EMU 以外のビットが立っていれば非タスクコンテキスト
363 * CPU例外の発生した時のCPUロック状態の参照。管理外割り込みの状態は無視する。
366 exc_sense_lock(VP p_excinf)
369 return((*__pIMASK | UNMANAGED_INT) != 0xFFFF ); // 0xFFFFならアンロック
371 return(*__pIMASK != 0xFFFF ); // 0xFFFFならアンロック
378 extern void cpu_initialize(void);
383 extern void cpu_terminate(void);
385 #endif /* _MACRO_ONLY */
386 #endif /* _CPU_CONFIG_H_ */