source: ssp_arm_gcc/trunk/arch/arm_gcc/common/core_config.h@ 92

Last change on this file since 92 was 92, checked in by nmir-saito, 9 years ago

add separate package of SSP kernel for ARM + SkyEye(experimental)

File size: 9.5 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2006-2013 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2014,2015 by Naoki Saito
11 * Nagoya Municipal Industrial Research Institute, JAPAN
12 *
13 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
14 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
15 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
21 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
22 * の無保証規定を掲載すること.
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
25 * と.
26 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
27 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
28 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
29 * 報告すること.
30 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
31 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
32 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
33 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
34 * 免責すること.
35 *
36 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
38 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
39 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
40 * の責任を負わない.
41 *
42 * @(#) $Id: core_config.h 619 2014-03-18 06:10:27Z nmir-saito $
43 */
44
45
46/*
47 * コア依存モジュール(ARM用)
48 *
49 * このインクルードファイルは,target_config.h(または,そこからインク
50 * ルードされるファイル)のみからインクルードされる.他のファイルから
51 * 直接インクルードしてはならない.
52 */
53
54#ifndef TOPPERS_CORE_CONFIG_H
55#define TOPPERS_CORE_CONFIG_H
56
57/*
58 * ARM依存の定義
59 */
60#include "arm.h"
61
62/*
63 * エラーチェック方法の指定
64 */
65#define CHECK_STKSZ_ALIGN 8 /* スタックサイズのアライン単位 */
66#ifndef __thumb__
67#define CHECK_FUNC_ALIGN 4 /* 関数のアライン単位 */
68#endif /* __thumb__ */
69#define CHECK_FUNC_NONNULL /* 関数の非NULLチェック */
70#define CHECK_STACK_ALIGN 4 /* スタック領域のアライン単位 */
71#define CHECK_STACK_NONNULL /* スタック領域の非NULLチェック */
72#define CHECK_MPF_ALIGN 4 /* 固定長メモリプール領域のアライン単位 */
73#define CHECK_MPF_NONNULL /* 固定長メモリプール領域の非NULLチェック */
74#define CHECK_MB_ALIGN 4 /* 管理領域のアライン単位 */
75
76/*
77 * CPUロックとするCPSRのパターン
78 */
79#ifndef CPSR_CPULOCK
80#define CPSR_CPULOCK (CPSR_IRQ_BIT)
81#endif /* CPSR_CPULOCK */
82
83/*
84 * 割込みロックとするCPSRのパターン
85 */
86#define CPSR_INTLOCK (CPSR_FIQ_BIT|CPSR_IRQ_BIT)
87
88/*
89 * CPSRに常にセットするパターン
90 */
91#ifndef CPSR_ALWAYS_SET
92#define CPSR_ALWAYS_SET 0x00
93#endif /* CPSR_ALWAYS_SET */
94
95/*
96 * 例外の番号
97 */
98#define EXCH_NO_RESET 0
99#define EXCH_NO_UNDEF 1
100#define EXCH_NO_SVC 2
101#define EXCH_NO_PABORT 3
102#define EXCH_NO_DABORT 4
103#define EXCH_NO_IRQ 5
104#define EXCH_NO_FIQ 6
105
106/*
107 * 例外の個数
108 */
109#define TNUM_EXCH 7
110
111#ifndef TOPPERS_MACRO_ONLY
112
113/*
114 * 非タスクコンテキスト用のスタック初期値
115 */
116#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char *)(istk) + (istksz)))
117
118/*
119 * プロセッサの特殊命令のインライン関数定義
120 */
121#include <core_insn.h>
122
123
124/*
125 * TOPPERS標準割込み処理モデルの実現
126 *
127 * IRQをカーネル管理内,FIQをカーネル管理外の割込みとして扱う.
128 *
129 * ARM依存部では,TOPPERS標準割込み処理モデルのうち,CPUロック状態
130 * のみを取り扱う.割込み優先度マスク,割込み要求禁止フラグに関して
131 * は,各ターゲット依存部で取り扱う
132 */
133
134/*
135 * コンテキスト参照のための変数
136 */
137extern uint32_t excpt_nest_count; /* 例外(割込み/CPU例外)のネスト回数のカウント */
138
139/*
140 * コンテキストの参照
141 *
142 * ARMでは,タスクコンテキストと非タスクコンテキストの両方をスーパー
143 * バイザーモードで動作させる.そのため,CPSRの内容では判別できない.
144 * そのため,例外(割込み/CPU例外)のネスト回数をカウントする変数
145 * (excpt_nest_count)を用意し,例外の入り口でインクリメントすること
146 * で,コンテキストを判定する.
147 */
148Inline bool_t
149sense_context(void)
150{
151 return(excpt_nest_count > 0U);
152}
153
154/*
155 * CPUロック状態への移行
156 */
157Inline void
158x_lock_cpu(void)
159{
160 set_sr(current_sr() | CPSR_CPULOCK | CPSR_ALWAYS_SET);
161 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
162 ARM_MEMORY_CHANGED;
163}
164
165#define t_lock_cpu() x_lock_cpu()
166#define i_lock_cpu() x_lock_cpu()
167
168/*
169 * CPUロック状態の解除
170 */
171Inline void
172x_unlock_cpu(void)
173{
174 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
175 ARM_MEMORY_CHANGED;
176 set_sr((current_sr() & (~CPSR_CPULOCK)) | CPSR_ALWAYS_SET);
177}
178
179#define t_unlock_cpu() x_unlock_cpu()
180#define i_unlock_cpu() x_unlock_cpu()
181
182/*
183 * CPUロック状態の参照
184 */
185Inline bool_t
186x_sense_lock(void)
187{
188 return((current_sr() & CPSR_CPULOCK) == CPSR_CPULOCK);
189}
190
191#define t_sense_lock() x_sense_lock()
192#define i_sense_lock() x_sense_lock()
193
194
195/*
196 * アイドルループの実装
197 */
198Inline void
199idle_loop(void)
200{
201 x_unlock_cpu();
202 Asm("":::"memory");
203 x_lock_cpu();
204}
205
206
207/*
208 * タスクディスパッチャ
209 */
210
211/*
212 * 最高優先順位タスクへのディスパッチ(core_support.S)
213 *
214 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
215 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状態・ディスパッ
216 * チ許可状態・(モデル上の)割込み優先度マスク全解除状態で呼び出さな
217 * ければならない.
218 */
219extern void dispatch(void);
220
221/*
222 * ディスパッチャの動作開始(core_support.S)
223 *
224 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
225 * みを禁止した状態(割込みロック状態と同等の状態)で呼び出さなければ
226 * ならない.
227 */
228extern void start_dispatch(void) NoReturn;
229
230/*
231 * 現在のコンテキストを捨ててディスパッチ(core_support.S)
232 *
233 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
234 * スト・CPUロック状態・ディスパッチ許可状態・(モデル上の)割込み優先
235 * 度マスク全解除状態で呼び出さなければならない.
236 */
237extern void exit_and_dispatch(void) NoReturn;
238
239/*
240 * カーネルの終了処理の呼出し(core_support.S)
241 *
242 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
243 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
244 * す.
245 */
246extern void call_exit_kernel(void) NoReturn;
247
248/*
249 * calltexは使用しない
250 */
251#define OMIT_CALLTEX
252
253/*
254 * CPU例外ハンドラの登録用テーブル
255 */
256extern const FP exch_tbl[TNUM_EXCH];
257
258/*
259 * ターゲット非依存部に含まれる標準の例外管理機能の初期化処理を用いない
260 */
261#define OMIT_INITIALIZE_EXCEPTION
262
263/*
264 * CPU例外ハンドラの初期化
265 */
266Inline void
267initialize_exception(void)
268{
269}
270
271/*
272 * CPU例外の発生した時のシステム状態の参照
273 */
274
275/*
276 * CPU例外の発生した時のコンテキストの参照
277 *
278 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にfalse,
279 * そうでない時にtrueを返す.
280 */
281Inline bool_t
282exc_sense_context(void *p_excinf)
283{
284 return((*((uint32_t *) p_excinf)) != 0U);
285}
286
287/*
288 * CPU例外の発生した時の(モデル上の)割込み優先度マスクの参照
289 */
290Inline PRI
291exc_get_ipm(void *p_excinf)
292{
293 return((PRI)(*(((uint32_t *)(p_excinf)) + 1)));
294}
295
296/*
297 * CPU例外の発生した時のCPSRの取得
298 */
299Inline uint32_t
300exc_get_sr(void *p_excinf){
301 return(*(((uint32_t *)(p_excinf)) + 2));
302}
303
304/*
305 * CPUロック状態か
306 */
307Inline bool_t
308exc_sense_lock(void *p_excinf){
309 return((exc_get_sr(p_excinf) & CPSR_CPULOCK) == CPSR_CPULOCK);
310}
311
312/*
313 * 割込みロック状態か
314 */
315Inline bool_t
316exc_sense_int_lock(void *p_excinf){
317 return((exc_get_sr(p_excinf) & CPSR_INTLOCK) == CPSR_INTLOCK);
318}
319
320/*
321 * CPU例外の発生した時のコンテキストと割込みのマスク状態の参照
322 *
323 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
324 * ンテキストであり,全割込みロック状態でなく,CPUロック状態でなく,割
325 * 込み優先度マスク全解除状態である時にtrue,そうでない時にfalseを返す
326 * (CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを返
327 * す).
328 *
329 */
330Inline bool_t
331exc_sense_intmask(void *p_excinf)
332{
333 return(!exc_sense_context(p_excinf)
334 && (exc_get_ipm(p_excinf) == 0U)
335 && !exc_sense_lock(p_excinf)
336 && !exc_sense_int_lock(p_excinf));
337}
338
339/*
340 * プロセッサ依存の初期化
341 */
342extern void core_initialize(void);
343
344/*
345 * プロセッサ依存の終了時処理
346 */
347extern void core_terminate(void);
348
349/*
350 * ベクターテーブルの命令から参照されるジャンプ先アドレス
351 * (start.S)
352 */
353extern void *vector_ref_tbl;
354
355/*
356 * 例外ベクタから直接実行するハンドラを登録
357 */
358extern void x_install_exc(EXCNO excno, FP exchdr);
359
360/*
361 * 例外ハンドラ
362 */
363
364/*
365 * 未定義命令 例外ハンドラ(core_support.S)
366 */
367extern void undef_handler(void);
368
369/*
370 * SWI 例外ハンドラ(core_support.S)
371 */
372extern void swi_handler(void);
373
374/*
375 * プリフェッチアボード 例外ハンドラ(core_support.S)
376 */
377extern void prefetch_handler(void);
378
379/*
380 * データアボード 例外ハンドラ(core_support.S)
381 */
382extern void data_abort_handler(void);
383
384/*
385 * FIQ 例外ハンドラ(core_support.S)
386 */
387extern void fiq_handler(void);
388
389/*
390 * 未定義の例外が入った場合の処理
391 */
392extern void default_exc_handler(void);
393
394#endif /* TOPPERS_MACRO_ONLY */
395#endif /* TOPPERS_CORE_CONFIG_H */
Note: See TracBrowser for help on using the repository browser.