source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel_impl.h@ 352

Last change on this file since 352 was 352, checked in by coas-nagasima, 6 years ago

arm向けASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 15.2 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-2016 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 * と.
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 * 報告すること.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 * $Id$
41 */
42
43/*
44 * kernel_impl.hのコア依存部(ARM用)
45 *
46 * このヘッダファイルは,target_kernel_impl.h(または,そこからインク
47 * ルードされるファイル)のみからインクルードされる.他のファイルから
48 * 直接インクルードしてはならない.
49 */
50
51#ifndef TOPPERS_CORE_KERNEL_IMPL_H
52#define TOPPERS_CORE_KERNEL_IMPL_H
53
54#include "arm.h"
55
56/*
57 * エラーチェック方法の指定
58 */
59#define CHECK_STKSZ_ALIGN 8 /* スタックサイズのアライン単位 */
60#define CHECK_INTPTR_ALIGN 4 /* intptr_t型の変数のアライン単位 */
61#define CHECK_INTPTR_NONNULL /* intptr_t型の変数の非NULLチェック */
62#ifndef __thumb__
63#define CHECK_FUNC_ALIGN 4 /* 関数のアライン単位 */
64#endif /* __thumb__ */
65#define CHECK_FUNC_NONNULL /* 関数の非NULLチェック */
66#define CHECK_STACK_ALIGN 8 /* スタック領域のアライン単位 */
67#define CHECK_STACK_NONNULL /* スタック領域の非NULLチェック */
68#define CHECK_MPF_ALIGN 4 /* 固定長メモリプール領域のアライン単位 */
69#define CHECK_MPF_NONNULL /* 固定長メモリプール領域の非NULLチェック */
70#define CHECK_MB_ALIGN 4 /* 管理領域のアライン単位 */
71
72#ifndef TOPPERS_MACRO_ONLY
73
74/*
75 * レディキューサーチのためのビットマップサーチ関数
76 *
77 * CLZ命令は最上位ビットからサーチするため,最上位ビットを最高優先度に
78 * 対応させる.
79 */
80#if __TARGET_ARCH_ARM >= 6
81
82#define OMIT_BITMAP_SEARCH
83#define PRIMAP_BIT(pri) (0x8000U >> (pri))
84
85Inline uint_t
86bitmap_search(uint16_t bitmap)
87{
88 return((uint_t)(count_leading_zero((uint32_t) bitmap) - 16));
89}
90
91#endif /* __TARGET_ARCH_ARM >= 6 */
92
93/*
94 * コンテキストの参照
95 *
96 * ARM依存部では,タスクコンテキストと非タスクコンテキストの両方をスー
97 * パバイザモードで動作させるため,プロセッサモードで判断することがで
98 * きない.そのため,割込みハンドラ/CPU例外ハンドラのネスト段数(これ
99 * を,例外ネストカウントと呼ぶ)で管理し,例外ネストカウントが0の時に
100 * タスクコンテキスト,0より大きい場合に非タスクコンテキストであると判
101 * 断する.
102 */
103extern uint32_t excpt_nest_count; /* 例外ネストカウント */
104
105Inline bool_t
106sense_context(void)
107{
108 return(excpt_nest_count > 0U);
109}
110
111#endif /* TOPPERS_MACRO_ONLY */
112
113/*
114 * TOPPERS標準割込み処理モデルの実現
115 *
116 * ARMコア依存部では,割込みの扱いに関して,次の2つの方法をサポートす
117 * る.
118 *
119 * (1) カーネルを単体で使用する場合やSafeGのノンセキュアモードで使用す
120 * る場合:IRQをカーネル管理の割込み,FIQをカーネル管理外の割込みとす
121 * る.デフォルトでは,この方法が使用される.
122 *
123 * (2) SafeGのセキュアモードで使用する場合:FIQをカーネル管理の割込み
124 * とし,カーネルの動作中はIRQを常にマスクする.この方法を使用する場合
125 * には,TOPPERS_SAFEG_SECUREをマクロ定義する.
126 *
127 * TOPPERS標準割込み処理モデルの中で,割込み優先度マスクと割込み要求禁
128 * 止フラグに関しては,割込みコントローラによって実現方法が異なるため,
129 * ARMコア依存部では扱わない.
130 */
131
132/*
133 * FIQとIRQの両方を禁止するCPSRのビットパターン
134 */
135#ifndef TOPPERS_MACRO_ONLY
136#define CPSR_FIQ_IRQ_BIT (CPSR_FIQ_BIT|CPSR_IRQ_BIT)
137#else /* TOPPERS_MACRO_ONLY */
138#define CPSR_FIQ_IRQ_BIT (CPSR_FIQ_BIT AOR CPSR_IRQ_BIT)
139#endif /* TOPPERS_MACRO_ONLY */
140
141/*
142 * CPUロック・割込みロックでない状態でのCPSRのビットパターン
143 */
144#ifndef TOPPERS_SAFEG_SECURE
145#define CPSR_UNLOCK UINT_C(0x00)
146#else /* TOPPERS_SAFEG_SECURE */
147#define CPSR_UNLOCK CPSR_IRQ_BIT
148#endif /* TOPPERS_SAFEG_SECURE */
149
150/*
151 * CPUロック状態でのCPSRのビットパターン
152 */
153#ifndef TOPPERS_SAFEG_SECURE
154#define CPSR_CPULOCK CPSR_IRQ_BIT
155#else /* TOPPERS_SAFEG_SECURE */
156#define CPSR_CPULOCK CPSR_FIQ_IRQ_BIT
157#endif /* TOPPERS_SAFEG_SECURE */
158
159/*
160 * 割込みロック状態でのCPSRのビットパターン
161 */
162#define CPSR_INTLOCK CPSR_FIQ_IRQ_BIT
163
164#ifndef TOPPERS_MACRO_ONLY
165
166/*
167 * CPUロック状態への遷移
168 */
169Inline void
170lock_cpu(void)
171{
172#if __TARGET_ARCH_ARM < 6
173 set_cpsr(current_cpsr() | CPSR_CPULOCK);
174#else /* __TARGET_ARCH_ARM < 6 */
175#ifndef TOPPERS_SAFEG_SECURE
176 disable_irq();
177#else /* TOPPERS_SAFEG_SECURE */
178 disable_fiq()
179#endif /* TOPPERS_SAFEG_SECURE */
180#endif /* __TARGET_ARCH_ARM < 6 */
181
182 /*
183 * メモリ参照が,この関数を超えて最適化されることを抑止
184 */
185 ARM_MEMORY_CHANGED;
186}
187
188/*
189 * CPUロック状態への移行(ディスパッチできる状態)
190 */
191#define lock_cpu_dsp() lock_cpu()
192
193/*
194 * CPUロック状態の解除
195 */
196Inline void
197unlock_cpu(void)
198{
199 /*
200 * メモリ参照が,この関数を超えて最適化されることを抑止
201 */
202 ARM_MEMORY_CHANGED;
203
204#if __TARGET_ARCH_ARM < 6
205 set_cpsr((current_cpsr() & ~CPSR_INT_MASK) | CPSR_UNLOCK);
206#else /* __TARGET_ARCH_ARM < 6 */
207#ifndef TOPPERS_SAFEG_SECURE
208 enable_irq();
209#else /* TOPPERS_SAFEG_SECURE */
210 enable_fiq()
211#endif /* TOPPERS_SAFEG_SECURE */
212#endif /* __TARGET_ARCH_ARM < 6 */
213}
214
215/*
216 * CPUロック状態の解除(ディスパッチできる状態)
217 */
218#define unlock_cpu_dsp() unlock_cpu()
219
220/*
221 * CPUロック状態の参照
222 */
223Inline bool_t
224sense_lock(void)
225{
226#ifndef TOPPERS_SAFEG_SECURE
227 return((current_cpsr() & CPSR_IRQ_BIT) != 0U);
228#else /* TOPPERS_SAFEG_SECURE */
229 return((current_cpsr() & CPSR_FIQ_BIT) != 0U);
230#endif /* TOPPERS_SAFEG_SECURE */
231}
232
233/*
234 * 割込みを受け付けるための遅延処理
235 */
236Inline void
237delay_for_interrupt(void)
238{
239}
240
241/*
242 * 非タスクコンテキスト用のスタック初期値
243 */
244#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char *)(istk) + (istksz)))
245
246/*
247 * タスクコンテキストブロックの定義
248 */
249typedef struct task_context_block {
250 void *sp; /* スタックポインタ */
251 FP pc; /* 実行再開番地 */
252} TSKCTXB;
253
254/*
255 * タスクディスパッチャ
256 */
257
258/*
259 * 最高優先順位タスクへのディスパッチ(core_support.S)
260 *
261 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
262 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状態・ディスパッ
263 * チ許可状態・(モデル上の)割込み優先度マスク全解除状態で呼び出さな
264 * ければならない.
265 */
266extern void dispatch(void);
267
268/*
269 * 非タスクコンテキストからのディスパッチ要求
270 */
271#define request_dispatch()
272
273/*
274 * ディスパッチャの動作開始(core_support.S)
275 *
276 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
277 * みを禁止した状態(割込みロック状態と同等の状態)で呼び出さなければ
278 * ならない.
279 */
280extern void start_dispatch(void) NoReturn;
281
282/*
283 * 現在のコンテキストを捨ててディスパッチ(core_support.S)
284 *
285 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
286 * スト・CPUロック状態・ディスパッチ許可状態・(モデル上の)割込み優先
287 * 度マスク全解除状態で呼び出さなければならない.
288 */
289extern void exit_and_dispatch(void) NoReturn;
290
291/*
292 * カーネルの終了処理の呼出し(core_support.S)
293 *
294 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
295 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
296 * す.
297 */
298extern void call_exit_kernel(void) NoReturn;
299
300/*
301 * タスクコンテキストの初期化
302 *
303 * タスクが休止状態から実行できる状態に遷移する時に呼ばれる.この時点
304 * でスタック領域を使ってはならない.
305 *
306 * activate_contextを,インライン関数ではなくマクロ定義としているのは,
307 * この時点ではTCBが定義されていないためである.
308 */
309extern void start_r(void);
310
311#define activate_context(p_tcb) \
312{ \
313 (p_tcb)->tskctxb.sp = (void *)((char *)((p_tcb)->p_tinib->stk) \
314 + (p_tcb)->p_tinib->stksz); \
315 (p_tcb)->tskctxb.pc = (FP) start_r; \
316}
317
318/*
319 * 標準の割込み管理機能の初期化処理を用いない
320 */
321#define OMIT_INITIALIZE_INTERRUPT
322
323/*
324 * 割込みハンドラテーブル(kernel_cfg.c)
325 */
326extern const FP inh_table[TNUM_INHNO];
327
328/*
329 * 割込み要求ライン設定テーブル(kernel_cfg.c)
330 *
331 * 割込み要求ラインに対して割込み属性が設定されていれば1,設定されてい
332 * なければ0を保持するテーブル.
333 */
334#ifdef USE_INTCFG_TABLE
335extern const uint8_t intcfg_table[TNUM_INTNO];
336#endif /* USE_INTCFG_TABLE */
337
338/*
339 * 標準の例外管理機能の初期化処理を用いない
340 */
341#define OMIT_INITIALIZE_EXCEPTION
342
343/*
344 * CPU例外ハンドラテーブル(kernel_cfg.c)
345 */
346extern const FP exc_table[TNUM_EXCNO];
347
348/*
349 * CPU例外ハンドラの初期化
350 */
351Inline void
352initialize_exception(void)
353{
354}
355
356/*
357 * CPU例外の発生した時のコンテキストの参照
358 *
359 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にfalse,
360 * そうでない時にtrueを返す.
361 */
362Inline bool_t
363exc_sense_context(void *p_excinf)
364{
365 return(((T_EXCINF *)(p_excinf))->nest_count != 0U);
366}
367
368/*
369 * CPU例外の発生した時の割込み優先度マスクの参照
370 */
371Inline PRI
372exc_get_intpri(void *p_excinf)
373{
374 return((PRI)(((T_EXCINF *)(p_excinf))->intpri));
375}
376
377/*
378 * CPUロック状態または割込みロック状態かの参照
379 */
380Inline bool_t
381exc_sense_lock(void *p_excinf)
382{
383#ifndef TOPPERS_SAFEG_SECURE
384 return(((((T_EXCINF *)(p_excinf))->cpsr) & CPSR_INT_MASK) != 0U);
385#define CPSR_UNLOCK UINT_C(0x00)
386#else /* TOPPERS_SAFEG_SECURE */
387 return(((((T_EXCINF *)(p_excinf))->cpsr) & CPSR_FIQ_BIT) != 0U);
388#endif /* TOPPERS_SAFEG_SECURE */
389}
390
391/*
392 * CPU例外の発生した時のコンテキストと割込みのマスク状態の参照
393 *
394 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
395 * ンテキストであり,全割込みロック状態でなく,CPUロック状態でなく,割
396 * 込み優先度マスク全解除状態である時にtrue,そうでない時にfalseを返す
397 * (CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを返
398 * す).
399 *
400 */
401Inline bool_t
402exc_sense_intmask(void *p_excinf)
403{
404 return(!exc_sense_context(p_excinf)
405 && exc_get_intpri(p_excinf) == TIPM_ENAALL
406 && !exc_sense_lock(p_excinf));
407}
408
409#endif /* TOPPERS_MACRO_ONLY */
410
411/*
412 * MMU関連の操作(VMSA)
413 */
414#ifdef USE_ARM_MMU
415
416/*
417 * 変換テーブルベースレジスタ(TTBR)の設定値
418 */
419#if __TARGET_ARCH_ARM < 6
420#define TTBR_CONFIG 0U
421#elif __TARGET_ARCH_ARM < 7
422#define TTBR_CONFIG (CP15_TTBR_RGN_CACHEABLE|CP15_TTBR_RGN_SHAREABLE \
423 |CP15_TTBR_RGN_WBACK)
424#else /* __TARGET_ARCH_ARM < 7 */
425#define TTBR_CONFIG (CP15_TTBR_RGN_SHAREABLE|CP15_TTBR_RGN_WBWA \
426 |CP15_TTBR_IRGN_WBWA)
427#endif
428
429#ifndef TOPPERS_MACRO_ONLY
430
431/*
432 * MMUの設定情報のデータ型
433 */
434typedef struct arm_mmu_config {
435 uint32_t vaddr; /* 仮想アドレス */
436 uint32_t paddr; /* 物理アドレス */
437 uint32_t size; /* サイズ */
438 uint32_t attr; /* セクション属性 */
439} ARM_MMU_CONFIG;
440
441/*
442 * MMUの設定情報の数(メモリエリアの数)(target_kernel_impl.c)
443 */
444extern const uint_t arm_tnum_memory_area;
445
446/*
447 * MMUの設定情報(メモリエリアの情報)(target_kernel_impl.c)
448 */
449extern ARM_MMU_CONFIG arm_memory_area[];
450
451/*
452 * MMUの初期化
453 */
454extern void arm_mmu_initialize(void);
455
456#endif /* TOPPERS_MACRO_ONLY */
457#endif /* USE_ARM_MMU */
458
459#ifndef TOPPERS_MACRO_ONLY
460
461/*
462 * コア依存の初期化
463 */
464extern void core_initialize(void);
465
466/*
467 * コア依存の終了処理
468 */
469extern void core_terminate(void);
470
471/*
472 * CPU例外の発生状況のログ出力
473 */
474#ifndef OMIT_XLOG_SYS
475extern void xlog_sys(void *p_excinf);
476extern void xlog_fsr(uint32_t fsr, uint32_t far);
477#endif /* OMIT_XLOG_SYS */
478
479/*
480 * 未定義の割込みが入った場合の処理
481 */
482extern void default_int_handler(void);
483
484/*
485 * 未定義の例外が入った場合の処理
486 */
487extern void default_exc_handler(void *p_excinf, EXCNO excno);
488
489#endif /* TOPPERS_MACRO_ONLY */
490#endif /* TOPPERS_CORE_KERNEL_IMPL_H */
Note: See TracBrowser for help on using the repository browser.