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