source: ssp_rpi3/trunk/arch/arm64_gcc/common/arm64.h@ 386

Last change on this file since 386 was 386, checked in by nmir-saito, 5 years ago

modify svn:mimetype of files

  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/plain; charset=utf-8
File size: 5.4 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 * Copyright (C) 2018,2019 by Naoki Saito
8 * Nagoya Municipal Industrial Research Institute, 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: arm64.h 386 2019-04-17 03:13:00Z nmir-saito $
40 */
41#ifndef TOPPERS_ARM64_H
42#define TOPPERS_ARM64_H
43
44/*
45 * PSTATE
46 */
47#define AARCH64_PSTATE_N (1 << 31)
48#define AARCH64_PSTATE_Z (1 << 30)
49#define AARCH64_PSTATE_C (1 << 29)
50#define AARCH64_PSTATE_V (1 << 28)
51#define AARCH64_PSTATE_SS (1 << 21)
52#define AARCH64_PSTATE_IL (1 << 20)
53#define AARCH64_PSTATE_D (1 << 9)
54#define AARCH64_PSTATE_A (1 << 8)
55#define AARCH64_PSTATE_I (1 << 7)
56#define AARCH64_PSTATE_F (1 << 6)
57#define AARCH64_PSTATE_MODE4 (1 << 4)
58#define AARCH64_PSTATE_MODE_MASK (AARCH64_PSTATE_MODE4 - 1)
59
60/*
61 * DAIF
62 */
63#define AARCH64_DAIF_FIQ UINT64_C(1)
64#define AARCH64_DAIF_IRQ UINT64_C(2)
65#define AARCH64_DAIF_SERR UINT64_C(4)
66#define AARCH64_DAIF_DBG UINT64_C(8)
67#define AARCH64_DAIF_ALL (AARCH64_DAIF_DBG|AARCH64_DAIF_SERR|AARCH64_DAIF_IRQ|AARCH64_DAIF_FIQ)
68
69#ifndef TOPPERS_MACRO_ONLY
70
71/*
72 * DAIFの設定および状態参照
73 */
74Inline uint32_t
75aarch64_get_daif(void){
76 uint32_t daif;
77 Asm ("mrs %0, daif\n\t":"=r"(daif): : "memory");
78 return daif;
79}
80
81Inline void
82aarch64_set_daif(uint32_t daif) {
83
84 Asm ("msr daif, %0\n\t" : : "r"(daif): "cc", "memory");
85}
86
87/*
88 * DAIF.I のセット/クリア
89 */
90Inline void
91aarch64_set_daif_i(void) {
92 Asm ("msr daifset, %0\n\t"::"i"(AARCH64_DAIF_IRQ): "cc", "memory");
93}
94
95Inline void
96aarch64_clear_daif_i(void) {
97 Asm ("msr daifclr, %0\n\t"::"i"(AARCH64_DAIF_IRQ): "cc", "memory");
98}
99
100/*
101 * DAIF.F のセット/クリア
102 */
103Inline void
104aarch64_set_daif_f(void) {
105 Asm ("msr daifset, %0\n\t"::"i"(AARCH64_DAIF_FIQ): "cc", "memory");
106}
107
108Inline void
109aarch64_clear_daif_f(void) {
110 Asm ("msr daifclr, %0\n\t"::"i"(AARCH64_DAIF_FIQ): "cc", "memory");
111}
112
113/*
114 * DAIF.F および DAIF.I の同時セット/クリア
115 */
116Inline void
117aarch64_set_daif_if(void) {
118 Asm ("msr daifset, %0\n\t"::"i"(AARCH64_DAIF_IRQ | AARCH64_DAIF_FIQ): "cc", "memory");
119}
120
121Inline void
122aarch64_clear_daif_if(void) {
123 Asm ("msr daifclr, %0\n\t"::"i"(AARCH64_DAIF_IRQ | AARCH64_DAIF_FIQ): "cc", "memory");
124}
125
126/*
127 * DAIF.I の状態参照
128 */
129Inline bool_t
130aarch64_sense_daif_irq(void) {
131 uint32_t daif;
132 bool_t state;
133
134 daif = aarch64_get_daif();
135
136 if(daif & AARCH64_PSTATE_I) {
137 state = true;
138 }
139 else {
140 state = false;
141 }
142
143 return state;
144}
145
146/*
147 * DAIF.F の状態参照
148 */
149Inline bool_t
150aarch64_sense_daif_fiq(void) {
151 uint32_t daif;
152 bool_t state;
153
154 daif = aarch64_get_daif();
155
156 if(daif & AARCH64_PSTATE_F) {
157 state = true;
158 }
159 else {
160 state = false;
161 }
162
163 return state;
164}
165
166/*
167 * クリティカル処理の出口(最適化防止)
168 */
169Inline void
170aarch64_exit_critical(void)
171{
172 Asm("":::"memory");
173}
174
175#endif /* TOPPERS_MACRO_ONLY */
176#endif /* TOPPERS_ARM64_H */
Note: See TracBrowser for help on using the repository browser.