source: asp3_wo_tecs/trunk/arch/arm_gcc/common/core_kernel_impl.c@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 9.1 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-2015 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 430 2015-08-08 11:38:46Z ertl-hiro $
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 D0_CLIENT 0x01U /* 変換テーブルに従ってドメイン0にアクセス */
79#define USE_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(D0_CLIENT);
158
159 /*
160 * ASIDの設定
161 */
162#if __TARGET_ARCH_ARM >= 6
163 CP15_WRITE_CONTEXTIDR(USE_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 * パフォーマンスモニタの初期化
202 */
203#if defined(USE_ARM_PM_HIST) && __TARGET_ARCH_ARM == 7
204 arm_init_pmcnt();
205#endif /* defined(USE_ARM_PM_HIST) && __TARGET_ARCH_ARM == 7 */
206}
207
208/*
209 * コア依存の終了処理
210 */
211void
212core_terminate(void)
213{
214}
215
216/*
217 * CPU例外の発生状況のログ出力
218 */
219#ifndef OMIT_XLOG_SYS
220
221/*
222 * CPU例外ハンドラの中から,CPU例外情
223報ポインタ(p_excinf)を引数とし
224 * て呼び出すことで,CPU例外の発生状況をシステムログに出力する.
225 */
226void
227xlog_sys(void *p_excinf)
228{
229 syslog_4(LOG_EMERG, "pc = %08x, cpsr = %08x, lr = %08x, r12 = %08x",
230 ((T_EXCINF *)(p_excinf))->pc, ((T_EXCINF *)(p_excinf))->cpsr,
231 ((T_EXCINF *)(p_excinf))->lr, ((T_EXCINF *)(p_excinf))->r12);
232 syslog_4(LOG_EMERG, "r0 = %08x, r1 = %08x, r2 = %08x, r3 = %08x",
233 ((T_EXCINF *)(p_excinf))->r0, ((T_EXCINF *)(p_excinf))->r1,
234 ((T_EXCINF *)(p_excinf))->r2, ((T_EXCINF *)(p_excinf))->r3);
235 syslog_2(LOG_EMERG, "nest_count = %d, intpri = %d",
236 ((T_EXCINF *)(p_excinf))->nest_count,
237 ((T_EXCINF *)(p_excinf))->intpri);
238}
239
240/*
241 * プリフェッチ/データアボートが発生した状況(状æ…
242‹ã¨ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼‰ã‚’シス
243 * テムログに出力する.
244 */
245void
246xlog_fsr(uint32_t fsr, uint32_t far)
247{
248 char *status;
249
250 switch (fsr & CP15_FSR_FS_MASK) {
251 case CP15_FSR_FS_ALIGNMENT:
252 status = "alignment fault";
253 break;
254 case CP15_FSR_FS_TRANSLATION1:
255 status = "translation fault (1st level)";
256 break;
257 case CP15_FSR_FS_TRANSLATION2:
258 status = "translation fault (2nd level)";
259 break;
260 case CP15_FSR_FS_PERMISSION1:
261 status = "permission fault (1st level)";
262 break;
263 case CP15_FSR_FS_PERMISSION2:
264 status = "permission fault (2nd level)";
265 break;
266 default:
267 status = "other fault";
268 break;
269 }
270 syslog_2(LOG_EMERG, "Fault status: 0x%04x (%s)", fsr, status);
271 syslog_1(LOG_EMERG, "Fault address: 0x%08x", far);
272}
273
274#endif /* OMIT_XLOG_SYS */
275
276/*
277 * 未定義の割込みがå…
278¥ã£ãŸå ´åˆã®å‡¦ç†
279 */
280#ifndef OMIT_DEFAULT_INT_HANDLER
281
282void
283default_int_handler(void)
284{
285 syslog_0(LOG_EMERG, "Unregistered interrupt occurs.");
286 ext_ker();
287}
288
289#endif /* OMIT_DEFAULT_INT_HANDLER */
290
291/*
292 * 未定義の例外がå…
293¥ã£ãŸå ´åˆã®å‡¦ç†
294 */
295#ifndef OMIT_DEFAULT_EXC_HANDLER
296
297void
298default_exc_handler(void *p_excinf, EXCNO excno)
299{
300#ifdef OMIT_XLOG_SYS
301 syslog_1(LOG_EMERG, "Unregistered exception %d occurs.", excno);
302#else /* OMIT_XLOG_SYS */
303 switch (excno) {
304 case EXCNO_UNDEF:
305 syslog_0(LOG_EMERG, "Undefined Instruction exception occurs.");
306 break;
307 case EXCNO_SVC:
308 syslog_0(LOG_EMERG, "Supervisor Call exception occurs.");
309 break;
310 case EXCNO_PABORT:
311 syslog_0(LOG_EMERG, "Prefetch Abort exception occurs.");
312 break;
313 case EXCNO_DABORT:
314 syslog_0(LOG_EMERG, "Data Abort exception occurs.");
315 break;
316 case EXCNO_IRQ:
317 syslog_0(LOG_EMERG, "IRQ exception occurs.");
318 break;
319 case EXCNO_FIQ:
320 syslog_0(LOG_EMERG, "FIQ exception occurs.");
321 break;
322 }
323 xlog_sys(p_excinf);
324
325 if (excno == EXCNO_PABORT || excno == EXCNO_DABORT) {
326 uint32_t fsr, far;
327
328#if __TARGET_ARCH_ARM >= 6
329 if (excno == EXCNO_PABORT) {
330 CP15_READ_IFSR(fsr);
331 CP15_READ_IFAR(far);
332 }
333 else {
334 CP15_READ_DFSR(fsr);
335 CP15_READ_DFAR(far);
336 }
337#else /* __TARGET_ARCH_ARM >= 6 */
338 CP15_READ_FSR(fsr);
339 CP15_READ_FAR(far);
340#endif /* __TARGET_ARCH_ARM >= 6 */
341
342 xlog_fsr(fsr, far);
343 }
344#endif /* OMIT_XLOG_SYS */
345 ext_ker();
346}
347
348#endif /* OMIT_DEFAULT_EXC_HANDLER */
Note: See TracBrowser for help on using the repository browser.