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