source: asp3_gr_sakura/trunk/arch/rx630_gcc/prc_kernel_impl.h@ 317

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

GR-SAKURA向けASP3を追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr
File size: 20.2 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_kernel_impl.h 317 2017-08-03 13:14:26Z coas-nagasima $
58 */
59
60/*
61 * プロセッサ依存モジュール(RX630用)
62 *
63 * このインクルードファイルは,target_kernel_impl.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
254lock_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 lock_cpu_dsp() lock_cpu()
278
279/*
280 * CPUロック状æ…
281‹ã®è§£é™¤
282 *
283 * lock_flagをFALSEにし,IPM(ハードウェアの割込み優å…
284ˆåº¦ãƒžã‚¹ã‚¯ï¼‰ã‚’,
285 * saved_iipmに保存した値に戻す.
286 *
287 * この関数は,CPUロック状æ…
288‹ï¼ˆlock_flagがtrueの状æ…
289‹ï¼‰ã§ã®ã¿å‘¼ã°ã‚Œã‚‹ã‚‚
290 * のと想定している.
291 */
292Inline void
293unlock_cpu( void )
294{
295#if TIPM_LOCK == -15
296 enaint();
297#else /* TIPM_LOCK == -15 */
298 lock_flag = false;
299 set_ipl( saved_ipl );
300#endif /* TIPM_LOCK == -15 */
301}
302
303#define unlock_cpu_dsp() unlock_cpu()
304
305/*
306 * CPUロック状æ…
307‹ã®å‚ç…
308§
309 */
310Inline bool_t
311sense_lock( void )
312{
313#if TIPM_LOCK == -15
314 return (( bool_t )(( current_psw() & PSW_I_MASK) == 0 ));
315#else /* TIPM_LOCK == -15 */
316 return lock_flag;
317#endif /* TIPM_LOCK == -15 */
318}
319
320
321/*
322 * 割込み属性の設定のチェック
323 */
324Inline bool_t
325check_intno_cfg(INTNO intno)
326{
327 return(cfg_int_table[intno].intpri != 0U);
328}
329
330/*
331 * (モデル上の)割込み優å…
332ˆåº¦ãƒžã‚¹ã‚¯ã®è¨­å®š
333 *
334 * CPUロックフラグがクリアされている時は,ハードウェアの割込み優å…
335ˆåº¦ãƒž
336 * スクを設定する.CPUロックフラグがセットされている時は,saved_iipm
337 * を設定し,さらに,ハードウェアの割込み優å…
338ˆåº¦ãƒžã‚¹ã‚¯ã‚’,設定しようと
339 * した(モデル上の)割込み優å…
340ˆåº¦ãƒžã‚¹ã‚¯ã¨TIPM_LOCKの高い方に設定する.
341 */
342Inline void
343t_set_ipm( PRI intpri )
344{
345 uint32_t ipl = IPM_TO_IPL( intpri );
346#if TIPM_LOCK == -15
347 set_ipl(ipl);
348#else /* TIPM_LOCK == -15 */
349 if( !lock_flag ){
350 set_ipl(ipl);
351 }
352 else {
353 saved_ipl = ipl;
354 set_ipl(ipl > IPL_LOCK ? ipl : IPL_LOCK);
355 }
356#endif /* TIPM_LOCK == -15 */
357}
358
359
360
361/*
362 * (モデル上の)割込み優å…
363ˆåº¦ãƒžã‚¹ã‚¯ã®å‚ç…
364§
365 *
366 * CPUロックフラグがクリアされている時はハードウェアの割込み優å…
367ˆåº¦ãƒž
368 * スクを,セットされている時はsaved_iipmを参ç…
369§ã™ã‚‹ï¼Ž
370 */
371Inline PRI
372t_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
389
390/*
391 * 割込み要求禁止フラグのセット
392 *
393 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
394 * フラグをセットしようとした場合には,FALSEを返す.
395 */
396Inline bool_t
397disable_int( INTNO intno )
398{
399 /*
400 * レベル定義が0である場合はCFG_INTされていない
401 */
402 if( cfg_int_table[intno].intpri == 0 ){
403 return ( false );
404 }
405
406 *ier_reg_addr[intno].addr &= ( ~ier_reg_addr[intno].offset );
407
408 return ( true );
409}
410
411
412/*
413 * 割込み要求禁止フラグのクリア
414 *
415 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
416 * フラグをクリアしようとした場合には,FALSEを返す.
417 */
418Inline bool_t
419enable_int( INTNO intno )
420{
421 /*
422 * レベル定義が0である場合はCFG_INTされていない
423 */
424 if( cfg_int_table[intno].intpri == 0 ){
425 return ( false );
426 }
427
428 *ier_reg_addr[intno].addr |= ier_reg_addr[intno].offset;
429
430 return ( true );
431}
432
433
434/*
435 * 割込み要求がクリアできる状æ…
436‹ã‹ï¼Ÿ
437 */
438Inline bool_t
439check_intno_clear(INTNO intno)
440{
441 return(true);
442}
443
444/*
445 * 割込み要求のクリア
446 */
447Inline void
448clear_int( INTNO intno )
449{
450 *IR_REG(intno) = 0U;
451}
452
453
454/*
455 * 割込みが要求できる状æ…
456‹ã‹ï¼Ÿ
457 */
458Inline bool_t
459check_intno_raise(INTNO intno)
460{
461 return(true);
462}
463
464/*
465 * 割込みの要求
466 * 注意:チップでサポートされていない操作
467 */
468Inline void
469raise_int( INTNO intno )
470{
471 *IR_REG(intno) = 1U;
472}
473
474/*
475 * 割込み要求のチェック
476 */
477Inline bool_t
478probe_int( INTNO intno )
479{
480 /*
481 * 割込み要求レジスタは0 or 1でしかないため,
482 * そのままの値を返す.
483 */
484 return ( *IR_REG(intno) );
485}
486
487/*
488 * 割込み要求ラインの属性の設定
489 */
490extern void config_int( INTNO intno, ATR intatr, PRI intpri );
491
492/*
493 * 割込みを受け付けるための遅
494延処理
495 */
496Inline void
497delay_for_interrupt(void)
498{
499}
500
501/*
502 * 最高優å…
503ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(prc_support.a30)
504 *
505 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
506 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状æ…
507‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッ
508 * チ許可状æ…
509‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
510ˆåº¦ãƒžã‚¹ã‚¯å…
511¨è§£é™¤çŠ¶æ…
512‹ã§å‘¼ã³å‡ºã•ãª
513 * ければならない.
514 */
515extern void dispatch( void );
516
517/*
518 * 非タスクコンテキストからのディスパッチ要求
519 */
520#define request_dispatch()
521
522/*
523 * ディスパッチャの動作開始(prc_support.a30)
524 *
525 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
526 * みを禁止した状æ…
527‹ï¼ˆå…
528¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
529‹ã¨åŒç­‰ã®çŠ¶æ…
530‹ï¼‰ã§å‘¼ã³å‡ºã•ãªã‘れば
531 * ならない.
532 */
533extern void start_dispatch( void ) NoReturn;
534
535/*
536 * 現在のコンテキストを捨ててディスパッチ(prc_support.a30)
537 *
538 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
539 * スト・CPUロック状æ…
540‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
541‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
542ˆ
543 * 度マスクå…
544¨è§£é™¤çŠ¶æ…
545‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
546 */
547#define _kernel_exit_and_dispatch(); \
548 _exit_and_dispatch(); \
549 ercd = E_SYS;
550
551extern void _exit_and_dispatch( void ) NoReturn;
552
553/*
554 * カーネルの終了処理の呼出し(prc_support.a30)
555 *
556 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
557 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
558 * す.
559 */
560extern void call_exit_kernel( void ) NoReturn;
561
562/*
563 * タスクコンテキストの初期化
564 *
565 * タスクが休止状æ…
566‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹çŠ¶æ…
567‹ã«ç§»è¡Œã™ã‚‹æ™‚に呼ばれる.この時点
568 * でスタック領域を使ってはならない.
569 *
570 * activate_contextを,インライン関数ではなくマクロ定義としているのは,
571 * この時点ではTCBが定義されていないためである.
572 */
573extern void start_r( void );
574
575#define activate_context( p_tcb ) \
576{ \
577 { \
578 \
579 /* スタックポインタ初期値の設定 */ \
580 ( p_tcb )->tskctxb.sp = ( void * )((( uint32_t ) ( p_tcb )->p_tinib->stk ) + \
581 ( p_tcb )->p_tinib->stksz ); \
582 /* 起動番地の設定 */ \
583 ( p_tcb )->tskctxb.pc = ( FP ) start_r; \
584 } \
585}
586
587
588/*
589 * calltexは使用しない
590 */
591#define OMIT_CALLTEX
592
593
594/*
595 * 割込みハンドラの設定
596 *
597 * RX630はROMに割込みベクタをé…
598ç½®ã™ã‚‹ãŸã‚ï¼Œæœ¬é–¢æ•°ã¯ç©ºé–¢æ•°ã§å®Ÿè£…
599する.
600 */
601Inline void
602define_inh( INHNO inhno, FP inthdr )
603{
604}
605
606/*
607 * CPU例外ハンドラの設定
608 *
609 * RX630はROMに例外ベクタをé…
610ç½®ã™ã‚‹ãŸã‚ï¼Œæœ¬é–¢æ•°ã¯ç©ºé–¢æ•°ã§å®Ÿè£…
611する.
612 */
613Inline void
614define_exc( EXCNO excno, FP exchdr )
615{
616}
617
618/*
619 * 割込み/例外ハンドラのå…
620¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
621 *
622 * テンプレートファイルにより生成するため空マクロとする.
623 */
624#define HDR_ENTRY(hdr, intexc_num , tobejmp)
625
626/*
627 * 割込みハンドラのå…
628¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
629 */
630#define _INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno##_entry
631#define INT_ENTRY(inhno, inthdr) _INT_ENTRY(inhno , inthdr)
632
633#define _INTHDR_ENTRY(inhno, inhno_num ,inthdr) \
634 extern void _kernel_##inthdr##_##inhno##_entry(void);
635#define INTHDR_ENTRY(inhno, inhno_num ,inthdr) _INTHDR_ENTRY(inhno, inhno_num ,inthdr)
636
637
638/*
639 * CPU例外ハンドラのå…
640¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
641 */
642#define _EXC_ENTRY(excno , exchdr) _kernel_##exchdr##_##excno##_entry
643#define EXC_ENTRY(excno , exchdr) _EXC_ENTRY(excno , exchdr)
644
645#define _EXCHDR_ENTRY(excno , excno_num , exchdr) \
646 extern void _kernel_##exchdr##_##excno##_entry(void);
647#define EXCHDR_ENTRY(excno , excno_num , exchdr) _EXCHDR_ENTRY(excno , excno_num , exchdr)
648
649
650/*
651 * CPU例外の発生した時のコンテキストの参ç…
652§
653 *
654 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にFALSE,
655 * そうでない時にtrueを返す.
656 */
657Inline bool_t
658exc_sense_context( void *p_excinf )
659{
660 /*
661 * ネストカウンタが1より大なら非タスクコンテキスト
662 */
663 return( intnest > 1U );
664}
665
666#endif /* TOPPERS_MACRO_ONLY */
667
668/*
669 * CPU例外情
670報 p_excinf から PSW の値を取得するためのオフセット値
671 * EXCNO + ACC + FPSW + R1~R15 + PC
672 */
673#define EXC_GET_PSW_OFFSET (4+8+4+60+4)
674
675#ifndef TOPPERS_MACRO_ONLY
676
677/*
678 * CPU例外の発生した時のIPLの参ç…
679§
680 */
681Inline uint32_t
682exc_get_ipl(void *p_excinf)
683{
684 return((*((uint32_t *)((uintptr_t)p_excinf+EXC_GET_PSW_OFFSET)))
685 & PSW_IPL_MASK);
686}
687
688Inline bool_t
689exc_sense_i(void *p_excinf)
690{
691 return((*(((uint32_t *)((uintptr_t)p_excinf+EXC_GET_PSW_OFFSET)))
692 & PSW_I_MASK) != 0u);
693}
694
695
696/*
697 * CPU例外の発生した時のコンテキストと割込みのマスク状æ…
698‹ã®å‚ç…
699§
700 *
701 * CPU例外の発生した時のシステム状æ…
702‹ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè¡Œä¸­ã§ãªãï¼Œã‚¿ã‚¹ã‚¯ã‚³
703 * ンテキストであり,å…
704¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
705‹ã§ãªãï¼ŒCPUロック状æ…
706‹ã§ãªãï¼Œï¼ˆãƒ¢
707 * デル上の)割込み優å…
708ˆåº¦ãƒžã‚¹ã‚¯å…
709¨è§£é™¤çŠ¶æ…
710‹ã§ã‚る時にtrue,そうでない時
711 * にFALSEを返す(CPU例外がカーネル管理外の割込み処理中で発生した場合
712 * にもFALSEを返す).
713 *
714 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1
715 * (else) IPL < IPL_LOCK
716 * タスクコンテキストである→intnest == 0
717 * å…
718¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ã§ãªã„→ Iフラグ == 1
719 * 割込み優å…
720ˆåº¦ãƒžã‚¹ã‚¯ãŒå…
721¨è§£é™¤â†’IPL == 0
722 *
723 *
724 */
725Inline bool_t
726exc_sense_intmask(void *p_excinf)
727{
728 return((!exc_sense_context(p_excinf))
729 && exc_sense_i(p_excinf)
730 && (exc_get_ipl(p_excinf) == IPL_ENAALL));
731}
732
733/*
734 * CPU例外の発生した時のコンテキストと割込み/CPUロック状æ…
735‹ã®å‚ç…
736§
737 *
738 * CPU例外の発生した時のシステム状æ…
739‹ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè¡Œä¸­ã§ãªãï¼Œã‚¿ã‚¹ã‚¯ã‚³
740 * ンテキストであり,å…
741¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
742‹ã§ãªãï¼ŒCPUロック状æ…
743‹ã§ãªã„時に
744 * true,そうでない時にfalseを返す(CPU例外がカーネル管理外の割込み処
745 * 理中で発生した場合にもfalseを返す).
746 *
747 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1
748 * (else) IPL < TIPM_LOCK
749 * タスクコンテキストである→intnest < 1
750 * å…
751¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ã§ãªã„→ Iフラグ == 1
752 * CPUロック状æ…
753‹ã§ãªã„→(TIPM_LOCK== -15) Iフラグ == 1
754 * (else) IPL < TIPM_LOCK
755 */
756Inline bool_t
757exc_sense_unlock(void *p_excinf)
758{
759#if TIPM_LOCK == -15
760 return((!exc_sense_context(p_excinf))
761 && exc_sense_i(p_excinf));
762#else
763 return((!exc_sense_context(p_excinf))
764 && exc_sense_i(p_excinf)
765 && exc_get_ipl(p_excinf) < IPL_LOCK);
766#endif
767}
768
769
770/*
771 * プロセッサ依存の初期化
772 */
773extern void prc_initialize( void );
774
775/*
776 * プロセッサ依存の終了時処理
777 */
778extern void prc_terminate( void );
779
780
781#ifndef OMIT_DEFAULT_INT_HANDLER
782/*
783 * 未登録の割込みが発生した場合に呼び出される
784 */
785void default_int_handler( void );
786#endif /* OMIT_DEFAULT_INT_HANDLER */
787
788#ifndef OMIT_DEFAULT_EXC_HANDLER
789/*
790 * 未登録の例外が発生した場合に呼び出される
791 */
792void default_exc_handler( void );
793#endif /* OMIT_DEFAULT_EXC_HANDLER */
794
795
796#endif /* TOPPERS_MACRO_ONLY */
797
798#endif /* TOPPERS_PRC_CONFIG_H */
799
Note: See TracBrowser for help on using the repository browser.