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

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

initial import

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 * 上記著作権者
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: prc_config.h 1304 2008-08-27 07:28:36Z ertl-honda $
55 */
56
57/*
58 * プロセッサ依存モジュール(ARM64用)
59 *
60 * このインクルードファイルは,target_config.h(または,そこからインク
61 * ルードされるファイル)のみからインクルードされる.他のファイルから
62 * 直接インクルードしてはならない.
63 */
64
65#ifndef TOPPERS_PRC_CONFIG_H
66#define TOPPERS_PRC_CONFIG_H
67
68#include "gic_config.h"
69
70#ifndef TOPPERS_MACRO_ONLY
71
72/*
73 * 非タスクコンテキスト用のスタック初期値
74 */
75#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char *)(istk) + (istksz)))
76
77/*
78 * 割込みネスト数
79 */
80extern uint8_t intnest;
81
82/*
83 * コンテキストの参ç…
84§
85 *
86 */
87Inline bool_t
88sense_context(void)
89{
90 bool_t ctx;
91
92 if (intnest > 0u){
93 ctx = true;
94 }
95 else {
96 ctx = false;
97 }
98
99 return ctx;
100}
101
102#endif /* TOPPERS_MACRO_ONLY */
103
104/*
105 * TOPPERS標準割込み処理モデルの実現
106 *
107 * å…
108¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ãƒ•ãƒ©ã‚°ã¨ã—て PSTATE.F および PSTATE.I を用いる
109 * CPUロックフラグとして PSTATE.I を用いる
110 * 割込み優å…
111ˆåº¦ãƒžã‚¹ã‚¯ã¨ã—て GICC_PMR レジスタを用いる.
112 */
113
114/*
115 * TIPM_ENAALL(割込み優å…
116ˆåº¦ãƒžã‚¹ã‚¯å…
117¨è§£é™¤ï¼‰ã®å†…
118部表現
119 */
120#define IIPM_ENAALL (0)
121
122
123#ifndef TOPPERS_MACRO_ONLY
124
125/*
126 * CPUロック状æ…
127‹ã¸ã®ç§»è¡Œ
128 */
129Inline void
130x_lock_cpu(void)
131{
132 aarch64_set_daif_if();
133}
134
135#define t_lock_cpu() x_lock_cpu()
136#define i_lock_cpu() x_lock_cpu()
137
138/*
139 * CPUロック状æ…
140‹ã®è§£é™¤
141 */
142Inline void
143x_unlock_cpu(void)
144{
145 aarch64_clear_daif_if();
146}
147
148#define t_unlock_cpu() x_unlock_cpu()
149#define i_unlock_cpu() x_unlock_cpu()
150
151/*
152 * CPUロック状æ…
153‹ã®å‚ç…
154§
155 */
156Inline bool_t
157x_sense_lock(void)
158{
159 bool_t state;
160
161 if(aarch64_sense_daif_irq() && aarch64_sense_daif_fiq()) {
162 state = true;
163 }
164 else {
165 state = false;
166 }
167
168 return state;
169}
170
171#define t_sense_lock() x_sense_lock()
172#define i_sense_lock() x_sense_lock()
173
174
175/*
176 * (モデル上の)割込み優å…
177ˆåº¦ãƒžã‚¹ã‚¯ã®è¨­å®š
178 *
179 * CPUロックフラグがクリアされている時は,ハードウェアの割込み優å…
180ˆåº¦ãƒž
181 * スクを設定する.CPUロックフラグがセットされている時は,saved_iipm
182 * を設定し,さらに,ハードウェアの割込み優å…
183ˆåº¦ãƒžã‚¹ã‚¯ã‚’,設定しようと
184 * した(モデル上の)割込み優å…
185ˆåº¦ãƒžã‚¹ã‚¯ã¨TIPM_LOCKの高い方に設定する.
186 */
187Inline void
188x_set_ipm(PRI intpri)
189{
190 gicc_set_priority(INT_IPM(intpri));
191}
192
193#define t_set_ipm(intpri) x_set_ipm(intpri)
194#define i_set_ipm(intpri) x_set_ipm(intpri)
195
196/*
197 * (モデル上の)割込み優å…
198ˆåº¦ãƒžã‚¹ã‚¯ã®å‚ç…
199§
200 *
201 * CPUロックフラグがクリアされている時はハードウェアの割込み優å…
202ˆåº¦ãƒž
203 * スクを,セットされている時はsaved_iipmを参ç…
204§ã™ã‚‹ï¼Ž
205 */
206Inline PRI
207x_get_ipm(void)
208{
209 return(EXT_IPM(gicc_get_priority()));
210}
211
212#define t_get_ipm() x_get_ipm()
213#define i_get_ipm() x_get_ipm()
214
215/*
216 * ディスパッチャの動作開始(prc_support.S)
217 *
218 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
219 * みを禁止した状æ…
220‹ï¼ˆå‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
221‹ã¨åŒç­‰ã®çŠ¶æ…
222‹ï¼‰ã§å‘¼ã³å‡ºã•ãªã‘れば
223 * ならない.
224 */
225extern void start_dispatch(void) NoReturn;
226
227
228/*
229 * カーネルの終了処理の呼出し(prc_support.S)
230 *
231 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
232 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
233 * す.
234 */
235extern void call_exit_kernel(void) NoReturn;
236
237/*
238 * アイドルループの実装
239
240 *
241 * 単にCPUロック状æ…
242‹ã¨CPUロック解除状æ…
243‹ã‚’呼び出す実装
244とする.
245 * スリープモードにå…
246¥ã‚Œã‚‹å ´åˆã¯æœ¬å‡¦ç†ã‚’wfi命令を用いて書き換えれば良い.
247 */
248Inline void
249idle_loop(void)
250{
251 x_unlock_cpu();
252 /* CPUアンロック => CPUロック */
253 x_lock_cpu();
254}
255
256/*
257 * 割込み番号・割込みハンドラ番号
258 *
259 * 割込みハンドラ番号(inhno)と割込み番号(intno)は,
260 * 割り込み発生時にGICC_IAR に設定される例外番号とする.
261 */
262
263/*
264 * 割込み番号の範囲の判定
265 */
266#define VALID_INTNO(intno) ((TMIN_INTNO <= (intno)) && ((intno) <= TMAX_INTNO))
267#define VALID_INTNO_DISINT(intno) VALID_INTNO(intno)
268#define VALID_INTNO_CFGINT(intno) VALID_INTNO(intno)
269
270/*
271 * 割込みハンドラの設定
272 */
273Inline void
274x_define_inh(INHNO inhno, FP int_entry)
275{
276}
277
278/*
279 * 割込みハンドラの出å…
280¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
281 *
282 */
283#define INT_ENTRY(inhno, inthdr) inthdr
284#define INTHDR_ENTRY(inhno, inhno_num, inthdr) extern void inthdr(void);
285
286/*
287 * 割込み要求禁止フラグ
288 */
289
290/*
291 * 割込み要求ライン設定テーブル(kernel_cfg.c)
292 *
293 * 割込み属性が設定されているかを判別するためのテーブル(kernel_cfg.c)
294 * 割込み要求ラインに対して割込み属性が設定されていれば1,設定されてい
295 * なければ0を保持するテーブル.
296 */
297extern const uint8_t intcfg_table[];
298
299
300/*
301 * 割込み要求禁止フラグのセット
302 *
303 * intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのセッ
304 * トし,割込みを禁止する.割込み属性が設定されていない割込み要求ライ
305 * ンが指定された場合には,falseを返す.
306 */
307Inline bool_t
308x_disable_int(INTNO intno)
309{
310 if (intcfg_table[intno] == 0U) {
311 return(false);
312 }
313 gicd_disable_int(intno);
314 return(true);
315}
316
317
318#define t_disable_int(intno) x_disable_int(intno)
319#define i_disable_int(intno) x_disable_int(intno)
320
321/*
322 * 割込み要求禁止フラグのクリア
323 *
324 * intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのクリ
325 * アし,割込みを許可する.割込み属性が設定されていない割込み要求ライ
326 * ンが指定された場合には,falseを返す.
327 */
328Inline bool_t
329x_enable_int(INTNO intno)
330{
331 if (intcfg_table[intno] == 0U) {
332 return(false);
333 }
334 gicd_enable_int(intno);
335 return(true);
336}
337
338
339#define t_enable_int(intno) x_enable_int(intno)
340#define i_enable_int(intno) x_enable_int(intno)
341
342/*
343 * 割込み要求のクリア
344 */
345Inline void
346x_clear_int(INTNO intno)
347{
348 gicd_clear_pending(intno);
349}
350
351/*
352 * 割込み要求のチェック
353 */
354Inline bool_t
355probe_int(INTNO intno)
356{
357 return(gicd_probe_pending(intno));
358}
359
360
361/*
362 * 割込み要求ラインの属性の設定
363 */
364extern void x_config_int(INTNO intno, ATR intatr, PRI intpri);
365
366/*
367 * 割込みハンドラå…
368¥å£ã§å¿…
369要なIRC操作
370 */
371Inline void
372i_begin_int(INTNO intno)
373{
374}
375
376/*
377 * 割込みハンドラの出口で必
378要なIRC操作
379 */
380Inline void
381i_end_int(INTNO intno)
382{
383}
384
385/*
386 * CPU例外ハンドラ関連
387 */
388
389/*
390 * CPU例外ハンドラ番号
391 */
392#define VALID_EXCNO_DEFEXC(excno) (TMIN_EXCNO <= (excno) && (excno) <= TMAX_EXCNO)
393
394/*
395 * CPU例外ハンドラの設定
396 */
397Inline void
398x_define_exc(EXCNO excno, FP exc_entry)
399{
400}
401
402/*
403 * CPU例外ハンドラのå…
404¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
405 */
406#define EXC_ENTRY(excno, exchdr) exchdr
407#define EXCHDR_ENTRY(excno, excno_num, exchdr) extern void exchdr(void *p_excinf);
408
409/*
410 * プロセッサ依存の初期化
411 */
412extern void prc_initialize(void);
413
414/*
415 * プロセッサ依存の終了時処理
416 */
417extern void prc_terminate(void) NoReturn;
418
419/*
420 * 登録されていない例外が発生すると呼び出される
421 */
422extern void default_exc_handler(void *p_excinf);
423
424/*
425 * 未登録の割込みが発生した場合に呼び出される
426 */
427extern void default_int_handler(void);
428
429/*
430 * 割込み/例外ハンドラテーブル(kernel_cfg.c)
431 */
432extern const INTHDR inh_table[];
433extern const EXCHDR exc_table[];
434
435/*
436 * 割込みハンドラの呼び出し
437 */
438extern void call_int_handler(uint32_t intno);
439
440/*
441 * CPU例外ハンドラの呼び出し
442 */
443extern void call_exc_handler(void *p_excinf, uint32_t excno);
444
445#endif /* TOPPERS_MACRO_ONLY */
446#endif /* TOPPERS_PRC_CONFIG_H */
Note: See TracBrowser for help on using the repository browser.