source: atk2-sc3_fl850f1l/kernel/osap.c@ 165

Last change on this file since 165 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 26.5 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
9 * Copyright (C) 2011-2013 by Spansion LLC, USA
10 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
11 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
13 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
14 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
15 * Copyright (C) 2011-2015 by Witz Corporation
16 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
17 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
18 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
19 *
20 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
21 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
22 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
23 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
24 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
25 * スコード中に含まれていること.
26 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
27 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
28 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
29 * の無保証規定を掲載すること.
30 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
32 * と.
33 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
36 * 報告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
39 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
41 * 免責すること.
42 *
43 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
44 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
45 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
46 * 用する者に対して,AUTOSARパートナーになることを求めている.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52 * の責任を負わない.
53 *
54 * $Id: osap.c 187 2015-06-25 03:39:04Z t_ishikawa $
55 */
56
57#include "kernel_impl.h"
58#include "check.h"
59#include "osap.h"
60#include "task.h"
61#include "interrupt.h"
62#include "counter.h"
63#include "alarm.h"
64#include "resource.h"
65#include "scheduletable.h"
66
67/*
68 * OSアプリケーション管理モジュール
69 */
70
71/*
72 * トレースマクロのデフォルト定義
73 */
74#ifndef LOG_GETOSAPID_ENTER
75#define LOG_GETOSAPID_ENTER()
76#endif /* LOG_GETOSAPID_ENTER */
77
78#ifndef LOG_GETOSAPID_LEAVE
79#define LOG_GETOSAPID_LEAVE(id)
80#endif /* LOG_GETOSAPID_LEAVE */
81
82#ifndef LOG_GETAST_ENTER
83#define LOG_GETAST_ENTER(Application)
84#endif /* LOG_GETAST_ENTER */
85
86#ifndef LOG_GETAST_LEAVE
87#define LOG_GETAST_LEAVE(ercd, p_value)
88#endif /* LOG_GETAST_LEAVE */
89
90#ifndef LOG_CALTFN_ENTER
91#define LOG_CALTFN_ENTER(FunctionIndex)
92#endif /* LOG_CALTFN_ENTER */
93
94#ifndef LOG_CALTFN_LEAVE
95#define LOG_CALTFN_LEAVE(FunctionIndex)
96#endif /* LOG_CALTFN_LEAVE */
97
98#ifndef LOG_TFN_ENTER
99#define LOG_TFN_ENTER(FunctionIndex)
100#endif /* LOG_TFN_ENTER */
101
102#ifndef LOG_TFN_LEAVE
103#define LOG_TFN_LEAVE(FunctionIndex, ercd)
104#endif /* LOG_TFN_LEAVE */
105
106#ifndef LOG_CHKTSKACS_ENTER
107#define LOG_CHKTSKACS_ENTER(ApplID, TaskID)
108#endif /* LOG_CHKTSKACS_ENTER */
109
110#ifndef LOG_CHKTSKACS_LEAVE
111#define LOG_CHKTSKACS_LEAVE(access)
112#endif /* LOG_CHKTSKACS_LEAVE */
113
114#ifndef LOG_CHKISRACS_ENTER
115#define LOG_CHKISRACS_ENTER(ApplID, ISRID)
116#endif /* LOG_CHKISRACS_ENTER */
117
118#ifndef LOG_CHKISRACS_LEAVE
119#define LOG_CHKISRACS_LEAVE(access)
120#endif /* LOG_CHKISRACS_LEAVE */
121
122#ifndef LOG_CHKALMACS_ENTER
123#define LOG_CHKALMACS_ENTER(ApplID, AlarmID)
124#endif /* LOG_CHKALMACS_ENTER */
125
126#ifndef LOG_CHKALMACS_LEAVE
127#define LOG_CHKALMACS_LEAVE(access)
128#endif /* LOG_CHKALMACS_LEAVE */
129
130#ifndef LOG_CHKRESACS_ENTER
131#define LOG_CHKRESACS_ENTER(ApplID, ResID)
132#endif /* LOG_CHKRESACS_ENTER */
133
134#ifndef LOG_CHKRESACS_LEAVE
135#define LOG_CHKRESACS_LEAVE(access)
136#endif /* LOG_CHKRESACS_LEAVE */
137
138#ifndef LOG_CHKCNTACS_ENTER
139#define LOG_CHKCNTACS_ENTER(ApplID, CounterID)
140#endif /* LOG_CHKCNTACS_ENTER */
141
142#ifndef LOG_CHKCNTACS_LEAVE
143#define LOG_CHKCNTACS_LEAVE(access)
144#endif /* LOG_CHKCNTACS_LEAVE */
145
146#ifndef LOG_CHKSCHTBLACS_ENTER
147#define LOG_CHKSCHTBLACS_ENTER(ApplID, ScheduleTableID)
148#endif /* LOG_CHKSCHTBLACS_ENTER */
149
150#ifndef LOG_CHKSCHTBLACS_LEAVE
151#define LOG_CHKSCHTBLACS_LEAVE(access)
152#endif /* LOG_CHKSCHTBLACS_LEAVE */
153
154#ifndef LOG_CHKTSKOWN_ENTER
155#define LOG_CHKTSKOWN_ENTER(TaskID)
156#endif /* LOG_CHKTSKOWN_ENTER */
157
158#ifndef LOG_CHKTSKOWN_LEAVE
159#define LOG_CHKTSKOWN_LEAVE(owner)
160#endif /* LOG_CHKTSKOWN_LEAVE */
161
162#ifndef LOG_CHKISROWN_ENTER
163#define LOG_CHKISROWN_ENTER(ISRID)
164#endif /* LOG_CHKISROWN_ENTER */
165
166#ifndef LOG_CHKISROWN_LEAVE
167#define LOG_CHKISROWN_LEAVE(owner)
168#endif /* LOG_CHKISROWN_LEAVE */
169
170#ifndef LOG_CHKALMOWN_ENTER
171#define LOG_CHKALMOWN_ENTER(AlarmID)
172#endif /* LOG_CHKALMOWN_ENTER */
173
174#ifndef LOG_CHKALMOWN_LEAVE
175#define LOG_CHKALMOWN_LEAVE(owner)
176#endif /* LOG_CHKALMOWN_LEAVE */
177
178#ifndef LOG_CHKCNTOWN_ENTER
179#define LOG_CHKCNTOWN_ENTER(CounterID)
180#endif /* LOG_CHKCNTOWN_ENTER */
181
182#ifndef LOG_CHKCNTOWN_LEAVE
183#define LOG_CHKCNTOWN_LEAVE(owner)
184#endif /* LOG_CHKCNTOWN_LEAVE */
185
186#ifndef LOG_CHKSCHTBLOWN_ENTER
187#define LOG_CHKSCHTBLOWN_ENTER(ScheduleTableID)
188#endif /* LOG_CHKSCHTBLOWN_ENTER */
189
190#ifndef LOG_CHKSCHTBLOWN_LEAVE
191#define LOG_CHKSCHTBLOWN_LEAVE(owner)
192#endif /* LOG_CHKSCHTBLOWN_LEAVE */
193
194#ifndef LOG_ALLOWACCESS_ENTER
195#define LOG_ALLOWACCESS_ENTER()
196#endif /* LOG_ALLOWACCESS_ENTER */
197
198#ifndef LOG_ALLOWACCESS_LEAVE
199#define LOG_ALLOWACCESS_LEAVE(ercd)
200#endif /* LOG_ALLOWACCESS_LEAVE */
201
202#ifndef LOG_TERMINATEAPPLICATION_ENTER
203#define LOG_TERMINATEAPPLICATION_ENTER(Application, RestartOption)
204#endif /* LOG_TERMINATEAPPLICATION_ENTER */
205
206#ifndef LOG_TERMINATEAPPLICATION_LEAVE
207#define LOG_TERMINATEAPPLICATION_LEAVE(ercd)
208#endif /* LOG_TERMINATEAPPLICATION_LEAVE */
209
210#ifdef TOPPERS_osap_initialize
211/*
212 * 実行中のOSアプリケーション
213 */
214OSAPCB *p_runosap;
215
216/*
217 * OSアプリケーション管理ブロック初期化
218 */
219void
220osap_initialize(void)
221{
222 ApplicationType i;
223 OSAPCB *p_osapcb;
224
225 p_runosap = NULL;
226 for (i = 0U; i < tnum_osap; i++) {
227 p_osapcb = &osapcb_table[i];
228 p_osapcb->p_osapinib = &osapinib_table[i];
229 p_osapcb->osap_stat = APPLICATION_ACCESSIBLE;
230 }
231}
232
233#endif /* TOPPERS_osap_initialize */
234
235/*
236 * 実行状態のOSアプリケーション ID取得
237 */
238#ifdef TOPPERS_GetApplicationID
239
240ApplicationType
241GetApplicationID(void)
242{
243 ApplicationType id;
244 StatusType ercd;
245
246 LOG_GETOSAPID_ENTER();
247
248 CHECK_CALLEVEL(CALLEVEL_GETAPPLICATIONID);
249
250 id = (p_runosap == NULL) ? INVALID_OSAPPLICATION : OSAPID(p_runosap);
251
252 exit_finish:
253 LOG_GETOSAPID_LEAVE(id);
254 return(id);
255
256#ifdef CFG_USE_ERRORHOOK
257 exit_errorhook:
258 x_nested_lock_os_int();
259 call_errorhook(ercd, OSServiceId_GetApplicationID);
260 x_nested_unlock_os_int();
261#endif /* CFG_USE_ERRORHOOK */
262
263 exit_no_errorhook:
264 id = INVALID_OSAPPLICATION;
265 goto exit_finish;
266}
267
268#endif /* TOPPERS_GetApplicationID */
269
270/*
271 * アプリケーションを利用可能な状態にするシステムサービス
272 */
273#ifdef TOPPERS_GetApplicationState
274
275StatusType
276GetApplicationState(ApplicationType Application, ApplicationStateRefType Value)
277{
278 StatusType ercd = E_OK;
279 OSAPCB *p_osapcb;
280
281 LOG_GETAST_ENTER(Application);
282
283 CHECK_CALLEVEL(CALLEVEL_GETAPPLICATIONSTATE);
284 CHECK_PARAM_POINTER(Value);
285 CHECK_MEM_WRITE(Value, ApplicationStateType);
286 CHECK_ID(Application < tnum_osap);
287
288 p_osapcb = get_osapcb(Application);
289 *Value = p_osapcb->osap_stat;
290
291 exit_no_errorhook:
292 LOG_GETAST_LEAVE(ercd, Value);
293 return(ercd);
294
295#ifdef CFG_USE_ERRORHOOK
296 exit_errorhook:
297 x_nested_lock_os_int();
298#ifdef CFG_USE_PARAMETERACCESS
299 _errorhook_par1.applid = Application;
300 _errorhook_par2.p_appstat = Value;
301#endif /* CFG_USE_PARAMETERACCESS */
302 call_errorhook(ercd, OSServiceId_GetApplicationState);
303 x_nested_unlock_os_int();
304 goto exit_no_errorhook;
305#endif /* CFG_USE_ERRORHOOK */
306}
307
308#endif /* TOPPERS_GetApplicationState */
309
310#ifdef TOPPERS_CallTrustedFunction
311
312StatusType
313CallTrustedFunction(TrustedFunctionIndexType FunctionIndex,
314 TrustedFunctionParameterRefType FunctionParams)
315{
316 StatusType ercd = E_OK;
317 const TFINIB *p_tfinib;
318 boolean saved_run_trusted;
319#ifdef CFG_USE_PROTECTIONHOOK
320 boolean saved_calltfn;
321#endif /* CFG_USE_PROTECTIONHOOK */
322
323 LOG_CALTFN_ENTER(FunctionIndex);
324
325 CHECK_DISABLEDINT();
326 CHECK_CALLEVEL(CALLEVEL_CALLTRUSTEDFUNCTION);
327
328 /* ファンクションIDのチェック */
329 CHECK_SERVICEID(FunctionIndex < tnum_tfn);
330
331 /* 使用するスタックのチェック */
332 p_tfinib = &(tfinib_table[FunctionIndex]);
333 ercd = trustedfunc_stack_check(p_tfinib->tf_stksz);
334 CHECK_NO_ERCD(ercd == E_OK);
335
336 saved_run_trusted = run_trusted;
337 run_trusted = TRUE;
338
339#ifdef CFG_USE_PROTECTIONHOOK
340 /* 信頼関数呼び出し中フラグ設定 */
341 if (callevel_stat == TCL_TASK) {
342 saved_calltfn = p_runtsk->calltfn;
343 p_runtsk->calltfn = TRUE;
344 }
345 else {
346 saved_calltfn = p_runisr->calltfn;
347 p_runisr->calltfn = TRUE;
348 }
349#endif /* CFG_USE_PROTECTIONHOOK */
350
351 LOG_TFN_ENTER(FunctionIndex);
352 /* 信頼関数実行 */
353 ercd = p_tfinib->trs_func(FunctionIndex, FunctionParams);
354 LOG_TFN_LEAVE(FunctionIndex, ercd);
355
356#ifdef CFG_USE_STACKMONITORING
357 if ((callevel_stat & TCL_ISR2) != TCL_NULL) {
358 if ((*TOPPERS_ISTK_MAGIC_REGION(_ostk, _ostksz)) != STACK_MAGIC_NUMBER) {
359 x_nested_lock_os_int();
360 call_protectionhk_main(E_OS_STACKFAULT);
361 ASSERT(0);
362 }
363 }
364 else {
365 if ((*TOPPERS_SSTK_MAGIC_REGION(p_runtsk->p_tinib)) != STACK_MAGIC_NUMBER) {
366 x_nested_lock_os_int();
367 call_protectionhk_main_stkchg(E_OS_STACKFAULT);
368 ASSERT(0);
369 }
370 }
371#endif /* CFG_USE_STACKMONITORING */
372
373#ifdef CFG_USE_PROTECTIONHOOK
374 /* 信頼関数呼び出し中フラグ戻す */
375 if (callevel_stat == TCL_TASK) {
376 p_runtsk->calltfn = saved_calltfn;
377 }
378 else {
379 p_runisr->calltfn = saved_calltfn;
380 }
381#endif /* CFG_USE_PROTECTIONHOOK */
382
383 run_trusted = saved_run_trusted;
384
385 /* 信頼関数がエラーになった場合もエラーフックを呼び出す */
386 CHECK_NO_ERCD(ercd == E_OK);
387
388 exit_no_errorhook:
389 LOG_CALTFN_LEAVE(ercd);
390 return(ercd);
391
392#ifdef CFG_USE_ERRORHOOK
393 exit_errorhook:
394 x_nested_lock_os_int();
395#ifdef CFG_USE_PARAMETERACCESS
396 _errorhook_par1.tfnid = FunctionIndex;
397 _errorhook_par2.tfnpr = FunctionParams;
398#endif /* CFG_USE_PARAMETERACCESS */
399 call_errorhook(ercd, OSServiceId_CallTrustedFunction);
400 x_nested_unlock_os_int();
401 goto exit_no_errorhook;
402#endif /* CFG_USE_ERRORHOOK */
403}
404
405#endif /* TOPPERS_CallTrustedFunction */
406
407/*
408 * アクセスチェック関数
409 */
410
411/*
412 * OSアプリケーションのオブジェクトのアクセス権限チェックシステムサービス
413 */
414
415/*
416 * ビットマップチェックマクロ
417 * このファイル内のみで使用するため,ここで定義している
418 */
419
420#define CHECK_OSAP_ACS(p_osapinib, btmp) (ObjectAccessType) ((((p_osapinib)->osap_trusted) != FALSE) || \
421 (((p_osapinib)->btptn & (btmp)) != 0U))
422
423/*
424 * タスク用アクセス権限チェックシステムサービス
425 */
426#ifdef TOPPERS_CheckTaskAccess
427
428ObjectAccessType
429CheckTaskAccess(ApplicationType ApplID, TaskType TaskID)
430{
431 ObjectAccessType access;
432 StatusType ercd;
433 TCB *p_tcb;
434
435 LOG_CHKTSKACS_ENTER(ApplID, TaskID);
436
437 CHECK_DISABLEDINT();
438 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTACCESS);
439 CHECK_ID(ApplID < tnum_osap);
440 CHECK_ID(TaskID < tnum_task);
441
442 p_tcb = get_tcb(TaskID);
443
444 access = CHECK_OSAP_ACS(get_osapinib(ApplID), p_tcb->p_tinib->acsbtmp);
445
446 exit_finish:
447 LOG_CHKTSKACS_LEAVE(access);
448 return(access);
449
450#ifdef CFG_USE_ERRORHOOK
451 exit_errorhook:
452 x_nested_lock_os_int();
453#ifdef CFG_USE_PARAMETERACCESS
454 _errorhook_par1.applid = ApplID;
455 _errorhook_par2.tskid = TaskID;
456#endif /* CFG_USE_PARAMETERACCESS */
457 call_errorhook(ercd, OSServiceId_CheckTaskAccess);
458 x_nested_unlock_os_int();
459#endif /* CFG_USE_ERRORHOOK */
460
461 exit_no_errorhook:
462 access = NO_ACCESS;
463 goto exit_finish;
464}
465
466#endif /* TOPPERS_CheckTaskAccess */
467
468/*
469 * ISR用アクセス権限チェックシステムサービス
470 */
471#ifdef TOPPERS_CheckISRAccess
472
473ObjectAccessType
474CheckISRAccess(ApplicationType ApplID, ISRType ISRID)
475{
476 ObjectAccessType access;
477 StatusType ercd;
478 ISRCB *p_isrcb;
479
480 LOG_CHKISRACS_ENTER(ApplID, ISRID);
481
482 CHECK_DISABLEDINT();
483 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTACCESS);
484 CHECK_ID(ApplID < tnum_osap);
485 CHECK_ID(ISRID < tnum_isr2);
486
487 p_isrcb = get_isrcb(ISRID);
488
489 access = CHECK_OSAP_ACS(get_osapinib(ApplID), p_isrcb->p_isrinib->acsbtmp);
490
491 exit_finish:
492 LOG_CHKISRACS_LEAVE(access);
493 return(access);
494
495#ifdef CFG_USE_ERRORHOOK
496 exit_errorhook:
497 x_nested_lock_os_int();
498#ifdef CFG_USE_PARAMETERACCESS
499 _errorhook_par1.applid = ApplID;
500 _errorhook_par2.isrid = ISRID;
501#endif /* CFG_USE_PARAMETERACCESS */
502 call_errorhook(ercd, OSServiceId_CheckISRAccess);
503 x_nested_unlock_os_int();
504#endif /* CFG_USE_ERRORHOOK */
505
506 exit_no_errorhook:
507 access = NO_ACCESS;
508 goto exit_finish;
509}
510
511#endif /* TOPPERS_CheckISRAccess */
512
513/*
514 * アラーム用アクセス権限チェックシステムサービス
515 */
516#ifdef TOPPERS_CheckAlarmAccess
517
518ObjectAccessType
519CheckAlarmAccess(ApplicationType ApplID, AlarmType AlarmID)
520{
521 ObjectAccessType access;
522 StatusType ercd;
523 ALMCB *p_almcb;
524
525 LOG_CHKALMACS_ENTER(ApplID, AlarmID);
526
527 CHECK_DISABLEDINT();
528 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTACCESS);
529 CHECK_ID(ApplID < tnum_osap);
530 CHECK_ID(AlarmID < tnum_alarm);
531
532 p_almcb = get_almcb(AlarmID);
533
534 access = CHECK_OSAP_ACS(get_osapinib(ApplID), p_almcb->p_alminib->acsbtmp);
535
536 exit_finish:
537 LOG_CHKALMACS_LEAVE(access);
538 return(access);
539
540#ifdef CFG_USE_ERRORHOOK
541 exit_errorhook:
542 x_nested_lock_os_int();
543#ifdef CFG_USE_PARAMETERACCESS
544 _errorhook_par1.applid = ApplID;
545 _errorhook_par2.almid = AlarmID;
546#endif /* CFG_USE_PARAMETERACCESS */
547 call_errorhook(ercd, OSServiceId_CheckAlarmAccess);
548 x_nested_unlock_os_int();
549#endif /* CFG_USE_ERRORHOOK */
550
551 exit_no_errorhook:
552 access = NO_ACCESS;
553 goto exit_finish;
554}
555
556#endif /* TOPPERS_CheckAlarmAccess */
557
558/*
559 * リソース用アクセス権限チェックシステムサービス
560 */
561#ifdef TOPPERS_CheckResourceAccess
562
563ObjectAccessType
564CheckResourceAccess(ApplicationType ApplID, ResourceType ResID)
565{
566 ObjectAccessType access;
567 StatusType ercd;
568 RESCB *p_rescb;
569
570 LOG_CHKRESACS_ENTER(ApplID, ResID);
571
572 CHECK_DISABLEDINT();
573 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTACCESS);
574 CHECK_ID(ApplID < tnum_osap);
575 CHECK_ID(ResID < tnum_stdresource);
576
577 p_rescb = get_rescb(ResID);
578 access = CHECK_OSAP_ACS(get_osapinib(ApplID), p_rescb->p_resinib->acsbtmp);
579
580 exit_finish:
581 LOG_CHKRESACS_LEAVE(access);
582 return(access);
583
584#ifdef CFG_USE_ERRORHOOK
585 exit_errorhook:
586 x_nested_lock_os_int();
587#ifdef CFG_USE_PARAMETERACCESS
588 _errorhook_par1.applid = ApplID;
589 _errorhook_par2.resid = ResID;
590#endif /* CFG_USE_PARAMETERACCESS */
591 call_errorhook(ercd, OSServiceId_CheckResourceAccess);
592 x_nested_unlock_os_int();
593#endif /* CFG_USE_ERRORHOOK */
594
595 exit_no_errorhook:
596 access = NO_ACCESS;
597 goto exit_finish;
598}
599
600#endif /* TOPPERS_CheckResourceAccess */
601
602/*
603 * カウンタ用アクセス権限チェックシステムサービス
604 */
605#ifdef TOPPERS_CheckCounterAccess
606
607ObjectAccessType
608CheckCounterAccess(ApplicationType ApplID, CounterType CounterID)
609{
610 ObjectAccessType access;
611 StatusType ercd;
612 CNTCB *p_cntcb;
613
614 LOG_CHKCNTACS_ENTER(ApplID, CounterID);
615
616 CHECK_DISABLEDINT();
617 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTACCESS);
618 CHECK_ID(ApplID < tnum_osap);
619 CHECK_ID(CounterID < tnum_counter);
620
621 p_cntcb = get_cntcb(CounterID);
622
623 access = CHECK_OSAP_ACS(get_osapinib(ApplID), p_cntcb->p_cntinib->acsbtmp);
624
625 exit_finish:
626 LOG_CHKCNTACS_LEAVE(access);
627 return(access);
628
629#ifdef CFG_USE_ERRORHOOK
630 exit_errorhook:
631 x_nested_lock_os_int();
632#ifdef CFG_USE_PARAMETERACCESS
633 _errorhook_par1.applid = ApplID;
634 _errorhook_par2.cntid = CounterID;
635#endif /* CFG_USE_PARAMETERACCESS */
636 call_errorhook(ercd, OSServiceId_CheckCounterAccess);
637 x_nested_unlock_os_int();
638#endif /* CFG_USE_ERRORHOOK */
639
640 exit_no_errorhook:
641 access = NO_ACCESS;
642 goto exit_finish;
643}
644
645#endif /* TOPPERS_CheckCounterAccess */
646
647/*
648 * スケジュールテーブル用アクセス権限チェックシステムサービス
649 */
650#ifdef TOPPERS_CheckScheduleTableAccess
651
652ObjectAccessType
653CheckScheduleTableAccess(ApplicationType ApplID, ScheduleTableType ScheduleTableID)
654{
655 ObjectAccessType access;
656 StatusType ercd;
657 SCHTBLCB *p_schtblcb;
658
659 LOG_CHKSCHTBLACS_ENTER(ApplID, ScheduleTableID);
660
661 CHECK_DISABLEDINT();
662 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTACCESS);
663 CHECK_ID(ApplID < tnum_osap);
664 CHECK_ID(ScheduleTableID < tnum_scheduletable);
665
666 p_schtblcb = get_schtblcb(ScheduleTableID);
667
668 access = CHECK_OSAP_ACS(get_osapinib(ApplID), p_schtblcb->p_schtblinib->acsbtmp);
669
670 exit_finish:
671 LOG_CHKSCHTBLACS_LEAVE(access);
672 return(access);
673
674#ifdef CFG_USE_ERRORHOOK
675 exit_errorhook:
676 x_nested_lock_os_int();
677#ifdef CFG_USE_PARAMETERACCESS
678 _errorhook_par1.applid = ApplID;
679 _errorhook_par2.schtblid = ScheduleTableID;
680#endif /* CFG_USE_PARAMETERACCESS */
681 call_errorhook(ercd, OSServiceId_CheckScheduleTableAccess);
682 x_nested_unlock_os_int();
683#endif /* CFG_USE_ERRORHOOK */
684
685 exit_no_errorhook:
686 access = NO_ACCESS;
687 goto exit_finish;
688}
689
690#endif /* TOPPERS_CheckScheduleTableAccess */
691
692/*
693 * OSアプリケーションのオブジェクトの所有チェックシステムサービス
694 */
695
696/*
697 * タスク用オブジェクト所有チェックシステムサービス
698 */
699#ifdef TOPPERS_CheckTaskOwnership
700
701ApplicationType
702CheckTaskOwnership(TaskType TaskID)
703{
704 ApplicationType owner;
705 StatusType ercd;
706 TCB *p_tcb;
707
708 LOG_CHKTSKOWN_ENTER(TaskID);
709
710 CHECK_DISABLEDINT();
711 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTOWNERSHIP);
712 CHECK_ID(TaskID < tnum_task);
713
714 p_tcb = get_tcb(TaskID);
715 owner = OSAPID(p_tcb->p_tinib->p_osapcb);
716
717 exit_finish:
718 LOG_CHKTSKOWN_LEAVE(owner);
719 return(owner);
720
721#ifdef CFG_USE_ERRORHOOK
722 exit_errorhook:
723 x_nested_lock_os_int();
724#ifdef CFG_USE_PARAMETERACCESS
725 _errorhook_par1.tskid = TaskID;
726#endif /* CFG_USE_PARAMETERACCESS */
727 call_errorhook(ercd, OSServiceId_CheckTaskOwnership);
728 x_nested_unlock_os_int();
729#endif /* CFG_USE_ERRORHOOK */
730
731 exit_no_errorhook:
732 owner = INVALID_OSAPPLICATION;
733 goto exit_finish;
734}
735
736#endif /* TOPPERS_CheckTaskOwnership */
737
738/*
739 * ISR用オブジェクト所有チェックシステムサービス
740 */
741#ifdef TOPPERS_CheckISROwnership
742
743ApplicationType
744CheckISROwnership(ISRType ISRID)
745{
746 ApplicationType owner;
747 StatusType ercd;
748 ISRCB *p_isrcb;
749
750 LOG_CHKISROWN_ENTER(ISRID);
751
752 CHECK_DISABLEDINT();
753 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTOWNERSHIP);
754 CHECK_ID(ISRID < tnum_isr2);
755
756 p_isrcb = get_isrcb(ISRID);
757 owner = OSAPID(p_isrcb->p_isrinib->p_osapcb);
758
759 exit_finish:
760 LOG_CHKISROWN_LEAVE(owner);
761 return(owner);
762
763#ifdef CFG_USE_ERRORHOOK
764 exit_errorhook:
765 x_nested_lock_os_int();
766#ifdef CFG_USE_PARAMETERACCESS
767 _errorhook_par1.isrid = ISRID;
768#endif /* CFG_USE_PARAMETERACCESS */
769 call_errorhook(ercd, OSServiceId_CheckISROwnership);
770 x_nested_unlock_os_int();
771#endif /* CFG_USE_ERRORHOOK */
772
773 exit_no_errorhook:
774 owner = INVALID_OSAPPLICATION;
775 goto exit_finish;
776}
777
778#endif /* TOPPERS_CheckISROwnership */
779
780/*
781 * アラーム用オブジェクト所有チェックシステムサービス
782 */
783#ifdef TOPPERS_CheckAlarmOwnership
784
785ApplicationType
786CheckAlarmOwnership(AlarmType AlarmID)
787{
788 ApplicationType owner;
789 StatusType ercd;
790 ALMCB *p_almcb;
791
792 LOG_CHKALMOWN_ENTER(AlarmID);
793
794 CHECK_DISABLEDINT();
795 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTOWNERSHIP);
796 CHECK_ID(AlarmID < tnum_alarm);
797
798 p_almcb = get_almcb(AlarmID);
799 owner = OSAPID(p_almcb->p_alminib->p_osapcb);
800
801 exit_finish:
802 LOG_CHKALMOWN_LEAVE(owner);
803 return(owner);
804
805#ifdef CFG_USE_ERRORHOOK
806 exit_errorhook:
807 x_nested_lock_os_int();
808#ifdef CFG_USE_PARAMETERACCESS
809 _errorhook_par1.almid = AlarmID;
810#endif /* CFG_USE_PARAMETERACCESS */
811 call_errorhook(ercd, OSServiceId_CheckAlarmOwnership);
812 x_nested_unlock_os_int();
813#endif /* CFG_USE_ERRORHOOK */
814
815 exit_no_errorhook:
816 owner = INVALID_OSAPPLICATION;
817 goto exit_finish;
818}
819
820#endif /* TOPPERS_CheckAlarmOwnership */
821
822/*
823 * カウンタ用オブジェクト所有チェックシステムサービス
824 */
825#ifdef TOPPERS_CheckCounterOwnership
826
827ApplicationType
828CheckCounterOwnership(CounterType CounterID)
829{
830 ApplicationType owner;
831 StatusType ercd;
832 CNTCB *p_cntcb;
833
834 LOG_CHKCNTOWN_ENTER(CounterID);
835
836 CHECK_DISABLEDINT();
837 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTOWNERSHIP);
838 CHECK_ID(CounterID < tnum_counter);
839
840 p_cntcb = get_cntcb(CounterID);
841 owner = OSAPID(p_cntcb->p_cntinib->p_osapcb);
842
843 exit_finish:
844 LOG_CHKCNTOWN_LEAVE(owner);
845 return(owner);
846
847#ifdef CFG_USE_ERRORHOOK
848 exit_errorhook:
849 x_nested_lock_os_int();
850#ifdef CFG_USE_PARAMETERACCESS
851 _errorhook_par1.cntid = CounterID;
852#endif /* CFG_USE_PARAMETERACCESS */
853 call_errorhook(ercd, OSServiceId_CheckCounterOwnership);
854 x_nested_unlock_os_int();
855#endif /* CFG_USE_ERRORHOOK */
856
857 exit_no_errorhook:
858 owner = INVALID_OSAPPLICATION;
859 goto exit_finish;
860}
861
862#endif /* TOPPERS_CheckCounterOwnership */
863
864/*
865 * スケジュールテーブル用オブジェクト所有チェックシステムサービス
866 */
867#ifdef TOPPERS_CheckScheduleTableOwnership
868
869ApplicationType
870CheckScheduleTableOwnership(ScheduleTableType ScheduleTableID)
871{
872 ApplicationType owner;
873 StatusType ercd;
874 SCHTBLCB *p_schtblcb;
875
876 LOG_CHKSCHTBLOWN_ENTER(ScheduleTableID);
877
878 CHECK_DISABLEDINT();
879 CHECK_CALLEVEL(CALLEVEL_CHECKOBJECTOWNERSHIP);
880 CHECK_ID(ScheduleTableID < tnum_scheduletable);
881
882 p_schtblcb = get_schtblcb(ScheduleTableID);
883 owner = OSAPID(p_schtblcb->p_schtblinib->p_osapcb);
884
885 exit_finish:
886 LOG_CHKSCHTBLOWN_LEAVE(owner);
887 return(owner);
888
889#ifdef CFG_USE_ERRORHOOK
890 exit_errorhook:
891 x_nested_lock_os_int();
892#ifdef CFG_USE_PARAMETERACCESS
893 _errorhook_par1.schtblid = ScheduleTableID;
894#endif /* CFG_USE_PARAMETERACCESS */
895 call_errorhook(ercd, OSServiceId_CheckScheduleTableOwnership);
896 x_nested_unlock_os_int();
897#endif /* CFG_USE_ERRORHOOK */
898
899 exit_no_errorhook:
900 owner = INVALID_OSAPPLICATION;
901 goto exit_finish;
902}
903
904#endif /* TOPPERS_CheckScheduleTableOwnership */
905
906/*
907 * 自OSAPを利用可能な状態にする
908 */
909#ifdef TOPPERS_AllowAccess
910
911StatusType
912AllowAccess(void)
913{
914 StatusType ercd = E_OK;
915
916 LOG_ALLOWACCESS_ENTER();
917
918 CHECK_DISABLEDINT();
919 CHECK_CALLEVEL(CALLEVEL_ALLOWACCESS);
920 /* ここに来た場合p_runosap(自OSAP)がNULLではない */
921 CHECK_STATE(p_runosap->osap_stat == APPLICATION_RESTARTING);
922
923 x_nested_lock_os_int();
924
925 p_runosap->osap_stat = APPLICATION_ACCESSIBLE;
926
927 d_exit_no_errorhook:
928 x_nested_unlock_os_int();
929 exit_no_errorhook:
930 LOG_ALLOWACCESS_LEAVE(ercd);
931 return(ercd);
932
933#ifdef CFG_USE_ERRORHOOK
934 exit_errorhook:
935 x_nested_lock_os_int();
936 call_errorhook(ercd, OSServiceId_AllowAccess);
937 goto d_exit_no_errorhook;
938#endif /* CFG_USE_ERRORHOOK */
939}
940
941#endif /* TOPPERS_AllowAccess */
942
943/*
944 * 指定OSAPを終了/再起動する
945 */
946#ifdef TOPPERS_TerminateApplication
947
948StatusType
949TerminateApplication(ApplicationType Application, RestartType RestartOption)
950{
951 StatusType ercd = E_OK;
952 OSAPCB *p_osapcb;
953
954 LOG_TERMINATEAPPLICATION_ENTER(Application, RestartOption);
955
956 CHECK_DISABLEDINT();
957 CHECK_CALLEVEL(CALLEVEL_TERMINATEAPPLICATION);
958 CHECK_ID((Application < tnum_osap) && (get_osapinib(Application)->osap_trusted == FALSE));
959 p_osapcb = get_osapcb(Application);
960 CHECK_VALUE((RestartOption == NO_RESTART) || ((RestartOption == RESTART) &&
961 (p_osapcb->p_osapinib->p_restart_tcb != NULL)));
962
963#ifdef CFG_USE_ERRORHOOK
964 if ((callevel_stat & TCL_ERROR) == TCL_NULL) {
965 /*
966 * タスクかC2ISRからの呼び出し
967 * 信頼OSAPからか自OSAPからかしか呼び出せない
968 */
969 CHECK_ACCESS((run_trusted != FALSE) || (p_osapcb == p_runosap));
970 }
971 else {
972 /*
973 * 自OSAP(非信頼)の固有エラーフック以外のフックなら呼び出せない
974 */
975 CHECK_ID((run_trusted == FALSE) && (p_osapcb == p_runosap));
976 }
977#else /* CFG_USE_ERRORHOOK */
978 /*
979 * タスクかC2ISRからの呼び出し
980 * 信頼OSAPからか自OSAPからかしか呼び出せない
981 */
982 CHECK_ACCESS((run_trusted != FALSE) || (p_osapcb == p_runosap));
983#endif /* CFG_USE_ERRORHOOK */
984
985 x_nested_lock_os_int();
986
987 S_D_CHECK_STATE((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
988 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
989 (p_osapcb == p_runosap) && (RestartOption == NO_RESTART)));
990
991 internal_term_osap(p_osapcb, RestartOption);
992
993 d_exit_no_errorhook:
994 x_nested_unlock_os_int();
995 exit_no_errorhook:
996 LOG_TERMINATEAPPLICATION_LEAVE(ercd);
997 return(ercd);
998
999#ifdef CFG_USE_ERRORHOOK
1000 exit_errorhook:
1001 x_nested_lock_os_int();
1002 d_exit_errorhook:
1003#ifdef CFG_USE_PARAMETERACCESS
1004 _errorhook_par1.applid = Application;
1005 _errorhook_par2.restartoption = RestartOption;
1006#endif /* CFG_USE_PARAMETERACCESS */
1007 call_errorhook(ercd, OSServiceId_TerminateApplication);
1008 goto d_exit_no_errorhook;
1009#endif /* CFG_USE_ERRORHOOK */
1010}
1011
1012#endif /* TOPPERS_TerminateApplication */
1013
1014/*
1015 * 指定OSAPを終了/再起動する内部関数(プロテクションフックからも呼ばれる)
1016 */
1017#ifdef TOPPERS_internal_term_osap
1018
1019void
1020internal_term_osap(OSAPCB *p_osapcb, RestartType RestartOption)
1021{
1022 TCB *p_restart_tcb;
1023 boolean dspflg = FALSE;
1024
1025 if (RestartOption == RESTART) {
1026 p_osapcb->osap_stat = APPLICATION_RESTARTING;
1027 }
1028 else {
1029 p_osapcb->osap_stat = APPLICATION_TERMINATED;
1030 }
1031
1032 force_term_osap_counter(p_osapcb);
1033 force_term_osap_alarm(p_osapcb);
1034 force_term_osap_schtbl(p_osapcb);
1035 force_term_osap_task(p_osapcb);
1036
1037 if (RestartOption == RESTART) {
1038 p_restart_tcb = p_osapcb->p_osapinib->p_restart_tcb;
1039 if (p_restart_tcb != NULL) {
1040 dspflg = make_active(p_restart_tcb);
1041 }
1042 else {
1043 /* プロテクションフックからのリターンのみ実行される */
1044 callevel_chk_shutdown(E_OS_PROTECTION_FATAL);
1045 }
1046 }
1047
1048 if ((callevel_stat & TCL_OSAP_STARTUP) != TCL_NULL) {
1049 /* OSAP固有スタートアップフック中発生したプロテクションフックから
1050 * のリターンのみ実行される
1051 * フックを強制終了し,そのフックが所属するOSAPは終了状態となる
1052 * 後続のスタートアップフックは実行され,OSが起動する
1053 */
1054 x_clear_nested_os_int();
1055 exit_nontrusted_hook();
1056 }
1057 else if (p_runosap == p_osapcb) {
1058 /* 全割込み禁止状態で,タスク強制終了しても,DisableAllInterrupts全割込み禁止状態を解除しない */
1059 callevel_stat = (callevel_stat & TSYS_DISALLINT) | TCL_TASK;
1060 /*
1061 * 処理単位がネストした場合,終了するOSAP確保した割込み禁止を解除する
1062 * エラーフックは呼ばない
1063 * エラーフックを呼ばないため,引数にOSServiceId_Invalidをする
1064 */
1065 if (sus_all_cnt > 0U) {
1066 sus_all_cnt = 0U;
1067 sus_all_cnt_ctx = 0U;
1068 }
1069 if (sus_os_cnt > 0U) {
1070 sus_os_cnt = 0U;
1071 sus_os_cnt_ctx = 0U;
1072 }
1073 x_clear_nested_os_int();
1074 cancel_nontrusted_hook();
1075 /* 自OSAPから呼び出した場合は,呼び出し元に戻らない */
1076 exit_and_dispatch_nohook();
1077 }
1078 else if ((dspflg != FALSE) && ((callevel_stat & ~TCL_TASK) == TCL_NULL)) {
1079 /*他のOSAPのタスクから呼び出し,且つディスパッチが必要な場合 */
1080 dispatch();
1081 }
1082 else {
1083 /* 上記以外の場合は,リターン */
1084 }
1085}
1086
1087#endif /* TOPPERS_internal_term_osap */
Note: See TracBrowser for help on using the repository browser.