source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/sh3/cpu_config.h

Last change on this file was 363, checked in by ykominami, 5 years ago

add tags/jsp-1.4.4-full-UTF8

  • Property svn:executable set to *
File size: 10.0 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 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: cpu_config.h,v 1.26 2006/04/10 09:58:15 honda Exp $
51 */
52
53
54/*
55 * プロセッサ依存モジュール(SH3/4用)
56 * このインクルードファイルは,t_config.h のみからインクルードされる.
57 * 他のファイルから直接インクルードしてはならない.
58 */
59
60#ifndef _CPU_CONFIG_H_
61#define _CPU_CONFIG_H_
62
63
64/*
65 * カーネル内
66部識別名のリネーム
67 */
68#include <cpu_rename.h>
69
70
71#ifdef SH4
72#include <sh4.h>
73#else /* SH3 */
74#include <sh3.h>
75#endif /* SH4 */
76
77
78/*
79 * 設定可能な最高優å…
80ˆåº¦
81 */
82#ifdef GDB_STUB
83#define MAX_IPM 0xe
84#else
85#define MAX_IPM 0xf
86#endif
87
88
89/*
90 * プロセッサの特殊命令のインライン関数定義
91 */
92#ifndef _MACRO_ONLY
93#include <cpu_insn.h>
94#endif /* _MACRO_ONLY */
95
96/*
97 * chg_ipm/get_ipm をサポートするかどうかの定義
98 */
99#define SUPPORT_CHG_IPM
100
101
102
103/*
104 * TCB 関連の定義
105 *
106 * cpu_context.h にå…
107¥ã‚Œã‚‹æ–¹ãŒã‚¨ãƒ¬ã‚¬ãƒ³ãƒˆã ãŒï¼Œå‚ç…
108§ã®ä¾å­˜æ€§ã®é–¢ä¿‚で,
109 * cpu_context.h にはå…
110¥ã‚Œã‚‰ã‚Œãªã„.
111 */
112
113/*
114 * TCB 中のフィールドのビット幅
115の定義
116 */
117#define TBIT_TCB_PRIORITY 8 /* priority フィールドのビット幅
118 */
119#define TBIT_TCB_TSTAT 8 /* tstat フィールドのビット幅
120 */
121
122#ifndef _MACRO_ONLY
123/*
124 * タスクコンテキストブロックの定義
125 */
126typedef struct task_context_block {
127 VP sp; /* スタックポインタ */
128 FP pc; /* プログラムカウンタ */
129} CTXB;
130
131/*
132 * 割込みマスク操作ライブラリ
133 *
134 * 割込みマスク(intmask)は,IPM(Interrupt Priority Mask)を4ビット
135 * 左にシフトしたものである.
136 */
137
138
139/*
140 * 現在の割込みマスクの読出し
141 */
142Inline UW
143current_intmask()
144{
145 return(current_sr() & 0x000000f0);
146}
147
148
149/*
150 * 割込みマスクの設定
151 */
152Inline void
153set_intmask(UW intmask)
154{
155 set_sr((current_sr() & ~0x000000f0) | intmask);
156}
157
158
159/*
160 * システム状æ…
161‹å‚ç…
162§
163 */
164
165Inline BOOL
166sense_context()
167{
168 UW nest;
169 Asm("stc r7_bank,%0":"=r"(nest));
170
171 return(nest > 0);
172}
173
174
175Inline BOOL
176sense_lock()
177{
178 return(current_intmask() == MAX_IPM << 4);
179}
180
181
182#define t_sense_lock sense_lock
183#define i_sense_lock sense_lock
184
185
186/*
187 * CPUロックとその解除(タスクコンテキスト用)
188 *
189 * task_intmask は,chg_ipm をサポートするための変数.chg_ipm をサポー
190 * トしない場合には,t_unlock_cpu 中の task_intmask は 0 に置き換えて
191 * よい.
192 */
193
194#ifdef SUPPORT_CHG_IPM
195extern UW task_intmask; /* タスクコンテキストでの割込みマスク */
196#endif /* SUPPORT_CHG_IPM */
197
198
199Inline void
200t_lock_cpu()
201{
202 disint();
203}
204
205
206Inline void
207t_unlock_cpu()
208{
209#ifdef SUPPORT_CHG_IPM
210 /*
211 * t_unlock_cpu が呼び出されるのは CPUロック状æ…
212‹ã®ã¿ã§ã‚るた
213 * め,処理の途中で task_intmask が書き換わることはない.
214 */
215 set_intmask(task_intmask);
216#else /* SUPPORT_CHG_IPM */
217 enaint();
218#endif /* SUPPORT_CHG_IPM */
219}
220
221
222/*
223 * CPUロックとその解除(非タスクコンテキスト用)
224 */
225
226extern UW int_intmask; /* 非タスクコンテキストでの割込みマスク */
227
228Inline void
229i_lock_cpu()
230{
231 UW intmask;
232
233 /*
234 * 一時変数 intmask を使っているのは,current_intmask()を呼ん
235 * だ直後に割込みが発生し,起動された割込みハンドラ内
236で
237 * int_intmask が変更される可能性があるためである.
238 */
239 intmask = current_intmask();
240 disint();
241 int_intmask = intmask;
242}
243
244
245Inline void
246i_unlock_cpu()
247{
248 set_intmask(int_intmask);
249}
250
251
252/*
253 * タスクディスパッチャ
254 */
255
256/*
257 * 最高優å…
258ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(cpu_support.S)
259 *
260 * dispatch は,タスクコンテキストから呼び出されたサービスコール処理
261 * 内
262で,CPUロック状æ…
263‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
264 */
265extern void dispatch(void);
266
267
268/*
269 * 現在のコンテキストを捨ててディスパッチ(cpu_support.S)
270 *
271 * exit_and_dispatch は,CPUロック状æ…
272‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
273 */
274extern void exit_and_dispatch(void);
275
276
277/*
278 * 割込みハンドラ/CPU例外ハンドラの設定
279 */
280
281/*
282 * ベクタベースの定義
283 */
284extern void BASE_VBR(void);
285
286
287/*
288 * 例外ベクタテーブルの構造の定義
289 */
290typedef struct exc_vector_entry {
291 FP exchdr; /* 例外ハンドラの起動番地 */
292} EXCVE;
293
294
295
296/*
297 * 割り込みハンドラの疑似テーブル
298 * SH3以降はベクタテーブルを持たないため割り込み処理で例外要因を
299 * オフセットにこれら疑似テーブルよりハンドラの実行番地及び
300 * 割り込みマスクの値を取得する
301 */
302extern FP int_table[];
303extern VW int_plevel_table[];
304
305
306/*
307 * CPU例外ハンドラの疑似テーブル
308 */
309extern FP exc_table[(0x1E0 >> 5) + 1];
310
311
312/*
313 *
314 * 割込みハンドラの設定
315 *
316 * ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.
317 * 疑似テーブルに登録する
318 * stubを使う場合はstub呼び出しによりstubに登録する
319 *
320 */
321
322extern FP general_exception();
323extern FP interrupt();
324
325
326Inline void
327define_inh(INHNO inhno, FP inthdr)
328{
329 int_table[inhno >> 5] = inthdr;
330#ifdef GDB_STUB
331 Asm("mov #0x8,r0; mov %0,r4; mov %1,r5; trapa #0x3f"
332 : /* no output */
333 : "r"(inhno),"r"(interrupt)
334 : "r0", "r4", "r5");
335#endif /* GDB_STUB */
336}
337
338
339/*
340 * CPU例外ハンドラの設定
341 * 擬似ベクターテーブルに登録
342 */
343Inline void
344define_exc(EXCNO excno, FP exchdr)
345{
346 exc_table[excno >> 5] = exchdr;
347#ifdef GDB_STUB
348 Asm("mov #0x8,r0; mov %0,r4; mov %1,r5; trapa #0x3f"
349 : /* no output */
350 : "r"(excno),"r"(general_exception)
351 : "r0", "r4", "r5");
352#endif /* GDB_STUB */
353}
354
355
356/*
357 * 割り込みレベルの設定
358 */
359Inline void
360define_int_plevel(UINT dintno, UW plevel)
361{
362 int_plevel_table[dintno >> 5] = (plevel << 4) | 0x40000000;
363}
364
365
366/*
367 * 割込みハンドラ/CPU例外ハンドラの出å…
368¥å£å‡¦ç†
369 *
370 */
371
372/*
373 * 割込みハンドラの出å…
374¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
375 */
376
377#define INTHDR_ENTRY(inthdr) extern void inthdr(void)
378
379#define INT_ENTRY(inthdr) inthdr
380
381/*
382 * CPU例外ハンドラの出å…
383¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
384 *
385 */
386#define EXCHDR_ENTRY(exchdr) extern void exchdr(VP sp)
387
388#define EXC_ENTRY(exchdr) exchdr
389
390
391/*
392 * CPU例外の発生した時のシステム状æ…
393‹ã®å‚ç…
394§
395 */
396
397/*
398 * CPU例外の発生した時のコンテキスト判定
399 */
400Inline BOOL
401exc_sense_context(VP p_excinf)
402{
403 UW nest;
404 Asm("stc r7_bank,%0":"=r"(nest));
405
406 return(nest > 1);
407}
408
409
410/*
411 * CPU例外の発生した時のCPUロック状æ…
412‹ã®å‚ç…
413§
414 */
415Inline BOOL
416exc_sense_lock(VP p_excinf)
417{
418 return((*((UW *)p_excinf + 11) & 0x00000f0) == MAX_IPM << 4);
419}
420
421
422/*
423 * プロセッサ依存の初期化
424 */
425extern void cpu_initialize(void);
426
427
428/*
429 * プロセッサ依存の終了時処理
430 */
431extern void cpu_terminate(void);
432
433
434/*
435 * 未登録の割込み/例外発生時のログ出力
436 */
437extern void cpu_expevt(VW,VW,VW,VW);
438extern void cpu_interrupt(VW,VW,VW,VW);
439extern void no_reg_interrupt(void);
440
441
442/*
443 * シリアルコントローラのボーレート設定時の待
444ち時間の設定
445 * バスステートコントローラのリフレッシュカウンタを使う
446 */
447#define WAIT_RFCR_FOR_SCI 200
448
449/*
450 * gdb stubによる出力
451 */
452Inline int
453stub_putc(int c)
454{
455 Asm("mov #0x00,r0; mov %0,r4; trapa #0x3f"
456 : /* no output */
457 : "r"(c)
458 : "r0","r4");
459 return(c);
460}
461
462
463#endif /* _MACRO_ONLY_ */
464#endif /* _CPU_CONFIG_H_ */
Note: See TracBrowser for help on using the repository browser.