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

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

ASP3, TINET, mbed を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 14.3 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-2019 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#include "arm_insn.h"
56#endif /* TOPPERS_MACRO_ONLY */
57
58/*
59 * ARM例外ベクタ
60 */
61#define RESET_VECTOR UINT_C(0x00)
62#define UNDEF_VECTOR UINT_C(0x04)
63#define SVC_VECTOR UINT_C(0x08)
64#define PABORT_VECTOR UINT_C(0x0c)
65#define DABORT_VECTOR UINT_C(0x10)
66#define IRQ_VECTOR UINT_C(0x18)
67#define FIQ_VECTOR UINT_C(0x1c)
68
69/*
70 * ARM例外ベクタ番号
71 */
72#define RESET_NUMBER UINT_C(0)
73#define UNDEF_NUMBER UINT_C(1)
74#define SVC_NUMBER UINT_C(2)
75#define PABORT_NUMBER UINT_C(3)
76#define DABORT_NUMBER UINT_C(4)
77#define IRQ_NUMBER UINT_C(6)
78#define FIQ_NUMBER UINT_C(7)
79
80/*
81 * CPSRの割込み禁止ビット
82 */
83#define CPSR_INT_MASK UINT_C(0xc0)
84#define CPSR_IRQ_BIT UINT_C(0x80)
85#define CPSR_FIQ_BIT UINT_C(0x40)
86
87/*
88 * CPSRのThumbビット
89 */
90#define CPSR_THUMB_BIT UINT_C(0x20)
91
92/*
93 * CPSRのモードビット
94 */
95#define CPSR_MODE_MASK UINT_C(0x1f)
96#define CPSR_USER_MODE UINT_C(0x10)
97#define CPSR_FIQ_MODE UINT_C(0x11)
98#define CPSR_IRQ_MODE UINT_C(0x12)
99#define CPSR_SVC_MODE UINT_C(0x13)
100#define CPSR_ABT_MODE UINT_C(0x17)
101#define CPSR_UND_MODE UINT_C(0x1b)
102#define CPSR_SYS_MODE UINT_C(0x1f)
103
104/*
105 * CP15のシステム制御レジスタ(SCTLR)の設定値
106 *
107 * ARMv7では,CP15_SCTLR_EXTPAGEは常に1になっている.
108 */
109#if __TARGET_ARCH_ARM == 6
110#define CP15_SCTLR_EXTPAGE UINT_C(0x00800000)
111#endif /* __TARGET_ARCH_ARM == 6 */
112#define CP15_SCTLR_VECTOR UINT_C(0x00002000)
113#define CP15_SCTLR_ICACHE UINT_C(0x00001000)
114#define CP15_SCTLR_BP UINT_C(0x00000800)
115#define CP15_SCTLR_DCACHE UINT_C(0x00000004)
116#define CP15_SCTLR_MMU UINT_C(0x00000001)
117
118/*
119 * CP15のコプロセッサアクセス制御レジスタ(CPACR)の設定値
120 */
121#define CP15_CPACR_ASEDIS UINT_C(0x80000000)
122#define CP15_CPACR_D32DIS UINT_C(0x40000000)
123#define CP15_CPACR_CP11_FULLACCESS UINT_C(0x00c00000)
124#define CP15_CPACR_CP10_FULLACCESS UINT_C(0x00300000)
125
126/*
127 * CP15のフォールト状態レジスタの参照値
128 */
129#define CP15_FSR_FS_MASK UINT_C(0x0000040f)
130#define CP15_FSR_FS_ALIGNMENT UINT_C(0x00000001)
131#define CP15_FSR_FS_TRANSLATION1 UINT_C(0x00000005)
132#define CP15_FSR_FS_TRANSLATION2 UINT_C(0x00000007)
133#define CP15_FSR_FS_PERMISSION1 UINT_C(0x0000000d)
134#define CP15_FSR_FS_PERMISSION2 UINT_C(0x0000000f)
135
136/*
137 * CP15のパフォーマンスモニタ制御レジスタ(PMCR)の設定値
138 */
139#define CP15_PMCR_ALLCNTR_ENABLE UINT_C(0x01)
140#define CP15_PMCR_PMCCNTR_DIVIDER UINT_C(0x08)
141
142/*
143 * CP15のパフォーマンスモニタカウントイネーブルセットレジスタ(PMCNTENSET)
144 * の設定値
145 */
146#define CP15_PMCNTENSET_CCNTR_ENABLE UINT_C(0x80000000)
147
148/*
149 * CP15の変換テーブルベースレジスタ(TTBR)の設定値
150 */
151#define CP15_TTBR_RGN_SHAREABLE UINT_C(0x00000002)
152#if __TARGET_ARCH_ARM == 7
153#define CP15_TTBR_RGN_WBWA UINT_C(0x00000008)
154#endif /* __TARGET_ARCH_ARM == 7 */
155#define CP15_TTBR_RGN_WTHROUGH UINT_C(0x00000010)
156#define CP15_TTBR_RGN_WBACK UINT_C(0x00000018)
157#if __TARGET_ARCH_ARM < 7
158#define CP15_TTBR_RGN_CACHEABLE UINT_C(0x00000001)
159#else /* __TARGET_ARCH_ARM < 7 */
160#define CP15_TTBR_IRGN_WBWA UINT_C(0x00000040)
161#define CP15_TTBR_IRGN_WTHROUGH UINT_C(0x00000001)
162#define CP15_TTBR_IRGN_WBACK UINT_C(0x00000041)
163#endif /* __TARGET_ARCH_ARM < 7 */
164
165/*
166 * MMU関連の定義(VMSA)
167 */
168
169/*
170 * セクションとページのサイズ
171 */
172#define ARM_SSECTION_SIZE UINT_C(0x1000000)
173#define ARM_SECTION_SIZE UINT_C(0x0100000)
174#define ARM_LPAGE_SIZE UINT_C(0x0010000)
175#define ARM_PAGE_SIZE UINT_C(0x0001000)
176
177/*
178 * セクションテーブルとページテーブルのサイズ
179 */
180#define ARM_SECTION_TABLE_SIZE UINT_C(0x4000)
181#define ARM_SECTION_TABLE_ALIGN UINT_C(0x4000)
182#define ARM_SECTION_TABLE_ENTRY (ARM_SECTION_TABLE_SIZE / sizeof(uint32_t))
183
184#define ARM_PAGE_TABLE_SIZE UINT_C(0x0400)
185#define ARM_PAGE_TABLE_ALIGN UINT_C(0x0400)
186#define ARM_PAGE_TABLE_ENTRY (ARM_PAGE_TABLE_SIZE / sizeof(uint32_t))
187
188/*
189 * 第1レベルディスクリプタの設定値
190 */
191#define ARM_MMU_DSCR1_FAULT 0x00000U /* フォルト */
192#define ARM_MMU_DSCR1_PAGETABLE 0x00001U /* コアースページテーブル */
193#define ARM_MMU_DSCR1_SECTION 0x00002U /* セクション */
194#define ARM_MMU_DSCR1_SSECTION 0x40002U /* スーパーセクション */
195
196#define ARM_MMU_DSCR1_SHARED 0x10000U /* プロセッサ間で共有 */
197#define ARM_MMU_DSCR1_TEX000 0x00000U /* TEXビットが000 */
198#define ARM_MMU_DSCR1_TEX001 0x01000U /* TEXビットが001 */
199#define ARM_MMU_DSCR1_TEX010 0x02000U /* TEXビットが010 */
200#define ARM_MMU_DSCR1_TEX100 0x04000U /* TEXビットが100 */
201#define ARM_MMU_DSCR1_CB00 0x00000U /* Cビットが0,Bビットが0 */
202#define ARM_MMU_DSCR1_CB01 0x00004U /* Cビットが0,Bビットが1 */
203#define ARM_MMU_DSCR1_CB10 0x00008U /* Cビットが1,Bビットが0 */
204#define ARM_MMU_DSCR1_CB11 0x0000cU /* Cビットが1,Bビットが1 */
205
206#if __TARGET_ARCH_ARM < 6
207
208#define ARMV5_MMU_DSCR1_AP01 0x00400U /* APビットが01 */
209#define ARMV5_MMU_DSCR1_AP10 0x00800U /* APビットが10 */
210#define ARMV5_MMU_DSCR1_AP11 0x00c00U /* APビットが11 */
211
212#else /* __TARGET_ARCH_ARM < 6 */
213
214#define ARMV6_MMU_DSCR1_NONGLOBAL 0x20000U /* グローバルでない */
215#define ARMV6_MMU_DSCR1_AP001 0x00400 /* APビットが001 */
216#define ARMV6_MMU_DSCR1_AP010 0x00800 /* APビットが010 */
217#define ARMV6_MMU_DSCR1_AP011 0x00c00 /* APビットが011 */
218#define ARMV6_MMU_DSCR1_AP101 0x08400 /* APビットが101 */
219#define ARMV6_MMU_DSCR1_AP110 0x08800 /* APビットが110 */
220#define ARMV6_MMU_DSCR1_AP111 0x08c00 /* APビットが111 */
221#define ARMV6_MMU_DSCR1_ECC 0x00200U /* ECCが有効(MPCore)*/
222#define ARMV6_MMU_DSCR1_NOEXEC 0x00010U /* 実行不可 */
223
224#endif /* __TARGET_ARCH_ARM < 6 */
225
226/*
227 * 第2レベルディスクリプタの設定値
228 */
229#define ARM_MMU_DSCR2_FAULT 0x0000U /* フォルト */
230#define ARM_MMU_DSCR2_LARGE 0x0001U /* ラージページ */
231#define ARM_MMU_DSCR2_SMALL 0x0002U /* スモールページ */
232
233#define ARM_MMU_DSCR2_CB00 0x0000U /* Cビットが0,Bビットが0 */
234#define ARM_MMU_DSCR2_CB01 0x0004U /* Cビットが0,Bビットが1 */
235#define ARM_MMU_DSCR2_CB10 0x0008U /* Cビットが1,Bビットが0 */
236#define ARM_MMU_DSCR2_CB11 0x000cU /* Cビットが1,Bビットが1 */
237
238#if __TARGET_ARCH_ARM < 6
239
240#define ARMV5_MMU_DSCR2_AP01 0x0550U /* AP[0-3]ビットが01 */
241#define ARMV5_MMU_DSCR2_AP10 0x0aa0U /* AP[0-3]ビットが10 */
242#define ARMV5_MMU_DSCR2_AP11 0x0ff0U /* AP[0-3]ビットが11 */
243
244/* ラージページのディスクリプタ用 */
245#define ARMV5_MMU_DSCR2L_TEX000 0x0000U /* TEXビットが000 */
246#define ARMV5_MMU_DSCR2L_TEX001 0x1000U /* TEXビットが001 */
247#define ARMV5_MMU_DSCR2L_TEX010 0x2000U /* TEXビットが010 */
248#define ARMV5_MMU_DSCR2L_TEX100 0x4000U /* TEXビットが100 */
249
250#else /* __TARGET_ARCH_ARM < 6 */
251
252#define ARMV6_MMU_DSCR2_NONGLOBAL 0x0800U /* グローバルでない */
253#define ARMV6_MMU_DSCR2_SHARED 0x0400U /* プロセッサ間で共有 */
254#define ARMV6_MMU_DSCR2_AP001 0x0010 /* APビットが001 */
255#define ARMV6_MMU_DSCR2_AP010 0x0020 /* APビットが010 */
256#define ARMV6_MMU_DSCR2_AP011 0x0030 /* APビットが011 */
257#define ARMV6_MMU_DSCR2_AP101 0x0210 /* APビットが101 */
258#define ARMV6_MMU_DSCR2_AP110 0x0220 /* APビットが110 */
259#define ARMV6_MMU_DSCR2_AP111 0x0230 /* APビットが111 */
260
261/* ラージページのディスクリプタ用 */
262#define ARMV6_MMU_DSCR2L_TEX000 0x0000U /* TEXビットが000 */
263#define ARMV6_MMU_DSCR2L_TEX001 0x1000U /* TEXビットが001 */
264#define ARMV6_MMU_DSCR2L_TEX010 0x2000U /* TEXビットが010 */
265#define ARMV6_MMU_DSCR2L_TEX100 0x4000U /* TEXビットが100 */
266#define ARMV6_MMU_DSCR2L_NOEXEC 0x8000U /* 実行不可 */
267
268/* スモールページのディスクリプタ用 */
269#define ARMV6_MMU_DSCR2S_TEX000 0x0000U /* TEXビットが000 */
270#define ARMV6_MMU_DSCR2S_TEX001 0x0040U /* TEXビットが001 */
271#define ARMV6_MMU_DSCR2S_TEX010 0x0080U /* TEXビットが010 */
272#define ARMV6_MMU_DSCR2S_TEX100 0x0100U /* TEXビットが100 */
273#define ARMV6_MMU_DSCR2S_NOEXEC 0x0001U /* 実行不可 */
274
275#endif /* __TARGET_ARCH_ARM < 6 */
276
277#ifndef TOPPERS_MACRO_ONLY
278
279/*
280 * コプロセッサ15の操作関数
281 */
282
283/*
284 * High exception vectorsを使うように設定
285 */
286Inline void
287arm_set_high_vectors(void)
288{
289 uint32_t reg;
290
291 CP15_READ_SCTLR(reg);
292 reg |= CP15_SCTLR_VECTOR;
293 CP15_WRITE_SCTLR(reg);
294}
295
296/*
297 * Low exception vectorsを使うように設定
298 */
299Inline void
300arm_set_low_vectors(void)
301{
302 uint32_t reg;
303
304 CP15_READ_SCTLR(reg);
305 reg &= ~CP15_SCTLR_VECTOR;
306 CP15_WRITE_SCTLR(reg);
307}
308
309/*
310 * 分岐予測をイネーブル
311 */
312Inline void
313arm_enable_bp(void)
314{
315 uint32_t reg;
316
317 CP15_READ_SCTLR(reg);
318 reg |= CP15_SCTLR_BP;
319 CP15_WRITE_SCTLR(reg);
320}
321
322/*
323 * 分岐予測をディスエーブル
324 */
325Inline void
326arm_disable_bp(void)
327{
328 uint32_t reg;
329
330 CP15_READ_SCTLR(reg);
331 reg &= ~CP15_SCTLR_BP;
332 CP15_WRITE_SCTLR(reg);
333}
334
335/*
336 * 自プロセッサのインデックス(0オリジン)の取得
337 *
338 * マルチプロセッサアフィニティレジスタを読んで,その下位8ビットを返
339 * す.ARMv6では,マルチプロセッサをサポートしている場合にのみ使用で
340 * きる.
341 */
342#if __TARGET_ARCH_ARM >= 6
343
344Inline uint_t
345get_my_prcidx(void)
346{
347 uint32_t reg;
348
349 CP15_READ_MPIDR(reg);
350 return((uint_t)(reg & 0xffU));
351}
352
353#endif /* __TARGET_ARCH_ARM >= 6 */
354
355/*
356 * キャッシュの操作
357 */
358
359/*
360 * 命令/データキャッシュのイネーブル/ディスエーブル
361 */
362extern void arm_enable_icache(void);
363extern void arm_disable_icache(void);
364extern void arm_enable_dcache(void);
365extern void arm_disable_dcache(void);
366
367/*
368 * キャッシュのイネーブル
369 */
370Inline void
371arm_enable_cache(void)
372{
373 arm_enable_icache();
374 arm_enable_dcache();
375}
376
377/*
378 * キャッシュのディスエーブル
379 */
380Inline void
381arm_disable_cache(void)
382{
383 arm_disable_icache();
384 arm_disable_dcache();
385}
386
387/*
388 * ARMv5におけるデータキャッシュの無効化/クリーン
389 */
390#if __TARGET_ARCH_ARM <= 5
391extern void armv5_clean_and_invalidate_dcache(void);
392#endif /* __TARGET_ARCH_ARM <= 5 */
393
394/*
395 * ARMv7におけるデータキャッシュの無効化/クリーン
396 */
397#if __TARGET_ARCH_ARM == 7
398extern void armv7_invalidate_dcache(void);
399extern void armv7_clean_and_invalidate_dcache(void);
400#endif /* __TARGET_ARCH_ARM == 7 */
401
402/*
403 * データキャッシュと統合キャッシュの無効化
404 */
405Inline void
406arm_invalidate_dcache(void)
407{
408#if __TARGET_ARCH_ARM <= 6
409 CP15_INVALIDATE_DCACHE();
410 CP15_INVALIDATE_UCACHE();
411#else /* __TARGET_ARCH_ARM <= 6 */
412 armv7_invalidate_dcache();
413#endif /* __TARGET_ARCH_ARM <= 6 */
414}
415
416/*
417 * データキャッシュと統合キャッシュのクリーンと無効化
418 */
419Inline void
420arm_clean_and_invalidate_dcache(void)
421{
422#if __TARGET_ARCH_ARM <= 5
423 armv5_clean_and_invalidate_dcache();
424#elif __TARGET_ARCH_ARM == 6
425 CP15_CLEAN_AND_INVALIDATE_DCACHE();
426 CP15_CLEAN_AND_INVALIDATE_UCACHE();
427#else
428 armv7_clean_and_invalidate_dcache();
429#endif
430}
431
432/*
433 * 命令キャッシュの無効化
434 */
435Inline void
436arm_invalidate_icache(void)
437{
438 CP15_INVALIDATE_ICACHE();
439}
440
441/*
442 * 分岐予測の無効化
443 */
444Inline void
445arm_invalidate_bp(void)
446{
447 CP15_INVALIDATE_BP();
448 data_sync_barrier();
449 inst_sync_barrier();
450}
451
452/*
453 * TLBの無効化
454 */
455Inline void
456arm_invalidate_tlb(void)
457{
458 CP15_INVALIDATE_TLB();
459 data_sync_barrier();
460}
461
462#endif /* TOPPERS_MACRO_ONLY */
463
464/*
465 * 浮動小数点例外制御レジスタ(FPEXC)の設定値
466 */
467#define FPEXC_ENABLE UINT_C(0x40000000)
468
469#endif /* TOPPERS_ARM_H */
Note: See TracBrowser for help on using the repository browser.