source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/cfv2/cpu_config.h@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 13.7 KB
Line 
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 * Copyright (C) 2007 by KURUSUGAWA Electronics Industry Inc, JAPAN
9 * Copyright (C) 2008 by Takahisa Yokota
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件か,Free Software Foundation
13 * によってå…
14¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
15 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
16 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
18 * 利用と呼ぶ)することを無償で許諾する.
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21 * スコード中に含まれていること.
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
25å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
26 * 者
27マニュアルなど)に,上記の著作権表示,この利用条件および下記
28 * の無保証規定を掲載すること.
29 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30 * 用できない形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
32 * と.
33 * (a) 再é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
35マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再é…
38å¸ƒã®å½¢æ…
39‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
40 * 報告すること.
41 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
42 * 害からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
49 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
50 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
51 *
52 * @(#) $Id: cpu_config.h,v 1.14 2003/07/08 14:57:12 hiro Exp $
53 */
54
55/*
56 * プロセッサ依存モジュール(CFV2用)
57 *
58 * このインクルードファイルは,t_config.h のみからインクルードされる.
59 * 他のファイルから直接インクルードしてはならない.
60 */
61
62#ifndef _CPU_CONFIG_H_
63#define _CPU_CONFIG_H_
64
65/*
66 * カーネルの内
67部識別名のリネーム
68 */
69#include <cpu_rename.h>
70
71/*
72 * 数値データ文字列化用マクロの定義
73 */
74#include <util.h>
75
76/*
77 * ユーザー定義情
78å ±
79 */
80#include <user_config.h>
81
82/*
83 * 設定可能な最高優å…
84ˆåº¦
85 */
86#ifdef GDB_STUB
87#define MAX_IPM 0x6 /* スタブありの場合は優å…
88ˆåº¦6でCPUロック */
89#else
90#define MAX_IPM 0x7 /* スタブなしの場合は最高優å…
91ˆåº¦ã§CPUロック */
92#endif /* GDB_STUB */
93
94#define str_MAX_IPM TO_STRING(MAX_IPM)
95
96/*
97 * プロセッサの特殊命令のインライン関数定義
98 */
99#ifndef _MACRO_ONLY
100#include <cpu_insn.h>
101#endif /* _MACRO_ONLY */
102
103/*
104 * chg_ipm/get_ipm をサポートするかどうかの定義
105 */
106#define SUPPORT_CHG_IPM
107
108/*
109 * TCB 中のフィールドのビット幅
110の定義
111 *
112 * cpu_context.h にå…
113¥ã‚Œã‚‹æ–¹ãŒã‚¨ãƒ¬ã‚¬ãƒ³ãƒˆã ãŒï¼Œå‚ç…
114§ã®ä¾å­˜æ€§ã®é–¢ä¿‚で,
115 * cpu_context.h にはå…
116¥ã‚Œã‚‰ã‚Œãªã„.
117 */
118#define TBIT_TCB_TSTAT 8 /* tstat フィールドのビット幅
119 */
120#define TBIT_TCB_PRIORITY 8 /* priority フィールドのビット幅
121 */
122
123#ifndef _MACRO_ONLY
124/*
125 * タスクコンテキストブロックの定義
126 */
127typedef struct task_context_block {
128 VP msp; /* スタックポインタ */
129 FP pc; /* プログラムカウンタ */
130} CTXB;
131
132/*
133 * 割込みマスク操作ライブラリ
134 *
135 * 割込みマスク(intmask)は,IPM(Interrupt Priority Mask)を8ビット
136 * 左にシフトしたものである.
137 */
138
139/*
140 * 現在の割込みマスクの読出し
141 */
142Inline UH
143current_intmask()
144{
145 return(current_sr() & 0x0700);
146}
147
148/*
149 * 割込みマスクの設定
150 */
151Inline void
152set_intmask(UH intmask)
153{
154 set_sr((current_sr() & ~0x0700) | intmask);
155}
156
157/*
158 * 割込み/CPU例外ネストカウンタ
159 */
160extern UW intnest;
161
162/*
163 * システム状æ…
164‹å‚ç…
165§
166 */
167
168Inline BOOL
169sense_context()
170{
171 return(intnest > 0);
172}
173
174Inline BOOL
175sense_lock()
176{
177 return(current_intmask() == (MAX_IPM << 8));
178}
179
180#define t_sense_lock sense_lock
181#define i_sense_lock sense_lock
182
183/*
184 * CPUロックとその解除(タスクコンテキスト用)
185 *
186 * task_intmask は,chg_ipm をサポートするための変数.chg_ipm をサポー
187 * トしない場合には,task_intmask が常に 0 になっていると考えればよい.
188 */
189
190#ifdef SUPPORT_CHG_IPM
191extern UH task_intmask; /* タスクコンテキストでの割込みマスク */
192#endif /* SUPPORT_CHG_IPM */
193
194Inline void
195t_lock_cpu()
196{
197 disint();
198}
199
200Inline void
201t_unlock_cpu()
202{
203#ifdef SUPPORT_CHG_IPM
204 /*
205 * t_unlock_cpu が呼び出されるのは CPUロック状æ…
206‹ã®ã¿ã§ã‚るた
207 * め,処理の途中で task_intmask が書き換わることはない.
208 */
209 set_intmask(task_intmask);
210#else /* SUPPORT_CHG_IPM */
211 enaint();
212#endif /* SUPPORT_CHG_IPM */
213}
214
215/*
216 * CPUロックとその解除(非タスクコンテキスト用)
217 */
218
219extern UH int_intmask; /* 非タスクコンテキストでの割込みマスク */
220
221Inline void
222i_lock_cpu()
223{
224 UH intmask;
225
226 /*
227 * 一時変数 intmask を使っているのは,current_intmask() を呼
228 * んだ直後に割込みが発生し,起動された割込みハンドラ内
229で
230 * int_intmask が変更される可能性があるためである.
231 */
232 intmask = current_intmask();
233 disint();
234 int_intmask = intmask;
235}
236
237Inline void
238i_unlock_cpu()
239{
240 set_intmask(int_intmask);
241}
242
243/*
244 * タスクディスパッチャ
245 */
246
247/*
248 * 最高優å…
249ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(cpu_support.S)
250 *
251 * dispatch は,タスクコンテキストから呼び出されたサービスコール処理
252 * 内
253で,CPUロック状æ…
254‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
255 */
256extern void dispatch(void);
257
258/*
259 * 現在のコンテキストを捨ててディスパッチ(cpu_support.S)
260 *
261 * exit_and_dispatch は,CPUロック状æ…
262‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
263 */
264extern void exit_and_dispatch(void);
265
266#endif /* _MACRO_ONLY */
267
268/*
269 * 割込みハンドラ/CPU例外ハンドラの設定
270 */
271
272/*
273 * 例外ベクタテーブルの定義
274 *   マクロの説明
275 *    KERNEL_HAS_A_VECTOR_TABLE
276 *     カーネルが例外ベクタテーブルを持つ
277 *    SIO_RESERVED
278 *     シリアルデバイスがデバッガによって使用されている
279 */
280#ifndef _MACRO_ONLY
281
282#ifdef KERNEL_HAS_A_VECTOR_TABLE
283extern FP vector_table[]; /* 例外ベクタテーブル */
284#endif /* KERNEL_HAS_A_VECTOR_TABLE */
285
286typedef struct exc_vector_entry {
287 FP exchdr; /* 例外ハンドラの起動番地 */
288} EXCVE;
289
290/*
291 * 割込みハンドラの設定
292 *
293 * ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.
294 */
295Inline void
296define_inh(INHNO inhno, FP inthdr)
297{
298#ifdef GDB_STUB
299 Asm("moveq.l #0x8,%%d0; move.l %0,%%d2; move.l %1,%%d3; trap #0xf"
300 : /* no output */
301 : "r"(inhno), "r"(inthdr)
302 : "%%d0", "%%d2", "%%d3");
303#else /* GDB_STUB */
304
305#ifdef KERNEL_HAS_A_VECTOR_TABLE
306
307/* SIO_RESERVEDは使用しない。sys_config.hでコメントにしてある */
308/*#ifdef SIO_RESERVED *//* シリアル割り込みは避ける */
309/* if ((inhno != RXI0) && (inhno != TXI0))*/
310/*#endif *//* SIO_RESERVED */
311 vector_table[inhno] = inthdr;
312
313#endif /* KERNEL_HAS_A_VECTOR_TABLE */
314
315#endif /* GDB_STUB */
316}
317
318/*
319 * CPU例外ハンドラの設定
320 *
321 * ベクトル番号 excno のCPU例外ハンドラの起動番地を exchdr に設定する.
322 */
323Inline void
324define_exc(EXCNO excno, FP exchdr)
325{
326 define_inh(excno, exchdr);
327}
328
329/* C言語ルーチンの関数名からå…
330¥å£å‡¦ç†ã®ãƒ©ãƒ™ãƒ«ã‚’生成
331 * kernel_cfg.cで使用
332 */
333#define INT_ENTRY(inthdr) _kernel_##inthdr##_entry
334#define EXC_ENTRY(exchdr) _kernel_##exchdr##_entry
335
336
337/*
338 * 割込みハンドラ/CPU例外ハンドラのå…
339¥å£å‡¦ç†ã®å…
340±é€šéƒ¨åˆ†
341 *
342 * ColdFireでは、割込みとCPU例外の扱いがほとんど同じなので、
343 * å…
344¥å£å‡¦ç†ã®ãƒžã‚¯ãƒ­ã‚‚å…
345±é€šã«å®šç¾©ã—ている
346 *
347 *  引数
348 * label:å…
349¥å£å‡¦ç†ã®ãƒ©ãƒ™ãƒ«
350 * inthdr:C言語ルーチンのå…
351ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
352 * common_routine:cpu_support.S内
353の分岐å…
354ˆã‚¢ãƒ‰ãƒ¬ã‚¹
355 * interrupt_entry:割込みの場合
356 * cpu_exception_entry:CPU例外の場合
357 *
358 *  レジスタ割当
359 *    d1:割込み受付直後のSRのコピー
360 *    a0:C言語ルーチンのå…
361ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
362 *
363 * 割込みとCPU例外の相違点
364 *   ・CPU例外ハンドラに引数を与える
365 *   ・CPU例外では、例外発生時のIPMと同じ値で割込みを許可する
366 * (CPU例外により、IPMを変化させない)
367 *
368 *   ・割込みハンドラの場合
369 *    割込み受付時にハードウェアがIPMを設定する
370 *    割込み許可にはこのIPMの値を用いる
371 *   ・CPU例外ハンドラの場合
372 *    CPU例外受付時にIPMの値は変化しない
373 *    割込み許可にはCPU例外発生時のIPMの値を用いる
374 */
375#define HANDLER_ENTRY_PROC(label, handler, common_routine) \
376asm(".text \n"\
377" .align 2 \n"\
378" .global "#label" \n"\
379#label": \n"\
380" lea.l -16(%sp), %sp \n" \
381" movem.l %d0-%d1/%a0-%a1, (%sp) \n" /* スクラッチレジスタを保存 */ \
382 /* 割込み禁止とSR復å…
383ƒã®æº–å‚™ */ \
384" move.w %sr,%d1 \n"\
385 /* 割込み禁止 */ \
386 /* 割込みを禁止する前に別の割込みがå…
387¥ã£ãŸå ´åˆã®æ³¨æ„ç‚¹ã¯ */ \
388 /* cpu_suppourt.Sのret_intを参ç…
389§ */ \
390" move.l #("str_MAX_IPM" << 8),%d0 \n"\
391" ori.l #0x00002000,%d0 \n"\
392" move.w %d0,%sr \n"\
393" move.l #"#handler", %a0 \n"\
394" jbra _kernel_"#common_routine" \n" /* C言語ルーチンのå…
395ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹*/\
396)
397
398/*
399 * 割込みハンドラのå…
400¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
401 *
402 */
403#define INTHDR_ENTRY(inthdr) INTHDR_ENTRY2(INT_ENTRY(inthdr), inthdr)
404
405#define INTHDR_ENTRY2(entry, inthdr) \
406 extern void entry(void); \
407 HANDLER_ENTRY_PROC(entry, inthdr, interrupt_entry)
408
409
410/*
411 * CPU例外ハンドラのå…
412¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
413 */
414#define EXCHDR_ENTRY(exchdr) EXCHDR_ENTRY2(EXC_ENTRY(exchdr), exchdr)
415
416#define EXCHDR_ENTRY2(entry, exchdr) \
417 extern void entry(void); \
418 HANDLER_ENTRY_PROC(entry, exchdr, cpu_exception_entry)
419 /*
420 * void entry()は単なるエントリのラベルなので、
421 * 引数は付けない
422 */
423
424/*
425 * CPU例外の発生した時のシステム状æ…
426‹ã®å‚ç…
427§
428 */
429
430/*
431 * CPU例外の発生した時のコンテキストの参ç…
432§
433 */
434Inline BOOL
435exc_sense_context(VP p_excinf)
436{
437 /*
438 * 1と比較するのは、現在実行中のCPU例外の分
439 * 割込みネストカウンタがインクリメントされているため
440 *
441 * CPU例外のå…
442¥å£å‡¦ç†ä¸­ã«åˆ¥ã®CPU例外は発生しないと仮定
443 * している
444 */
445 return(intnest > 0);
446}
447
448/*
449 * CPU例外の発生した時のCPUロック状æ…
450‹ã®å‚ç…
451§
452 */
453Inline BOOL
454exc_sense_lock(VP p_excinf)
455{
456 return((*((UH *) p_excinf) & 0x0700) == 0x0700);
457}
458
459/*
460 * プロセッサ依存の初期化
461 */
462extern void cpu_initialize(void);
463
464/*
465 * プロセッサ依存の終了時処理
466 */
467extern void cpu_terminate(void);
468/*
469 * 下記のログ出力時のスタック構造の定義
470 */
471typedef struct exc_stack {
472 VW d0;
473 VW d1;
474 VW d2;
475 VW d3;
476 VW d4;
477 VW d5;
478 VW d6;
479 VW d7;
480 VW a0;
481 VW a1;
482 VW a2;
483 VW a3;
484 VW a4;
485 VW a5;
486 VW a6;
487 VW a7;
488 VW sr; /* ステータス・レジスタ */
489 VW pc; /* プログラム・カウンタ */
490} EXCSTACK;
491
492
493/*
494 * 例外発生時のログ出力 (cpu_config.c, cpu_support.S)
495 */
496extern void cpu_experr(EXCSTACK *);
497
498#endif /* _MACRO_ONLY */
499
500
501/*
502 * 例外ベクタに設定するデフォルトの値
503 * 以下の例外要因でデフォルトとは異なる例外ベクタを定義
504 * する場合は、sys_config.hで該当するマクロを定義する。
505 */
506#define RESET_VECTOR start /* リセットベクタ */
507#define INIT_STACK STACKTOP /* スタックポインタの初期値 */
508
509#define RESERVED_VECTOR RESET_VECTOR /* システム予約のリセットベクタ */
510 /* 実際には使用されない */
511
512#ifndef ACC_VECTOR /* アクセスエラー */
513#define ACC_VECTOR RESET_VECTOR
514#endif /* ACC_VECTOR */
515
516#ifndef ADD_VECTOR /* アクセスエラー */
517#define ADD_VECTOR RESET_VECTOR
518#endif /* ACC_VECTOR */
519
520#ifndef II_VECTOR /* 不当命令 */
521#define II_VECTOR RESET_VECTOR
522#endif /* II_VECTOR */
523
524#ifndef PV_VECTOR /* スロット不当命令 */
525#define PV_VECTOR RESET_VECTOR
526#endif /* SII_VECTOR */
527
528#ifndef CAE_VECTOR /* CPUアドレスエラー */
529#define CAE_VECTOR RESET_VECTOR
530#endif /* CAE_VECTOR */
531
532#ifndef DAE_VECTOR /* DMAアドレスエラー */
533#define DAE_VECTOR RESET_VECTOR
534#endif /* DAE_VECTOR */
535
536#ifndef NMI_VECTOR /* NMI */
537#define NMI_VECTOR RESET_VECTOR
538#endif /* NMI_VECTOR */
539
540#endif /* _CPU_CONFIG_H_ */
Note: See TracBrowser for help on using the repository browser.