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

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

initial

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