source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/s1c33/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 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * Copyright (C) 2004 by SEIKO EPSON Corp, 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 */
53
54/*
55 * プロセッサ依存モジュール(S1C33用)
56 */
57
58
59#ifndef _CPU_CONFIG_H_
60#define _CPU_CONFIG_H_
61
62/*
63 * カーネルの内
64部識別名のリネーム
65 */
66#include "cpu_rename.h"
67
68
69/*
70 * 設定可能な最高割り込み優å…
71ˆåº¦
72 */
73#define TPS_INTLEV_MAX (0x04)
74#define TPS_CPULOCK_LEV (TPS_INTLEV_MAX + 1)
75
76/*
77 * TCB 中のフィールドのビット幅
78の定義
79 */
80#define TBIT_TCB_PRIORITY 8 /* priority フィールドのビット幅
81 */
82#define TBIT_TCB_TSTAT 8 /* tstat フィールドのビット幅
83 */
84
85
86#ifndef _MACRO_ONLY
87/*
88 * TCB 関連の定義
89 * cpu_context.h にå…
90¥ã‚Œã‚‹æ–¹ãŒã‚¨ãƒ¬ã‚¬ãƒ³ãƒˆã ãŒï¼Œå‚ç…
91§ã®ä¾å­˜æ€§ã®é–¢ä¿‚で,
92 * cpu_context.h にはå…
93¥ã‚Œã‚‰ã‚Œãªã„.
94 */
95/*
96 * タスクコンテキストブロックの定義
97 * Task context block.
98 */
99typedef struct task_context_block {
100 VP sp; /* スタックポインタ */
101 FP pc; /* プログラムカウンタ */
102} CTXB;
103
104
105/*
106 * 最高優å…
107ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(cpu_config.c)
108 *
109 * dispatch は,タスクコンテキストから呼び出されたサービスコール処理
110 * 内
111で,CPUロック状æ…
112‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
113 */
114extern void dispatch(void);
115
116/*
117 * 現在のコンテキストを捨ててディスパッチ(cpu_config.c)
118 *
119 * exit_and_dispatch は,CPUロック状æ…
120‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
121 */
122extern void exit_and_dispatch(void);
123
124/*
125 * プロセッサ依存の初期化
126 */
127extern void cpu_initialize(void);
128
129/*
130 * プロセッサ依存の終了時処理
131 */
132extern void cpu_terminate(void);
133
134/*
135 * CPUロック解除時に復å…
136ƒã™ã‚‹å‰²ã‚Šè¾¼ã¿ãƒ¬ãƒ™ãƒ«
137 */
138extern UINT tps_OrgIntLevel;
139
140/*
141 * 割込みネストカウンタ
142 */
143extern UINT tps_IntNestCnt;
144
145/*
146 * ビットサーチマクロ使用の設定
147 */
148#ifndef __c33pe
149#define CPU_BITMAP_SEARCH
150#endif /* __c33pe */
151
152/*
153 * プロセッサの特殊命令のインライン関数定義
154 */
155#include "cpu_insn.h"
156
157/*
158 * システム状æ…
159‹å‚ç…
160§é–¢æ•°ã®åˆ¥åå®šç¾©
161 */
162#define t_sense_lock sense_lock
163#define i_sense_lock sense_lock
164#define t_lock_cpu lock_cpu
165#define i_lock_cpu lock_cpu
166#define t_unlock_cpu unlock_cpu
167#define i_unlock_cpu unlock_cpu
168
169/*
170 * 現在のコンテキスト状æ…
171‹ã‚’参ç…
172§
173 */
174Inline BOOL
175sense_context()
176{
177 return ((tps_IntNestCnt) ? TRUE : FALSE);
178}
179
180/*
181 * 現在のCPUロック状æ…
182‹ã‚’参ç…
183§
184 */
185Inline BOOL
186sense_lock()
187{
188 UW ulIntLevel;
189
190 ulIntLevel = get_psr();
191
192 ulIntLevel = (ulIntLevel & S1C33_PSR_MASK_IL);
193 return ((ulIntLevel < (TPS_CPULOCK_LEV << 8)) ? FALSE : TRUE);
194}
195
196/*
197 * CPUロック状æ…
198‹è¨­å®šå‡¦ç†
199 */
200Inline void
201lock_cpu()
202{
203 UW ulPsr, ulIntLevel;
204
205 ulPsr = get_psr();
206 ulIntLevel = (ulPsr & S1C33_PSR_MASK_IL);
207
208 if(ulIntLevel < (TPS_CPULOCK_LEV << 8)){
209 ulPsr &= ~S1C33_PSR_MASK_IL;
210 set_psr(ulPsr | (TPS_CPULOCK_LEV << 8));
211 tps_OrgIntLevel = ulIntLevel;
212 }
213}
214
215Inline void
216unlock_cpu()
217{
218 UW ulPsr;
219
220 ulPsr = get_psr();
221 ulPsr &= ~S1C33_PSR_MASK_IL;
222 ulPsr |= tps_OrgIntLevel;
223 tps_OrgIntLevel = (TPS_INIT_INTLEVEL << 8);
224
225 set_psr(ulPsr);
226}
227
228/*
229 * CPU例外の発生した時のシステム状æ…
230‹ã®å‚ç…
231§
232 */
233/*
234 * CPU例外の発生した時のコンテキストの参ç…
235§
236 */
237Inline BOOL
238exc_sense_context(VP p_excinf)
239{
240 return ((tps_IntNestCnt > 1) ? TRUE : FALSE);
241}
242
243/*
244 * CPU例外の発生した時のCPUロック状æ…
245‹ã®å‚ç…
246§
247 */
248Inline BOOL
249exc_sense_lock(VP p_excinf)
250{
251 UW ulPsr;
252
253 ulPsr = ((*((UW *)p_excinf) & S1C33_PSR_MASK_IL) >> 8);
254 return (ulPsr == TPS_CPULOCK_LEV) ? TRUE : FALSE;
255}
256
257/*
258 * 例外ベクタテーブルの構造の定義
259 */
260typedef struct exc_vector_entry {
261 FP exchdr; /* 例外ハンドラの起動番地 */
262} EXCVE;
263
264/*
265 * CPU例外ハンドラの設定
266 */
267#define define_exc define_inh
268
269/*
270 * 割込みハンドラの設定
271 */
272Inline void
273define_inh(INHNO inhno, FP inthdr)
274{
275 EXCVE *excvt;
276
277 excvt = (EXCVE *) get_ttbr();
278 excvt[inhno].exchdr = inthdr;
279}
280
281/*
282 * 割込みハンドラの出å…
283¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
284 */
285#define INTHDR_ENTRY(inthdr) void inthdr##_entry(void) { tpsIntPreWrap(); asm("xcall " #inthdr); tpsIntPostWrap(); }
286#define INT_ENTRY(inthdr) inthdr##_entry
287
288/*
289 * CPU例外ハンドラの出å…
290¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
291 */
292#define EXCHDR_ENTRY(exchdr) INTHDR_ENTRY(exchdr)
293#define EXC_ENTRY(exchdr) exchdr##_entry
294
295/*
296 * 割込み/CPU例外ハンドラの出å…
297¥å£å‡¦ç†
298 *
299 * idle中は割り込まれたスタック==stacktopなので、
300 * idleルーチンにもretiで復帰できる位置に割り込みスタックを設定している
301 */
302Inline void
303tpsIntPreWrap(void)
304{
305#if TPS_DAREA_CNT == 4 /* データエリア数に応じて退避 */
306 Asm("pushn %r11"); /* レジスタ数を変更する。 */
307#elif TPS_DAREA_CNT == 3
308 Asm("pushn %r12");
309#elif TPS_DAREA_CNT == 2
310 Asm("pushn %r13");
311#elif TPS_DAREA_CNT == 1
312 Asm("pushn %r14");
313#else
314 Asm("pushn %r15");
315#endif /* TPS_DAREA */
316
317#ifdef __c33adv
318 Asm("pushs %sor ");
319#else /* __c33adv */
320 Asm("ld.w %r0, %ahr ");
321 Asm("ld.w %r1, %alr ");
322#endif /* __c33adv */
323
324 Asm("ld.w %r2, %sp "); /* スタックの切り替え、 */
325 Asm("xld.w %r3, _kernel_tps_IntNestCnt "); /* 割り込みカウンタの更新、 */
326 Asm("ld.w %r5, [%r3] "); /* 多重割り込みの許可を行う */
327 Asm("xld.w %%r4, %0 - 8 " : : "g"(STACKTOP));
328 Asm("cmp %r5, 0x00 ");
329 Asm("jrne 0f ");
330 Asm("ld.w %sp, %r4 ");
331 Asm("0: ");
332 Asm("add %r5, 1 ");
333 Asm("ld.w [%r3], %r5 ");
334 Asm("ld.w %r4, %psr ");
335 Asm("or %r4, 0x10 ");
336 Asm("ld.w %psr, %r4 ");
337 Asm("ld.w %r6, %r2 ");
338
339#ifdef __c33adv /* pushs命令によるスタック使用 */
340 Asm("add %r6, 24"); /* サイズを加算する */
341#endif /* __c33adv */
342
343#if TPS_DAREA_CNT == 4
344 Asm("add %r6, 48");
345#elif TPS_DAREA_CNT == 3
346 Asm("add %r6, 52");
347#elif TPS_DAREA_CNT == 2
348 Asm("add %r6, 56");
349#elif TPS_DAREA_CNT == 1
350 Asm("add %r6, 60");
351#else
352 Asm("ext 0x0001");
353 Asm("add %r6, 0x00");
354#endif /* TPS_DAREA */
355}
356
357Inline void
358tpsIntPostWrap(void)
359{
360 Asm("ld.w %r4, %psr "); /* 割り込みをディセーブルする */
361 Asm("xand %r4, 0xfffff0ff ");
362 Asm("xld.w %%r5, %0"
363 : : "g"(TPS_CPULOCK_LEV << 8));
364 Asm("or %r4, %r5 ");
365 Asm("ld.w %psr, %r4 ");
366
367 Asm("ld.w %r4, [%r3] "); /* tps_IntNestCntを更新する */
368 Asm("sub %r4, 1 ");
369 Asm("ld.w [%r3], %r4 ");
370
371 Asm("ld.w %sp, %r2 "); /* スタック領域を復å…
372ƒã™ã‚‹ */
373
374 Asm("cmp %r4, 0x00 ");
375 Asm("xjrne 0f ");
376 Asm("xld.w %r3, _kernel_reqflg ");
377 Asm("ld.w %r3, [%r3] ");
378 Asm("cmp %r3, 1 "); /* tps_IntNestCnt== 0でディス */
379 Asm("xjreq _kernel_ret_int "); /* パッチが発生していればジャンプ */
380 Asm("0: "); /* する */
381
382#ifdef __c33adv /* 退避した特殊レジスタを復å…
383ƒã™ã‚‹ */
384 Asm("pops %sor ");
385#else /* __c33adv */
386 Asm("ld.w %alr, %r1 ");
387 Asm("ld.w %ahr, %r0 ");
388#endif /* __c33adv */
389
390#if TPS_DAREA_CNT == 4
391 Asm("popn %r11");
392#elif TPS_DAREA_CNT == 3
393 Asm("popn %r12");
394#elif TPS_DAREA_CNT == 2
395 Asm("popn %r13");
396#elif TPS_DAREA_CNT == 1
397 Asm("popn %r14");
398#else
399 Asm("popn %r15");
400#endif /* TPS_DAREA */
401
402 Asm("reti");
403}
404
405#endif /* _MACRO_ONLY */
406#endif /* _CPU_CONFIG_H_ */
Note: See TracBrowser for help on using the repository browser.