source: EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/arm.h@ 321

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

文字コードを設定

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