source: ssp_aarch64/trunk/arm64_gcc/prc_config.h@ 356

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

set svn:mime-type to files

  • Property svn:mime-type set to text/plain; charset=utf-8
File size: 10.7 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 * Copyright (C) 2015,2018 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: prc_config.h 1304 2008-08-27 07:28:36Z ertl-honda $
40 */
41
42/*
43 * プロセッサ依存モジュール(ARM64用)
44 *
45 * このインクルードファイルは,target_config.h(または,そこからインク
46 * ルードされるファイル)のみからインクルードされる.他のファイルから
47 * 直接インクルードしてはならない.
48 */
49
50#ifndef TOPPERS_PRC_CONFIG_H
51#define TOPPERS_PRC_CONFIG_H
52
53#include "gic_config.h"
54
55#ifndef TOPPERS_MACRO_ONLY
56
57/*
58 * 非タスクコンテキスト用のスタック初期値
59 */
60#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char *)(istk) + (istksz)))
61
62/*
63 * 割込みネスト数
64 */
65extern uint8_t intnest;
66
67/*
68 * コンテキストの参照
69 *
70 */
71Inline bool_t
72sense_context(void)
73{
74 bool_t ctx;
75
76 if (intnest > 0u){
77 ctx = true;
78 }
79 else {
80 ctx = false;
81 }
82
83 return ctx;
84}
85
86#endif /* TOPPERS_MACRO_ONLY */
87
88/*
89 * TOPPERS標準割込み処理モデルの実現
90 *
91 * 全割込みロックフラグとして PSTATE.F および PSTATE.I を用いる
92 * CPUロックフラグとして PSTATE.I を用いる
93 * 割込み優先度マスクとして GICC_PMR レジスタを用いる.
94 */
95
96/*
97 * TIPM_ENAALL(割込み優先度マスク全解除)の内部表現
98 */
99#define IIPM_ENAALL (0)
100
101
102#ifndef TOPPERS_MACRO_ONLY
103
104/*
105 * CPUロック状態への移行
106 */
107Inline void
108x_lock_cpu(void)
109{
110 aarch64_set_daif_if();
111}
112
113#define t_lock_cpu() x_lock_cpu()
114#define i_lock_cpu() x_lock_cpu()
115
116/*
117 * CPUロック状態の解除
118 */
119Inline void
120x_unlock_cpu(void)
121{
122 aarch64_clear_daif_if();
123}
124
125#define t_unlock_cpu() x_unlock_cpu()
126#define i_unlock_cpu() x_unlock_cpu()
127
128/*
129 * CPUロック状態の参照
130 */
131Inline bool_t
132x_sense_lock(void)
133{
134 bool_t state;
135
136 if(aarch64_sense_daif_irq() && aarch64_sense_daif_fiq()) {
137 state = true;
138 }
139 else {
140 state = false;
141 }
142
143 return state;
144}
145
146#define t_sense_lock() x_sense_lock()
147#define i_sense_lock() x_sense_lock()
148
149
150/*
151 * (モデル上の)割込み優先度マスクの設定
152 *
153 * CPUロックフラグがクリアされている時は,ハードウェアの割込み優先度マ
154 * スクを設定する.CPUロックフラグがセットされている時は,saved_iipm
155 * を設定し,さらに,ハードウェアの割込み優先度マスクを,設定しようと
156 * した(モデル上の)割込み優先度マスクとTIPM_LOCKの高い方に設定する.
157 */
158Inline void
159x_set_ipm(PRI intpri)
160{
161 gicc_set_priority(INT_IPM(intpri));
162}
163
164#define t_set_ipm(intpri) x_set_ipm(intpri)
165#define i_set_ipm(intpri) x_set_ipm(intpri)
166
167/*
168 * (モデル上の)割込み優先度マスクの参照
169 *
170 * CPUロックフラグがクリアされている時はハードウェアの割込み優先度マ
171 * スクを,セットされている時はsaved_iipmを参照する.
172 */
173Inline PRI
174x_get_ipm(void)
175{
176 return(EXT_IPM(gicc_get_priority()));
177}
178
179#define t_get_ipm() x_get_ipm()
180#define i_get_ipm() x_get_ipm()
181
182/*
183 * ディスパッチャの動作開始(prc_support.S)
184 *
185 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
186 * みを禁止した状態(割込みロック状態と同等の状態)で呼び出さなければ
187 * ならない.
188 */
189extern void start_dispatch(void) NoReturn;
190
191
192/*
193 * カーネルの終了処理の呼出し(prc_support.S)
194 *
195 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
196 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
197 * す.
198 */
199extern void call_exit_kernel(void) NoReturn;
200
201/*
202 * アイドルループの実装
203 *
204 * 単にCPUロック状態とCPUロック解除状態を呼び出す実装とする.
205 * スリープモードに入れる場合は本処理をwfi命令を用いて書き換えれば良い.
206 */
207Inline void
208idle_loop(void)
209{
210 x_unlock_cpu();
211 /* CPUアンロック => CPUロック */
212 x_lock_cpu();
213}
214
215/*
216 * 割込み番号・割込みハンドラ番号
217 *
218 * 割込みハンドラ番号(inhno)と割込み番号(intno)は,
219 * 割り込み発生時にGICC_IAR に設定される例外番号とする.
220 */
221
222/*
223 * 割込み番号の範囲の判定
224 */
225#define VALID_INTNO(intno) ((TMIN_INTNO <= (intno)) && ((intno) <= TMAX_INTNO))
226#define VALID_INTNO_DISINT(intno) VALID_INTNO(intno)
227#define VALID_INTNO_CFGINT(intno) VALID_INTNO(intno)
228
229/*
230 * 割込みハンドラの設定
231 */
232Inline void
233x_define_inh(INHNO inhno, FP int_entry)
234{
235}
236
237/*
238 * 割込みハンドラの出入口処理の生成マクロ
239 *
240 */
241#define INT_ENTRY(inhno, inthdr) inthdr
242#define INTHDR_ENTRY(inhno, inhno_num, inthdr) extern void inthdr(void);
243
244/*
245 * 割込み要求禁止フラグ
246 */
247
248/*
249 * 割込み要求ライン設定テーブル(kernel_cfg.c)
250 *
251 * 割込み属性が設定されているかを判別するためのテーブル(kernel_cfg.c)
252 * 割込み要求ラインに対して割込み属性が設定されていれば1,設定されてい
253 * なければ0を保持するテーブル.
254 */
255extern const uint8_t intcfg_table[];
256
257
258/*
259 * 割込み要求禁止フラグのセット
260 *
261 * intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのセッ
262 * トし,割込みを禁止する.割込み属性が設定されていない割込み要求ライ
263 * ンが指定された場合には,falseを返す.
264 */
265Inline bool_t
266x_disable_int(INTNO intno)
267{
268 if (intcfg_table[intno] == 0U) {
269 return(false);
270 }
271 gicd_disable_int(intno);
272 return(true);
273}
274
275
276#define t_disable_int(intno) x_disable_int(intno)
277#define i_disable_int(intno) x_disable_int(intno)
278
279/*
280 * 割込み要求禁止フラグのクリア
281 *
282 * intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのクリ
283 * アし,割込みを許可する.割込み属性が設定されていない割込み要求ライ
284 * ンが指定された場合には,falseを返す.
285 */
286Inline bool_t
287x_enable_int(INTNO intno)
288{
289 if (intcfg_table[intno] == 0U) {
290 return(false);
291 }
292 gicd_enable_int(intno);
293 return(true);
294}
295
296
297#define t_enable_int(intno) x_enable_int(intno)
298#define i_enable_int(intno) x_enable_int(intno)
299
300/*
301 * 割込み要求のクリア
302 */
303Inline void
304x_clear_int(INTNO intno)
305{
306 gicd_clear_pending(intno);
307}
308
309/*
310 * 割込み要求のチェック
311 */
312Inline bool_t
313probe_int(INTNO intno)
314{
315 return(gicd_probe_pending(intno));
316}
317
318
319/*
320 * 割込み要求ラインの属性の設定
321 */
322extern void x_config_int(INTNO intno, ATR intatr, PRI intpri);
323
324/*
325 * 割込みハンドラ入口で必要なIRC操作
326 */
327Inline void
328i_begin_int(INTNO intno)
329{
330}
331
332/*
333 * 割込みハンドラの出口で必要なIRC操作
334 */
335Inline void
336i_end_int(INTNO intno)
337{
338}
339
340/*
341 * CPU例外ハンドラ関連
342 */
343
344/*
345 * CPU例外ハンドラ番号
346 */
347#define VALID_EXCNO_DEFEXC(excno) (TMIN_EXCNO <= (excno) && (excno) <= TMAX_EXCNO)
348
349/*
350 * CPU例外ハンドラの設定
351 */
352Inline void
353x_define_exc(EXCNO excno, FP exc_entry)
354{
355}
356
357/*
358 * CPU例外ハンドラの入口処理の生成マクロ
359 */
360#define EXC_ENTRY(excno, exchdr) exchdr
361#define EXCHDR_ENTRY(excno, excno_num, exchdr) extern void exchdr(void *p_excinf);
362
363/*
364 * プロセッサ依存の初期化
365 */
366extern void prc_initialize(void);
367
368/*
369 * プロセッサ依存の終了時処理
370 */
371extern void prc_terminate(void) NoReturn;
372
373/*
374 * 登録されていない例外が発生すると呼び出される
375 */
376extern void default_exc_handler(void *p_excinf);
377
378/*
379 * 未登録の割込みが発生した場合に呼び出される
380 */
381extern void default_int_handler(void);
382
383/*
384 * 割込み/例外ハンドラテーブル(kernel_cfg.c)
385 */
386extern const INTHDR inh_table[];
387extern const EXCHDR exc_table[];
388
389/*
390 * 割込みハンドラの呼び出し
391 */
392extern void call_int_handler(uint32_t intno);
393
394/*
395 * CPU例外ハンドラの呼び出し
396 */
397extern void call_exc_handler(void *p_excinf, uint32_t excno);
398
399#endif /* TOPPERS_MACRO_ONLY */
400#endif /* TOPPERS_PRC_CONFIG_H */
Note: See TracBrowser for help on using the repository browser.