source: EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel_impl.h@ 429

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

ASP3, TINET, mbed を更新

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