source: atk2-sc3-1.4.0-ntisr/kernel/osctl.c

Last change on this file was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

File size: 11.6 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
11 * Copyright (C) 2011-2013 by Spansion LLC, USA
12 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
13 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
14 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
15 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
16 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
17 * Copyright (C) 2004-2015 by Witz Corporation
18 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
19 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
20 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
21 * Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
22 *
23 * 上記著作権者
24は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
25 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
26 * 変・再é…
27å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
28 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
29 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
30 * スコード中に含まれていること.
31 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
32 * 用できる形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
35 * 者
36マニュアルなど)に,上記の著作権表示,この利用条件および下記
37 * の無保証規定を掲載すること.
38 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
39 * 用できない形で再é…
40å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
41 * と.
42 * (a) 再é…
43å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
44マニュアルなど)に,上記の著
45 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
46 * (b) 再é…
47å¸ƒã®å½¢æ…
48‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
49 * 報告すること.
50 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
51 * 害からも,上記著作権者
52およびTOPPERSプロジェクトをå…
53è²¬ã™ã‚‹ã“と.
54 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
55 * 由に基づく請求からも,上記著作権者
56およびTOPPERSプロジェクトを
57 * å…
58è²¬ã™ã‚‹ã“と.
59 *
60 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
61 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
62 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
63 * 用する者
64に対して,AUTOSARパートナーになることを求めている.
65 *
66 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
67お
68 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
69 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
70 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
71 * の責任を負わない.
72 *
73 * $Id: osctl.c 432 2015-12-09 11:54:28Z nces-okajima $
74 */
75
76/*
77 * OS制御モジュール
78 */
79
80#include "kernel_impl.h"
81#include "interrupt.h"
82#include "task.h"
83
84/*
85 * トレースログマクロのデフォルト定義
86 */
87
88#ifndef LOG_ERRHOOK_ENTER
89#define LOG_ERRHOOK_ENTER(ercd)
90#endif /* LOG_ERRHOOK_ENTER */
91
92#ifndef LOG_ERRHOOK_LEAVE
93#define LOG_ERRHOOK_LEAVE()
94#endif /* LOG_ERRHOOK_LEAVE */
95
96#ifndef LOG_PROHOOK_ENTER
97#define LOG_PROHOOK_ENTER(ercd)
98#endif /* LOG_PROHOOK_ENTER */
99
100#ifndef LOG_PROHOOK_LEAVE
101#define LOG_PROHOOK_LEAVE(pret)
102#endif /* LOG_PROHOOK_LEAVE */
103
104#ifndef LOG_SHUTHOOK_ENTER
105#define LOG_SHUTHOOK_ENTER(ercd)
106#endif /* LOG_SHUTHOOK_ENTER */
107
108#ifndef LOG_SHUTHOOK_LEAVE
109#define LOG_SHUTHOOK_LEAVE()
110#endif /* LOG_SHUTHOOK_LEAVE */
111
112#ifndef LOG_STUTOS_ENTER
113#define LOG_STUTOS_ENTER(ercd)
114#endif /* LOG_STUTOS_ENTER */
115
116#ifndef LOG_STUTOS_LEAVE
117#define LOG_STUTOS_LEAVE()
118#endif /* LOG_STUTOS_LEAVE */
119
120#ifdef CFG_USE_ERRORHOOK
121/*
122 * エラーフックに渡す情
123報を格納する変数
124 */
125#ifdef TOPPERS_internal_call_errorhook
126
127#ifdef CFG_USE_GETSERVICEID
128DEFINE_VAR_SEC_NOBITS(OSServiceIdType, _errorhook_svcid, ".srpw_bss_kernel");
129#endif /* CFG_USE_GETSERVICEID */
130
131#ifdef CFG_USE_PARAMETERACCESS
132_ErrorHook_Par _errorhook_par1;
133_ErrorHook_Par _errorhook_par2;
134_ErrorHook_Par _errorhook_par3;
135DEFINE_VAR_SEC_NOBITS(_ErrorHook_Par, errorhook_par1, ".srpw_bss_kernel");
136DEFINE_VAR_SEC_NOBITS(_ErrorHook_Par, errorhook_par2, ".srpw_bss_kernel");
137DEFINE_VAR_SEC_NOBITS(_ErrorHook_Par, errorhook_par3, ".srpw_bss_kernel");
138#endif /* CFG_USE_PARAMETERACCESS */
139
140/*
141 * エラーフックの呼び出し
142 */
143void
144internal_call_errorhook(StatusType ercd, OSServiceIdType svcid)
145{
146
147 boolean saved_run_trusted = run_trusted;
148
149 if ((callevel_stat & (TCL_ERROR | TSYS_ISR1)) == TCL_NULL) {
150
151#ifdef CFG_USE_GETSERVICEID
152 _errorhook_svcid = svcid;
153#endif /* CFG_USE_GETSERVICEID */
154
155#ifdef CFG_USE_PARAMETERACCESS
156 errorhook_par1 = _errorhook_par1;
157 errorhook_par2 = _errorhook_par2;
158 errorhook_par3 = _errorhook_par3;
159#endif /* CFG_USE_PARAMETERACCESS */
160
161 ENTER_CALLEVEL(TCL_ERROR);
162 run_trusted = TRUE;
163
164 LOG_ERRHOOK_ENTER(ercd);
165 ErrorHook(ercd);
166 LOG_ERRHOOK_LEAVE();
167 LEAVE_CALLEVEL(TCL_ERROR);
168
169 }
170
171 run_trusted = saved_run_trusted;
172}
173
174#endif /* TOPPERS_internal_call_errorhook */
175
176#endif /* CFG_USE_ERRORHOOK */
177
178#ifdef CFG_USE_POSTTASKHOOK
179/*
180 * ポストタスクフックの呼び出し
181 */
182#ifdef TOPPERS_call_posttaskhook
183
184void
185call_posttaskhook(void)
186{
187 boolean saved_run_trusted;
188
189 ENTER_CALLEVEL(TCL_PREPOST);
190 saved_run_trusted = run_trusted;
191 run_trusted = TRUE;
192
193 PostTaskHook();
194
195 run_trusted = saved_run_trusted;
196
197 LEAVE_CALLEVEL(TCL_PREPOST);
198
199}
200
201#endif /* TOPPERS_call_posttaskhook */
202
203#endif /* CFG_USE_POSTTASKHOOK */
204
205#ifdef CFG_USE_PRETASKHOOK
206/*
207 * プレタスクフックの呼び出し
208 */
209#ifdef TOPPERS_call_pretaskhook
210
211void
212call_pretaskhook(void)
213{
214 boolean saved_run_trusted;
215
216 ENTER_CALLEVEL(TCL_PREPOST);
217 saved_run_trusted = run_trusted;
218 run_trusted = TRUE;
219
220 PreTaskHook();
221
222 run_trusted = saved_run_trusted;
223
224 LEAVE_CALLEVEL(TCL_PREPOST);
225
226}
227
228#endif /* TOPPERS_call_pretaskhook */
229
230#endif /* CFG_USE_PRETASKHOOK */
231
232#ifdef CFG_USE_STACKMONITORING
233
234#ifdef TOPPERS_init_stack_magic_region
235
236/*
237 * スタックモニタリング機能の初期化
238 * スタックモニタリング機能のためのマジックナンバー領域の初期化
239 */
240void
241init_stack_magic_region(void)
242{
243 StackType *p_stack_magic_region;
244
245 /*
246 * スタックモニタリング機能のため,スタック成長方向考æ…
247®ã—た
248 * 非タスクスタックのマジックナンバー領域の初期化
249 */
250 p_stack_magic_region = TOPPERS_ISTK_MAGIC_REGION(_ostk, _ostksz);
251 *p_stack_magic_region = STACK_MAGIC_NUMBER;
252}
253
254#endif /* TOPPERS_init_stack_magic_region */
255
256#endif /* CFG_USE_STACKMONITORING */
257
258/*
259 * プロテクションフックの呼び出し
260 * 引数の最上位ビットは,呼び出し箇所を示す役割がある
261 */
262#ifdef TOPPERS_call_protectionhk_main
263
264void
265call_protectionhk_main(StatusType protection_error)
266{
267#ifdef CFG_USE_PROTECTIONHOOK
268
269 boolean saved_run_trusted;
270
271 ProtectionReturnType pret;
272
273 /* プロテクションフック実行中に保護違反が発生した場合 */
274 if ((callevel_stat & TCL_PROTECT) == TCL_PROTECT) {
275 internal_shutdownos(E_OS_PROTECTION_FATAL);
276 }
277
278 /* 以下 プロテクションフックを呼出す処理 */
279
280 ENTER_CALLEVEL(TCL_PROTECT);
281 saved_run_trusted = run_trusted;
282
283 run_trusted = TRUE;
284 LOG_PROHOOK_ENTER(protection_error);
285 pret = ProtectionHook(protection_error);
286 LOG_PROHOOK_LEAVE(pret);
287 run_trusted = saved_run_trusted;
288
289 LEAVE_CALLEVEL(TCL_PROTECT);
290
291 /* 以下 ProtectionHook 実行後の処理 */
292 switch (pret) {
293 case PRO_SHUTDOWN:
294 internal_shutdownos(protection_error);
295 break;
296 case PRO_TERMINATETASKISR:
297#if 0
298 if ((p_runtsk == NULL) || (pre_protection_supervised != FALSE)) {
299 /* 信頼領域からのフック時はシャットダウン */
300 internal_shutdownos(E_OS_PROTECTION_FATAL);
301 }
302 else {
303 /* タスクの場合 */
304 force_terminate_task(p_runtsk);
305 }
306#else /* 0 */
307 if ((p_runisr != NULL) || (pre_protection_supervised == FALSE)) {
308 /* 非信頼ISRの場合 */
309 force_terminate_isr(p_runisr);
310 }
311 else if ((p_runtsk != NULL) || (pre_protection_supervised == FALSE)) {
312 /* 非信頼タスクの場合 */
313 force_terminate_task(p_runtsk);
314 }
315 else {
316 /* 信頼領域からのフック時はシャットダウン */
317 internal_shutdownos(E_OS_PROTECTION_FATAL);
318 }
319#endif /* 0 */
320 break;
321 case PRO_IGNORE:
322 if (protection_error != E_OS_PROTECTION_EXCEPTION) {
323 internal_shutdownos(E_OS_PROTECTION_FATAL);
324 }
325 break;
326 case PRO_TERMINATEAPPL:
327 if ((p_runosap == NULL) || (pre_protection_supervised != FALSE)) {
328 internal_shutdownos(E_OS_PROTECTION_FATAL);
329 }
330 else {
331 force_term_osap(p_runosap, NO_RESTART);
332 }
333 break;
334 case PRO_TERMINATEAPPL_RESTART:
335 if ((p_runosap == NULL) || (pre_protection_supervised != FALSE)) {
336 internal_shutdownos(E_OS_PROTECTION_FATAL);
337 }
338 else {
339 force_term_osap(p_runosap, RESTART);
340 }
341 break;
342 default:
343 /* ProtectionHookから不正な値が返った場合 */
344 internal_shutdownos(E_OS_PROTECTION_FATAL);
345 break;
346 }
347
348#else /* CFG_USE_PROTECTIONHOOK */
349
350 /*
351 * プロテクションフックがコンフィギュレーション時に無効と
352 * されている場合,OSは保護違反時処理としてOSシャットダウンを
353 * 行う
354 * このとき,OSシャットダウンのパラメータとして,
355 * 違反の区別を示すエラーコードを指定する
356 */
357 internal_shutdownos(protection_error);
358#endif /* CFG_USE_PROTECTIONHOOK */
359
360}
361
362#endif /* TOPPERS_call_protectionhk_main */
363
364/*
365 * OS内
366部からのShutdownOSの呼び出し
367 */
368#ifdef TOPPERS_internal_shutdownos
369
370void
371internal_shutdownos(StatusType ercd)
372{
373 LOG_STUTOS_ENTER(ercd);
374
375 x_nested_lock_os_int();
376
377#ifdef CFG_USE_SHUTDOWNHOOK
378 call_shutdownhook(ercd);
379#endif /* CFG_USE_SHUTDOWNHOOK */
380
381 /* 各モジュールの終了処理 */
382 object_terminate();
383
384 /* å…
385¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
386‹ã«ç§»è¡Œ */
387 x_lock_all_int();
388
389 LOG_STUTOS_LEAVE();
390
391 /* ターゲット依存の終了処理 */
392 target_exit();
393
394 /*
395 * ターゲット依存部から処理が返ってきた場合,
396 * 無限ループを行う
397 */
398 while (1) {
399 }
400
401}
402
403#endif /* TOPPERS_internal_shutdownos */
404
405#ifdef TOPPERS_internal_call_shtdwnhk
406
407#ifdef CFG_USE_SHUTDOWNHOOK
408
409void
410internal_call_shtdwnhk(StatusType ercd)
411{
412
413 /*
414 * シャットダウンフック中のシャットダウンではシャットダウンフック
415 * は呼び出さない
416 */
417 if ((callevel_stat & TCL_SHUTDOWN) == TCL_NULL) {
418
419 p_runosap = NULL;
420
421 /*
422 * ShutdownHook の呼び出し
423 */
424 ENTER_CALLEVEL(TCL_SHUTDOWN);
425 run_trusted = TRUE;
426 LOG_SHUTHOOK_ENTER(ercd);
427 ShutdownHook(ercd);
428 LOG_SHUTHOOK_LEAVE();
429 LEAVE_CALLEVEL(TCL_SHUTDOWN);
430
431 }
432}
433#endif /* CFG_USE_SHUTDOWNHOOK */
434
435#endif /* TOPPERS_internal_call_shtdwnhk */
Note: See TracBrowser for help on using the repository browser.