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

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

initial

File size: 10.9 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-2010 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, JAPAN
10 * Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering
11 * Tomakomai National College of Technology, JAPAN
12 *
13 * 上記著作権者
14は,以下の (1)〜(4) の条件か,Free Software Foundation
15 * によってå…
16¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
17 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
18 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
19å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
20 * 利用と呼ぶ)することを無償で許諾する.
21 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
22 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
23 * スコード中に含まれていること.
24 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
25 * 用できる形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
27å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
28 * 者
29マニュアルなど)に,上記の著作権表示,この利用条件および下記
30 * の無保証規定を掲載すること.
31 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
32 * 用できない形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
34 * と.
35 * (a) 再é…
36å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
37マニュアルなど)に,上記の著
38 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
39 * (b) 再é…
40å¸ƒã®å½¢æ…
41‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
42 * 報告すること.
43 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
44 * 害からも,上記著作権者
45およびTOPPERSプロジェクトをå…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
51 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
52 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
53 *
54 * @(#) $Id: cpu_config.h,v 1.18 2007/03/23 07:22:15 honda Exp $
55 */
56
57/*
58 * プロセッサ依存モジュール(H8用)
59 *
60 * このインクルードファイルは,t_config.h のみからインクルードされる.
61 * 他のファイルから直接インクルードしてはならない.
62 */
63
64#ifndef _CPU_CONFIG_H_
65#define _CPU_CONFIG_H_
66
67#include <h8.h>
68
69/*
70 * カーネルの内
71部識別名のリネーム
72 */
73
74#include <cpu_rename.h>
75
76/*
77 * プロセッサの特殊命令のインライン関数定義
78 */
79
80#ifndef _MACRO_ONLY
81#include <cpu_insn.h>
82
83/*
84 * タスクコンテキストブロックの定義
85 */
86
87typedef struct task_context_block {
88 VP sp; /* スタックポインタ */
89 FP pc; /* プログラムカウンタ */
90} CTXB;
91
92/*
93 * 割込みマスク操作ライブラリ
94 */
95
96/*
97 * 現在の割込みマスクの読出し
98 */
99
100Inline UB
101current_intmask(void)
102{
103 return(current_ccr() & H8INT_MASK_ALL);
104}
105
106/*
107 * 割込みマスクの設定
108 */
109
110Inline void
111set_intmask(UB intmask)
112{
113 set_ccr((current_ccr() & ~H8INT_MASK_ALL) | intmask);
114}
115
116/*
117 * 割込みネストカウンタ
118 */
119
120extern volatile UB intnest;
121
122/*
123 * コンテキスト参ç…
124§
125 *
126 * 割込みネストカウンタを読み出した直後に割込みが発生しても、戻ったと
127 * きにはコンテキストもå…
128ƒã«æˆ»ã£ã¦ã„ã‚‹
129 */
130
131Inline BOOL
132sense_context(void)
133{
134 BOOL ret;
135
136 ret = (intnest != 0) ? TRUE : FALSE;
137 return(ret);
138}
139
140/*
141 * CPUロック状æ…
142‹ã®å‚ç…
143§
144 */
145
146/*
147 * CPUロック状æ…
148‹ã‚’表すフラグ
149 */
150extern volatile BOOL iscpulocked;
151
152#define sense_lock() iscpulocked
153#define t_sense_lock sense_lock
154#define i_sense_lock sense_lock
155
156/*
157 * CPUロックとその解除(タスクコンテキスト用)
158 *
159 * task_intmask は、chg_ipm をサポートするための変数。chg_ipm をサポート
160 * しない場合には、t_unlock_cpu 中の task_intmask は 0 に置き換えてよい。
161 */
162
163#ifdef SUPPORT_CHG_IPM
164extern volatile UB task_intmask; /* タスクコンテキストでの割込みマスク */
165#endif /* SUPPORT_CHG_IPM */
166
167Inline void
168t_lock_cpu(void)
169{
170 disint();
171 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
172 Asm("":::"memory");
173 iscpulocked = TRUE;
174}
175
176Inline void
177t_unlock_cpu(void)
178{
179 iscpulocked = FALSE;
180 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
181 Asm("":::"memory");
182#ifdef SUPPORT_CHG_IPM
183 /*
184 * t_unlock_cpu が呼び出されるのは CPUロック状æ…
185‹ã®ã¿ã§ã‚るため、
186 * 処理の途中で task_intmask が書き換わることはない。
187 */
188 set_intmask(task_intmask);
189#else /* SUPPORT_CHG_IPM */
190 enaint(); /* cpu_insn.h */
191#endif /* SUPPORT_CHG_IPM */
192}
193
194/*
195 * CPUロックとその解除(非タスクコンテキスト用)
196 */
197
198extern volatile UB int_intmask; /* 非タスクコンテキストでの割込みマスク */
199
200Inline void
201i_lock_cpu(void)
202{
203 UB intmask = current_intmask();
204 /*
205 * 一時変数 intmask を使っているのは,current_intmask()を呼ん
206 * だ直後に割込みが発生し,起動された割込みハンドラ内
207で
208 * int_intmask が変更される可能性があるためである.
209 */
210
211 disint();
212 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
213 Asm("":::"memory");
214 int_intmask = intmask;
215 iscpulocked = TRUE;
216}
217
218Inline void
219i_unlock_cpu(void)
220{
221 iscpulocked = FALSE;
222 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
223 Asm("":::"memory");
224 set_intmask(int_intmask);
225}
226
227/*
228 * タスクディスパッチャ
229 */
230
231/*
232 * 最高優å…
233ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(cpu_support.S)
234 *
235 * dispatch は,タスクコンテキストから呼び出されたサービスコール処理
236 * 内
237で,CPUロック状æ…
238‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
239 */
240
241extern void dispatch(void);
242
243/*
244 * 現在のコンテキストを捨ててディスパッチ(cpu_support.S)
245 *
246 * exit_and_dispatch は,CPUロック状æ…
247‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
248 */
249
250extern void exit_and_dispatch(void);
251
252/*
253 *
254 * 割込みハンドラの設定
255 *
256 * ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.
257 *
258 */
259
260#define JMP_OPECODE 0x5a000000u
261
262Inline void
263define_inh(INHNO inhno, FP inthdr)
264{
265#ifdef REDBOOT
266 UW *addr = (UW *)VECTOR_TABLE_ADDR;
267 addr[inhno] = JMP_OPECODE | (UW)inthdr;
268#endif /* #ifdef REDBOOT */
269}
270
271/*
272 * CPU例外ハンドラの設定
273 */
274
275Inline void
276define_exc(EXCNO excno, FP exchdr)
277{
278}
279
280#endif /* _MACRO_ONLY */
281
282/*
283 * 割込みハンドラの出å…
284¥å£å‡¦ç†
285 *
286 */
287
288/*
289 * 割込みハンドラの出å…
290¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
291 * (主にå…
292¥å£å‡¦ç†ï¼‰
293 */
294
295/*
296 * C言語ルーチンの関数名からå…
297¥å£å‡¦ç†ã®ãƒ©ãƒ™ãƒ«ã‚’生成 するマクロ
298 */
299
300/* C言語用のラベル生成 */
301#define INT_ENTRY(inthdr) _kernel_##inthdr##_entry
302#define EXC_ENTRY(exchdr) INT_ENTRY(exchdr)
303
304/* アセンブラ用のラベル生成 */
305#define INT_ENTRY_ASM(inthdr) __kernel_##inthdr##_entry
306
307
308
309/*
310 *  割込みのå…
311¥å£å‡¦ç†ã‚’生成するマクロの定義
312 *   (割込み要因毎に異なる部分)
313 *
314 *   パラメータ
315 *   entry:å…
316¥å£å‡¦ç†ã®ãƒ©ãƒ™ãƒ«
317 *     inthdr:C言語ルーチンの関数名(å…
318ˆé ­ã®'_'は付けない)
319 *     intmask: 割込み許可時に割込みマスクに設定する値
320 *           IPM_LEVEL1、IPM_LEVEL2のいずれかにすること
321 *
322 *   H8では割込み受付直後はハードウェア的に割込み禁止になっている
323 *
324 *    レジスタ割り当て
325 *     ・er0〜er3:退避
326 *     ・er2:C言語ルーチンのå…
327ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹
328 *     ・r3l:割込み許可時に割込みマスクに設定する値
329 *
330 */
331#define INTHDR_ENTRY2(entry, inthdr, intmask) \
332 _INTHDR_ENTRY2(entry, inthdr, intmask)
333
334#define _INTHDR_ENTRY2(entry, inthdr, intmask) \
335asm(".text \n"\
336" .align 2 \n"\
337" .global "#entry" \n"\
338#entry": \n"\
339 /* 必
340要最小限のレジスタをスタックに待
341避 */\
342" push.l er0 \n"\
343" push.l er1 \n"\
344" push.l er2 \n"\
345" push.l er3 \n"\
346 /* C言語ルーチンのå…
347ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ */ \
348" mov.l #_"#inthdr", er2 \n"\
349 /* 割込み許可時に設定する割込みマスクの値 */\
350" mov.b #"#intmask", r3l \n"\
351" jmp @__kernel_common_interrupt_process"\
352)
353
354/* _INTHDR_ENTRY()マクロ ここまで */
355
356/*
357 * 割込みハンドラの出å…
358¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
359 *
360 */
361
362#define INTHDR_ENTRY(inthdr) \
363 extern void INT_ENTRY(inthdr)(void) throw(); \
364 INTHDR_ENTRY2(INT_ENTRY_ASM(inthdr), inthdr, inthdr##_intmask)
365
366/*
367 * CPU例外ハンドラの出å…
368¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
369 */
370
371#define EXCHDR_ENTRY(exchdr) INTHDR_ENTRY(exchdr)
372
373
374#ifndef _MACRO_ONLY
375
376/*
377 * CPU例外の発生した時のシステム状æ…
378‹ã®å‚ç…
379§
380 */
381
382/*
383 * CPU例外の発生した時のコンテキスト判定
384 */
385
386Inline BOOL
387exc_sense_context(VP p_excinf)
388{
389 /* H8版では呼ばれない。 */
390 return(TRUE);
391}
392
393/*
394 * CPU例外の発生した時のCPUロック状æ…
395‹ã®å‚ç…
396§
397 */
398
399Inline BOOL
400exc_sense_lock(VP p_excinf)
401{
402 /* H8版では呼ばれない。 */
403 return(TRUE);
404}
405
406/*
407 * プロセッサ依存の初期化
408 */
409
410extern void cpu_initialize(void);
411
412/*
413 * プロセッサ依存の終了時処理
414 */
415
416extern void cpu_terminate(void);
417
418/*
419 * 未定義割込み発生時のエラー出力時のスタック構造の定義
420 */
421
422typedef struct exc_stack {
423 UW er0;
424 UW er1;
425 UW er2;
426 UW er3;
427 UW er4;
428 UW er5;
429 UW er6;
430 UW pc; /* プログラム・カウンタ */
431} EXCSTACK;
432
433/*
434 * 未定義割込み発生時のエラー出力 (cpu_config.c, cpu_support.S)
435 */
436
437extern void cpu_experr(EXCSTACK *sp) throw();
438
439/*
440 * ターゲットシステムの文字出力
441 *
442 * システムの低レベルの文字出力ルーチン.
443 */
444
445extern void cpu_putc(char c);
446
447#endif /* _MACRO_ONLY_ */
448
449#endif /* _CPU_CONFIG_H_ */
Note: See TracBrowser for help on using the repository browser.