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

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

initial

File size: 10.6 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.14 2003/07/08 14:57:12 hiro Exp $
51 */
52
53/*
54 * プロセッサ依存モジュール(M68040用)
55 *
56 * このインクルードファイルは,t_config.h のみからインクルードされる.
57 * 他のファイルから直接インクルードしてはならない.
58 */
59
60#ifndef _CPU_CONFIG_H_
61#define _CPU_CONFIG_H_
62
63/*
64 * カーネルの内
65部識別名のリネーム
66 */
67#include <cpu_rename.h>
68
69/*
70 * プロセッサの特殊命令のインライン関数定義
71 */
72#ifndef _MACRO_ONLY
73#include <cpu_insn.h>
74#endif /* _MACRO_ONLY */
75
76/*
77 * chg_ipm/get_ipm をサポートするかどうかの定義
78 */
79#define SUPPORT_CHG_IPM
80
81/*
82 * TCB 中のフィールドのビット幅
83の定義
84 *
85 * cpu_context.h にå…
86¥ã‚Œã‚‹æ–¹ãŒã‚¨ãƒ¬ã‚¬ãƒ³ãƒˆã ãŒï¼Œå‚ç…
87§ã®ä¾å­˜æ€§ã®é–¢ä¿‚で,
88 * cpu_context.h にはå…
89¥ã‚Œã‚‰ã‚Œãªã„.
90 */
91#define TBIT_TCB_TSTAT 8 /* tstat フィールドのビット幅
92 */
93#define TBIT_TCB_PRIORITY 8 /* priority フィールドのビット幅
94 */
95
96#ifndef _MACRO_ONLY
97/*
98 * タスクコンテキストブロックの定義
99 */
100typedef struct task_context_block {
101 VP msp; /* スタックポインタ */
102 FP pc; /* プログラムカウンタ */
103} CTXB;
104
105/*
106 * 割込みマスク操作ライブラリ
107 *
108 * 割込みマスク(intmask)は,IPM(Interrupt Priority Mask)を8ビット
109 * 左にシフトしたものである.
110 */
111
112/*
113 * 現在の割込みマスクの読出し
114 */
115Inline UH
116current_intmask()
117{
118 return(current_sr() & 0x0700);
119}
120
121/*
122 * 割込みマスクの設定
123 */
124Inline void
125set_intmask(UH intmask)
126{
127 set_sr((current_sr() & ~0x0700) | intmask);
128}
129
130/*
131 * システム状æ…
132‹å‚ç…
133§
134 */
135
136Inline BOOL
137sense_context()
138{
139 return((current_sr() & 0x1000) == 0);
140}
141
142Inline BOOL
143sense_lock()
144{
145 return(current_intmask() == 0x0700);
146}
147
148#define t_sense_lock sense_lock
149#define i_sense_lock sense_lock
150
151/*
152 * CPUロックとその解除(タスクコンテキスト用)
153 *
154 * task_intmask は,chg_ipm をサポートするための変数.chg_ipm をサポー
155 * トしない場合には,task_intmask が常に 0 になっていると考えればよい.
156 */
157
158#ifdef SUPPORT_CHG_IPM
159extern UH task_intmask; /* タスクコンテキストでの割込みマスク */
160#endif /* SUPPORT_CHG_IPM */
161
162Inline void
163t_lock_cpu()
164{
165 disint();
166}
167
168Inline void
169t_unlock_cpu()
170{
171#ifdef SUPPORT_CHG_IPM
172 /*
173 * t_unlock_cpu が呼び出されるのは CPUロック状æ…
174‹ã®ã¿ã§ã‚るた
175 * め,処理の途中で task_intmask が書き換わることはない.
176 */
177 set_intmask(task_intmask);
178#else /* SUPPORT_CHG_IPM */
179 enaint();
180#endif /* SUPPORT_CHG_IPM */
181}
182
183/*
184 * CPUロックとその解除(非タスクコンテキスト用)
185 */
186
187extern UH int_intmask; /* 非タスクコンテキストでの割込みマスク */
188
189Inline void
190i_lock_cpu()
191{
192 UH intmask;
193
194 /*
195 * 一時変数 intmask を使っているのは,current_intmask() を呼
196 * んだ直後に割込みが発生し,起動された割込みハンドラ内
197で
198 * int_intmask が変更される可能性があるためである.
199 */
200 intmask = current_intmask();
201 disint();
202 int_intmask = intmask;
203}
204
205Inline void
206i_unlock_cpu()
207{
208 set_intmask(int_intmask);
209}
210
211/*
212 * タスクディスパッチャ
213 */
214
215/*
216 * 最高優å…
217ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(cpu_support.S)
218 *
219 * dispatch は,タスクコンテキストから呼び出されたサービスコール処理
220 * 内
221で,CPUロック状æ…
222‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
223 */
224extern void dispatch(void);
225
226/*
227 * 現在のコンテキストを捨ててディスパッチ(cpu_support.S)
228 *
229 * exit_and_dispatch は,CPUロック状æ…
230‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
231 */
232extern void exit_and_dispatch(void);
233
234/*
235 * 割込みハンドラ/CPU例外ハンドラの設定
236 */
237
238/*
239 * 例外ベクタテーブルの構造の定義
240 */
241typedef struct exc_vector_entry {
242 FP exchdr; /* 例外ハンドラの起動番地 */
243} EXCVE;
244
245/*
246 * 割込みハンドラの設定
247 *
248 * ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.
249 */
250Inline void
251define_inh(INHNO inhno, FP inthdr)
252{
253 EXCVE *excvt;
254
255#ifdef EXCVT_KERNEL
256 /*
257 * EXCVT_KERNEL が定義されている時は,初期化処理の中で VBR を
258 * EXCVT_KERNEL に設定するので,EXCVT_KERNEL を使う.
259 */
260 excvt = (EXCVE *) EXCVT_KERNEL;
261#else /* EXCVT_KERNEL */
262 excvt = (EXCVE *) current_vbr();
263#endif /* EXCVT_KERNEL */
264 excvt[inhno].exchdr = inthdr;
265}
266
267/*
268 * CPU例外ハンドラの設定
269 *
270 * ベクトル番号 excno のCPU例外ハンドラの起動番地を exchdr に設定する.
271 */
272Inline void
273define_exc(EXCNO excno, FP exchdr)
274{
275 define_inh(excno, exchdr);
276}
277
278/*
279 * 割込みハンドラ/CPU例外ハンドラの出å…
280¥å£å‡¦ç†
281 */
282
283/*
284 * 割込みハンドラの出å…
285¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
286 *
287 * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
288 * に起動された割込みハンドラ内
289でディスパッチが要求された場合に,ディ
290 * スパッチされない.
291 */
292
293#define INTHDR_ENTRY(inthdr) \
294extern void inthdr##_entry(void); \
295asm(".text \n" \
296#inthdr "_entry: \n" \
297" movem.l %d0-%d1/%a0-%a1, -(%sp) \n" /* スクラッチレジスタを保存 */ \
298" jsr " #inthdr " \n" /* 割込みハンドラを呼び出す */ \
299" movem.l (%sp)+, %d0-%d1/%a0-%a1 \n" /* スクラッチレジスタを復帰 */ \
300" btst.b #4, (%sp) \n" /* 戻りå…
301ˆãŒå‰²è¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ãªã‚‰ */ \
302" jbeq 1f \n" /* すぐにリターン */ \
303" or.w #0x0700, %sr \n" /* 割込み禁止 */ \
304" tst.l _kernel_reqflg \n" /* reqflg が TRUE であれば */ \
305" jbne _kernel_ret_int \n" /* ret_int へ */ \
306"1: rte \n")
307
308#define INT_ENTRY(inthdr) inthdr##_entry
309
310/*
311 * CPU例外ハンドラの出å…
312¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
313 *
314 * CPU例外ハンドラは,非タスクコンテキストで実行する.そのため,CPU例
315 * 外ハンドラを呼び出す前に割込みモードに移行し,リターンしてきた後に
316 * å…
317ƒã®ãƒ¢ãƒ¼ãƒ‰ã«æˆ»ã™ï¼Žå…
318ƒã®ãƒ¢ãƒ¼ãƒ‰ã«æˆ»ã™ãŸã‚ã«ï¼Œå‰²è¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã«ç§»è¡Œã™ã‚‹å‰
319 * の SR を割込みスタック上に保存する.CPU例外がタスクコンテキストで
320 * 発生し,reqflg が TRUE になった時に,ret_exc へ分岐する.
321 * reqflg をチェックする前に割込みを禁止しないと,reqflg をチェック後
322 * に起動された割込みハンドラ内
323でディスパッチが要求された場合に,ディ
324 * スパッチされない.
325 */
326
327#define EXCHDR_ENTRY(exchdr) \
328extern void exchdr##_entry(VP sp); \
329asm(".text \n" \
330#exchdr "_entry: \n" \
331" movem.l %d0-%d1/%a0-%a1, -(%sp) \n" /* スクラッチレジスタを保存 */ \
332" lea.l 16(%sp), %a0 \n" /* 例外フレームのå…
333ˆé ­ã‚’ A0 に */ \
334" move.w %sr, %d0 \n" /* SR を D0 に */ \
335" and.w #~0x1000, %sr \n" /* 割込みモード */ \
336" move.l %d0, -(%sp) \n" /* å…
337ƒã® SR をスタックに保存 */ \
338" move.l %a0, -(%sp) \n" /* A0 を引数として渡す */ \
339" jsr " #exchdr " \n" /* CPU例外ハンドラを呼び出す */ \
340" addq.l #4, %sp \n" \
341" move.l (%sp)+, %d0 \n" \
342" and.w #0x1000, %d0 \n" /* å…
343ƒãŒå‰²è¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ãªã‚‰ */ \
344" jbeq 1f \n" /* すぐにリターン */ \
345" or.w #0x1700, %sr \n" /* マスタモード・割込み禁止 */ \
346" tst.l _kernel_reqflg \n" /* reqflg が TRUE であれば */ \
347" jbne _kernel_ret_exc \n" /* ret_exc へ */ \
348"1: movem.l (%sp)+, %d0-%d1/%a0-%a1 \n" /* スクラッチレジスタを復帰 */ \
349" rte \n")
350
351#define EXC_ENTRY(exchdr) exchdr##_entry
352
353/*
354 * CPU例外の発生した時のシステム状æ…
355‹ã®å‚ç…
356§
357 */
358
359/*
360 * CPU例外の発生した時のコンテキストの参ç…
361§
362 */
363Inline BOOL
364exc_sense_context(VP p_excinf)
365{
366 return((*((UH *) p_excinf) & 0x1000) == 0);
367}
368
369/*
370 * CPU例外の発生した時のCPUロック状æ…
371‹ã®å‚ç…
372§
373 */
374Inline BOOL
375exc_sense_lock(VP p_excinf)
376{
377 return((*((UH *) p_excinf) & 0x0700) == 0x0700);
378}
379
380/*
381 * プロセッサ依存の初期化
382 */
383extern void cpu_initialize(void);
384
385/*
386 * プロセッサ依存の終了時処理
387 */
388extern void cpu_terminate(void);
389
390#endif /* _MACRO_ONLY */
391#endif /* _CPU_CONFIG_H_ */
Note: See TracBrowser for help on using the repository browser.