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

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

initial

File size: 9.5 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.9 2003/12/24 07:24:40 honda Exp $
51 */
52
53/*
54 * プロセッサ依存モジュール(Linux用)
55 */
56
57#ifndef _CPU_CONFIG_H_
58#define _CPU_CONFIG_H_
59
60/*
61 * カーネルの内
62部識別名のリネーム
63 */
64#include <cpu_rename.h>
65
66#ifndef _MACRO_ONLY
67
68/*
69 * Linux用標準インクルードファイル
70 */
71
72#include <signal.h>
73#include <setjmp.h>
74
75/*
76 * chg_ims/get_ims をサポートするかどうかの定義
77 */
78#define SUPPORT_CHG_IMS
79
80/*
81 * TCB 関連の定義
82 *
83 * cpu_context.h にå…
84¥ã‚Œã‚‹æ–¹ãŒã‚¨ãƒ¬ã‚¬ãƒ³ãƒˆã ãŒï¼Œå‚ç…
85§ã®ä¾å­˜æ€§ã®é–¢ä¿‚で,
86 * cpu_context.h にはå…
87¥ã‚Œã‚‰ã‚Œãªã„.
88 */
89
90/*
91 * TCB 中のフィールドのビット幅
92の定義
93 */
94#define TBIT_TCB_PRIORITY 8 /* priority フィールドのビット幅
95 */
96#define TBIT_TCB_TSTAT 8 /* tstat フィールドのビット幅
97 */
98
99/*
100 * タスクコンテキストブロックの定義
101 */
102typedef struct task_context_block {
103 jmp_buf env; /* CPUコンテキスト */
104} CTXB;
105
106/*
107 * CPU例外ハンドラ
108 */
109
110#define EXCHNO_ZDIV SIGFPE
111
112/*
113 * システム状æ…
114‹å‚ç…
115§
116 */
117
118
119Inline int
120current_stack()
121{
122 struct sigaltstack ss;
123
124 sigaltstack(((void *)0), &ss);
125 return(ss.ss_flags & SS_ONSTACK);
126}
127
128
129Inline BOOL
130sense_context()
131{
132 return(current_stack());
133}
134
135Inline BOOL
136sense_lock()
137{
138 sigset_t currentSet;
139
140 sigprocmask(SIG_BLOCK, ((void *)0), &currentSet);
141
142#if defined(linux) & (defined(i386) | defined(_i386_) | defined(__i386__))
143 if(currentSet.__val[0] == ~(0 | (1<<(SIGKILL-1)) | (1<<(SIGSTOP-1)))
144 && currentSet.__val[1] == ~0 )
145 return(TRUE);
146 else
147 return(FALSE);
148#else
149
150#error not supported.
151
152#endif /* linux */
153}
154
155
156#define t_sense_lock sense_lock
157#define i_sense_lock sense_lock
158
159/*
160 * CPUロックとその解除(タスクコンテキスト用)
161 *
162 * task_intmask は,chg_ipm をサポートするための変数.chg_ipm をサポー
163 * トしない場合には,task_intmask が常に 0 になっていると考えればよい.
164 */
165
166#ifdef SUPPORT_CHG_IMS
167extern IMS task_sigmask; /* タスクコンテキストでの割込みマスク */
168#endif /* SUPPORT_CHG_IMS */
169
170Inline void
171t_lock_cpu()
172{
173 sigset_t newmask;
174
175 sigfillset(&newmask);
176 sigprocmask(SIG_SETMASK,&newmask,0);
177}
178
179Inline void
180t_unlock_cpu()
181{
182#ifdef SUPPORT_CHG_IMS
183 /*
184 * t_unlock_cpu が呼び出されるのは CPUロック状æ…
185‹ã®ã¿ã§ã‚るた
186 * め,処理の途中で task_intmask が書き換わることはない.
187 */
188 sigprocmask(SIG_SETMASK,&task_sigmask,0);
189#else /* SUPPORT_CHG_IMS */
190 sigset_t mask;
191
192 sigemptyset(&mask);
193 sigprocmask(SIG_SETMASK,&mask,0);
194#endif /* SUPPORT_CHG_IMS */
195}
196
197/*
198 * CPUロックとその解除(非タスクコンテキスト用)
199 */
200
201extern IMS int_sigmask; /* 非タスクコンテキストでの割込みマスク */
202
203Inline void
204i_lock_cpu()
205{
206 sigset_t mask;
207
208 sigfillset(&mask);
209 sigprocmask(SIG_SETMASK,&mask,&int_sigmask);
210}
211
212Inline void
213i_unlock_cpu()
214{
215 sigprocmask(SIG_SETMASK,&int_sigmask,0);
216}
217
218/*
219 * タスクディスパッチャ
220 */
221
222/*
223 * 最高優å…
224ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ
225 *
226 * dispatch は,タスクコンテキストから呼び出されたサービスコール処理
227 * 内
228で,CPUロック状æ…
229‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
230 */
231extern void dispatch();
232
233
234/*
235 * 現在のコンテキストを捨ててディスパッチ
236 *
237 * exit_and_dispatch は,CPUロック状æ…
238‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
239 */
240
241extern void exit_and_dispatch(void);
242
243/*
244 * 割込みハンドラ/CPU例外ハンドラの設定
245 */
246
247
248/*
249 * 割込みハンドラの設定
250 *
251 * ベクトル番号 inhno の割込みハンドラの起動番地を inthdr に設定する.
252 */
253
254Inline void
255define_inh(INHNO inhno, FP inthdr)
256{
257 /*
258 * SIGUSR1をブロック、スタック切り替え有りで登録する。
259 * 優å…
260ˆåº¦ã‚’付けたい場合はマスクするビットを指定する
261 * 必
262要があるのでこの方法は使えない。
263 */
264
265 struct sigaction action;
266
267 action.sa_handler = inthdr;
268 sigemptyset(&action.sa_mask);
269 sigaddset(&action.sa_mask,SIGUSR1);
270 action.sa_flags = SA_ONSTACK;
271
272 sigaction(inhno, &action, 0);
273}
274
275/*
276 * CPU例外ハンドラの設定
277 *
278 * ベクトル番号 excno のCPU例外ハンドラの起動番地を exchdr に設定する.
279 */
280Inline void
281define_exc(EXCNO excno, FP exchdr)
282{
283 /*
284 * ブロックするマスク無し、スタック切り替え有りで登録する。
285 */
286 struct sigaction action;
287
288 action.sa_handler = exchdr;
289 sigemptyset(&action.sa_mask);
290 sigaddset(&action.sa_mask,SIGUSR1);
291 action.sa_flags = SA_ONSTACK;
292 sigaction(excno, &action, 0);
293}
294
295/*
296 * 割込みハンドラ/CPU例外ハンドラの出å…
297¥å£å‡¦ç†
298 */
299
300/*
301 * 割込みハンドラの出å…
302¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
303 *
304 * シグナルが発行されてるとシグナルスタックに自動的に切り替わる。
305 * å…
306¨ã¦ã®å‰²ã‚Šè¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã¯ãƒ‡ã‚£ã‚¹ãƒ‘ッチャを起動するSIGUSR1をマスクして
307 * 動作する。そのためreqflgのチェック後シグナルが発行されて起動された
308 * ハンドラでディスパッチが要求されても正しく動く
309 */
310
311
312#define INTHDR_ENTRY(inthdr) \
313void inthdr##_entry(void){ \
314 inthdr(); /* 割り込みハンドラを呼び出す */ \
315 if(_kernel_reqflg) /* regflg がTRUEであれば */ \
316 raise(SIGUSR1); /* ディスパッチャを呼び出す */ \
317}
318
319#define INT_ENTRY(inthdr) inthdr##_entry
320
321
322/*
323 * CPU例外ハンドラの出å…
324¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
325 *
326 * シグナルが発行されてるとシグナルスタックに自動的に切り替わる。
327 * å…
328¨ã¦ã®CPU例外ハンドラはディスパッチャを起動するSIGUSR1をマスクして
329 * 動作する。そのためreqflgのチェック後シグナルが発行されて起動された
330 * ハンドラでディスパッチが要求されても正しく動く
331 */
332#define EXCHDR_ENTRY(exchdr) \
333void exchdr##_entry(VP sp){ \
334 exchdr(sp); /* 割り込みハンドラを呼び出す */ \
335 if(_kernel_reqflg) /* regflg がTRUEであれば */ \
336 raise(SIGUSR1); /* ディスパッチャを呼び出す */ \
337}
338
339#define EXC_ENTRY(exchdr) exchdr##_entry
340
341/*
342 * CPU例外の発生した時のシステム状æ…
343‹ã®å‚ç…
344§
345 */
346
347/*
348 * CPU例外の発生した時のディスパッチ
349 */
350Inline BOOL
351exc_sense_context(VP p_excinf)
352{
353 return((*((UH *) p_excinf) & 0x1000) == 0);
354}
355
356/*
357 * CPU例外の発生した時のCPUロック状æ…
358‹ã®å‚ç…
359§
360 */
361Inline BOOL
362exc_sense_lock(VP p_excinf)
363{
364 return((*((UH *) p_excinf) & 0x0700) == 0x0700);
365}
366
367
368/*
369 * プロセッサ依存の初期化
370 */
371extern void cpu_initialize(void);
372
373/*
374 * プロセッサ依存の終了時処理
375 */
376extern void cpu_terminate(void);
377
378#endif /* _MACRO_ONLY */
379#endif /* _CPU_CONFIG_H_ */
380
381
382
383
384
385
386
Note: See TracBrowser for help on using the repository browser.