source: asp_wo_cfg/trunk/target/macosx_gcc/target_config.h@ 50

Last change on this file since 50 was 50, checked in by ertl-hiro, 12 years ago

ターゲット依存のエラーチェックコードを追加。

  • Property svn:keywords set to Id
File size: 14.2 KB
RevLine 
[49]1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2006-2012 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * と.
22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * 報告すること.
26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30 * 免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
34 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
35 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
36 * の責任を負わない.
37 *
38 * $Id: target_config.h 50 2012-09-07 03:47:18Z ertl-hiro $
39 */
40
41/*
42 * ターゲット依存モジュール(Mac OS X用)
43 *
44 * カーネルのターゲット依存部のインクルードファイル.kernel_impl.hのター
45 * ゲット依存部の位置付けとなる.
46 */
47
48#ifndef TOPPERS_TARGET_CONFIG_H
49#define TOPPERS_TARGET_CONFIG_H
50
51/*
52 * 標準のインクルードファイル
53 */
54#ifndef TOPPERS_MACRO_ONLY
55#include <sys/types.h>
56#include <unistd.h>
57#include <stdlib.h>
58#include <setjmp.h>
59#include <signal.h>
60#include <stdio.h>
61
62#ifdef TOPPERS_SUPPORT_OVRHDR
63#include "overrun.h"
64#endif /* TOPPERS_SUPPORT_OVRHDR */
65#endif /* TOPPERS_MACRO_ONLY */
66
67/*
68 * ターゲットシステムのOS依存の定義
69 */
70#include "macosx.h"
71
72/*
73 * ターゲット定義のオブジェクト属性
74 */
75#define TARGET_INHATR TA_NONKERNEL /* カーネル管理外の割込み */
76
77/*
78 * エラーチェック方法の指定
79 */
80#define CHECK_STKSZ_ALIGN 4 /* スタックサイズのアライン単位 */
81#define CHECK_FUNC_ALIGN 4 /* 関数のアライン単位 */
82#define CHECK_FUNC_NONNULL /* 関数の非NULLチェック */
83#define CHECK_STACK_ALIGN 4 /* スタック領域のアライン単位 */
84#define CHECK_STACK_NONNULL /* スタック領域の非NULLチェック */
85#define CHECK_MPF_ALIGN 4 /* 固定長メモリプール領域のアライン単位 */
86#define CHECK_MPF_NONNULL /* 固定長メモリプール領域の非NULLチェック */
87#define CHECK_MB_ALIGN 4 /* 管理領域のアライン単位 */
88
89/*
90 * トレースログに関する設定
91 */
92#ifdef TOPPERS_ENABLE_TRACE
93#include "logtrace/trace_config.h"
94#endif /* TOPPERS_ENABLE_TRACE */
95
96/*
97 * アーキテクチャ(プロセッサ)依存の定義
98 */
99#if defined(__ppc__)
100
101#define JMPBUF_PC 21 /* jmp_buf中でのPCの位置 */
102#define JMPBUF_SP 0 /* jmp_buf中でのSPの位置 */
103#define TASK_STACK_MERGIN 4U
104#define DEFAULT_ISTKSZ SIGSTKSZ /* シグナルスタックのサイズ */
105
106#elif defined(__i386__)
107
108#define JMPBUF_PC 12 /* jmp_buf中でのPCの位置 */
109#define JMPBUF_SP 9 /* jmp_buf中でのSPの位置 */
110#define TASK_STACK_MERGIN 4U
111#define DEFAULT_ISTKSZ SIGSTKSZ /* シグナルスタックのサイズ */
112
113#elif defined(__x86_64__)
114
115#error architecture not supported
116#define JMPBUF_PC 7 /* jmp_buf中でのPCの位置 */
117#define JMPBUF_SP 2 /* jmp_buf中でのSPの位置 */
118#define TASK_STACK_MERGIN 8U
119#define DEFAULT_ISTKSZ SIGSTKSZ /* シグナルスタックのサイズ */
120
121#else
122#error architecture not supported
123#endif
124
125#ifndef TOPPERS_MACRO_ONLY
126
127/*
128 * タスクコンテキストブロックの定義
129 */
130typedef struct task_context_block {
131 jmp_buf env; /* コンテキスト情報 */
132} TSKCTXB;
133
134/*
135 * シグナルセット操作マクロ
136 */
137#define sigequalset(set1, set2) (*(set1) == *(set2))
138#define sigassignset(set1, set2) (*(set1) = *(set2))
139#define sigjoinset(set1, set2) (*(set1) |= *(set2))
140
141/*
142 * 割込み優先度マスクによるシグナルマスク
143 *
144 * 割込み優先度マスクによってマスクされている割込みと,割込み属性が設
145 * 定されていない割込みに対応するシグナルをマスクするためのシグナルマ
146 * スクを保持する配列.配列のインデックスは,割込み優先度マスクの符号
147 * を反転したもの.
148 *
149 * sigmask_table[0]:割込み属性が設定されていない割込みに対応するシグ
150 * ナルのみをマスクするシグナルマスク
151 * sigmask_table[-TMIN_INTPRI]:カーネル管理の割込みすべてと,割込み属
152 * 性が設定されていない割込みに対応するシグナルをマ
153 * スクするシグナルマスク
154 * sigmask_table[6]:NMIとSIGUSR2を除くすべての割込みと,割込み属性が設
155 * 定されていない割込みに対応するシグナルをマスクする
156 * シグナルマスク
157 * sigmask_table[7]:sigmask_table[6]と同じ値
158 */
159extern sigset_t sigmask_table[8];
160
161/*
162 * 割込みロック/CPUロックへの移行でマスクするシグナルを保持する変数
163 */
164extern sigset_t sigmask_intlock; /* 割込みロックでマスクするシグナル */
165extern sigset_t sigmask_cpulock; /* CPUロックでマスクするシグナル */
166
167/*
168 * コンテキストの参照
169 */
170Inline bool_t
171sense_context(void)
172{
173 stack_t ss;
174
175 sigaltstack(NULL, &ss);
176 return((ss.ss_flags & SA_ONSTACK) != 0);
177}
178
179/*
180 * CPUロックフラグ実現のための変数
181 */
182extern volatile bool_t lock_flag; /* CPUロックフラグを表す変数 */
183extern volatile sigset_t saved_sigmask; /* シグナルマスクを保存する変数 */
184
185/*
186 * 割込み優先度マスク実現のための変数
187 */
188extern volatile PRI ipm_value; /* 割込み優先度マスクを表す変数 */
189
190/*
191 * 割込み要求禁止フラグ実現のための変数
192 */
193extern volatile sigset_t sigmask_disint; /* 個別にマスクしているシグナル */
194
195/*
196 * シグナルマスクの設定
197 *
198 * 現在の状態(コンテキスト,CPUロックフラグ,割込み優先度マスク,割込
199 * み禁止フラグ)を参照して,現在のシグナルマスクとsaved_sigmaskを適切
200 * な値に設定する.
201 */
202Inline void
203set_sigmask(void)
204{
205 sigset_t sigmask;
206
207 sigassignset(&sigmask, &(sigmask_table[-ipm_value]));
208 sigjoinset(&sigmask, &sigmask_disint);
209 if (sense_context()) {
210 sigaddset(&sigmask, SIGUSR2);
211 }
212 if (lock_flag) {
213 sigassignset(&saved_sigmask, &sigmask);
214 sigjoinset(&sigmask, &sigmask_cpulock);
215 }
216 sigprocmask(SIG_SETMASK, &sigmask, NULL);
217}
218
219/*
220 * CPUロック状態への移行
221 */
222Inline void
223x_lock_cpu(void)
224{
225 assert(!lock_flag);
226 sigprocmask(SIG_BLOCK, &sigmask_cpulock, (sigset_t *) &saved_sigmask);
227 lock_flag = true;
228}
229
230#define t_lock_cpu() x_lock_cpu()
231#define i_lock_cpu() x_lock_cpu()
232
233/*
234 * CPUロック状態の解除
235 */
236Inline void
237x_unlock_cpu(void)
238{
239 assert(lock_flag);
240 lock_flag = false;
241 sigprocmask(SIG_SETMASK, (sigset_t *) &saved_sigmask, NULL);
242}
243
244#define t_unlock_cpu() x_unlock_cpu()
245#define i_unlock_cpu() x_unlock_cpu()
246
247/*
248 * CPUロック状態の参照
249 */
250Inline bool_t
251x_sense_lock(void)
252{
253 return(lock_flag);
254}
255
256#define t_sense_lock() x_sense_lock()
257#define i_sense_lock() x_sense_lock()
258
259/*
260 * 割込み優先度マスクの設定
261 */
262Inline void
263x_set_ipm(PRI intpri)
264{
265 ipm_value = intpri;
266 set_sigmask();
267}
268
269#define t_set_ipm(intpri) x_set_ipm(intpri)
270#define i_set_ipm(intpri) x_set_ipm(intpri)
271
272/*
273 * 割込み優先度マスクの参照
274 */
275Inline PRI
276x_get_ipm(void)
277{
278 return(ipm_value);
279}
280
281#define t_get_ipm() x_get_ipm()
282#define i_get_ipm() x_get_ipm()
283
284/*
285 * 割込み要求ライン属性,割込みハンドラ,CPU例外ハンドラの登録可能数
286 */
287#define TNUM_INTNO 30
288#define TNUM_INHNO 30
289#define TNUM_EXCNO 30
290
291#define INDEX_INTNO(intno) ((uint_t)((intno) - 1))
292#define INDEX_INHNO(inhno) ((uint_t)((inhno) - 1))
293#define INDEX_EXCNO(intno) ((uint_t)((excno) - 1))
294
295/*
296 * 割込み番号と割込みハンドラ番号を変換するためのマクロ
297 */
298#define INTNO_INHNO(inhno) ((INTNO)(inhno))
299#define INHNO_INTNO(intno) ((INHNO)(intno))
300
301/*
302 * 割込み番号の範囲の判定
303 */
304#define VALID_INTNO(intno) (1 <= (intno) && (intno) <= 30 \
305 && (intno) != SIGKILL && (intno) != SIGSTOP)
306#define VALID_INTNO_CFGINT(intno) VALID_INTNO(intno)
307#define VALID_INTNO_CREISR(intno) VALID_INTNO(intno)
308#define VALID_INTNO_DISINT(intno) VALID_INTNO(intno)
309
310/*
311 * 割込み優先度の範囲の判定
312 */
313#define VALID_INTPRI_CFGINT(intpri) (-1 >= (intpri) && (intpri) >= -7)
314
315/*
316 * 割込みハンドラ番号とCPU例外ハンドラ番号の範囲の判定
317 */
318#define VALID_INHNO_DEFINH(inhno) VALID_INTNO((INTNO)(inhno))
319#define VALID_EXCNO_DEFEXC(excno) VALID_INTNO((INTNO)(excno))
320
321/*
322 * 割込み要求禁止フラグのセット
323 *
324 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
325 * フラグをセットしようとした場合には,falseを返す.
326 */
327Inline bool_t
328x_disable_int(INTNO intno)
329{
330 if (sigismember(&(sigmask_table[0]), intno)
331 || !sigismember(&(sigmask_table[7]), intno)) {
332 return(false);
333 }
334 sigaddset(&sigmask_disint, intno);
335 set_sigmask();
336 return(true);
337}
338
339#define t_disable_int(intno) x_disable_int(intno)
340#define i_disable_int(intno) x_disable_int(intno)
341
342/*
343 * 割込み要求禁止フラグのクリア
344 *
345 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
346 * フラグをクリアしようとした場合には,falseを返す.
347 */
348Inline bool_t
349x_enable_int(INTNO intno)
350{
351 if (sigismember(&(sigmask_table[0]), intno)
352 || !sigismember(&(sigmask_table[7]), intno)) {
353 return(false);
354 }
355 sigdelset(&sigmask_disint, intno);
356 set_sigmask();
357 return(true);
358}
359
360#define t_enable_int(intno) x_enable_int(intno)
361#define i_enable_int(intno) x_enable_int(intno)
362
363/*
364 * 割込み要求のクリア
365 */
366Inline void
367x_clear_int(INTNO intno)
368{
369}
370
371#define t_clear_int(intno) x_clear_int(intno)
372#define i_clear_int(intno) x_clear_int(intno)
373
374/*
375 * 割込み要求のチェック
376 */
377Inline bool_t
378x_probe_int(INTNO intno)
379{
380 sigset_t sigmask;
381
382 sigpending(&sigmask);
383 return(sigismember(&sigmask, intno));
384}
385
386#define t_probe_int(intno) x_probe_int(intno)
387#define i_probe_int(intno) x_probe_int(intno)
388
389/*
390 * 割込みハンドラの入口で必要なIRC操作
391 */
392Inline void
393i_begin_int(INTNO intno)
394{
395}
396
397/*
398 * 割込みハンドラの出口で必要なIRC操作
399 */
400Inline void
401i_end_int(INTNO intno)
402{
403}
404
405/*
406 * 最高優先順位タスクへのディスパッチ
407 *
408 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
409 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状態・ディスパッ
410 * チ許可状態・(モデル上の)割込み優先度マスク全解除状態で呼び出さな
411 * ければならない.
412 */
413extern void dispatch(void);
414
415/*
416 * ディスパッチャの動作開始
417 *
418 * start_dispatchをreturnにマクロ定義することで,カーネルの初期化完了
419 * 後にsta_kerからmainにリターンさせ,シグナルスタックから元のスタック
420 * に戻す.
421 */
422#define start_dispatch() return
423
424/*
425 * 現在のコンテキストを捨ててディスパッチ
426 *
427 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
428 * スト・CPUロック状態・ディスパッチ許可状態・(モデル上の)割込み優先
429 * 度マスク全解除状態で呼び出さなければならない.
430 */
431extern void exit_and_dispatch(void);
432
433/*
434 * 割込みハンドラ出口処理
435 */
436extern void ret_int(void);
437
438/*
439 * CPU例外ハンドラ出口処理
440 */
441extern void ret_exc(void);
442
443/*
444 * カーネルの終了処理の呼出し
445 *
446 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
447 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
448 * す.
449 */
450extern void call_exit_kernel(void) NoReturn;
451
452/*
453 * タスクコンテキストの初期化
454 *
455 * タスクが休止状態から実行できる状態に移行する時に呼ばれる.この時点
456 * でスタック領域を使ってはならない.
457 *
458 * activate_contextを,インライン関数ではなくマクロ定義としているのは,
459 * この時点ではTCBが定義されていないためである.
460 */
461extern void start_r(void);
462
463/*
464 * Intelプロセッサでは,PCとSP以外のレジスタを設定しないとSegmentation
465 * faultが起きる.具体的にどのレジスタの設定が引き起こしているかが不明
466 * のため,現時点の環境を_setjmpで取得して回避している.
467 */
468#define activate_context(p_tcb) \
469{ \
470 _setjmp(p_tcb->tskctxb.env); \
471 ((intptr_t *) &((p_tcb)->tskctxb.env))[JMPBUF_PC] \
472 = (intptr_t) start_r; \
473 ((intptr_t *) &((p_tcb)->tskctxb.env))[JMPBUF_SP] \
474 = (intptr_t)((char *)((p_tcb)->p_tinib->stk) \
475 + (p_tcb)->p_tinib->stksz \
476 - TASK_STACK_MERGIN); \
477}
478
479/*
480 * オーバランハンドラ停止のためのマクロ
481 */
482#ifdef TOPPERS_SUPPORT_OVRHDR
483#define OVRTIMER_STOP() { \
484 i_lock_cpu(); \
485 _kernel_ovrtimer_stop(); \
486 i_unlock_cpu(); \
487 }
488#else /* TOPPERS_SUPPORT_OVRHDR */
489#define OVRTIMER_STOP()
490#endif /* TOPPERS_SUPPORT_OVRHDR */
491
492/*
493 * CPU例外の発生した時のコンテキストの参照
494 *
495 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にfalse,
496 * そうでない時にtrueを返す.
497 */
498Inline bool_t
499exc_sense_context(void *p_excinf)
500{
501 return(((ucontext_t *) p_excinf)->uc_onstack != 0);
502}
503
504/*
505 * カーネル管理外のCPU例外の判別
506 *
507 * カーネル管理外のCPU例外の時にtrue,そうでない時にfalseを返す.
508 */
509Inline bool_t
510exc_sense_nonkernel(void *p_excinf)
511{
512 sigset_t sigmask;
513
514 sigassignset(&sigmask, &(((ucontext_t *) p_excinf)->uc_sigmask));
515 return(sigismember(&sigmask, SIGUSR2));
516}
517
518/*
519 * CPU例外の発生した時のコンテキストと割込みのマスク状態の参照
520 *
521 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
522 * ンテキストであり,全割込みロック状態でなく,CPUロック状態でなく,割
523 * 込み優先度マスク全解除状態である時にtrue,そうでない時にfalseを返す
524 * (CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを返
525 * す).
526 */
527Inline bool_t
528exc_sense_intmask(void *p_excinf)
529{
530 return(!exc_sense_context(p_excinf) && !exc_sense_nonkernel(p_excinf)
531 && ipm_value == TIPM_ENAALL);
532}
533
534/*
[50]535 * サービスコールのターゲット依存エラーチェックコード
536 */
537Inline ER
538target_check_ctsk(ID tskid, const T_CTSK *pk_ctsk)
539{
540 return(E_OK);
541}
542
543extern ER target_check_cint(INTNO intno, const T_CINT *pk_cint);
544
545Inline ER
546target_check_dinh(INHNO inhno, const T_DINH *pk_dinh)
547{
548 return(E_OK);
549}
550
551extern ER target_check_dexc(EXCNO excno, const T_DEXC *pk_dexc);
552
553/*
[49]554 * ターゲットシステム依存の初期化
555 */
556extern void target_initialize(void);
557
558/*
559 * 割込み/CPU例外の初期化処理(ターゲット依存)
560 */
561extern void target_prepare(void);
562
563/*
564 * ターゲットシステムの終了
565 *
566 * システムを終了する時に使う.
567 */
568extern void target_exit(void) NoReturn;
569
570#endif /* TOPPERS_MACRO_ONLY */
571
572#endif /* TOPPERS_TARGET_CONFIG_H */
Note: See TracBrowser for help on using the repository browser.