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-2012 by Embedded and Real-Time Systems Laboratory
|
---|
9 | * Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
10 | *
|
---|
11 | * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
|
---|
12 | * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
|
---|
13 | * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
|
---|
14 | * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
|
---|
15 | * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
|
---|
16 | * スコード中に含まれていること.
|
---|
17 | * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
|
---|
18 | * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
|
---|
19 | * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
|
---|
20 | * の無保証規定を掲載すること.
|
---|
21 | * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
|
---|
22 | * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
|
---|
23 | * と.
|
---|
24 | * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
|
---|
25 | * 作権表示,この利用条件および下記の無保証規定を掲載すること.
|
---|
26 | * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
|
---|
27 | * 報告すること.
|
---|
28 | * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
|
---|
29 | * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
|
---|
30 | * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
|
---|
31 | * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
|
---|
32 | * 免責すること.
|
---|
33 | *
|
---|
34 | * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
---|
35 | * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
---|
36 | * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
---|
37 | * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
---|
38 | * の責任を負わない.
|
---|
39 | *
|
---|
40 | * @(#) $Id: exception.c 50 2012-09-07 03:47:18Z ertl-hiro $
|
---|
41 | */
|
---|
42 |
|
---|
43 | /*
|
---|
44 | * CPU例外管理機能
|
---|
45 | */
|
---|
46 |
|
---|
47 | #include "kernel_impl.h"
|
---|
48 | #include "check.h"
|
---|
49 | #include "task.h"
|
---|
50 | #include "exception.h"
|
---|
51 |
|
---|
52 | /*
|
---|
53 | * トレースログマクロのデフォルト定義
|
---|
54 | */
|
---|
55 | #ifndef LOG_DEF_EXC_ENTER
|
---|
56 | #define LOG_DEF_EXC_ENTER(excno, pk_dexc)
|
---|
57 | #endif /* LOG_DEF_EXC_ENTER */
|
---|
58 |
|
---|
59 | #ifndef LOG_DEF_EXC_LEAVE
|
---|
60 | #define LOG_DEF_EXC_LEAVE(ercd)
|
---|
61 | #endif /* LOG_DEF_EXC_LEAVE */
|
---|
62 |
|
---|
63 | #ifndef LOG_XSNS_DPN_ENTER
|
---|
64 | #define LOG_XSNS_DPN_ENTER(p_excinf)
|
---|
65 | #endif /* LOG_XSNS_DPN_ENTER */
|
---|
66 |
|
---|
67 | #ifndef LOG_XSNS_DPN_LEAVE
|
---|
68 | #define LOG_XSNS_DPN_LEAVE(state)
|
---|
69 | #endif /* LOG_XSNS_DPN_LEAVE */
|
---|
70 |
|
---|
71 | #ifndef LOG_XSNS_XPN_ENTER
|
---|
72 | #define LOG_XSNS_XPN_ENTER(p_excinf)
|
---|
73 | #endif /* LOG_XSNS_XPN_ENTER */
|
---|
74 |
|
---|
75 | #ifndef LOG_XSNS_XPN_LEAVE
|
---|
76 | #define LOG_XSNS_XPN_LEAVE(state)
|
---|
77 | #endif /* LOG_XSNS_XPN_LEAVE */
|
---|
78 |
|
---|
79 | #ifdef TOPPERS_excini
|
---|
80 |
|
---|
81 | /*
|
---|
82 | * CPU例外ハンドラ初期化ブロックのエリア
|
---|
83 | */
|
---|
84 | EXCINIB excinib_table[TNUM_EXCNO];
|
---|
85 |
|
---|
86 | /*
|
---|
87 | * CPU例外ハンドラ管理機能の初期化
|
---|
88 | */
|
---|
89 | void
|
---|
90 | initialize_exception(void)
|
---|
91 | {
|
---|
92 | uint_t i;
|
---|
93 |
|
---|
94 | for (i = 0; i < TNUM_EXCNO; i++) {
|
---|
95 | excinib_table[i].excatr = TA_NOEXS;
|
---|
96 | }
|
---|
97 | }
|
---|
98 |
|
---|
99 | #endif /* TOPPERS_excini */
|
---|
100 |
|
---|
101 | /*
|
---|
102 | * CPU例外ハンドラの定義
|
---|
103 | */
|
---|
104 | #ifdef TOPPERS_def_exc
|
---|
105 |
|
---|
106 | ER
|
---|
107 | def_exc(EXCNO excno, const T_DEXC *pk_dexc)
|
---|
108 | {
|
---|
109 | EXCINIB *p_excinib;
|
---|
110 | ER ercd;
|
---|
111 |
|
---|
112 | LOG_DEF_EXC_ENTER(excno, pk_dexc);
|
---|
113 | CHECK_INIRTN();
|
---|
114 | CHECK_PAR(VALID_EXCNO_DEFEXC(excno));
|
---|
115 | CHECK_RSATR(pk_dexc->excatr, TARGET_EXCATR);
|
---|
116 | CHECK_NOSPT(pk_dexc->exchdr != NULL);
|
---|
117 | CHECK_ALIGN_FUNC(pk_dexc->exchdr);
|
---|
118 | CHECK_NONNULL_FUNC(pk_dexc->exchdr);
|
---|
119 | p_excinib = get_excinib(excno);
|
---|
120 |
|
---|
121 | if (p_excinib->excatr != TA_NOEXS) {
|
---|
122 | ercd = E_OBJ;
|
---|
123 | }
|
---|
124 | else if ((ercd = target_check_dexc(excno, pk_dexc)) == E_OK) {
|
---|
125 | p_excinib->excatr = pk_dexc->excatr;
|
---|
126 | p_excinib->exchdr = pk_dexc->exchdr;
|
---|
127 | }
|
---|
128 |
|
---|
129 | error_exit:
|
---|
130 | LOG_DEF_EXC_LEAVE(ercd);
|
---|
131 | return(ercd);
|
---|
132 | }
|
---|
133 |
|
---|
134 | #endif /* TOPPERS_def_exc */
|
---|
135 |
|
---|
136 | /*
|
---|
137 | * CPU例外の発生したコンテキストの参照
|
---|
138 | */
|
---|
139 |
|
---|
140 | /*
|
---|
141 | * CPU例外発生時のディスパッチ保留状態の参照
|
---|
142 | *
|
---|
143 | * CPU例外ハンドラ中でdisdspが変化することはないため,CPU例外が発生し
|
---|
144 | * た時のdisdspを保存しておく必要はない.
|
---|
145 | */
|
---|
146 | #ifdef TOPPERS_xsns_dpn
|
---|
147 |
|
---|
148 | bool_t
|
---|
149 | xsns_dpn(void *p_excinf)
|
---|
150 | {
|
---|
151 | bool_t state;
|
---|
152 |
|
---|
153 | LOG_XSNS_DPN_ENTER(p_excinf);
|
---|
154 | state = (exc_sense_intmask(p_excinf) && !disdsp) ? false : true;
|
---|
155 | LOG_XSNS_DPN_LEAVE(state);
|
---|
156 | return(state);
|
---|
157 | }
|
---|
158 |
|
---|
159 | #endif /* TOPPERS_xsns_dpn */
|
---|
160 |
|
---|
161 | /*
|
---|
162 | * CPU例外発生時のタスク例外処理保留状態の参照
|
---|
163 | *
|
---|
164 | * CPU例外ハンドラ中でp_runtskとp_runtsk->enatexが変化することはない
|
---|
165 | * ため,CPU例外が発生した時のp_runtsk->enatexを保存しておく必要はな
|
---|
166 | * い.
|
---|
167 | */
|
---|
168 | #ifdef TOPPERS_xsns_xpn
|
---|
169 |
|
---|
170 | bool_t
|
---|
171 | xsns_xpn(void *p_excinf)
|
---|
172 | {
|
---|
173 | bool_t state;
|
---|
174 |
|
---|
175 | LOG_XSNS_XPN_ENTER(p_excinf);
|
---|
176 | state = (exc_sense_intmask(p_excinf) && p_runtsk->enatex) ? false : true;
|
---|
177 | LOG_XSNS_XPN_LEAVE(state);
|
---|
178 | return(state);
|
---|
179 | }
|
---|
180 |
|
---|
181 | #endif /* TOPPERS_xsns_xpn */
|
---|