source: asp3_wo_tecs/trunk/arch/arm_gcc/common/arm_insn.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.5 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_insn.h 438 2015-08-09 01:37:47Z ertl-hiro $
55 */
56
57/*
58 * ARMコアの特殊命令のインライン関数定義
59 *
60 * このヘッダファイルは,arm.hからインクルードされる.arm.hから分離し
61 * ているのは,コンパイラによるインラインアセンブラの記述方法の違いを
62 * 吸収するために,このファイルのみを置き換えればよいようにするためで
63 * ある.
64 */
65
66#ifndef TOPPERS_ARM_INSN_H
67#define TOPPERS_ARM_INSN_H
68
69#include <t_stddef.h>
70
71/*
72 * CLZ(Count Leading Zero)命令
73 */
74#if __TARGET_ARCH_ARM >= 6
75
76Inline uint32_t
77count_leading_zero(uint32_t val)
78{
79 uint32_t count;
80
81 Asm("clz %0, %1" : "=r"(count) : "r"(val));
82 return(count);
83}
84
85#endif /* __TARGET_ARCH_ARM >= 6 */
86
87/*
88 * メモリが変更されることをコンパイラに伝えるためのマクロ
89 */
90#define ARM_MEMORY_CHANGED Asm("":::"memory")
91
92/*
93 * ステータスレジスタの操作関数
94 */
95#ifndef __thumb__
96
97/*
98 * ステータスレジスタ(CPSR)の現在値の読出し
99 */
100Inline uint32_t
101current_cpsr(void)
102{
103 uint32_t cpsr;
104
105 Asm("mrs %0, cpsr" : "=r"(cpsr));
106 return(cpsr);
107}
108
109/*
110 * ステータスレジスタ(CPSR)の現在値の変更
111 */
112Inline void
113set_cpsr(uint32_t cpsr)
114{
115 Asm("msr cpsr_cxsf, %0" : : "r"(cpsr) : "memory","cc");
116}
117
118#else /* __thumb__ */
119/*
120 * Thumbモードではmrs/msr命令が使用できないため,関数として実現して,
121 * ARMモードに移行して実行する.
122 */
123
124/*
125 * ステータスレジスタ(CPSR)の現在値の読出し
126 */
127extern uint32_t current_cpsr(void);
128
129/*
130 * ステータスレジスタ(CPSR)の現在値の変更
131 */
132extern void set_cpsr(uint32_t cpsr);
133
134#endif /* __thumb__ */
135
136/*
137 * 割込み禁止/許可関数
138 *
139 * ARMv6から追加されたシステム状æ…
140‹ã‚’変更する命令を使った割込み禁止/許
141 * 可のための関数.
142 */
143#if __TARGET_ARCH_ARM >= 6
144
145/*
146 * IRQの禁止
147 */
148Inline void
149disable_irq(void)
150{
151 Asm("cpsid i");
152}
153
154/*
155 * IRQの許可
156 */
157Inline void
158enable_irq(void)
159{
160 Asm("cpsie i");
161}
162
163/*
164 * FIQの禁止
165 */
166Inline void
167disable_fiq(void)
168{
169 Asm("cpsid f");
170}
171
172/*
173 * FIQの許可
174 */
175Inline void
176enable_fiq(void)
177{
178 Asm("cpsie f");
179}
180
181/*
182 * FIQとIRQの禁止
183 */
184Inline void
185disable_fiq_irq(void)
186{
187 Asm("cpsid fi");
188}
189
190/*
191 * FIQとIRQの許可
192 */
193Inline void
194enable_fiq_irq(void)
195{
196 Asm("cpsie fi");
197}
198
199#endif /* __TARGET_ARCH_ARM >= 6 */
200
201/*
202 * CP15のIDレジスタ操作マクロ
203 */
204
205/* メインIDレジスタ */
206#define CP15_READ_MIDR(reg) Asm("mrc p15, 0, %0, c0, c0, 0":"=r"(reg))
207
208/* マルチプロセッサアフィニティレジスタ(ARMv6以降)*/
209#if __TARGET_ARCH_ARM >= 6
210#define CP15_READ_MPIDR(reg) Asm("mrc p15, 0, %0, c0, c0, 5":"=r"(reg))
211#endif /* __TARGET_ARCH_ARM >= 6 */
212
213/* キャッシュタイプレジスタ */
214#define CP15_READ_CTR(reg) Asm("mrc p15, 0, %0, c0, c0, 1":"=r"(reg))
215
216#if __TARGET_ARCH_ARM == 7
217/* キャッシュレベルIDレジスタ(ARMv7) */
218#define CP15_READ_CLIDR(reg) Asm("mrc p15, 1, %0, c0, c0, 1":"=r"(reg))
219
220/* キャッシュサイズ選択レジスタ(ARMv7)*/
221#define CP15_WRITE_CSSELR(reg) Asm("mcr p15, 2, %0, c0, c0, 0"::"r"(reg))
222
223/* キャッシュサイズIDレジスタ(ARMv7)*/
224#define CP15_READ_CCSIDR(reg) Asm("mrc p15, 1, %0, c0, c0, 0":"=r"(reg))
225#endif /* __TARGET_ARCH_ARM == 7 */
226
227/*
228 * CP15のシステム制御レジスタ操作マクロ
229 */
230
231/* システム制御レジスタ */
232#define CP15_READ_SCTLR(reg) Asm("mrc p15, 0, %0, c1, c0, 0":"=r"(reg))
233#define CP15_WRITE_SCTLR(reg) Asm("mcr p15, 0, %0, c1, c0, 0"::"r"(reg))
234
235/* 補助制御レジスタ(機能はチップ依存)*/
236#define CP15_READ_ACTLR(reg) Asm("mrc p15, 0, %0, c1, c0, 1":"=r"(reg))
237#define CP15_WRITE_ACTLR(reg) Asm("mcr p15, 0, %0, c1, c0, 1"::"r"(reg))
238
239/*
240 * CP15によるキャッシュ操作マクロ
241 */
242
243/* 命令キャッシュå…
244¨ä½“の無効化 */
245#define CP15_INVALIDATE_ICACHE() \
246 Asm("mcr p15, 0, %0, c7, c5, 0"::"r"(0))
247
248/* データキャッシュå…
249¨ä½“の無効化(ARMv6以前)*/
250#if __TARGET_ARCH_ARM <= 6
251#define CP15_INVALIDATE_DCACHE() Asm("mcr p15, 0, %0, c7, c6, 0"::"r"(0))
252#endif /* __TARGET_ARCH_ARM <= 6 */
253
254/* 統合キャッシュå…
255¨ä½“の無効化(ARMv6以前)*/
256#if __TARGET_ARCH_ARM <= 6
257#define CP15_INVALIDATE_UCACHE() Asm("mcr p15, 0, %0, c7, c7, 0"::"r"(0))
258#endif /* __TARGET_ARCH_ARM <= 6 */
259
260/* データキャッシュå…
261¨ä½“のクリーンと無効化(ARMv5のみ)*/
262#if __TARGET_ARCH_ARM <= 5
263#define ARMV5_CLEAN_AND_INVALIDATE_DCACHE() \
264 Asm("1: mrc p15, 0, apsr_nzcv, c7, c14, 3; bne 1b")
265#endif /* __TARGET_ARCH_ARM <= 5 */
266
267/* データキャッシュå…
268¨ä½“のクリーンと無効化(ARMv6のみ)*/
269#if __TARGET_ARCH_ARM == 6
270#define CP15_CLEAN_AND_INVALIDATE_DCACHE() \
271 Asm("mcr p15, 0, %0, c7, c14, 0"::"r"(0))
272#endif /* __TARGET_ARCH_ARM == 6 */
273
274/* 統合キャッシュå…
275¨ä½“のクリーンと無効化(ARMv6のみ)*/
276#if __TARGET_ARCH_ARM == 6
277#define CP15_CLEAN_AND_INVALIDATE_UCACHE() \
278 Asm("mcr p15, 0, %0, c7, c15, 0"::"r"(0))
279#endif /* __TARGET_ARCH_ARM == 6 */
280
281/* データキャッシュのセット/ウェイ単位の無効化 */
282#define CP15_WRITE_DCISW(reg) Asm("mcr p15, 0, %0, c7, c6, 2"::"r"(reg))
283
284/* データキャッシュのセット/ウェイ単位のクリーンと無効化 */
285#define CP15_WRITE_DCCISW(reg) Asm("mcr p15, 0, %0, c7, c14, 2"::"r"(reg))
286
287/*
288 * CP15のフォールト状æ…
289‹ï¼ã‚¢ãƒ‰ãƒ¬ã‚¹ã®æ“ä½œãƒžã‚¯ãƒ­
290 */
291#if __TARGET_ARCH_ARM >= 6
292#define CP15_READ_DFSR(reg) Asm("mrc p15, 0, %0, c5, c0, 0":"=r"(reg))
293#define CP15_READ_DFAR(reg) Asm("mrc p15, 0, %0, c6, c0, 0":"=r"(reg))
294#define CP15_READ_IFSR(reg) Asm("mrc p15, 0, %0, c5, c0, 1":"=r"(reg))
295#define CP15_READ_IFAR(reg) Asm("mrc p15, 0, %0, c6, c0, 2":"=r"(reg))
296#else /* __TARGET_ARCH_ARM >= 6 */
297#define CP15_READ_FSR(reg) Asm("mrc p15, 0, %0, c5, c0, 0":"=r"(reg))
298#define CP15_READ_FAR(reg) Asm("mrc p15, 0, %0, c6, c0, 0":"=r"(reg))
299#endif /* __TARGET_ARCH_ARM >= 6 */
300
301/*
302 * CP15によるMMUの操作マクロ(VMSA)
303 */
304
305/* 変換テーブルベース制御レジスタ(ARMv6以降)*/
306#if __TARGET_ARCH_ARM >= 6
307#define CP15_WRITE_TTBCR(reg) Asm("mcr p15, 0, %0, c2, c0, 2"::"r"(reg))
308#endif /* __TARGET_ARCH_ARM >= 6 */
309
310/* 変換テーブルベースレジスタ0 */
311#define CP15_READ_TTBR0(reg) Asm("mrc p15, 0, %0, c2, c0, 0":"=r"(reg))
312#define CP15_WRITE_TTBR0(reg) Asm("mcr p15, 0, %0, c2, c0, 0"::"r"(reg))
313
314/* ドメインアクセス制御レジスタ */
315#define CP15_WRITE_DACR(reg) Asm("mcr p15, 0, %0, c3, c0, 0":: "r"(reg))
316
317/* コンテキストIDレジスタ(ARMv6以降)*/
318#if __TARGET_ARCH_ARM >= 6
319#define CP15_WRITE_CONTEXTIDR(reg) Asm("mcr p15, 0, %0, c13, c0, 1" ::"r"(reg))
320#endif /* __TARGET_ARCH_ARM >= 6 */
321
322/*
323 * CP15によるTLB操作マクロ(VMSA)
324 */
325
326/* TLBå…
327¨ä½“の無効化 */
328#define CP15_INVALIDATE_TLB() Asm("mcr p15, 0, %0, c8, c7, 0"::"r"(0))
329
330/*
331 * CP15のパフォーマンスモニタ操作マクロ(ARMv7のみ)
332 */
333#if __TARGET_ARCH_ARM == 7
334
335/* パフォーマンスモニタ制御レジスタ */
336#define CP15_READ_PMCR(reg) Asm("mrc p15, 0, %0, c9, c12, 0":"=r"(reg))
337#define CP15_WRITE_PMCR(reg) Asm("mcr p15, 0, %0, c9, c12, 0"::"r"(reg))
338
339/* パフォーマンスモニタカウントイネーブルセットレジスタ */
340#define CP15_READ_PMCNTENSET(reg) Asm("mrc p15, 0, %0, c9, c12, 1":"=r"(reg))
341#define CP15_WRITE_PMCNTENSET(reg) Asm("mcr p15, 0, %0, c9, c12, 1"::"r"(reg))
342
343/* パフォーマンスモニタカウンタサイクルレジスタ */
344#define CP15_READ_PMCCNTR(reg) Asm("mrc p15, 0, %0, c9, c13, 0":"=r"(reg))
345#define CP15_WRITE_PMCCNTR(reg) Asm("mcr p15, 0, %0, c9, c13, 0"::"r"(reg))
346
347#endif /* __TARGET_ARCH_ARM == 7 */
348
349/*
350 * CP15によるメモリバリア操作マクロ
351 */
352#define CP15_INST_SYNC_BARRIER() \
353 Asm("mcr p15, 0, %0, c7, c5, 4"::"r"(0):"memory")
354#define CP15_DATA_SYNC_BARRIER() \
355 Asm("mcr p15, 0, %0, c7, c10, 4"::"r"(0):"memory")
356#define CP15_DATA_MEMORY_BARRIER() \
357 Asm("mcr p15, 0, %0, c7, c10, 5"::"r"(0):"memory")
358
359/*
360 * メモリバリア
361 *
362 * ARMv6とARMv7が持つ3つのメモリバリア機能を使用するための関数.メモリ
363 * バリアは,ARMv7では専用命令,ARMv6ではCP15への書込みで実現される.
364 * ARMv7のメモリバリア命令は,同期を取る範囲を指定できるが,以下の関数
365 * では最大範囲(システムå…
366¨ä½“,リード/ライトの両方)で同期を取る.
367 */
368
369/*
370 * データメモリバリア
371 *
372 * このバリアの前後で,メモリアクセスの順序がå…
373¥ã‚Œæ›ã‚ã‚‰ãªã„ようにする.
374 * マルチコア(厳密にはマルチマスタ)での使用を想定した命令.
375 */
376Inline void
377data_memory_barrier(void)
378{
379#if __TARGET_ARCH_ARM <= 6
380 CP15_DATA_MEMORY_BARRIER();
381#else /* __TARGET_ARCH_ARM <= 6 */
382 Asm("dmb":::"memory");
383#endif /* __TARGET_ARCH_ARM <= 6 */
384}
385
386/*
387 * データ同期バリア
388 *
389 * å…
390ˆè¡Œã™ã‚‹ãƒ¡ãƒ¢ãƒªã‚¢ã‚¯ã‚»ã‚¹ãŒå®Œäº†ã™ã‚‹ã®ã‚’å¾…
391つ.メモリアクセスが副作用を
392 * 持つ時に,その副作用が起こるのを待
393つための使用を想定した命令.
394 */
395Inline void
396data_sync_barrier(void)
397{
398#if __TARGET_ARCH_ARM <= 6
399 CP15_DATA_SYNC_BARRIER();
400#else /* __TARGET_ARCH_ARM <= 6 */
401 Asm("dsb":::"memory");
402#endif /* __TARGET_ARCH_ARM <= 6 */
403}
404
405/*
406 * 命令同期バリア
407 *
408 * プログラムが書き換えられた(または,システム状æ…
409‹ã®å¤‰åŒ–により実行す
410 * べきプログラムが変わった)時に,パイプラインをフラッシュするなど,
411 * 新しいプログラムを読み込むようにする.ARMv6では,プリフェッチフラッ
412 * シュと呼ばれている.
413 */
414Inline void
415inst_sync_barrier(void)
416{
417#if __TARGET_ARCH_ARM <= 6
418 CP15_INST_SYNC_BARRIER();
419#else /* __TARGET_ARCH_ARM <= 6 */
420 Asm("isb":::"memory");
421#endif /* __TARGET_ARCH_ARM <= 6 */
422}
423
424#endif /* TOPPERS_ARM_INSN_H */
Note: See TracBrowser for help on using the repository browser.