source: rubycfg_asp/trunk/asp_dcre/arch/rx630_gcc/prc_config.h@ 313

Last change on this file since 313 was 313, checked in by coas-nagasima, 7 years ago

ソースを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr
File size: 21.0 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005,2006 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2008-2010 by Witz Corporation, JAPAN
11 * Copyright (C) 2013 by Mitsuhiro Matsuura
12 *
13 * 上記著作権者
14は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
15 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
16 * 変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
18 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
19 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
20 * スコード中に含まれていること.
21 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
22 * 用できる形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
24å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
25 * 者
26マニュアルなど)に,上記の著作権表示,この利用条件および下記
27 * の無保証規定を掲載すること.
28 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
29 * 用できない形で再é…
30å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
31 * と.
32 * (a) 再é…
33å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
34マニュアルなど)に,上記の著
35 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
36 * (b) 再é…
37å¸ƒã®å½¢æ…
38‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
39 * 報告すること.
40 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
41 * 害からも,上記著作権者
42およびTOPPERSプロジェクトをå…
43è²¬ã™ã‚‹ã“と.
44 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
45 * 由に基づく請求からも,上記著作権者
46およびTOPPERSプロジェクトを
47 * å…
48è²¬ã™ã‚‹ã“と.
49 *
50 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
51お
52 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
53 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
54 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
55 * の責任を負わない.
56 *
57 * @(#) $Id: prc_config.h 313 2017-07-23 04:50:32Z coas-nagasima $
58 */
59
60/*
61 * プロセッサ依存モジュール(RX630用)
62 *
63 * このインクルードファイルは,target_config.h(または,そこからインク
64 * ルードされるファイル)のみからインクルードされる.他のファイルから
65 * 直接インクルードしてはならない.
66 */
67
68#ifndef TOPPERS_PRC_CONFIG_H
69#define TOPPERS_PRC_CONFIG_H
70
71/*
72 * プロセッサの特殊命令のインライン関数定義
73 */
74#include "prc_insn.h"
75#include "sil.h"
76
77#ifndef TOPPERS_MACRO_ONLY
78
79/*
80 * 非タスクコンテキスト用のスタック初期値
81 */
82
83#define TOPPERS_ISTKPT( istk, istksz ) (( STK_T * )(( char * )( istk ) + ( istksz )))
84
85/*
86 * タスクコンテキストブロックの定義
87 */
88typedef struct task_context_block {
89 void *sp; /* スタックポインタ */
90 FP pc; /* プログラムカウンタ */
91} TSKCTXB;
92
93
94/*
95 * 割込み発生回数を保存する変数
96 */
97extern uint16_t intnest;
98
99#endif /* TOPPERS_MACRO_ONLY */
100
101/*
102 * CPUロック状æ…
103‹ã§ã®å‰²è¾¼ã¿å„ªå…
104ˆåº¦ãƒžã‚¹ã‚¯
105 *
106 * TIPM_LOCKは,CPUロック状æ…
107‹ã§ã®å‰²è¾¼ã¿å„ªå…
108ˆåº¦ãƒžã‚¹ã‚¯ï¼Œã™ãªã‚ã¡ï¼Œã‚«ãƒ¼ãƒ
109 * ル管理外のものを除くすべての割込み要求をマスクする値に定義する.
110 *
111 * TMIN_INTPRI変更することで管理外割込みの有無を決定する.
112 * 例えばTMIN_INTPRIを-14に設定すると,レベル15の割込みがカーネル管理外と
113 * なる.TMIN_INTPRIを-15に設定すると,NMI以外にカーネル管理外の割込みを
114 * 設けないことになる(この場合には-15に設定することを推奨する).
115 */
116#ifndef TIPM_LOCK
117#define TIPM_LOCK TMIN_INTPRI
118#endif /* TIPM_LOCK */
119
120#ifndef TOPPERS_MACRO_ONLY
121
122/*
123 * TOPPERS標準割込み処理モデルの実現
124 */
125/*
126 * コンテキストの参ç…
127§
128 *
129 * RXでは,割込みの戻りå…
130ˆãŒã‚¿ã‚¹ã‚¯ã‹ã©ã†ã‹ã‚’判断するために intnest
131 * を使用している.これを用いてコンテキストを判断する.
132 */
133Inline bool_t
134sense_context( void )
135{
136 /* ネストカウンタ0より大なら非タスクコンテキスト */
137 return ( intnest > 0U );
138}
139
140
141/*
142 * CPUロックフラグ実現のための変数
143 *
144 * これらの変数は,CPUロック状æ…
145‹ã®æ™‚のみ書き換えてよいものとする.
146 */
147#if TIPM_LOCK != -15
148extern bool_t lock_flag; /* CPUロックフラグの値を保持する変数 */
149extern uint32_t saved_ipl; /* 割込み優å…
150ˆåº¦ãƒ¬ãƒ™ãƒ«ã‚’保存する変数 */
151#endif /* TIPM_LOCK != -15 */
152
153#endif /* TOPPERS_MACRO_ONLY */
154
155
156/*
157 * 割込み優å…
158ˆåº¦ãƒžã‚¹ã‚¯ã®å¤–部表現と内
159部表現の変換
160 *
161 * RX630では,プロセッサステータスワードレジスタ(PSW)の下から
162 * 24~27ビット目の4ビットに割込み優å…
163ˆåº¦ãƒ¬ãƒ™ãƒ«ï¼ˆIPL)が置かれている.
164 * カーネル管理外割込みを実装
165する場合にIPLを使用した制御を行う.
166 * カーネルは割込み優å…
167ˆåº¦ãƒžã‚¹ã‚¯ï¼ˆ-1から連続した負の値)で管理されて
168 * いるためIPLとの変換が必
169要となる.
170 */
171#define IPL_TO_IPM( ipl ) (-(( PRI )(( ipl ) >> 24U ))) /* IPLをIPMに */
172#define IPM_TO_IPL( ipm ) ((( uint32_t )(-( ipm ))) << 24U ) /* IPMをIPLに */
173
174
175/*
176 * CPUロック状æ…
177‹ã§ã®å‰²è¾¼ã¿å„ªå…
178ˆåº¦ãƒžã‚¹ã‚¯ã®IPL
179 */
180#define IPL_LOCK ( IPM_TO_IPL( TIPM_LOCK ) )
181
182/*
183 * TIPM_ENAALL(割込み優å…
184ˆåº¦ãƒžã‚¹ã‚¯å…
185¨è§£é™¤ï¼‰ã®IPL
186 */
187#define IPL_ENAALL ( IPM_TO_IPL( TIPM_ENAALL ) )
188
189
190#ifndef TOPPERS_MACRO_ONLY
191
192/*
193 * 割込み要因毎のレベル & 属性定義テーブル
194 * (テンプレートファイルによる出力)
195 */
196typedef struct cfg_int_info {
197 PRI intpri;
198 ATR intatr;
199} CFG_INT_INFO;
200
201extern const CFG_INT_INFO cfg_int_table[];
202
203
204/*
205 * 割込み番号の範囲の判定
206 *
207 * 割込み番号が有効な値か厳密にチェックするため,
208 * コンフィギュレータ出力テーブルを参ç…
209§ã™ã‚‹.
210 */
211#define VALID_INTNO( intno ) \
212 ( cfg_int_table[( intno )].intpri > 0 )
213#define VALID_INTNO_DISINT( intno ) VALID_INTNO( intno )
214#define VALID_INTNO_CFGINT( intno ) VALID_INTNO( intno )
215
216/* cre_intで有効な割込み番号の指定 */
217#define VALID_INTNO_CREINT VALID_INTNO_CFGINT((intno))
218
219/* cre_isrで有効な割込み番号の指定 */
220#define VALID_INTNO_CREISR(intno) VALID_INTNO_CFGINT((intno))
221
222
223/*
224 * 割込み制御レジスタ関連の定義
225 */
226#define IRQ_POSEDGE ( 0x08U )
227#define IRQ_NEGEDGE ( 0x04U )
228#define IRQ_BOTHEDGE ( 0x0CU )
229#define IRQ_LOWLEVEL ( 0x00U )
230
231
232/*
233 * CPUロック状æ…
234‹ã¸ã®ç§»è¡Œ
235 *
236 * IPM(ハードウェアの割込み優å…
237ˆåº¦ãƒžã‚¹ã‚¯ï¼‰ã‚’,saved_iipmに保存し,カー
238 * ネル管理外のものを除くすべての割込み要求をマスクする値(TIPM_LOCK)
239 * に設定する.また,lock_flagをTRUEにする.
240 *
241 * IPMが,最初からTIPM_LOCKと同じかそれより高い場合には,それを
242 * saved_iipmに保存するのみで,TIPM_LOCKには設定しない.これは,モデル
243 * 上の割込み優å…
244ˆåº¦ãƒžã‚¹ã‚¯ãŒï¼ŒTIPM_LOCKと同じかそれより高いレベルに設定
245 * されている状æ…
246‹ã«ã‚たる.
247 *
248 * この関数は,CPUロック状æ…
249‹ï¼ˆlock_flagがTRUEの状æ…
250‹ï¼‰ã§å‘¼ã°ã‚Œã‚‹ã“とは
251 * ないものと想定している.
252 */
253Inline void
254x_lock_cpu( void )
255{
256#if TIPM_LOCK == -15
257 disint();
258#else /* TIPM_LOCK == -15 */
259 uint32_t ipl;
260
261 /*
262 * current_ipl()の返り値を直接saved_iplに保存せず,一時変数ipl
263 * を用いているのは,current_ipl()を呼んだ直後に割込みが発生し,
264 * 起動された割込み処理でsaved_iplが変更される可能性があるためで
265 * ある.
266 */
267 ipl = current_ipl();
268 if( IPL_LOCK > ipl ){
269 set_ipl( IPL_LOCK );
270 }
271
272 saved_ipl = ipl;
273 lock_flag = true;
274#endif /* TIPM_LOCK == -15 */
275}
276
277#define t_lock_cpu() x_lock_cpu()
278#define i_lock_cpu() x_lock_cpu()
279
280
281/*
282 * CPUロック状æ…
283‹ã®è§£é™¤
284 *
285 * lock_flagをFALSEにし,IPM(ハードウェアの割込み優å…
286ˆåº¦ãƒžã‚¹ã‚¯ï¼‰ã‚’,
287 * saved_iipmに保存した値に戻す.
288 *
289 * この関数は,CPUロック状æ…
290‹ï¼ˆlock_flagがtrueの状æ…
291‹ï¼‰ã§ã®ã¿å‘¼ã°ã‚Œã‚‹ã‚‚
292 * のと想定している.
293 */
294Inline void
295x_unlock_cpu( void )
296{
297#if TIPM_LOCK == -15
298 enaint();
299#else /* TIPM_LOCK == -15 */
300 lock_flag = false;
301 set_ipl( saved_ipl );
302#endif /* TIPM_LOCK == -15 */
303}
304
305#define t_unlock_cpu() x_unlock_cpu()
306#define i_unlock_cpu() x_unlock_cpu()
307
308
309/*
310 * CPUロック状æ…
311‹ã®å‚ç…
312§
313 */
314Inline bool_t
315x_sense_lock( void )
316{
317#if TIPM_LOCK == -15
318 return (( bool_t )(( current_psw() & PSW_I_MASK) == 0 ));
319#else /* TIPM_LOCK == -15 */
320 return lock_flag;
321#endif /* TIPM_LOCK == -15 */
322}
323
324#define t_sense_lock() x_sense_lock()
325#define i_sense_lock() x_sense_lock()
326
327
328/*
329 * (モデル上の)割込み優å…
330ˆåº¦ãƒžã‚¹ã‚¯ã®è¨­å®š
331 *
332 * CPUロックフラグがクリアされている時は,ハードウェアの割込み優å…
333ˆåº¦ãƒž
334 * スクを設定する.CPUロックフラグがセットされている時は,saved_iipm
335 * を設定し,さらに,ハードウェアの割込み優å…
336ˆåº¦ãƒžã‚¹ã‚¯ã‚’,設定しようと
337 * した(モデル上の)割込み優å…
338ˆåº¦ãƒžã‚¹ã‚¯ã¨TIPM_LOCKの高い方に設定する.
339 */
340Inline void
341x_set_ipm( PRI intpri )
342{
343 uint32_t ipl = IPM_TO_IPL( intpri );
344#if TIPM_LOCK == -15
345 set_ipl(ipl);
346#else /* TIPM_LOCK == -15 */
347 if( !lock_flag ){
348 set_ipl(ipl);
349 }
350 else {
351 saved_ipl = ipl;
352 set_ipl(ipl > IPL_LOCK ? ipl : IPL_LOCK);
353 }
354#endif /* TIPM_LOCK == -15 */
355}
356
357#define t_set_ipm( intpri ) x_set_ipm( intpri )
358#define i_set_ipm( intpri ) x_set_ipm( intpri )
359
360
361/*
362 * (モデル上の)割込み優å…
363ˆåº¦ãƒžã‚¹ã‚¯ã®å‚ç…
364§
365 *
366 * CPUロックフラグがクリアされている時はハードウェアの割込み優å…
367ˆåº¦ãƒž
368 * スクを,セットされている時はsaved_iipmを参ç…
369§ã™ã‚‹ï¼Ž
370 */
371Inline PRI
372x_get_ipm( void )
373{
374 uint32_t ipl;
375#if TIPM_LOCK == -15
376 ipl = current_ipl();
377#else /* TIPM_LOCK == -15 */
378 if (!lock_flag) {
379 ipl = current_ipl();
380 }
381 else {
382 ipl = saved_ipl;
383 }
384#endif /* TIPM_LOCK == -15 */
385 return IPL_TO_IPM( ipl );
386}
387
388#define t_get_ipm() x_get_ipm()
389#define i_get_ipm() x_get_ipm()
390
391
392/*
393 * 割込み要求禁止フラグのセット
394 *
395 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
396 * フラグをセットしようとした場合には,FALSEを返す.
397 */
398Inline bool_t
399x_disable_int( INTNO intno )
400{
401 /*
402 * レベル定義が0である場合はCFG_INTされていない
403 */
404 if( cfg_int_table[intno].intpri == 0 ){
405 return ( false );
406 }
407
408 *ier_reg_addr[intno].addr &= ( ~ier_reg_addr[intno].offset );
409
410 return ( true );
411}
412
413#define t_disable_int( intno ) x_disable_int( intno )
414#define i_disable_int( intno ) x_disable_int( intno )
415
416
417/*
418 * 割込み要求禁止フラグのクリア
419 *
420 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
421 * フラグをクリアしようとした場合には,FALSEを返す.
422 */
423Inline bool_t
424x_enable_int( INTNO intno )
425{
426 /*
427 * レベル定義が0である場合はCFG_INTされていない
428 */
429 if( cfg_int_table[intno].intpri == 0 ){
430 return ( false );
431 }
432
433 *ier_reg_addr[intno].addr |= ier_reg_addr[intno].offset;
434
435 return ( true );
436}
437
438#define t_enable_int( intno ) x_enable_int( intno )
439#define i_enable_int( intno ) x_enable_int( intno )
440
441
442/*
443 * 割込み要求のクリア
444 */
445Inline void
446x_clear_int( INTNO intno )
447{
448 *IR_REG(intno) = 0U;
449}
450
451#define t_clear_int( intno ) x_clear_int( intno )
452#define i_clear_int( intno ) x_clear_int( intno )
453
454
455/*
456 * 割込み要求のチェック
457 */
458Inline bool_t
459x_probe_int( INTNO intno )
460{
461 /*
462 * 割込み要求レジスタは0 or 1でしかないため,
463 * そのままの値を返す.
464 */
465 return ( *IR_REG(intno) );
466}
467
468#define t_probe_int( intno ) x_probe_int( intno )
469#define i_probe_int( intno ) x_probe_int( intno )
470
471
472/*
473 * 割込み要求ラインの属性の設定
474 */
475extern void x_config_int( INTNO intno, ATR intatr, PRI intpri );
476
477
478/*
479 * 割込みハンドラのå…
480¥å£ã§å¿…
481要なIRC操作
482 *
483 */
484Inline void
485i_begin_int( INTNO intno )
486{
487 //volatile uint8_t reg;
488
489 /*
490 * レベル検出の割込みに対しては割込みステータス
491 * フラグをクリアする.
492 */
493 if( ( cfg_int_table[intno].intatr & TA_LOWLEVEL ) > 0 ){
494 if( *IR_REG(intno) > 0U ){
495 /*
496 * 外部割込みの場合, IRQ端子がHighに戻っている
497 * ことを確認する旨が記載されているが, 省略する.
498 */
499 // *ir_reg_addr[intno] = 0U;
500
501 /*
502 * ハードウェアマニュアルに0になったことを
503 * 確認する旨が記載あるため, レジスタ値を読み出す.
504 */
505 // reg = *ir_reg_addr[intno];
506 }
507 }
508}
509
510
511/*
512 * 割込みハンドラの出口で必
513要なIRC操作
514 *
515 */
516Inline void
517i_end_int( INTNO intno )
518{
519 /* 特に行うべき処理はない */
520}
521
522
523/*
524 * 最高優å…
525ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(prc_support.a30)
526 *
527 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
528 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状æ…
529‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッ
530 * チ許可状æ…
531‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
532ˆåº¦ãƒžã‚¹ã‚¯å…
533¨è§£é™¤çŠ¶æ…
534‹ã§å‘¼ã³å‡ºã•ãª
535 * ければならない.
536 */
537extern void dispatch( void );
538
539/*
540 * ディスパッチャの動作開始(prc_support.a30)
541 *
542 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
543 * みを禁止した状æ…
544‹ï¼ˆå…
545¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
546‹ã¨åŒç­‰ã®çŠ¶æ…
547‹ï¼‰ã§å‘¼ã³å‡ºã•ãªã‘れば
548 * ならない.
549 */
550extern void start_dispatch( void ) NoReturn;
551
552/*
553 * 現在のコンテキストを捨ててディスパッチ(prc_support.a30)
554 *
555 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
556 * スト・CPUロック状æ…
557‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
558‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
559ˆ
560 * 度マスクå…
561¨è§£é™¤çŠ¶æ…
562‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
563 */
564#define _kernel_exit_and_dispatch(); \
565 _exit_and_dispatch(); \
566 ercd = E_SYS;
567
568extern void _exit_and_dispatch( void ) NoReturn;
569
570/*
571 * カーネルの終了処理の呼出し(prc_support.a30)
572 *
573 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
574 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
575 * す.
576 */
577extern void call_exit_kernel( void ) NoReturn;
578
579/*
580 * タスクコンテキストの初期化
581 *
582 * タスクが休止状æ…
583‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹çŠ¶æ…
584‹ã«ç§»è¡Œã™ã‚‹æ™‚に呼ばれる.この時点
585 * でスタック領域を使ってはならない.
586 *
587 * activate_contextを,インライン関数ではなくマクロ定義としているのは,
588 * この時点ではTCBが定義されていないためである.
589 */
590extern void start_r( void );
591
592#define activate_context( p_tcb ) \
593{ \
594 { \
595 \
596 /* スタックポインタ初期値の設定 */ \
597 ( p_tcb )->tskctxb.sp = ( void * )((( uint32_t ) ( p_tcb )->p_tinib->stk ) + \
598 ( p_tcb )->p_tinib->stksz ); \
599 /* 起動番地の設定 */ \
600 ( p_tcb )->tskctxb.pc = ( FP ) start_r; \
601 } \
602}
603
604
605/*
606 * calltexは使用しない
607 */
608#define OMIT_CALLTEX
609
610
611/*
612 * 割込みハンドラの設定
613 *
614 * RX630はROMに割込みベクタをé…
615ç½®ã™ã‚‹ãŸã‚ï¼Œæœ¬é–¢æ•°ã¯ç©ºé–¢æ•°ã§å®Ÿè£…
616する.
617 */
618Inline void
619x_define_inh( INHNO inhno, FP inthdr )
620{
621}
622
623
624/*
625 * CPU例外ハンドラの設定
626 *
627 * RX630はROMに例外ベクタをé…
628ç½®ã™ã‚‹ãŸã‚ï¼Œæœ¬é–¢æ•°ã¯ç©ºé–¢æ•°ã§å®Ÿè£…
629する.
630 */
631Inline void
632x_define_exc( EXCNO excno, FP exchdr )
633{
634}
635
636
637/*
638 * 割込み/例外ハンドラのå…
639¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
640 *
641 * テンプレートファイルにより生成するため空マクロとする.
642 */
643#define HDR_ENTRY(hdr, intexc_num , tobejmp)
644
645/*
646 * 割込みハンドラのå…
647¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
648 */
649#define _INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno##_entry
650#define INT_ENTRY(inhno, inthdr) _INT_ENTRY(inhno , inthdr)
651
652#define _INTHDR_ENTRY(inhno, inhno_num ,inthdr) \
653 extern void _kernel_##inthdr##_##inhno##_entry(void);
654#define INTHDR_ENTRY(inhno, inhno_num ,inthdr) _INTHDR_ENTRY(inhno, inhno_num ,inthdr)
655
656
657/*
658 * CPU例外ハンドラのå…
659¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
660 */
661#define _EXC_ENTRY(excno , exchdr) _kernel_##exchdr##_##excno##_entry
662#define EXC_ENTRY(excno , exchdr) _EXC_ENTRY(excno , exchdr)
663
664#define _EXCHDR_ENTRY(excno , excno_num , exchdr) \
665 extern void _kernel_##exchdr##_##excno##_entry(void);
666#define EXCHDR_ENTRY(excno , excno_num , exchdr) _EXCHDR_ENTRY(excno , excno_num , exchdr)
667
668
669/*
670 * CPU例外の発生した時のコンテキストの参ç…
671§
672 *
673 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にFALSE,
674 * そうでない時にtrueを返す.
675 */
676Inline bool_t
677exc_sense_context( void *p_excinf )
678{
679 /*
680 * ネストカウンタが1より大なら非タスクコンテキスト
681 */
682 return( intnest > 1U );
683}
684
685#endif /* TOPPERS_MACRO_ONLY */
686
687/*
688 * CPU例外情
689報 p_excinf から PSW の値を取得するためのオフセット値
690 * EXCNO + ACC + FPSW + R1~R15 + PC
691 */
692#define EXC_GET_PSW_OFFSET (4+8+4+60+4)
693
694#ifndef TOPPERS_MACRO_ONLY
695
696/*
697 * CPU例外の発生した時のIPLの参ç…
698§
699 */
700Inline uint32_t
701exc_get_ipl(void *p_excinf)
702{
703 return((*((uint32_t *)((uintptr_t)p_excinf+EXC_GET_PSW_OFFSET)))
704 & PSW_IPL_MASK);
705}
706
707Inline bool_t
708exc_sense_i(void *p_excinf)
709{
710 return((*(((uint32_t *)((uintptr_t)p_excinf+EXC_GET_PSW_OFFSET)))
711 & PSW_I_MASK) != 0u);
712}
713
714
715/*
716 * CPU例外の発生した時のコンテキストと割込みのマスク状æ…
717‹ã®å‚ç…
718§
719 *
720 * CPU例外の発生した時のシステム状æ…
721‹ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè¡Œä¸­ã§ãªãï¼Œã‚¿ã‚¹ã‚¯ã‚³
722 * ンテキストであり,å…
723¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
724‹ã§ãªãï¼ŒCPUロック状æ…
725‹ã§ãªãï¼Œï¼ˆãƒ¢
726 * デル上の)割込み優å…
727ˆåº¦ãƒžã‚¹ã‚¯å…
728¨è§£é™¤çŠ¶æ…
729‹ã§ã‚る時にtrue,そうでない時
730 * にFALSEを返す(CPU例外がカーネル管理外の割込み処理中で発生した場合
731 * にもFALSEを返す).
732 *
733 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1
734 * (else) IPL < IPL_LOCK
735 * タスクコンテキストである→intnest == 0
736 * å…
737¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ã§ãªã„→ Iフラグ == 1
738 * 割込み優å…
739ˆåº¦ãƒžã‚¹ã‚¯ãŒå…
740¨è§£é™¤â†’IPL == 0
741 *
742 *
743 */
744Inline bool_t
745exc_sense_intmask(void *p_excinf)
746{
747 return((!exc_sense_context(p_excinf))
748 && exc_sense_i(p_excinf)
749 && (exc_get_ipl(p_excinf) == IPL_ENAALL));
750}
751
752/*
753 * CPU例外の発生した時のコンテキストと割込み/CPUロック状æ…
754‹ã®å‚ç…
755§
756 *
757 * CPU例外の発生した時のシステム状æ…
758‹ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè¡Œä¸­ã§ãªãï¼Œã‚¿ã‚¹ã‚¯ã‚³
759 * ンテキストであり,å…
760¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
761‹ã§ãªãï¼ŒCPUロック状æ…
762‹ã§ãªã„時に
763 * true,そうでない時にfalseを返す(CPU例外がカーネル管理外の割込み処
764 * 理中で発生した場合にもfalseを返す).
765 *
766 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1
767 * (else) IPL < TIPM_LOCK
768 * タスクコンテキストである→intnest < 1
769 * å…
770¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ã§ãªã„→ Iフラグ == 1
771 * CPUロック状æ…
772‹ã§ãªã„→(TIPM_LOCK== -15) Iフラグ == 1
773 * (else) IPL < TIPM_LOCK
774 */
775Inline bool_t
776exc_sense_unlock(void *p_excinf)
777{
778#if TIPM_LOCK == -15
779 return((!exc_sense_context(p_excinf))
780 && exc_sense_i(p_excinf));
781#else
782 return((!exc_sense_context(p_excinf))
783 && exc_sense_i(p_excinf)
784 && exc_get_ipl(p_excinf) < IPL_LOCK);
785#endif
786}
787
788
789/*
790 * プロセッサ依存の初期化
791 */
792extern void prc_initialize( void );
793
794/*
795 * プロセッサ依存の終了時処理
796 */
797extern void prc_terminate( void );
798
799
800#ifndef OMIT_DEFAULT_INT_HANDLER
801/*
802 * 未登録の割込みが発生した場合に呼び出される
803 */
804void default_int_handler( void );
805#endif /* OMIT_DEFAULT_INT_HANDLER */
806
807#ifndef OMIT_DEFAULT_EXC_HANDLER
808/*
809 * 未登録の例外が発生した場合に呼び出される
810 */
811void default_exc_handler( void );
812#endif /* OMIT_DEFAULT_EXC_HANDLER */
813
814
815#endif /* TOPPERS_MACRO_ONLY */
816
817#endif /* TOPPERS_PRC_CONFIG_H */
818
Note: See TracBrowser for help on using the repository browser.