source: EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel_impl.c@ 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-csrc
File size: 9.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.c 270 2017-02-09 04:03:47Z coas-nagasima $
56 */
57
58/*
59 * カーネルのコア依存部(ARM用)
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "task.h"
65#include "arm.h"
66
67/*
68 * コンテキスト参ç…
69§ã®ãŸã‚ã®å¤‰æ•°
70 */
71uint32_t excpt_nest_count; /* 例外ネストカウント */
72
73/*
74 * MMU関連の操作(VMSA)
75 */
76#ifdef USE_ARM_MMU
77
78#define CP15_DACR_D0_CLIENT 0x01U /* 変換テーブルに従いドメイン0にアクセス */
79#define DEFAULT_ASID 1 /* 使用するASID */
80
81/*
82 * セクションテーブル
83 */
84static uint32_t section_table[ARM_SECTION_TABLE_ENTRY]
85 __attribute__((aligned(ARM_SECTION_TABLE_ALIGN)));
86
87/*
88 * MMUのセクションテーブルエントリの設定
89 */
90Inline void
91config_section_entry(ARM_MMU_CONFIG *p_ammuc)
92{
93 uint32_t vaddr = p_ammuc->vaddr;
94 uint32_t paddr = p_ammuc->paddr;
95 uint32_t size = p_ammuc->size;
96 uint_t i;
97
98 while (size > 0) {
99#ifdef USE_ARM_SSECTION
100 if (size >= ARM_SSECTION_SIZE && (vaddr % ARM_SSECTION_SIZE) == 0) {
101 for (i = 0; i < 16; i++) {
102 section_table[vaddr / ARM_SECTION_SIZE] = paddr
103 |ARM_MMU_DSCR1_SSECTION|p_ammuc->attr;
104 vaddr += ARM_SECTION_SIZE;
105 }
106 paddr += ARM_SSECTION_SIZE;
107 size -= ARM_SSECTION_SIZE;
108 }
109 else {
110#endif /* USE_ARM_SSECTION */
111 section_table[vaddr / ARM_SECTION_SIZE] = paddr
112 |ARM_MMU_DSCR1_SECTION|p_ammuc->attr;
113 vaddr += ARM_SECTION_SIZE;
114 paddr += ARM_SECTION_SIZE;
115 size -= ARM_SECTION_SIZE;
116#ifdef USE_ARM_SSECTION
117 }
118#endif /* USE_ARM_SSECTION */
119 }
120}
121
122/*
123 * MMUの初期化
124 */
125void
126arm_mmu_initialize(void)
127{
128 uint32_t reg;
129 uint_t i;
130
131 /*
132 * MMUのセクションテーブルの設定
133 */
134 for (i = 0; i < ARM_SECTION_TABLE_ENTRY; i++) {
135 section_table[i] = ARM_MMU_DSCR1_FAULT;
136 }
137 for (i = 0; i < arm_tnum_memory_area; i++) {
138 config_section_entry(&(arm_memory_area[i]));
139 }
140
141 /*
142 * TTBR0を用いるように指定(ARMv6以降)
143 */
144#if __TARGET_ARCH_ARM >= 6
145 CP15_WRITE_TTBCR(0U);
146#endif /* __TARGET_ARCH_ARM >= 6 */
147
148 /*
149 * 変換テーブルとして,section_tableを使用する.
150 */
151 reg = ((uint32_t) &(section_table[0])) | TTBR_CONFIG;
152 CP15_WRITE_TTBR0(reg);
153
154 /*
155 * ドメインアクセス制御の設定
156 */
157 CP15_WRITE_DACR(CP15_DACR_D0_CLIENT);
158
159 /*
160 * ASIDの設定
161 */
162#if __TARGET_ARCH_ARM >= 6
163 CP15_WRITE_CONTEXTIDR(DEFAULT_ASID);
164#endif /* __TARGET_ARCH_ARM >= 6 */
165
166 /*
167 * TLBå…
168¨ä½“の無効化
169 */
170 arm_invalidate_tlb();
171
172 /*
173 * MMUを有効にする.ARMv6では,拡張ページテーブル設定を使う(サブ
174 * ページは使わない)ように設定する.
175 */
176 CP15_READ_SCTLR(reg);
177#if __TARGET_ARCH_ARM == 6
178 reg |= (CP15_SCTLR_MMU|CP15_SCTLR_EXTPAGE);
179#else /* __TARGET_ARCH_ARM == 6 */
180 reg |= CP15_SCTLR_MMU;
181#endif /* __TARGET_ARCH_ARM == 6 */
182 CP15_WRITE_SCTLR(reg);
183 inst_sync_barrier();
184}
185
186#endif /* USE_ARM_MMU */
187
188/*
189 * コア依存の初期化
190 */
191void
192core_initialize(void)
193{
194 /*
195 * カーネル起動時は非タスクコンテキストとして動作させるために,例外
196 * のネスト回数を1に初期化する.
197 */
198 excpt_nest_count = 1U;
199
200 /*
201 * MMUを有効に
202 */
203#ifdef USE_ARM_MMU
204 arm_mmu_initialize();
205#endif /* USE_ARM_MMU */
206
207 /*
208 * パフォーマンスモニタの初期化
209 */
210#if defined(USE_ARM_PM_HIST) && __TARGET_ARCH_ARM == 7
211 arm_init_pmcnt();
212#endif /* defined(USE_ARM_PM_HIST) && __TARGET_ARCH_ARM == 7 */
213}
214
215/*
216 * コア依存の終了処理
217 */
218void
219core_terminate(void)
220{
221}
222
223/*
224 * CPU例外の発生状況のログ出力
225 */
226#ifndef OMIT_XLOG_SYS
227
228/*
229 * CPU例外ハンドラの中から,CPU例外情
230報ポインタ(p_excinf)を引数とし
231 * て呼び出すことで,CPU例外の発生状況をシステムログに出力する.
232 */
233void
234xlog_sys(void *p_excinf)
235{
236 syslog_4(LOG_EMERG, "pc = %08x, cpsr = %08x, lr = %08x, r12 = %08x",
237 ((T_EXCINF *)(p_excinf))->pc, ((T_EXCINF *)(p_excinf))->cpsr,
238 ((T_EXCINF *)(p_excinf))->lr, ((T_EXCINF *)(p_excinf))->r12);
239 syslog_4(LOG_EMERG, "r0 = %08x, r1 = %08x, r2 = %08x, r3 = %08x",
240 ((T_EXCINF *)(p_excinf))->r0, ((T_EXCINF *)(p_excinf))->r1,
241 ((T_EXCINF *)(p_excinf))->r2, ((T_EXCINF *)(p_excinf))->r3);
242 syslog_2(LOG_EMERG, "nest_count = %d, intpri = %d",
243 ((T_EXCINF *)(p_excinf))->nest_count,
244 ((T_EXCINF *)(p_excinf))->intpri);
245}
246
247/*
248 * プリフェッチ/データアボートが発生した状況(状æ…
249‹ã¨ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼‰ã‚’シス
250 * テムログに出力する.
251 */
252void
253xlog_fsr(uint32_t fsr, uint32_t far)
254{
255 char *status;
256
257 switch (fsr & CP15_FSR_FS_MASK) {
258 case CP15_FSR_FS_ALIGNMENT:
259 status = "alignment fault";
260 break;
261 case CP15_FSR_FS_TRANSLATION1:
262 status = "translation fault (1st level)";
263 break;
264 case CP15_FSR_FS_TRANSLATION2:
265 status = "translation fault (2nd level)";
266 break;
267 case CP15_FSR_FS_PERMISSION1:
268 status = "permission fault (1st level)";
269 break;
270 case CP15_FSR_FS_PERMISSION2:
271 status = "permission fault (2nd level)";
272 break;
273 default:
274 status = "other fault";
275 break;
276 }
277 syslog_2(LOG_EMERG, "Fault status: 0x%04x (%s)", fsr, status);
278 syslog_1(LOG_EMERG, "Fault address: 0x%08x", far);
279}
280
281#endif /* OMIT_XLOG_SYS */
282
283/*
284 * 未定義の割込みがå…
285¥ã£ãŸå ´åˆã®å‡¦ç†
286 */
287#ifndef OMIT_DEFAULT_INT_HANDLER
288
289void
290default_int_handler(void)
291{
292 syslog_0(LOG_EMERG, "Unregistered interrupt occurs.");
293 ext_ker();
294}
295
296#endif /* OMIT_DEFAULT_INT_HANDLER */
297
298/*
299 * 未定義の例外がå…
300¥ã£ãŸå ´åˆã®å‡¦ç†
301 */
302#ifndef OMIT_DEFAULT_EXC_HANDLER
303
304void
305default_exc_handler(void *p_excinf, EXCNO excno)
306{
307#ifdef OMIT_XLOG_SYS
308 syslog_1(LOG_EMERG, "Unregistered exception %d occurs.", excno);
309#else /* OMIT_XLOG_SYS */
310 switch (excno) {
311 case EXCNO_UNDEF:
312 syslog_0(LOG_EMERG, "Undefined Instruction exception occurs.");
313 break;
314 case EXCNO_SVC:
315 syslog_0(LOG_EMERG, "Supervisor Call exception occurs.");
316 break;
317 case EXCNO_PABORT:
318 syslog_0(LOG_EMERG, "Prefetch Abort exception occurs.");
319 break;
320 case EXCNO_DABORT:
321 syslog_0(LOG_EMERG, "Data Abort exception occurs.");
322 break;
323 case EXCNO_IRQ:
324 syslog_0(LOG_EMERG, "IRQ exception occurs.");
325 break;
326 case EXCNO_FIQ:
327 syslog_0(LOG_EMERG, "FIQ exception occurs.");
328 break;
329 }
330 xlog_sys(p_excinf);
331
332 if (excno == EXCNO_PABORT || excno == EXCNO_DABORT) {
333 uint32_t fsr, far;
334
335#if __TARGET_ARCH_ARM >= 6
336 if (excno == EXCNO_PABORT) {
337 CP15_READ_IFSR(fsr);
338 CP15_READ_IFAR(far);
339 }
340 else {
341 CP15_READ_DFSR(fsr);
342 CP15_READ_DFAR(far);
343 }
344#else /* __TARGET_ARCH_ARM >= 6 */
345 CP15_READ_FSR(fsr);
346 CP15_READ_FAR(far);
347#endif /* __TARGET_ARCH_ARM >= 6 */
348
349 xlog_fsr(fsr, far);
350 }
351#endif /* OMIT_XLOG_SYS */
352 ext_ker();
353}
354
355#endif /* OMIT_DEFAULT_EXC_HANDLER */
Note: See TracBrowser for help on using the repository browser.