source: EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/arm.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: 13.6 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
6 * Toyohashi Univ. of Technology, JAPAN
7 * Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 *
10 * 上記著作権者
11は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再é…
14å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22 * 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24 * の無保証規定を掲載すること.
25 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26 * 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
28 * と.
29 * (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著
32 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
33 * (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
36 * 報告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 * 害からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者
43およびTOPPERSプロジェクトを
44 * å…
45è²¬ã™ã‚‹ã“と.
46 *
47 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52 * の責任を負わない.
53 *
54 * $Id: arm.h 270 2017-02-09 04:03:47Z coas-nagasima $
55 */
56
57/*
58 * ARMコアサポートモジュール
59 */
60
61#ifndef TOPPERS_ARM_H
62#define TOPPERS_ARM_H
63
64#include <t_stddef.h>
65
66/*
67 * ARMコアの特殊命令のインライン関数定義
68 */
69#ifndef TOPPERS_MACRO_ONLY
70#ifndef TECSGEN
71#include "arm_insn.h" /* tecsgenが解釈できないためスキップ */
72#endif /* TECSGEN */
73#endif /* TOPPERS_MACRO_ONLY */
74
75/*
76 * ARM例外ベクタ
77 */
78#define RESET_VECTOR UINT_C(0x00)
79#define UNDEF_VECTOR UINT_C(0x04)
80#define SVC_VECTOR UINT_C(0x08)
81#define PABORT_VECTOR UINT_C(0x0c)
82#define DABORT_VECTOR UINT_C(0x10)
83#define IRQ_VECTOR UINT_C(0x18)
84#define FIQ_VECTOR UINT_C(0x1c)
85
86/*
87 * ARM例外ベクタ番号
88 */
89#define RESET_NUMBER UINT_C(0)
90#define UNDEF_NUMBER UINT_C(1)
91#define SVC_NUMBER UINT_C(2)
92#define PABORT_NUMBER UINT_C(3)
93#define DABORT_NUMBER UINT_C(4)
94#define IRQ_NUMBER UINT_C(6)
95#define FIQ_NUMBER UINT_C(7)
96
97/*
98 * CPSRの割込み禁止ビット
99 */
100#define CPSR_INT_MASK UINT_C(0xc0)
101#define CPSR_IRQ_BIT UINT_C(0x80)
102#define CPSR_FIQ_BIT UINT_C(0x40)
103
104/*
105 * CPSRのThumbビット
106 */
107#define CPSR_THUMB_BIT UINT_C(0x20)
108
109/*
110 * CPSRのモードビット
111 */
112#define CPSR_MODE_MASK UINT_C(0x1f)
113#define CPSR_USER_MODE UINT_C(0x10)
114#define CPSR_FIQ_MODE UINT_C(0x11)
115#define CPSR_IRQ_MODE UINT_C(0x12)
116#define CPSR_SVC_MODE UINT_C(0x13)
117#define CPSR_ABT_MODE UINT_C(0x17)
118#define CPSR_UND_MODE UINT_C(0x1b)
119#define CPSR_SYS_MODE UINT_C(0x1f)
120
121/*
122 * CP15のシステム制御レジスタ(SCTLR)の設定値
123 *
124 * ARMv7では,CP15_SCTLR_EXTPAGEは常に1になっている.
125 */
126#if __TARGET_ARCH_ARM == 6
127#define CP15_SCTLR_EXTPAGE UINT_C(0x00800000)
128#endif /* __TARGET_ARCH_ARM == 6 */
129#define CP15_SCTLR_VECTOR UINT_C(0x00002000)
130#define CP15_SCTLR_ICACHE UINT_C(0x00001000)
131#define CP15_SCTLR_BP UINT_C(0x00000800)
132#define CP15_SCTLR_DCACHE UINT_C(0x00000004)
133#define CP15_SCTLR_MMU UINT_C(0x00000001)
134
135/*
136 * CP15のフォールト状æ…
137‹ãƒ¬ã‚¸ã‚¹ã‚¿ã®å‚ç…
138§å€¤
139 */
140#define CP15_FSR_FS_MASK UINT_C(0x0000040f)
141#define CP15_FSR_FS_ALIGNMENT UINT_C(0x00000001)
142#define CP15_FSR_FS_TRANSLATION1 UINT_C(0x00000005)
143#define CP15_FSR_FS_TRANSLATION2 UINT_C(0x00000007)
144#define CP15_FSR_FS_PERMISSION1 UINT_C(0x0000000d)
145#define CP15_FSR_FS_PERMISSION2 UINT_C(0x0000000f)
146
147/*
148 * CP15のパフォーマンスモニタ制御レジスタ(PMCR)の設定値
149 */
150#define CP15_PMCR_ALLCNTR_ENABLE UINT_C(0x01)
151#define CP15_PMCR_PMCCNTR_DIVIDER UINT_C(0x08)
152
153/*
154 * CP15のパフォーマンスモニタカウントイネーブルセットレジスタ(PMCNTENSET)
155 * の設定値
156 */
157#define CP15_PMCNTENSET_CCNTR_ENABLE UINT_C(0x80000000)
158
159/*
160 * CP15の変換テーブルベースレジスタ(TTBR)の設定値
161 */
162#define CP15_TTBR_RGN_SHAREABLE UINT_C(0x00000002)
163#if __TARGET_ARCH_ARM == 7
164#define CP15_TTBR_RGN_WBWA UINT_C(0x00000008)
165#endif /* __TARGET_ARCH_ARM == 7 */
166#define CP15_TTBR_RGN_WTHROUGH UINT_C(0x00000010)
167#define CP15_TTBR_RGN_WBACK UINT_C(0x00000018)
168#if __TARGET_ARCH_ARM < 7
169#define CP15_TTBR_RGN_CACHEABLE UINT_C(0x00000001)
170#else /* __TARGET_ARCH_ARM < 7 */
171#define CP15_TTBR_IRGN_WBWA UINT_C(0x00000040)
172#define CP15_TTBR_IRGN_WTHROUGH UINT_C(0x00000001)
173#define CP15_TTBR_IRGN_WBACK UINT_C(0x00000041)
174#endif /* __TARGET_ARCH_ARM < 7 */
175
176/*
177 * MMU関連の定義(VMSA)
178 */
179
180/*
181 * セクションとページのサイズ
182 */
183#define ARM_SSECTION_SIZE UINT_C(0x1000000)
184#define ARM_SECTION_SIZE UINT_C(0x0100000)
185#define ARM_LPAGE_SIZE UINT_C(0x0010000)
186#define ARM_PAGE_SIZE UINT_C(0x0001000)
187
188/*
189 * セクションテーブルとページテーブルのサイズ
190 */
191#define ARM_SECTION_TABLE_SIZE UINT_C(0x4000)
192#define ARM_SECTION_TABLE_ALIGN UINT_C(0x4000)
193#define ARM_SECTION_TABLE_ENTRY (ARM_SECTION_TABLE_SIZE / sizeof(uint32_t))
194
195#define ARM_PAGE_TABLE_SIZE UINT_C(0x0400)
196#define ARM_PAGE_TABLE_ALIGN UINT_C(0x0400)
197#define ARM_PAGE_TABLE_ENTRY (ARM_PAGE_TABLE_SIZE / sizeof(uint32_t))
198
199/*
200 * 第1レベルディスクリプタの設定値
201 */
202#define ARM_MMU_DSCR1_FAULT 0x00000U /* フォルト */
203#define ARM_MMU_DSCR1_PAGETABLE 0x00001U /* コアースページテーブル */
204#define ARM_MMU_DSCR1_SECTION 0x00002U /* セクション */
205#define ARM_MMU_DSCR1_SSECTION 0x40002U /* スーパーセクション */
206
207#define ARM_MMU_DSCR1_SHARED 0x10000U /* プロセッサ間でå…
208±æœ‰ */
209#define ARM_MMU_DSCR1_TEX000 0x00000U /* TEXビットが000 */
210#define ARM_MMU_DSCR1_TEX001 0x01000U /* TEXビットが001 */
211#define ARM_MMU_DSCR1_TEX010 0x02000U /* TEXビットが010 */
212#define ARM_MMU_DSCR1_TEX100 0x04000U /* TEXビットが100 */
213#define ARM_MMU_DSCR1_AP01 0x00400U /* APビットが01 */
214#define ARM_MMU_DSCR1_AP10 0x00800U /* APビットが10 */
215#define ARM_MMU_DSCR1_AP11 0x00c00U /* APビットが11 */
216#define ARM_MMU_DSCR1_CB00 0x00000U /* Cビットが0,Bビットが0 */
217#define ARM_MMU_DSCR1_CB01 0x00004U /* Cビットが0,Bビットが1 */
218#define ARM_MMU_DSCR1_CB10 0x00008U /* Cビットが1,Bビットが0 */
219#define ARM_MMU_DSCR1_CB11 0x0000cU /* Cビットが1,Bビットが1 */
220
221#if __TARGET_ARCH_ARM >= 6
222#define ARMV6_MMU_DSCR1_NONGLOBAL 0x20000U /* グローバルでない */
223#define ARMV6_MMU_DSCR1_APX0 0x00000U /* APXビットが0 */
224#define ARMV6_MMU_DSCR1_APX1 0x08000U /* APXビットが1 */
225#define ARMV6_MMU_DSCR1_ECC 0x00200U /* ECCが有効(MPCore)*/
226#define ARMV6_MMU_DSCR1_NOEXEC 0x00010U /* 実行不可 */
227#endif /* __TARGET_ARCH_ARM >= 6 */
228
229/*
230 * 第2レベルディスクリプタの設定値
231 */
232#define ARM_MMU_DSCR2_FAULT 0x0000U /* フォルト */
233#define ARM_MMU_DSCR2_LARGE 0x0001U /* ラージページ */
234#define ARM_MMU_DSCR2_SMALL 0x0002U /* スモールページ */
235
236#define ARM_MMU_DSCR2_CB00 0x0000U /* Cビットが0,Bビットが0 */
237#define ARM_MMU_DSCR2_CB01 0x0004U /* Cビットが0,Bビットが1 */
238#define ARM_MMU_DSCR2_CB10 0x0008U /* Cビットが1,Bビットが0 */
239#define ARM_MMU_DSCR2_CB11 0x000cU /* Cビットが1,Bビットが1 */
240
241#if __TARGET_ARCH_ARM < 6
242
243#define ARMV5_MMU_DSCR2_AP01 0x0550U /* AP[0-3]ビットが01 */
244#define ARMV5_MMU_DSCR2_AP10 0x0aa0U /* AP[0-3]ビットが10 */
245#define ARMV5_MMU_DSCR2_AP11 0x0ff0U /* AP[0-3]ビットが11 */
246
247/* ラージページのディスクリプタ用 */
248#define ARMV5_MMU_DSCR2L_TEX000 0x0000U /* TEXビットが000 */
249#define ARMV5_MMU_DSCR2L_TEX001 0x1000U /* TEXビットが001 */
250#define ARMV5_MMU_DSCR2L_TEX010 0x2000U /* TEXビットが010 */
251#define ARMV5_MMU_DSCR2L_TEX100 0x4000U /* TEXビットが100 */
252
253#else /* __TARGET_ARCH_ARM < 6 */
254
255#define ARMV6_MMU_DSCR2_NONGLOBAL 0x0800U /* グローバルでない */
256#define ARMV6_MMU_DSCR2_SHARED 0x0400U /* プロセッサ間でå…
257±æœ‰ */
258#define ARMV6_MMU_DSCR2_APX0 0x0000U /* APXビットが0 */
259#define ARMV6_MMU_DSCR2_APX1 0x0200U /* APXビットが1 */
260#define ARMV6_MMU_DSCR2_AP01 0x0010U /* APビットが01 */
261#define ARMV6_MMU_DSCR2_AP10 0x0020U /* APビットが10 */
262#define ARMV6_MMU_DSCR2_AP11 0x0030U /* APビットが11 */
263
264/* ラージページのディスクリプタ用 */
265#define ARMV6_MMU_DSCR2L_TEX000 0x0000U /* TEXビットが000 */
266#define ARMV6_MMU_DSCR2L_TEX001 0x1000U /* TEXビットが001 */
267#define ARMV6_MMU_DSCR2L_TEX010 0x2000U /* TEXビットが010 */
268#define ARMV6_MMU_DSCR2L_TEX100 0x4000U /* TEXビットが100 */
269#define ARMV6_MMU_DSCR2L_NOEXEC 0x8000U /* 実行不可 */
270
271/* スモールページのディスクリプタ用 */
272#define ARMV6_MMU_DSCR2S_TEX000 0x0000U /* TEXビットが000 */
273#define ARMV6_MMU_DSCR2S_TEX001 0x0040U /* TEXビットが001 */
274#define ARMV6_MMU_DSCR2S_TEX010 0x0080U /* TEXビットが010 */
275#define ARMV6_MMU_DSCR2S_TEX100 0x0100U /* TEXビットが100 */
276#define ARMV6_MMU_DSCR2S_NOEXEC 0x0001U /* 実行不可 */
277
278#endif /* __TARGET_ARCH_ARM < 6 */
279
280#ifndef TOPPERS_MACRO_ONLY
281
282/*
283 * コプロセッサ15の操作関数
284 */
285
286/*
287 * High exception vectorsを使うように設定
288 */
289Inline void
290arm_set_high_vectors(void)
291{
292 uint32_t reg;
293
294 CP15_READ_SCTLR(reg);
295 reg |= CP15_SCTLR_VECTOR;
296 CP15_WRITE_SCTLR(reg);
297}
298
299/*
300 * Low exception vectorsを使うように設定
301 */
302Inline void
303arm_set_low_vectors(void)
304{
305 uint32_t reg;
306
307 CP15_READ_SCTLR(reg);
308 reg &= ~CP15_SCTLR_VECTOR;
309 CP15_WRITE_SCTLR(reg);
310}
311
312/*
313 * 分岐予測をイネーブル
314 */
315Inline void
316arm_enable_bp(void)
317{
318 uint32_t reg;
319
320 CP15_READ_SCTLR(reg);
321 reg |= CP15_SCTLR_BP;
322 CP15_WRITE_SCTLR(reg);
323}
324
325/*
326 * 分岐予測をディスエーブル
327 */
328Inline void
329arm_disable_bp(void)
330{
331 uint32_t reg;
332
333 CP15_READ_SCTLR(reg);
334 reg &= ~CP15_SCTLR_BP;
335 CP15_WRITE_SCTLR(reg);
336}
337
338/*
339 * プロセッサ番号の取得
340 *
341 * マルチプロセッサアフィニティレジスタを読んで,その下位8ビットを返す.
342 * ARMv6では,マルチプロセッサをサポートしている場合にのみ使用できる.
343 */
344#if __TARGET_ARCH_ARM >= 6
345
346Inline uint32_t
347arm_prc_index(void)
348{
349 uint32_t reg;
350
351 CP15_READ_MPIDR(reg);
352 return(reg & 0xffU);
353}
354
355#endif /* __TARGET_ARCH_ARM >= 6 */
356
357/*
358 * キャッシュの操作
359 */
360
361/*
362 * 命令/データキャッシュのイネーブル/ディスエーブル
363 */
364extern void arm_enable_icache(void);
365extern void arm_disable_icache(void);
366extern void arm_enable_dcache(void);
367extern void arm_disable_dcache(void);
368
369/*
370 * キャッシュのイネーブル
371 */
372Inline void
373arm_enable_cache(void)
374{
375 arm_enable_icache();
376 arm_enable_dcache();
377}
378
379/*
380 * キャッシュのディスエーブル
381 */
382Inline void
383arm_disable_cache(void)
384{
385 arm_disable_icache();
386 arm_disable_dcache();
387}
388
389/*
390 * ARMv5におけるデータキャッシュの無効化/クリーン
391 */
392#if __TARGET_ARCH_ARM <= 5
393extern void armv5_clean_and_invalidate_dcache(void);
394#endif /* __TARGET_ARCH_ARM <= 5 */
395
396/*
397 * ARMv7におけるデータキャッシュの無効化/クリーン
398 */
399#if __TARGET_ARCH_ARM == 7
400extern void armv7_invalidate_dcache(void);
401extern void armv7_clean_and_invalidate_dcache(void);
402#endif /* __TARGET_ARCH_ARM == 7 */
403
404/*
405 * データキャッシュと統合キャッシュの無効化
406 */
407Inline void
408arm_invalidate_dcache(void)
409{
410#if __TARGET_ARCH_ARM <= 6
411 CP15_INVALIDATE_DCACHE();
412 CP15_INVALIDATE_UCACHE();
413#else /* __TARGET_ARCH_ARM <= 6 */
414 armv7_invalidate_dcache();
415#endif /* __TARGET_ARCH_ARM <= 6 */
416}
417
418/*
419 * データキャッシュと統合キャッシュのクリーンと無効化
420 */
421Inline void
422arm_clean_and_invalidate_dcache(void)
423{
424#if __TARGET_ARCH_ARM <= 5
425 armv5_clean_and_invalidate_dcache();
426#elif __TARGET_ARCH_ARM == 6
427 CP15_CLEAN_AND_INVALIDATE_DCACHE();
428 CP15_CLEAN_AND_INVALIDATE_UCACHE();
429#else
430 armv7_clean_and_invalidate_dcache();
431#endif
432}
433
434/*
435 * 命令キャッシュの無効化
436 */
437Inline void
438arm_invalidate_icache(void)
439{
440 CP15_INVALIDATE_ICACHE();
441}
442
443/*
444 * 分岐予測の無効化
445 */
446Inline void
447arm_invalidate_bp(void)
448{
449 CP15_INVALIDATE_BP();
450 data_sync_barrier();
451 inst_sync_barrier();
452}
453
454/*
455 * TLBの無効化
456 */
457Inline void
458arm_invalidate_tlb(void)
459{
460 CP15_INVALIDATE_TLB();
461 data_sync_barrier();
462}
463
464#endif /* TOPPERS_MACRO_ONLY */
465#endif /* TOPPERS_ARM_H */
Note: See TracBrowser for help on using the repository browser.