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

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

initial

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 * 2003 by Advanced Data Controls, Corp
9 *
10 * 上記著作権者
11は,以下の (1)〜(4) の条件か,Free Software Foundation
12 * によってå…
13¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
14 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
15 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
16å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
17 * 利用と呼ぶ)することを無償で許諾する.
18 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
19 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
20 * スコード中に含まれていること.
21 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
22 * 用できる形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
24å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
25 * 者
26マニュアルなど)に,上記の著作権表示,この利用条件および下記
27 * の無保証規定を掲載すること.
28 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
29 * 用できない形で再é…
30å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
31 * と.
32 * (a) 再é…
33å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
34マニュアルなど)に,上記の著
35 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
36 * (b) 再é…
37å¸ƒã®å½¢æ…
38‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
39 * 報告すること.
40 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
41 * 害からも,上記著作権者
42およびTOPPERSプロジェクトをå…
43è²¬ã™ã‚‹ã“と.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
48 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
49 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
50 *
51 * @(#) $Id: cpu_config.h,v 1.3 2003/12/19 11:24:37 honda Exp $
52 */
53
54/*
55 * プロセッサ依存モジュール(ARM4vT用)
56 *
57 * このインクルードファイルは,t_config.hのみからインクルードされる.
58 * 他のファイルから直接インクルードしてはならない.
59 */
60
61#ifndef _CPU_CONFIG_H_
62#define _CPU_CONFIG_H_
63
64/*
65 * カーネル内
66部識別名のリネーム
67 */
68#include "cpu_rename.h"
69
70/*
71 * プロセッサの特殊命令のインライン関数定義
72 */
73#ifndef _MACRO_ONLY
74#include <cpu_insn.h>
75#endif /* _MACRO_ONLY */
76
77/*
78 * TCB 関連の定義
79 *
80 * cpu_context.h にå…
81¥ã‚Œã‚‹æ–¹ãŒã‚¨ãƒ¬ã‚¬ãƒ³ãƒˆã ãŒï¼Œå‚ç…
82§ã®ä¾å­˜æ€§ã®é–¢ä¿‚で,
83 * cpu_context.h にはå…
84¥ã‚Œã‚‰ã‚Œãªã„.
85 */
86
87/*
88 * TCB 中のフィールドのビット幅
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 sp; /* スタックポインタ */
102 FP pc; /* プログラムカウンタ */
103} CTXB;
104
105/*
106 * 割り込みのネスト回数のカウント
107 */
108extern UW interrupt_count;
109
110
111/*
112 * システム状æ…
113‹å‚ç…
114§
115 */
116Inline UB
117current_mode()
118{
119 return(current_sr() & CPSR_MODE_MASK);
120}
121
122Inline BOOL
123sense_context()
124{
125 return(interrupt_count > 0);
126}
127
128Inline BOOL
129sense_lock()
130{
131 return(current_sr() & CPSR_IRQ_BIT);
132}
133
134#define t_sense_lock sense_lock
135#define i_sense_lock sense_lock
136
137
138/*
139 * CPUロックとその解除
140 *
141 */
142
143#define t_lock_cpu lock_cpu
144#define i_lock_cpu lock_cpu
145#define t_unlock_cpu unlock_cpu
146#define i_unlock_cpu unlock_cpu
147
148
149Inline void
150lock_cpu()
151{
152 disint();
153}
154
155Inline void
156unlock_cpu()
157{
158 enaint();
159}
160
161
162/*
163 * タスクディスパッチャ
164 */
165
166/*
167 * 最高優å…
168ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(cpu_support.S)
169 *
170 * dispatch は,タスクコンテキストから呼び出されたサービスコール処理
171 * 内
172で,CPUロック状æ…
173‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
174 */
175extern void dispatch(void);
176
177
178/*
179 * 現在のコンテキストを捨ててディスパッチ(cpu_support.S)
180 *
181 * exit_and_dispatch は,CPUロック状æ…
182‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
183 */
184extern void exit_and_dispatch(void);
185
186
187/*
188 * 例外ベクタに書き込まれたジャンプ命令が参ç…
189§ã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹
190 */
191extern UW * arm_vector_add[8];
192
193
194/*
195 * 例外に応じたハンドラの起動番地
196 */
197extern UW arm_handler_add[8];
198
199
200/*
201 * CPU例外ハンドラの設定
202 */
203extern void define_exc(EXCNO excno, FP exchdr);
204
205
206Inline void
207arm_install_handler(EXCNO excno, FP exchdr)
208{
209 *arm_vector_add[excno] = (UW)exchdr;
210}
211
212
213/*
214 * CPU例外ハンドラの出å…
215¥å£å‡¦ç†
216 */
217
218
219/*
220 * CPU例外ハンドラの出å…
221¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
222 *
223 */
224#define __EXCHDR_ENTRY(exchdr, stacktop) \
225extern void exchdr##_entry(VP sp); \
226asm(".text \n" \
227#exchdr "_entry: \n" \
228" ldr sp,.int_stack_"#exchdr" \n" /* スタックの切り替え */\
229" sub lr,lr,#4 \n" /* undefでもこれでいいか? */\
230" stmfd sp!, {r0 - r2,lr} \n" /* 一時的にint_stackに待
231避 */ \
232" mrs r0, spsr \n" /* SVCモードに切り替えるため */ \
233" mov r1, sp \n" /* 保存する */ \
234" mov r2,#0xd3 \n" /* CPSRの書き換え */ \
235" msr cpsr,r2 \n" \
236" ldr r2,[r1,#0x0C] \n" /* load PC */\
237" stmfd sp!,{r2} \n" /* Store PC */\
238" stmfd sp!,{r3,ip,lr} \n" /* Store r3,ip,lr */\
239" ldmfd r1!,{r2,ip,lr} \n" /* load r0,r1,r2 */\
240" stmfd sp!,{r0,r2,ip,lr} \n" /* SPSR,Store r0,r1,r2 */\
241" ldr r2, .interrupt_count_"#exchdr"\n" /* 多重割り込みか判定 */\
242" ldr r3, [r2] \n" \
243" add r0,r3,#1 \n" \
244" str r0, [r2] \n" \
245" mov r0,sp \n" /* 例外ハンドラへの引数 */\
246" cmp r3, #0x00 \n" \
247" ldreq sp,stack_"#exchdr" \n" /* スタックの変更 */\
248" stmeqfd sp!,{r0} \n" /* タスクスタックの保存 */\
249" mov r2,#0x13 \n" /* 割り込み許可 */\
250" msr cpsr,r2 \n" \
251" bl "#exchdr" \n" /* ハンドラ呼び出し */\
252" mov r2,#0xd3 \n" /* 割り込み禁止 */\
253" msr cpsr,r2 \n" \
254" ldr r2,.interrupt_count_"#exchdr" \n"/* 割り込み回数を */\
255" ldr r1, [r2] \n" /* デクリメント */\
256" sub r3,r1,#1 \n"\
257" str r3, [r2] \n"\
258" cmp r3,#0x00 \n" /* 割り込みネスト数? */\
259" bne return_to_task_"#exchdr" \n" \
260" ldmfd sp!,{r0} \n" /* タスクスタックの復帰 */\
261" mov sp, r0 \n"\
262" ldr r1, reqflg_"#exchdr" \n" /* Check reqflg */\
263" ldr r0,[r1] \n"\
264" cmp r0,#0 \n"\
265" beq return_to_task_"#exchdr" \n"\
266" mov r0,#0 \n"\
267" str r0,[r1] \n" /* Clear reqflg */\
268" b _kernel_ret_exc \n" /* ret_intへ */\
269"return_to_task_"#exchdr": \n" \
270" ldmfd sp!,{r1} \n" /* CPSRの復帰処理 */\
271" msr spsr, r1 \n" /* 割り込み許可 */\
272" ldmfd sp!,{r0-r3,ip,lr,pc}^ \n"\
273" .align 4 \n"\
274".int_stack_"#exchdr": \n"\
275" .word _kernel_int_stack + 6 * 4 \n"\
276"reqflg_"#exchdr": \n"\
277" .word _kernel_reqflg \n"\
278"stack_"#exchdr": \n"\
279" .word " #stacktop " \n"\
280".interrupt_count_"#exchdr": \n"\
281" .word _kernel_interrupt_count \n")
282
283
284#define _EXCHDR_ENTRY(exchdr, stacktop) __EXCHDR_ENTRY(exchdr, stacktop)
285
286#define EXCHDR_ENTRY(exchdr) _EXCHDR_ENTRY(exchdr, STACKTOP)
287
288#define EXC_ENTRY(exchdr) exchdr##_entry
289
290
291/*
292 * CPU例外の発生した時のシステム状æ…
293‹ã®å‚ç…
294§
295 */
296
297/*
298 * CPU例外の発生した時のディスパッチ
299 */
300Inline BOOL
301exc_sense_context(VP p_excinf)
302{
303 return(interrupt_count > 1);
304}
305
306
307/*
308 * CPU例外の発生した時のCPUロック状æ…
309‹ã®å‚ç…
310§
311 */
312Inline BOOL
313exc_sense_lock(VP p_excinf)
314{
315 return((*((UW *)p_excinf) & CPSR_IRQ_BIT) == CPSR_IRQ_BIT );
316}
317
318
319/*
320 * 未定義の例外がå…
321¥ã£ãŸå ´åˆ
322 */
323extern void undef_exception();
324extern void swi_exception();
325extern void prefetch_exception();
326extern void data_abort_exception();
327extern void irq_abort_exception();
328extern void fiq_abort_exception();
329
330
331/*
332 * プロセッサ依存の初期化
333 */
334extern void cpu_initialize(void);
335
336
337/*
338 * プロセッサ依存の終了時処理
339 */
340extern void cpu_terminate(void);
341
342
343/*
344 * CPU/割込みハンドラの出å…
345¥ã‚Šå£å‡¦ç†ã§ä¸€æ™‚的に使用するスタック
346 */
347#define INT_STACK_SIZE 6
348extern UW int_stack[INT_STACK_SIZE];
349
350
351#endif /* _MACRO_ONLY */
352#endif /* _CPU_CONFIG_H_ */
Note: See TracBrowser for help on using the repository browser.