source: asp3_wo_tecs/trunk/arch/arm_gcc/common/arm.h@ 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: 12.9 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-2015 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 430 2015-08-08 11:38:46Z ertl-hiro $
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#include "arm_insn.h"
71#endif /* TOPPERS_MACRO_ONLY */
72
73/*
74 * ARM例外ベクタ
75 */
76#define RESET_VECTOR UINT_C(0x00)
77#define UNDEF_VECTOR UINT_C(0x04)
78#define SVC_VECTOR UINT_C(0x08)
79#define PABORT_VECTOR UINT_C(0x0c)
80#define DABORT_VECTOR UINT_C(0x10)
81#define IRQ_VECTOR UINT_C(0x18)
82#define FIQ_VECTOR UINT_C(0x1c)
83
84/*
85 * ARM例外ベクタ番号
86 */
87#define RESET_NUMBER UINT_C(0)
88#define UNDEF_NUMBER UINT_C(1)
89#define SVC_NUMBER UINT_C(2)
90#define PABORT_NUMBER UINT_C(3)
91#define DABORT_NUMBER UINT_C(4)
92#define IRQ_NUMBER UINT_C(6)
93#define FIQ_NUMBER UINT_C(7)
94
95/*
96 * CPSRの割込み禁止ビット
97 */
98#define CPSR_INT_MASK UINT_C(0xc0)
99#define CPSR_IRQ_BIT UINT_C(0x80)
100#define CPSR_FIQ_BIT UINT_C(0x40)
101
102/*
103 * CPSRのThumbビット
104 */
105#define CPSR_THUMB_BIT UINT_C(0x20)
106
107/*
108 * CPSRのモードビット
109 */
110#define CPSR_MODE_MASK UINT_C(0x1f)
111#define CPSR_USER_MODE UINT_C(0x10)
112#define CPSR_FIQ_MODE UINT_C(0x11)
113#define CPSR_IRQ_MODE UINT_C(0x12)
114#define CPSR_SVC_MODE UINT_C(0x13)
115#define CPSR_ABT_MODE UINT_C(0x17)
116#define CPSR_UND_MODE UINT_C(0x1b)
117#define CPSR_SYS_MODE UINT_C(0x1f)
118
119/*
120 * CP15のシステム制御レジスタ(SCTLR)の設定値
121 *
122 * ARMv7では,CP15_SCTLR_EXTPAGEは常に1になっている.
123 */
124#if __TARGET_ARCH_ARM == 6
125#define CP15_SCTLR_EXTPAGE UINT_C(0x00800000)
126#endif /* __TARGET_ARCH_ARM == 6 */
127#define CP15_SCTLR_VECTOR UINT_C(0x00002000)
128#define CP15_SCTLR_ICACHE UINT_C(0x00001000)
129#define CP15_SCTLR_DCACHE UINT_C(0x00000004)
130#define CP15_SCTLR_MMU UINT_C(0x00000001)
131
132/*
133 * CP15のフォールト状æ…
134‹ãƒ¬ã‚¸ã‚¹ã‚¿ã®å‚ç…
135§å€¤
136 */
137#define CP15_FSR_FS_MASK UINT_C(0x0000040f)
138#define CP15_FSR_FS_ALIGNMENT UINT_C(0x00000001)
139#define CP15_FSR_FS_TRANSLATION1 UINT_C(0x00000005)
140#define CP15_FSR_FS_TRANSLATION2 UINT_C(0x00000007)
141#define CP15_FSR_FS_PERMISSION1 UINT_C(0x0000000d)
142#define CP15_FSR_FS_PERMISSION2 UINT_C(0x0000000f)
143
144/*
145 * CP15のパフォーマンスモニタ制御レジスタ(PMCR)の設定値
146 */
147#define CP15_PMCR_ALLCNTR_ENABLE UINT_C(0x01)
148#define CP15_PMCR_PMCCNTR_DIVIDER UINT_C(0x08)
149
150/*
151 * CP15のパフォーマンスモニタカウントイネーブルセットレジスタ(PMCNTENSET)
152 * の設定値
153 */
154#define CP15_PMCNTENSET_CCNTR_ENABLE UINT_C(0x80000000)
155
156/*
157 * CP15の変換テーブルベースレジスタ(TTBR)の設定値
158 */
159#define CP15_TTBR_RGN_SHAREABLE UINT_C(0x00000002)
160#if __TARGET_ARCH_ARM == 7
161#define CP15_TTBR_RGN_WBWA UINT_C(0x00000008)
162#endif /* __TARGET_ARCH_ARM == 7 */
163#define CP15_TTBR_RGN_WTHROUGH UINT_C(0x00000010)
164#define CP15_TTBR_RGN_WBACK UINT_C(0x00000018)
165#if __TARGET_ARCH_ARM < 7
166#define CP15_TTBR_RGN_CACHEABLE UINT_C(0x00000001)
167#else /* __TARGET_ARCH_ARM < 7 */
168#define CP15_TTBR_IRGN_WBWA UINT_C(0x00000040)
169#define CP15_TTBR_IRGN_WTHROUGH UINT_C(0x00000001)
170#define CP15_TTBR_IRGN_WBACK UINT_C(0x00000041)
171#endif /* __TARGET_ARCH_ARM < 7 */
172
173/*
174 * MMU関連の定義(VMSA)
175 */
176
177/*
178 * セクションとページのサイズ
179 */
180#define ARM_SSECTION_SIZE UINT_C(0x1000000)
181#define ARM_SECTION_SIZE UINT_C(0x0100000)
182#define ARM_LPAGE_SIZE UINT_C(0x0010000)
183#define ARM_PAGE_SIZE UINT_C(0x0001000)
184
185/*
186 * セクションテーブルとページテーブルのサイズ
187 */
188#define ARM_SECTION_TABLE_SIZE UINT_C(0x4000)
189#define ARM_SECTION_TABLE_ALIGN UINT_C(0x4000)
190#define ARM_SECTION_TABLE_ENTRY (ARM_SECTION_TABLE_SIZE / sizeof(uint32_t))
191
192#define ARM_PAGE_TABLE_SIZE UINT_C(0x0400)
193#define ARM_PAGE_TABLE_ALIGN UINT_C(0x0400)
194#define ARM_PAGE_TABLE_ENTRY (ARM_PAGE_TABLE_SIZE / sizeof(uint32_t))
195
196/*
197 * 第1レベルディスクリプタの設定値
198 */
199#define ARM_MMU_DSCR1_FAULT 0x00000U /* フォルト */
200#define ARM_MMU_DSCR1_PAGETABLE 0x00001U /* コアースページテーブル */
201#define ARM_MMU_DSCR1_SECTION 0x00002U /* セクション */
202#define ARM_MMU_DSCR1_SSECTION 0x40002U /* スーパーセクション */
203
204#define ARM_MMU_DSCR1_SHARED 0x10000U /* プロセッサ間でå…
205±æœ‰ */
206#define ARM_MMU_DSCR1_TEX000 0x00000U /* TEXビットが000 */
207#define ARM_MMU_DSCR1_TEX001 0x01000U /* TEXビットが001 */
208#define ARM_MMU_DSCR1_TEX010 0x02000U /* TEXビットが010 */
209#define ARM_MMU_DSCR1_TEX100 0x04000U /* TEXビットが100 */
210#define ARM_MMU_DSCR1_AP01 0x00400U /* APビットが01 */
211#define ARM_MMU_DSCR1_AP10 0x00800U /* APビットが10 */
212#define ARM_MMU_DSCR1_AP11 0x00c00U /* APビットが11 */
213#define ARM_MMU_DSCR1_CB00 0x00000U /* Cビットが0,Bビットが0 */
214#define ARM_MMU_DSCR1_CB01 0x00004U /* Cビットが0,Bビットが1 */
215#define ARM_MMU_DSCR1_CB10 0x00008U /* Cビットが1,Bビットが0 */
216#define ARM_MMU_DSCR1_CB11 0x0000cU /* Cビットが1,Bビットが1 */
217
218#if __TARGET_ARCH_ARM >= 6
219#define ARMV6_MMU_DSCR1_NONGLOBAL 0x20000U /* グローバルでない */
220#define ARMV6_MMU_DSCR1_APX0 0x00000U /* APXビットが0 */
221#define ARMV6_MMU_DSCR1_APX1 0x08000U /* APXビットが1 */
222#define ARMV6_MMU_DSCR1_ECC 0x00200U /* ECCが有効(MPCore)*/
223#define ARMV6_MMU_DSCR1_NOEXEC 0x00010U /* 実行不可 */
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±æœ‰ */
255#define ARMV6_MMU_DSCR2_APX0 0x0000U /* APXビットが0 */
256#define ARMV6_MMU_DSCR2_APX1 0x0200U /* APXビットが1 */
257#define ARMV6_MMU_DSCR2_AP01 0x0010U /* APビットが01 */
258#define ARMV6_MMU_DSCR2_AP10 0x0020U /* APビットが10 */
259#define ARMV6_MMU_DSCR2_AP11 0x0030U /* APビットが11 */
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 vectorを使うかの設定
285 */
286Inline void
287arm_set_high_vector(bool_t enable)
288{
289 uint32_t reg;
290
291 CP15_READ_SCTLR(reg);
292 if (enable) {
293 reg |= CP15_SCTLR_VECTOR;
294 }
295 else {
296 reg &= ~CP15_SCTLR_VECTOR;
297 }
298 CP15_WRITE_SCTLR(reg);
299}
300
301/*
302 * プロセッサ番号の取得
303 *
304 * マルチプロセッサアフィニティレジスタを読んで,その下位8ビットを返す.
305 * ARMv6では,マルチプロセッサをサポートしている場合にのみ使用できる.
306 */
307#if __TARGET_ARCH_ARM >= 6
308
309Inline uint32_t
310arm_prc_index(void)
311{
312 uint32_t reg;
313
314 CP15_READ_MPIDR(reg);
315 return(reg & 0xffU);
316}
317
318#endif /* __TARGET_ARCH_ARM >= 6 */
319
320/*
321 * キャッシュの操作
322 */
323
324/*
325 * 命令/データキャッシュのイネーブル/ディスエーブル
326 */
327extern void arm_enable_icache(void);
328extern void arm_disable_icache(void);
329extern void arm_enable_dcache(void);
330extern void arm_disable_dcache(void);
331
332/*
333 * キャッシュのイネーブル
334 */
335Inline void
336arm_enable_cache(void)
337{
338 arm_enable_icache();
339 arm_enable_dcache();
340}
341
342/*
343 * キャッシュのディスエーブル
344 */
345Inline void
346arm_disable_cache(void)
347{
348 arm_disable_icache();
349 arm_disable_dcache();
350}
351
352/*
353 * ARMv5におけるデータキャッシュの無効化/クリーン
354 */
355#if __TARGET_ARCH_ARM <= 5
356extern void armv5_clean_and_invalidate_dcache(void);
357#endif /* __TARGET_ARCH_ARM <= 5 */
358
359/*
360 * ARMv7におけるデータキャッシュの無効化/クリーン
361 */
362#if __TARGET_ARCH_ARM == 7
363extern void armv7_invalidate_dcache(void);
364extern void armv7_clean_and_invalidate_dcache(void);
365#endif /* __TARGET_ARCH_ARM == 7 */
366
367/*
368 * データキャッシュと統合キャッシュの無効化
369 */
370Inline void
371arm_invalidate_dcache(void)
372{
373#if __TARGET_ARCH_ARM <= 6
374 CP15_INVALIDATE_DCACHE();
375 CP15_INVALIDATE_UCACHE();
376#else /* __TARGET_ARCH_ARM <= 6 */
377 armv7_invalidate_dcache();
378#endif /* __TARGET_ARCH_ARM <= 6 */
379}
380
381/*
382 * データキャッシュと統合キャッシュのクリーンと無効化
383 */
384Inline void
385arm_clean_and_invalidate_dcache(void)
386{
387#if __TARGET_ARCH_ARM <= 5
388 armv5_clean_and_invalidate_dcache();
389#elif __TARGET_ARCH_ARM == 6
390 CP15_CLEAN_AND_INVALIDATE_DCACHE();
391 CP15_CLEAN_AND_INVALIDATE_UCACHE();
392#else
393 armv7_clean_and_invalidate_dcache();
394#endif
395}
396
397/*
398 * 命令キャッシュの無効化
399 */
400Inline void
401arm_invalidate_icache(void)
402{
403 CP15_INVALIDATE_ICACHE();
404}
405
406/*
407 * TLBの無効化
408 */
409Inline void
410arm_invalidate_tlb(void)
411{
412 CP15_INVALIDATE_TLB();
413 data_sync_barrier();
414}
415
416#endif /* TOPPERS_MACRO_ONLY */
417#endif /* TOPPERS_ARM_H */
Note: See TracBrowser for help on using the repository browser.