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

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

initial

File size: 10.4 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-2004 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.19 2004/09/17 13:45:55 honda Exp $
51 */
52
53/*
54 * プロセッサ依存モジュール(ARM4vT用)
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 * TCB 関連の定義
78 *
79 * cpu_context.h にå…
80¥ã‚Œã‚‹æ–¹ãŒã‚¨ãƒ¬ã‚¬ãƒ³ãƒˆã ãŒï¼Œå‚ç…
81§ã®ä¾å­˜æ€§ã®é–¢ä¿‚で,
82 * cpu_context.h にはå…
83¥ã‚Œã‚‰ã‚Œãªã„.
84 */
85
86/*
87 * TCB 中のフィールドのビット幅
88の定義
89 */
90#define TBIT_TCB_TSTAT 8 /* tstat フィールドのビット幅
91 */
92#define TBIT_TCB_PRIORITY 8 /* priority フィールドのビット幅
93 */
94
95#ifndef _MACRO_ONLY
96/*
97 * タスクコンテキストブロックの定義
98 */
99typedef struct task_context_block {
100 VP sp; /* スタックポインタ */
101 FP pc; /* プログラムカウンタ */
102} CTXB;
103
104/*
105 * 割り込みのネスト回数のカウント
106 */
107extern UW interrupt_count;
108
109
110/*
111 * システム状æ…
112‹å‚ç…
113§
114 */
115Inline UB
116current_mode()
117{
118 return(current_sr() & CPSR_MODE_MASK);
119}
120
121Inline BOOL
122sense_context()
123{
124 return(interrupt_count > 0);
125}
126
127Inline BOOL
128sense_lock()
129{
130 return(current_sr() & CPSR_IRQ_BIT);
131}
132
133#define t_sense_lock sense_lock
134#define i_sense_lock sense_lock
135
136
137/*
138 * CPUロックとその解除
139 *
140 */
141
142#define t_lock_cpu lock_cpu
143#define i_lock_cpu lock_cpu
144#define t_unlock_cpu unlock_cpu
145#define i_unlock_cpu unlock_cpu
146
147
148Inline void
149lock_cpu()
150{
151 disint();
152}
153
154Inline void
155unlock_cpu()
156{
157 enaint();
158}
159
160
161/*
162 * タスクディスパッチャ
163 */
164
165/*
166 * 最高優å…
167ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(cpu_support.S)
168 *
169 * dispatch は,タスクコンテキストから呼び出されたサービスコール処理
170 * 内
171で,CPUロック状æ…
172‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
173 */
174extern void dispatch(void);
175
176
177/*
178 * 現在のコンテキストを捨ててディスパッチ(cpu_support.S)
179 *
180 * exit_and_dispatch は,CPUロック状æ…
181‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
182 */
183extern void exit_and_dispatch(void);
184
185
186/*
187 * 例外ベクタに書き込まれたジャンプ命令が参ç…
188§ã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹
189 */
190extern UW * arm_vector_add[8];
191
192
193/*
194 * 例外に応じたハンドラの起動番地
195 */
196extern UW arm_handler_add[8];
197
198
199/*
200 * CPU例外ハンドラの設定
201 */
202extern void define_exc(EXCNO excno, FP exchdr);
203
204
205Inline void
206arm_install_handler(EXCNO excno, FP exchdr)
207{
208 *arm_vector_add[excno] = (UW)exchdr;
209}
210
211
212/*
213 * CPU例外ハンドラの出å…
214¥å£å‡¦ç†
215 */
216
217
218/*
219 * CPU例外ハンドラの出å…
220¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
221 *
222 */
223#define __EXCHDR_ENTRY(exchdr, stacktop) \
224extern void exchdr##_entry(VP sp); \
225asm(".text \n" \
226#exchdr "_entry: \n" \
227" ldr sp,.int_stack_"#exchdr" \n" /* スタックの切り替え */\
228" sub lr,lr,#4 \n" /* undefでもこれでいいか? */\
229" stmfd sp!, {r0 - r2,lr} \n" /* 一時的にint_stackに待
230避 */ \
231" mrs r1, spsr \n" /* SVCモードに切り替えるため */ \
232" mov r0, sp \n" /* 保存する */ \
233" mov r2,#0xd3 \n" /* CPSRの書き換え(SVCモードへ)*/ \
234" msr cpsr,r2 \n" \
235" ldr r2,[r0,#0x0C] \n" /* load PC */\
236" stmfd sp!,{r2} \n" /* Store PC */\
237" stmfd sp!,{r3,ip,lr} \n" /* Store r3,ip,lr */\
238" ldmfd r0!,{r2,ip,lr} \n" /* load r0,r1,r2 */\
239" stmfd sp!,{r1,r2,ip,lr} \n" /* SPSR,Store r0,r1,r2 */\
240" ldr r2, .interrupt_count_"#exchdr"\n" /* 多重割り込みか判定 */\
241" ldr r3, [r2] \n" \
242" add r0,r3,#1 \n" \
243" str r0, [r2] \n" \
244" mov r0,sp \n" /* 例外ハンドラへの引数 */\
245" cmp r3, #0x00 \n" \
246" ldreq sp,stack_"#exchdr" \n" /* スタックの変更 */\
247" stmeqfd sp!,{r0} \n" /* タスクスタックの保存 */\
248" and r2, r1, #0xc0 \n" /* 例外発生時のCPUロック状æ…
249‹(IRQ) */\
250" orr r2, r2, #0x13 \n" /* とFIQを継承. SVCモード */\
251" msr cpsr,r2 \n" \
252" bl "#exchdr" \n" /* ハンドラ呼び出し */\
253" mrs r2, cpsr \n" /* FIQを継承 */\
254" and r2, r2, #0x40 \n" /* */\
255" orr r2, r2, #0x93 \n" /* 割り込み禁止 */\
256" msr cpsr,r2 \n" \
257" ldr r2,.interrupt_count_"#exchdr" \n"/* 割り込み回数を */\
258" ldr r1, [r2] \n" /* デクリメント */\
259" sub r3,r1,#1 \n"\
260" str r3, [r2] \n"\
261" cmp r3,#0x00 \n" /* 割り込みネスト数? */\
262" bne return_to_task_"#exchdr" \n" \
263" ldmfd sp!,{r0} \n" /* タスクスタックの復帰 */\
264" mov sp, r0 \n"\
265" ldr r1, reqflg_"#exchdr" \n" /* Check reqflg */\
266" ldr r0,[r1] \n"\
267" cmp r0,#0 \n"\
268" beq return_to_task_"#exchdr" \n"\
269" mov r0,#0 \n"\
270" str r0,[r1] \n" /* Clear reqflg */\
271" b _kernel_ret_exc \n" /* ret_intへ */\
272"return_to_task_"#exchdr": \n" \
273" ldmfd sp!,{r1} \n" /* CPSRの復帰処理 r1 <- cpsr*/\
274" mrs r2, cpsr \n" /* FIQを継承 */\
275" and r2, r2, #0x40 \n" /* */\
276" and r1, r1, #~0x40 \n" /* */\
277" orr r1, r1, r2 \n" /* */\
278" msr spsr, r1 \n" /* 割り込み許可 */\
279" ldmfd sp!,{r0-r3,ip,lr,pc}^ \n"\
280" .align 4 \n"\
281".int_stack_"#exchdr": \n"\
282" .long _kernel_int_stack + 6 * 4 \n"\
283"reqflg_"#exchdr": \n"\
284" .long _kernel_reqflg \n"\
285"stack_"#exchdr": \n"\
286" .long " #stacktop " \n"\
287".interrupt_count_"#exchdr": \n"\
288" .long _kernel_interrupt_count \n")
289
290
291#define _EXCHDR_ENTRY(exchdr, stacktop) __EXCHDR_ENTRY(exchdr, stacktop)
292
293#define EXCHDR_ENTRY(exchdr) _EXCHDR_ENTRY(exchdr, STACKTOP)
294
295#define EXC_ENTRY(exchdr) exchdr##_entry
296
297
298/*
299 * CPU例外の発生した時のシステム状æ…
300‹ã®å‚ç…
301§
302 */
303
304/*
305 * CPU例外の発生した時のディスパッチ
306 */
307Inline BOOL
308exc_sense_context(VP p_excinf)
309{
310 return(interrupt_count > 1);
311}
312
313
314/*
315 * CPU例外の発生した時のCPUロック状æ…
316‹ã®å‚ç…
317§
318 */
319Inline BOOL
320exc_sense_lock(VP p_excinf)
321{
322 return((*((UW *)p_excinf) & CPSR_IRQ_BIT) == CPSR_IRQ_BIT );
323}
324
325
326/*
327 * 未定義の例外がå…
328¥ã£ãŸå ´åˆ
329 */
330extern void undef_exception();
331extern void swi_exception();
332extern void prefetch_exception();
333extern void data_abort_exception();
334extern void irq_abort_exception();
335extern void fiq_abort_exception();
336
337
338/*
339 * プロセッサ依存の初期化
340 */
341extern void cpu_initialize(void);
342
343
344/*
345 * プロセッサ依存の終了時処理
346 */
347extern void cpu_terminate(void);
348
349
350/*
351 * CPU/割込みハンドラの出å…
352¥ã‚Šå£å‡¦ç†ã§ä¸€æ™‚的に使用するスタック
353 */
354#define INT_STACK_SIZE 6
355extern UW int_stack[INT_STACK_SIZE];
356
357
358#endif /* _MACRO_ONLY */
359#endif /* _CPU_CONFIG_H_ */
Note: See TracBrowser for help on using the repository browser.