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

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

mruby版ECNLプロトタイピング・ツールを追加

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