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