source: atk2-sc3-1.4.0-ntisr/arch/logtrace/trace_dump.c

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

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

  • Property svn:executable set to *
File size: 55.8 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2007-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 * Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
20 *
21 * 上記著作権者
22は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
23 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
24 * 変・再é…
25å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
26 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
27 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
28 * スコード中に含まれていること.
29 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
30 * 用できる形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
33 * 者
34マニュアルなど)に,上記の著作権表示,この利用条件および下記
35 * の無保証規定を掲載すること.
36 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
37 * 用できない形で再é…
38å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
39 * と.
40 * (a) 再é…
41å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
42マニュアルなど)に,上記の著
43 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
44 * (b) 再é…
45å¸ƒã®å½¢æ…
46‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
47 * 報告すること.
48 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
49 * 害からも,上記著作権者
50およびTOPPERSプロジェクトをå…
51è²¬ã™ã‚‹ã“と.
52 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
53 * 由に基づく請求からも,上記著作権者
54およびTOPPERSプロジェクトを
55 * å…
56è²¬ã™ã‚‹ã“と.
57 *
58 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
59 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
60 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
61 * 用する者
62に対して,AUTOSARパートナーになることを求めている.
63 *
64 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
65お
66 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
67 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
68 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
69 * の責任を負わない.
70 *
71 * $Id: trace_dump.c 425 2015-12-07 08:06:19Z witz-itoyo $
72 */
73
74/*
75 * トレースログのダンプ
76 */
77
78#include "kernel_impl.h"
79#include "task.h"
80#include "alarm.h"
81#include "scheduletable.h"
82#include "log_output.h"
83#include "Os_Lcfg.h"
84#include "t_stdlib.h" /* atk2_strerror */
85
86/*
87 * 処理単位の種別
88 */
89typedef enum {
90 PR_UNIT_TASK, /* タスク */
91 PR_UNIT_ALARM, /* アラーム満了処理 */
92 PR_UNIT_ISR, /* C2ISR */
93 PR_UNIT_SCHTBL, /* スケジュールテーブル満了処理 */
94 PR_UNIT_STA, /* スタートアップフック */
95 PR_UNIT_ERR, /* エラーフック */
96 PR_UNIT_PRO, /* プロテクションフック */
97 PR_UNIT_SHUT, /* シャットダウンフック */
98 PR_UNIT_TFN, /* 信頼関数 */
99} PR_UNIT_TYPE;
100
101/*
102 * 処理単位のID
103 */
104typedef struct {
105 PR_UNIT_TYPE type; /* 処理単位の種別 */
106 ObjectIDType id; /* 処理単位のID */
107} OBJ_ID;
108
109
110/* 内
111部関数のプロトタイプ宣言 */
112static const char8 *trace_proret_str(ProtectionReturnType ret);
113static const char8 *trace_schtblstatus_str(ScheduleTableStatusType status);
114static const char8 *atk2_task_state_str(TaskStateType state);
115static const char8 *atk2_osap_state_str(ApplicationStateType state);
116static const char8 *atk2_access_str(ObjectAccessType access);
117static uintptr trace_get_tskid(uintptr info);
118static const char8 *trace_print_tskenter(const TRACE *trace, uintptr info[]);
119static const char8 *trace_print_tskleave(const TRACE *trace, uintptr info[]);
120static const char8 *trace_print_evententer(const TRACE *trace, uintptr info[]);
121static const char8 *trace_print_eventleave(const TRACE *trace, uintptr info[]);
122static const char8 *trace_print_resenter(const TRACE *trace, uintptr info[]);
123static const char8 *trace_print_resleave(const TRACE *trace, uintptr info[]);
124static const char8 *trace_print_almenter(const TRACE *trace, uintptr info[]);
125static const char8 *trace_print_almleave(const TRACE *trace, uintptr info[]);
126static const char8 *trace_print_schtblenter(const TRACE *trace, uintptr info[]);
127static const char8 *trace_print_schtblleave(const TRACE *trace, uintptr info[]);
128static const char8 *trace_print_intenter(const TRACE *trace, uintptr info[]);
129static const char8 *trace_print_intleave(const TRACE *trace, uintptr info[]);
130static const char8 *trace_print_sysenter(const TRACE *trace, uintptr info[]);
131static const char8 *trace_print_sysleave(const TRACE *trace, uintptr info[]);
132static const char8 *trace_print_kerenter(const TRACE *trace, uintptr info[], void (*outputc)(char8 c));
133static const char8 *trace_print_osapenter(const TRACE *trace, uintptr info[]);
134static const char8 *trace_print_osapleave(const TRACE *trace, uintptr info[]);
135static const char8 *trace_print_memoryenter(const TRACE *trace, uintptr info[]);
136static void trace_get_memory_access(AccessType access, uintptr info[]);
137static const char8 *trace_print_memoryleave(const TRACE *trace, uintptr info[]);
138static const char8 *trace_print_svcenter(const TRACE *trace, uintptr info[], void (*outputc)(char8 c));
139static const char8 *trace_print_svcleave(const TRACE *trace, uintptr info[]);
140static void trace_set_context(PR_UNIT_TYPE type, ObjectIDType id);
141static void trace_push_context(PR_UNIT_TYPE type, ObjectIDType id);
142static void trace_get_context(uintptr *p_obj_type_str, uintptr *p_id);
143static void trace_pop_context(uintptr *p_obj_type_str, uintptr *p_id);
144static void trace_change_context(PR_UNIT_TYPE type, ObjectIDType id);
145static void trace_resume_context(void);
146static void trace_print(const TRACE *p_trace, void (*outputc)(char8 c));
147static const char8 *trace_print_iocleave(const TRACE *trace, uintptr info[]);
148static const char8 *trace_print_iocenter(const TRACE *trace, uintptr info[]);
149
150/*
151 * プロテクションフックの返り値を文字列変換
152 */
153static const char8 *
154trace_proret_str(ProtectionReturnType ret)
155{
156 const char8 *proretstr;
157
158 switch (ret) {
159 case PRO_IGNORE:
160 proretstr = "IGNORE";
161 break;
162 case PRO_SHUTDOWN:
163 proretstr = "SHUTDOWN";
164 break;
165 default:
166 proretstr = "";
167 break;
168 }
169 return(proretstr);
170}
171
172/*
173 * スケジュールテーブルの状æ…
174‹ã‚’文字列変換
175 */
176static const char8 *
177trace_schtblstatus_str(ScheduleTableStatusType status)
178{
179 const char8 *schtblstr;
180
181 switch (status) {
182 case SCHEDULETABLE_STOPPED:
183 schtblstr = "STOPPED";
184 break;
185 case SCHEDULETABLE_NEXT:
186 schtblstr = "NEXT";
187 break;
188 case SCHEDULETABLE_WAITING:
189 schtblstr = "WAITING";
190 break;
191 case SCHEDULETABLE_RUNNING:
192 schtblstr = "RUNNING";
193 break;
194 case SCHEDULETABLE_RUNNING_AND_SYNCHRONOUS:
195 schtblstr = "RUNNING_AND_SYNCHRONOUS";
196 break;
197 default:
198 schtblstr = "";
199 break;
200 }
201 return(schtblstr);
202}
203
204/*
205 * タスク状æ…
206‹ã‚’文字列変換
207 */
208static const char8 *
209atk2_task_state_str(TaskStateType state)
210{
211 const char8 *taskstatstr;
212
213 switch (state) {
214 case SUSPENDED:
215 taskstatstr = "SUSPENDED";
216 break;
217 case RUNNING:
218 taskstatstr = "RUNNING";
219 break;
220 case READY:
221 taskstatstr = "READY";
222 break;
223 case WAITING:
224 taskstatstr = "WAITING";
225 break;
226 default:
227 taskstatstr = "unknown state";
228 break;
229 }
230 return(taskstatstr);
231}
232
233/*
234 * OSAP状æ…
235‹ã‚’文字列変換
236 */
237static const char8 *
238atk2_osap_state_str(ApplicationStateType state)
239{
240 const char8 *osapstatstr;
241
242 switch (state) {
243 case APPLICATION_ACCESSIBLE:
244 osapstatstr = "ACCESSIBLE";
245 break;
246 case APPLICATION_RESTARTING:
247 osapstatstr = "RESTARTING";
248 break;
249 case APPLICATION_TERMINATED:
250 osapstatstr = "TERMINATED";
251 break;
252 default:
253 osapstatstr = "unknown state";
254 break;
255 }
256 return(osapstatstr);
257}
258
259/*
260 * ObjectAccessTypeを文字列変換
261 */
262static const char8 *
263atk2_access_str(ObjectAccessType access)
264{
265 const char8 *accessstr;
266
267 switch (access) {
268 case ACCESS:
269 accessstr = "ACCESS";
270 break;
271 case NO_ACCESS:
272 accessstr = "NO_ACCESS";
273 break;
274 default:
275 accessstr = "";
276 break;
277 }
278 return(accessstr);
279}
280
281/*
282 * PR_UNIT_TYPEの処理単位種別に対応する文字列
283 */
284static const char8 *obj_type_to_str[] = {
285 "task",
286 "alarm",
287 "isr",
288 "schtbl",
289 "sta",
290 "err",
291 "pro",
292 "shut",
293 "tfn"
294};
295
296/*
297 * 2つの引数の大きい方を返す
298 */
299#define MAX(a, b) ((a) < (b) ? (b) : (a))
300
301/*
302 * 処理単位のネストを管理するスタック
303 */
304static OBJ_ID context_stack[MAX(4U, 1U + TNUM_ISR2)];
305
306/*
307 * タスクが実行しているアラーム満了処理,スケジュールテーブル満了処理,
308 * 信頼関数を管理する
309 * アラーム満了処理はIncrementCounterによりネストする場合がある
310 * スケジュールテーブル満了処理のネストはない
311 */
312static OBJ_ID task_exec[TNUM_TASK][TNUM_ALARM + TNUM_TFN + 1U];
313
314/*
315 * タスクがアラーム満了処理,スケジュールテーブル満了処理,信頼関数を
316 * 実行している場合の,task_exec[task_id][index]のindexを示す
317 * 満了処理を実行していない場合は-1にする
318 */
319static sint32 task_context_index[TNUM_TASK];
320
321/*
322 * task_execのC2ISR版
323 */
324static OBJ_ID isr_exec[TNUM_ISR2][TNUM_ALARM + TNUM_TFN + 1U];
325
326/*
327 * task_context_indexのC2ISR版
328 */
329static sint32 isr_context_index[TNUM_ISR2];
330
331/*
332 * context_stackの現在のインデックス(ネスト数)を示す
333 */
334static uint32 context_index;
335
336/*
337 * tcbからタスクIDを取得
338 */
339static uintptr
340trace_get_tskid(uintptr info)
341{
342 TCB *p_tcb;
343 TaskType tskid;
344
345 p_tcb = (TCB *) info;
346 if (p_tcb == NULL) {
347 tskid = 0U;
348 }
349 else {
350 tskid = TSKID(p_tcb);
351 }
352 return((uintptr) tskid);
353}
354
355
356/*
357 * タスク管理 - å…
358¥å£ãƒ­ã‚°
359 */
360static const char8 *
361trace_print_tskenter(const TRACE *trace, uintptr info[])
362{
363 uint32 type;
364 const char8 *tracemsg;
365
366 type = (const uint32) trace->loginfo[0];
367
368 switch (type) {
369
370 case TFN_ACTIVATETASK:
371 info[0] = (uintptr) atk2_tskid_str((TaskType) trace->loginfo[1]);
372 info[1] = trace->loginfo[1];
373 tracemsg = "enter to ActivateTask TaskID=%s(%d).";
374 break;
375
376 case TFN_TERMINATETASK:
377 tracemsg = "enter to TerminateTask.";
378 break;
379
380 case TFN_CHAINTASK:
381 info[0] = (uintptr) atk2_tskid_str((TaskType) trace->loginfo[1]);
382 info[1] = trace->loginfo[1];
383 tracemsg = "enter to ChainTask TaskID=%s(%d).";
384 break;
385
386 case TFN_SCHEDULE:
387 tracemsg = "enter to Schedule.";
388 break;
389
390 default:
391 tracemsg = "unknown service call";
392 break;
393 }
394
395 return(tracemsg);
396}
397
398
399/*
400 * タスク管理 - 出口ログ
401 */
402static const char8 *
403trace_print_tskleave(const TRACE *trace, uintptr info[])
404{
405 uint32 type;
406 const char8 *tracemsg;
407
408 type = (const uint32) trace->loginfo[0];
409
410 switch (type) {
411
412 case TFN_ACTIVATETASK:
413 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
414 tracemsg = "leave from ActivateTask %s.";
415 break;
416
417 case TFN_TERMINATETASK:
418 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
419 tracemsg = "leave from TerminateTask %s.";
420 break;
421
422 case TFN_CHAINTASK:
423 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
424 tracemsg = "leave from ChainTask %s.";
425 break;
426
427 case TFN_SCHEDULE:
428 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
429 tracemsg = "leave from Schedule %s.";
430 break;
431
432 default:
433 tracemsg = "unknown tsk service call";
434 break;
435 }
436
437 return(tracemsg);
438}
439
440
441/*
442 * イベント機能 - å…
443¥å£ãƒ­ã‚°
444 */
445static const char8 *
446trace_print_evententer(const TRACE *trace, uintptr info[])
447{
448 uint32 type;
449 const char8 *tracemsg;
450
451 type = (const uint32) trace->loginfo[0];
452
453 switch (type) {
454 case TFN_SETEVENT:
455 info[0] = (uintptr) atk2_tskid_str((TaskType) trace->loginfo[1]);
456 info[1] = trace->loginfo[1];
457 info[2] = (uintptr) atk2_evtid_str((TaskType) trace->loginfo[1], (EventMaskType) trace->loginfo[2]);
458 info[3] = trace->loginfo[2];
459 tracemsg = "enter to SetEvent TaskID=%s(%d)/Mask=%s(0x%x).";
460 break;
461
462 case TFN_CLEAREVENT:
463 info[0] = (uintptr) atk2_evtid_str((TaskType) trace_get_tskid(trace->loginfo[1]), (EventMaskType) trace->loginfo[2]);
464 info[1] = trace->loginfo[2];
465 tracemsg = "enter to ClearEvent Mask=%s(0x%x).";
466 break;
467
468 case TFN_GETEVENT:
469 info[0] = (uintptr) atk2_tskid_str((TaskType) trace->loginfo[1]);
470 info[1] = trace->loginfo[1];
471 tracemsg = "enter to GetEvent TaskID=%s(%d).";
472 break;
473
474 case TFN_WAITEVENT:
475 info[0] = (uintptr) atk2_evtid_str((TaskType) trace_get_tskid(trace->loginfo[1]), (EventMaskType) trace->loginfo[2]);
476 info[1] = trace->loginfo[2];
477 tracemsg = "enter to WaitEvent Mask=%s(0x%x).";
478 break;
479
480 default:
481 tracemsg = "unknown service call";
482 break;
483 }
484
485 return(tracemsg);
486}
487
488
489/*
490 * イベント機能 - 出口ログ
491 */
492static const char8 *
493trace_print_eventleave(const TRACE *trace, uintptr info[])
494{
495 uint32 type;
496 const char8 *tracemsg;
497
498 type = (const uint32) trace->loginfo[0];
499
500 switch (type) {
501 case TFN_SETEVENT:
502 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
503 tracemsg = "leave from SetEvent %s.";
504 break;
505
506 case TFN_CLEAREVENT:
507 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
508 tracemsg = "leave from ClearEvent %s.";
509 break;
510
511 case TFN_GETEVENT:
512 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
513 /* 返り値がE_OKの場合のみ,有効値がå…
514¥ã‚‹ */
515 if (trace->loginfo[1] == E_OK) {
516 info[1] = (uintptr) atk2_evtid_str((TaskType) trace->loginfo[2], (EventMaskType) trace->loginfo[3]);
517 info[2] = trace->loginfo[3];
518 tracemsg = "leave from GetEvent %s/Mask=%s(0x%x).";
519 }
520 else {
521 tracemsg = "leave from GetEvent %s.";
522 }
523 break;
524
525 case TFN_WAITEVENT:
526 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
527 tracemsg = "leave from WaitEvent %s.";
528 break;
529
530 default:
531 tracemsg = "unknown servic call";
532 break;
533 }
534
535 return(tracemsg);
536}
537
538
539/*
540 * リソース機能 - å…
541¥å£ãƒ­ã‚°
542 */
543static const char8 *
544trace_print_resenter(const TRACE *trace, uintptr info[])
545{
546 uint32 type;
547 const char8 *tracemsg;
548
549 type = (const uint32) trace->loginfo[0];
550
551 switch (type) {
552 case TFN_GETRESOURCE:
553 info[0] = (uintptr) atk2_resid_str((ResourceType) trace->loginfo[1]);
554 info[1] = trace->loginfo[1];
555 tracemsg = "enter to GetResource ResID=%s(%d).";
556 break;
557
558 case TFN_RELEASERESOURCE:
559 info[0] = (uintptr) atk2_resid_str((ResourceType) trace->loginfo[1]);
560 info[1] = trace->loginfo[1];
561 tracemsg = "enter to ReleaseResource ResID=%s(%d).";
562 break;
563
564 default:
565 tracemsg = "unknown service call";
566 break;
567 }
568
569 return(tracemsg);
570}
571
572
573/*
574 * リソース機能 - 出口ログ
575 */
576static const char8 *
577trace_print_resleave(const TRACE *trace, uintptr info[])
578{
579 uint32 type;
580 const char8 *tracemsg;
581
582 type = (const uint32) trace->loginfo[0];
583
584 switch (type) {
585 case TFN_GETRESOURCE:
586 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
587 tracemsg = "leave from GetResource %s.";
588 break;
589
590 case TFN_RELEASERESOURCE:
591 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
592 tracemsg = "leave from ReleaseResource %s.";
593 break;
594
595 default:
596 tracemsg = "unknown servic call";
597 break;
598 }
599
600 return(tracemsg);
601}
602
603/*
604 * アラーム機能 - å…
605¥å£ãƒ­ã‚°
606 */
607static const char8 *
608trace_print_almenter(const TRACE *trace, uintptr info[])
609{
610 uint32 type;
611 const char8 *tracemsg;
612
613 type = (const uint32) trace->loginfo[0];
614
615 switch (type) {
616 case TFN_GETALARMBASE:
617 info[0] = (uintptr) atk2_almid_str((AlarmType) trace->loginfo[1]);
618 info[1] = trace->loginfo[1];
619 tracemsg = "enter to GetAlarmBase AlarmID=%s(%d).";
620 break;
621
622 case TFN_GETALARM:
623 info[0] = (uintptr) atk2_almid_str((AlarmType) trace->loginfo[1]);
624 info[1] = trace->loginfo[1];
625 tracemsg = "enter to GetAlarm AlarmID=%s(%d).";
626 break;
627
628 case TFN_SETRELALARM:
629 info[0] = (uintptr) atk2_almid_str((AlarmType) trace->loginfo[1]);
630 info[1] = trace->loginfo[1];
631 info[2] = trace->loginfo[2];
632 info[3] = trace->loginfo[3];
633 tracemsg = "enter to SetRelAlarm AlarmID=%s(%d)/increment=%d/cycle=%d.";
634 break;
635
636 case TFN_SETABSALARM:
637 info[0] = (uintptr) atk2_almid_str((AlarmType) trace->loginfo[1]);
638 info[1] = trace->loginfo[1];
639 info[2] = trace->loginfo[2];
640 info[3] = trace->loginfo[3];
641 tracemsg = "enter to SetAbsAlarm AlarmID=%s(%d)/start=%d/cycle=%d.";
642 break;
643
644 case TFN_CANCELALARM:
645 info[0] = (uintptr) atk2_almid_str((AlarmType) trace->loginfo[1]);
646 info[1] = trace->loginfo[1];
647 tracemsg = "enter to CancelAlarm AlarmID=%s(%d).";
648 break;
649
650 case TFN_INCREMENTCOUNTER:
651 info[0] = (uintptr) atk2_cntid_str((CounterType) trace->loginfo[1]);
652 info[1] = trace->loginfo[1];
653 tracemsg = "enter to IncrementCounter CounterID=%s(%d).";
654 break;
655
656 case TFN_GETCOUNTERVALUE:
657 info[0] = (uintptr) atk2_cntid_str((CounterType) trace->loginfo[1]);
658 info[1] = trace->loginfo[1];
659 tracemsg = "enter to GetCounterValue CounterID=%s(%d).";
660 break;
661
662 case TFN_GETELAPSEDVALUE:
663 info[0] = (uintptr) atk2_cntid_str((CounterType) trace->loginfo[1]);
664 info[1] = trace->loginfo[1];
665 info[2] = trace->loginfo[2];
666 tracemsg = "enter to GetElapsedValue CounterID=%s(%d) Value=%d.";
667 break;
668
669 default:
670 tracemsg = "unknown service call";
671 break;
672 }
673
674 return(tracemsg);
675}
676
677
678/*
679 * アラーム機能 - 出口ログ
680 */
681static const char8 *
682trace_print_almleave(const TRACE *trace, uintptr info[])
683{
684 uint32 type;
685 const char8 *tracemsg;
686
687 type = (const uint32) trace->loginfo[0];
688
689 switch (type) {
690 case TFN_GETALARMBASE:
691 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
692 /* 返り値がE_OKの場合のみ,有効値がå…
693¥ã‚‹ */
694 if (trace->loginfo[1] == E_OK) {
695 info[1] = trace->loginfo[2];
696 info[2] = trace->loginfo[3];
697 info[3] = trace->loginfo[4];
698 tracemsg = "leave from GetAlarmBase %s/maxval=%d/tickbase=%d/mincyc=%d.";
699 }
700 else {
701 tracemsg = "leave from GetAlarmBase %s.";
702 }
703 break;
704
705 case TFN_GETALARM:
706 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
707 /* 返り値がE_OKの場合のみ,有効値がå…
708¥ã‚‹ */
709 if (trace->loginfo[1] == E_OK) {
710 info[1] = trace->loginfo[2];
711 tracemsg = "leave from GetAlarm %s/Tick=%d.";
712 }
713 else {
714 tracemsg = "leave from GetAlarm %s.";
715 }
716 break;
717
718 case TFN_SETRELALARM:
719 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
720 tracemsg = "leave from SetRelAlarm %s.";
721 break;
722
723 case TFN_SETABSALARM:
724 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
725 tracemsg = "leave from SetAbsAlarm %s.";
726 break;
727
728 case TFN_CANCELALARM:
729 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
730 tracemsg = "leave from CancelAlarm %s.";
731 break;
732
733 case TFN_INCREMENTCOUNTER:
734 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
735 tracemsg = "leave from IncrementCounter %s.";
736 break;
737
738 case TFN_GETCOUNTERVALUE:
739 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
740 /* 返り値がE_OKの場合のみ,有効値がå…
741¥ã‚‹ */
742 if (trace->loginfo[1] == E_OK) {
743 info[1] = trace->loginfo[2];
744 tracemsg = "leave from GetCounterValue %s/Value=%d.";
745 }
746 else {
747 tracemsg = "leave from GetCounterValue %s.";
748 }
749 break;
750
751 case TFN_GETELAPSEDVALUE:
752 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
753 /* 返り値がE_OKの場合のみ,有効値がå…
754¥ã‚‹ */
755 if (trace->loginfo[1] == E_OK) {
756 info[1] = trace->loginfo[2];
757 info[2] = trace->loginfo[3];
758 tracemsg = "leave from GetElapsedValue %s/Value=%d/ElapsedValue=%d.";
759 }
760 else {
761 tracemsg = "leave from GetElapsedValue %s.";
762 }
763 break;
764
765 default:
766 tracemsg = "unknown servic call";
767 break;
768 }
769
770 return(tracemsg);
771}
772
773/*
774 * スケジュールテーブル機能 - å…
775¥å£ãƒ­ã‚°
776 */
777static const char8 *
778trace_print_schtblenter(const TRACE *trace, uintptr info[])
779{
780 uint32 type;
781 const char8 *tracemsg;
782
783 type = (const uint32) trace->loginfo[0];
784
785 switch (type) {
786 case TFN_STARTSCHEDULETABLEREL:
787 info[0] = (uintptr) atk2_schtblid_str((ScheduleTableType) trace->loginfo[1]);
788 info[1] = trace->loginfo[1];
789 info[2] = trace->loginfo[2];
790 tracemsg = "enter to StartScheduleTableRel SchtblID=%s(%d)/offset=%d.";
791 break;
792
793 case TFN_STARTSCHEDULETABLEABS:
794 info[0] = (uintptr) atk2_schtblid_str((ScheduleTableType) trace->loginfo[1]);
795 info[1] = trace->loginfo[1];
796 info[2] = trace->loginfo[2];
797 tracemsg = "enter to StartScheduleTableAbs SchtblID=%s(%d)/start=%d.";
798 break;
799
800 case TFN_STOPSCHEDULETABLE:
801 info[0] = (uintptr) atk2_schtblid_str((ScheduleTableType) trace->loginfo[1]);
802 info[1] = trace->loginfo[1];
803 tracemsg = "enter to StopScheduleTable SchtblID=%s(%d).";
804 break;
805
806 case TFN_NEXTSCHEDULETABLE:
807 info[0] = (uintptr) atk2_schtblid_str((ScheduleTableType) trace->loginfo[1]);
808 info[1] = trace->loginfo[1];
809 info[2] = (uintptr) atk2_schtblid_str((ScheduleTableType) trace->loginfo[2]);
810 info[3] = trace->loginfo[2];
811 tracemsg = "enter to NextScheduleTable From_ID=%s(%d)/To_ID=%s(%d).";
812 break;
813
814 case TFN_GETSCHEDULETABLESTATUS:
815 info[0] = (uintptr) atk2_schtblid_str((ScheduleTableType) trace->loginfo[1]);
816 info[1] = trace->loginfo[1];
817 tracemsg = "enter to GetScheduleTableStatus SchtblID=%s(%d).";
818 break;
819
820 default:
821 tracemsg = "unknown service call";
822 break;
823 }
824
825 return(tracemsg);
826}
827
828/*
829 * スケジュールテーブル - 出口ログ
830 */
831static const char8 *
832trace_print_schtblleave(const TRACE *trace, uintptr info[])
833{
834 uint32 type;
835 const char8 *tracemsg;
836
837 type = (const uint32) trace->loginfo[0];
838
839 switch (type) {
840 case TFN_STARTSCHEDULETABLEREL:
841 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
842 tracemsg = "leave from StartScheduleTableRel %s.";
843 break;
844
845 case TFN_STARTSCHEDULETABLEABS:
846 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
847 tracemsg = "leave from StartScheduleTableAbs %s.";
848 break;
849
850 case TFN_STOPSCHEDULETABLE:
851 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
852 tracemsg = "leave from StopScheduleTable %s.";
853 break;
854
855 case TFN_NEXTSCHEDULETABLE:
856 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
857 tracemsg = "leave from NextScheduleTable %s.";
858 break;
859
860 case TFN_GETSCHEDULETABLESTATUS:
861 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
862 /* 返り値がE_OKの場合のみ,有効値がå…
863¥ã‚‹ */
864 if (trace->loginfo[1] == E_OK) {
865 info[1] = (uintptr) trace_schtblstatus_str((ScheduleTableStatusType) trace->loginfo[2]);
866 tracemsg = "leave from GetScheduleTableStatus %s/status=%s.";
867 }
868 else {
869 tracemsg = "leave from GetScheduleTableStatus %s.";
870 }
871 break;
872
873 default:
874 tracemsg = "unknown servic call";
875 break;
876 }
877
878 return(tracemsg);
879}
880
881/*
882 * 割込み管理機能 - å…
883¥å£ãƒ­ã‚°
884 */
885static const char8 *
886trace_print_intenter(const TRACE *trace, uintptr info[])
887{
888 uint32 type;
889 const char8 *tracemsg;
890
891 type = (const uint32) trace->loginfo[0];
892
893 switch (type) {
894 case TFN_DISABLEALLINTERRUPTS:
895 tracemsg = "enter to DisableAllInterrupts.";
896 break;
897
898 case TFN_SUSPENDALLINTERRUPTS:
899 tracemsg = "enter to SuspendAllInterrupts.";
900 break;
901
902 case TFN_SUSPENDOSINTERRUPTS:
903 tracemsg = "enter to SuspendOSInterrupts.";
904 break;
905
906 case TFN_ENABLEALLINTERRUPTS:
907 tracemsg = "enter to EnableAllInterrupts.";
908 break;
909
910 case TFN_RESUMEALLINTERRUPTS:
911 tracemsg = "enter to ResumeAllInterrupts.";
912 break;
913
914 case TFN_RESUMEOSINTERRUPTS:
915 tracemsg = "enter to ResumeOSInterrupts.";
916 break;
917
918 case TFN_GETISRID:
919 tracemsg = "enter to GetISRID.";
920 break;
921
922 case TFN_DISABLEINTERRUPTSOURCE:
923 info[0] = (uintptr) atk2_isrid_str((ISRType) trace->loginfo[1]);
924 info[1] = trace->loginfo[1];
925 tracemsg = "enter to DisableInterruptSource ISRID=%s(%d).";
926 break;
927
928 case TFN_ENABLEINTERRUPTSOURCE:
929 info[0] = (uintptr) atk2_isrid_str((ISRType) trace->loginfo[1]);
930 info[1] = trace->loginfo[1];
931 tracemsg = "enter to EnableInterruptSource ISRID=%s(%d).";
932 break;
933
934 default:
935 tracemsg = "unknown service call";
936 break;
937 }
938
939 return(tracemsg);
940}
941
942
943/*
944 * 割込み管理機能 - 出口ログ
945 */
946static const char8 *
947trace_print_intleave(const TRACE *trace, uintptr info[])
948{
949 uint32 type;
950 const char8 *tracemsg;
951
952 type = (const uint32) trace->loginfo[0];
953
954 switch (type) {
955 case TFN_DISABLEALLINTERRUPTS:
956 tracemsg = "leave from DisableAllInterrupts.";
957 break;
958
959 case TFN_SUSPENDALLINTERRUPTS:
960 tracemsg = "leave from SuspendAllInterrupts.";
961 break;
962
963 case TFN_SUSPENDOSINTERRUPTS:
964 tracemsg = "leave from SuspendOSInterrupts.";
965 break;
966
967 case TFN_ENABLEALLINTERRUPTS:
968 tracemsg = "leave from EnableAllInterrupts.";
969 break;
970
971 case TFN_RESUMEALLINTERRUPTS:
972 tracemsg = "leave from ResumeAllInterrupts.";
973 break;
974
975 case TFN_RESUMEOSINTERRUPTS:
976 tracemsg = "leave from ResumeOSInterrupts.";
977 break;
978
979 case TFN_GETISRID:
980 info[0] = (uintptr) atk2_isrid_str((ISRType) trace->loginfo[1]);
981 info[1] = (const uintptr) trace->loginfo[1];
982 tracemsg = "leave from GetISRID id=%s(%d).";
983 break;
984
985 case TFN_DISABLEINTERRUPTSOURCE:
986 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
987 tracemsg = "leave from DisableInterruptSource %s.";
988 break;
989
990 case TFN_ENABLEINTERRUPTSOURCE:
991 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
992 tracemsg = "leave from EnableInterruptSource %s.";
993 break;
994
995 default:
996 tracemsg = "unknown servic call";
997 break;
998 }
999
1000 return(tracemsg);
1001}
1002
1003
1004/*
1005 * システム状æ…
1006‹ç®¡ç†æ©Ÿèƒ½ - å…
1007¥å£ãƒ­ã‚°
1008 */
1009static const char8 *
1010trace_print_sysenter(const TRACE *trace, uintptr info[])
1011{
1012 uint32 type;
1013 const char8 *tracemsg;
1014
1015 type = (const uint32) trace->loginfo[0];
1016
1017 switch (type) {
1018 case TFN_GETTASKID:
1019 tracemsg = "enter to GetTaskID.";
1020 break;
1021
1022 case TFN_GETTASKSTATE:
1023 info[0] = (uintptr) atk2_tskid_str((TaskType) trace->loginfo[1]);
1024 info[1] = trace->loginfo[1];
1025 tracemsg = "enter to GetTaskState TaskID=%s(%d).";
1026 break;
1027
1028 case TFN_GETACTIVEAPPLICATIONMODE:
1029 tracemsg = "enter to GetActiveApplicationMode.";
1030 break;
1031
1032 default:
1033 tracemsg = "unknown servic call";
1034 break;
1035 }
1036
1037 return(tracemsg);
1038}
1039
1040
1041/*
1042 * システム状æ…
1043‹ç®¡ç†æ©Ÿèƒ½ - 出口ログ
1044 */
1045static const char8 *
1046trace_print_sysleave(const TRACE *trace, uintptr info[])
1047{
1048 uint32 type;
1049 const char8 *tracemsg;
1050
1051 type = (const uint32) trace->loginfo[0];
1052
1053 switch (type) {
1054 case TFN_GETTASKID:
1055 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
1056 /* 返り値がE_OKの場合のみ,有効値がå…
1057¥ã‚‹ */
1058 if (trace->loginfo[1] == E_OK) {
1059 info[1] = (uintptr) atk2_tskid_str(trace->loginfo[2]);
1060 tracemsg = "leave from GetTaskID %s/TaskID=%s.";
1061 }
1062 else {
1063 tracemsg = "leave from GetTaskID %s.";
1064 }
1065 break;
1066
1067 case TFN_GETTASKSTATE:
1068 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
1069 /* 返り値がE_OKの場合のみ,有効値がå…
1070¥ã‚‹ */
1071 if (trace->loginfo[1] == E_OK) {
1072 info[1] = (uintptr) atk2_task_state_str((TaskStateType) trace->loginfo[2]);
1073 tracemsg = "leave from GetTaskState %s/State=%s.";
1074 }
1075 else {
1076 tracemsg = "leave from GetTaskState %s.";
1077 }
1078 break;
1079
1080 case TFN_GETACTIVEAPPLICATIONMODE:
1081 info[0] = (uintptr) atk2_appid_str((AppModeType) trace->loginfo[1]);
1082 info[1] = trace->loginfo[1];
1083 tracemsg = "leave from GetActiveApplicationMode mode=%s(%d).";
1084 break;
1085
1086 default:
1087 tracemsg = "unknown servic call";
1088 break;
1089 }
1090
1091 return(tracemsg);
1092}
1093
1094
1095/*
1096 * カーネルの初期化と終了処理
1097 */
1098static const char8 *
1099trace_print_kerenter(const TRACE *trace, uintptr info[], void (*outputc)(char8 c))
1100{
1101 uint32 type;
1102 const char8 *tracemsg;
1103 uintptr traceinfo[TMAX_LOGINFO + 1U];
1104 uint32 i;
1105
1106 type = (const uint32) trace->loginfo[0];
1107
1108 /* シャットダウン時にすべてのタスクがSUSPENDED状æ…
1109‹ã¨ãªã‚‹ã‚ˆã†ã«ã™ã‚‹ */
1110 for (i = 0U; i < TNUM_TASK; i++) {
1111 traceinfo[0] = (uintptr) i;
1112 syslog_printf("task %d becomes SUSPENDED.\n", traceinfo, outputc);
1113 traceinfo[0] = (uintptr) (trace->logtim);
1114 syslog_printf("[%d] ", traceinfo, outputc);
1115 }
1116
1117 if (type == TFN_SHUTDOWNOS) {
1118 info[0] = trace->loginfo[1];
1119 tracemsg = "enter to ShutdownOS Error=%d.";
1120 }
1121 else {
1122 tracemsg = "unknown service call";
1123 }
1124
1125 return(tracemsg);
1126}
1127
1128/*
1129 * OSAP機能 - å…
1130¥å£ãƒ­ã‚°
1131 */
1132static const char8 *
1133trace_print_osapenter(const TRACE *trace, uintptr info[])
1134{
1135 uint32 type;
1136 const char8 *tracemsg;
1137
1138 type = (const uint32) trace->loginfo[0];
1139
1140 switch (type) {
1141 case TFN_GETAPPLICATIONID:
1142 tracemsg = "enter to GetApplicationID.";
1143 break;
1144
1145 case TFN_GETAPPLICATIONSTATE:
1146 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1147 info[1] = trace->loginfo[1];
1148 tracemsg = "enter to GetApplicationState OsapID=%s(%d).";
1149 break;
1150
1151 case TFN_CALLTRUSTEDFUNCTION:
1152 info[0] = (uintptr) atk2_tfnid_str((TrustedFunctionIndexType) trace->loginfo[1]);
1153 info[1] = trace->loginfo[1];
1154 tracemsg = "enter to CallTrustedFunction FunctionID=%s(%d).";
1155 break;
1156
1157 case TFN_CHECKTASKACCESS:
1158 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1159 info[1] = trace->loginfo[1];
1160 info[2] = (uintptr) atk2_tskid_str((TaskType) trace->loginfo[2]);
1161 info[3] = trace->loginfo[2];
1162 tracemsg = "enter to CheckTaskAccess ApplID=%s(%d)/TaskID=%s(%d).";
1163 break;
1164
1165 case TFN_CHECKISRACCESS:
1166 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1167 info[1] = trace->loginfo[1];
1168 info[2] = (uintptr) atk2_isrid_str((ISRType) trace->loginfo[2]);
1169 info[3] = trace->loginfo[2];
1170 tracemsg = "enter to CheckISRAccess ApplID=%s(%d)/ISRID=%s(%d).";
1171 break;
1172
1173 case TFN_CHECKALARMACCESS:
1174 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1175 info[1] = trace->loginfo[1];
1176 info[2] = (uintptr) atk2_almid_str((AlarmType) trace->loginfo[2]);
1177 info[3] = trace->loginfo[2];
1178 tracemsg = "enter to CheckAlarmAccess ApplID=%s(%d)/AlarmID=%s(%d).";
1179 break;
1180
1181 case TFN_CHECKRESOURCEACCESS:
1182 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1183 info[1] = trace->loginfo[1];
1184 info[2] = (uintptr) atk2_resid_str((ResourceType) trace->loginfo[2]);
1185 info[3] = trace->loginfo[2];
1186 tracemsg = "enter to CheckResourceAccess ApplID=%s(%d)/ResID=%s(%d).";
1187 break;
1188
1189 case TFN_CHECKCOUNTERACCESS:
1190 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1191 info[1] = trace->loginfo[1];
1192 info[2] = (uintptr) atk2_cntid_str((CounterType) trace->loginfo[2]);
1193 info[3] = trace->loginfo[2];
1194 tracemsg = "enter to CheckCounterAccess ApplID=%s(%d)/CounterID=%s(%d).";
1195 break;
1196
1197 case TFN_CHECKSCHEDULETABLEACCESS:
1198 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1199 info[1] = trace->loginfo[1];
1200 info[2] = (uintptr) atk2_schtblid_str((ScheduleTableType) trace->loginfo[2]);
1201 info[3] = trace->loginfo[2];
1202 tracemsg = "enter to CheckScheduleTableAccess ApplID=%s(%d)/ScheduleTableID=%s(%d).";
1203 break;
1204
1205 case TFN_CHECKTASKOWNERSHIP:
1206 info[0] = (uintptr) atk2_tskid_str((TaskType) trace->loginfo[1]);
1207 info[1] = trace->loginfo[1];
1208 tracemsg = "enter to CheckTaskOwnership TaskID=%s(%d).";
1209 break;
1210
1211 case TFN_CHECKISROWNERSHIP:
1212 info[0] = (uintptr) atk2_isrid_str((ISRType) trace->loginfo[1]);
1213 info[1] = trace->loginfo[1];
1214 tracemsg = "enter to CheckISROwnership ISRID=%s(%d).";
1215 break;
1216
1217 case TFN_CHECKALARMOWNERSHIP:
1218 info[0] = (uintptr) atk2_almid_str((AlarmType) trace->loginfo[1]);
1219 info[1] = trace->loginfo[1];
1220 tracemsg = "enter to CheckAlarmOwnership AlarmID=%s(%d).";
1221 break;
1222
1223 case TFN_CHECKCOUNTEROWNERSHIP:
1224 info[0] = (uintptr) atk2_cntid_str((CounterType) trace->loginfo[1]);
1225 info[1] = trace->loginfo[1];
1226 tracemsg = "enter to CheckCounterOwnership CounterID=%s(%d).";
1227 break;
1228
1229 case TFN_CHECKSCHEDULETABLEOWNERSHIP:
1230 info[0] = (uintptr) atk2_schtblid_str((ScheduleTableType) trace->loginfo[1]);
1231 info[1] = trace->loginfo[1];
1232 tracemsg = "enter to CheckScheduleTableOwnership ScheduleTableID=%s(%d).";
1233 break;
1234
1235 default:
1236 tracemsg = "unknown service call";
1237 break;
1238 }
1239
1240 return(tracemsg);
1241}
1242
1243
1244/*
1245 * OSAP機能 - 出口ログ
1246 */
1247static const char8 *
1248trace_print_osapleave(const TRACE *trace, uintptr info[])
1249{
1250 uint32 type;
1251 const char8 *tracemsg;
1252
1253 type = (const uint32) trace->loginfo[0];
1254
1255 switch (type) {
1256 case TFN_GETAPPLICATIONID:
1257 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1258 info[1] = trace->loginfo[1];
1259 tracemsg = "leave from GetApplicationID id=%s.";
1260 break;
1261
1262 case TFN_GETAPPLICATIONSTATE:
1263 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
1264 /* 返り値がE_OKの場合のみ,有効値がå…
1265¥ã‚‹ */
1266 if (trace->loginfo[1] == E_OK) {
1267 info[1] = (uintptr) atk2_osap_state_str((ApplicationStateType) trace->loginfo[2]);
1268 tracemsg = "leave from GetApplicationState %s/state=%s.";
1269 }
1270 else {
1271 tracemsg = "leave from GetApplicationState %s.";
1272 }
1273 break;
1274
1275 case TFN_CALLTRUSTEDFUNCTION:
1276 info[0] = (uintptr) atk2_strerror((StatusType) trace->loginfo[1]);
1277 info[1] = trace->loginfo[1];
1278 tracemsg = "leave from CallTrustedFunction %s(%d).";
1279 break;
1280
1281 case TFN_CHECKTASKACCESS:
1282 info[0] = (uintptr) atk2_access_str((ObjectAccessType) trace->loginfo[1]);
1283 tracemsg = "leave from CheckTaskAccess %s.";
1284 break;
1285
1286 case TFN_CHECKISRACCESS:
1287 info[0] = (uintptr) atk2_access_str((ObjectAccessType) trace->loginfo[1]);
1288 tracemsg = "leave from CheckISRAccess %s.";
1289 break;
1290
1291 case TFN_CHECKALARMACCESS:
1292 info[0] = (uintptr) atk2_access_str((ObjectAccessType) trace->loginfo[1]);
1293 tracemsg = "leave from CheckAlarmAccess %s.";
1294 break;
1295
1296 case TFN_CHECKRESOURCEACCESS:
1297 info[0] = (uintptr) atk2_access_str((ObjectAccessType) trace->loginfo[1]);
1298 tracemsg = "leave from CheckResourceAccess %s.";
1299 break;
1300
1301 case TFN_CHECKCOUNTERACCESS:
1302 info[0] = (uintptr) atk2_access_str((ObjectAccessType) trace->loginfo[1]);
1303 tracemsg = "leave from CheckCounterAccess %s.";
1304 break;
1305
1306 case TFN_CHECKSCHEDULETABLEACCESS:
1307 info[0] = (uintptr) atk2_access_str((ObjectAccessType) trace->loginfo[1]);
1308 tracemsg = "leave from CheckScheduleTableAccess %s.";
1309 break;
1310
1311 case TFN_CHECKTASKOWNERSHIP:
1312 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1313 tracemsg = "leave from CheckTaskOwnership %s.";
1314 break;
1315
1316 case TFN_CHECKISROWNERSHIP:
1317 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1318 tracemsg = "leave from CheckISROwnership %s.";
1319 break;
1320
1321 case TFN_CHECKALARMOWNERSHIP:
1322 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1323 tracemsg = "leave from CheckAlarmOwnership %s.";
1324 break;
1325
1326 case TFN_CHECKCOUNTEROWNERSHIP:
1327 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1328 tracemsg = "leave from CheckCounterOwnership %s.";
1329 break;
1330
1331 case TFN_CHECKSCHEDULETABLEOWNERSHIP:
1332 info[0] = (uintptr) atk2_osapid_str((ApplicationType) trace->loginfo[1]);
1333 tracemsg = "leave from CheckScheduleTableOwnership %s.";
1334 break;
1335
1336 default:
1337 tracemsg = "unknown servic call";
1338 break;
1339 }
1340
1341 return(tracemsg);
1342}
1343
1344
1345/*
1346 * IOC - å…
1347¥å£ãƒ­ã‚°
1348 */
1349static const char8 *
1350trace_print_iocenter(const TRACE *trace, uintptr info[])
1351{
1352 uint32 type;
1353 const char8 *tracemsg;
1354
1355 type = (const uint32) trace->loginfo[0];
1356
1357 switch (type) {
1358
1359 case TFN_IOC_SEND_GENERIC:
1360 info[0] = trace->loginfo[1];
1361 tracemsg = "enter to IocSend Sender ID=%d.";
1362 break;
1363
1364 case TFN_IOC_WRITE_GENERIC:
1365 info[0] = trace->loginfo[1];
1366 tracemsg = "enter to IocWrite Sender ID=%d.";
1367 break;
1368
1369 case TFN_IOC_RECEIVE_GENERIC:
1370 info[0] = (uintptr) atk2_iocid_str((IocType) trace->loginfo[1]);
1371 info[1] = trace->loginfo[1];
1372 tracemsg = "enter to IocReceive IOC ID=%s(%d).";
1373 break;
1374
1375 case TFN_IOC_READ_GENERIC:
1376 info[0] = (uintptr) atk2_iocid_str((IocType) trace->loginfo[1]);
1377 info[1] = trace->loginfo[1];
1378 tracemsg = "enter to IocRead IOC ID=%s(%d).";
1379 break;
1380
1381 case TFN_IOC_EMPTY_QUEUE_GENERIC:
1382 info[0] = (uintptr) atk2_iocid_str((IocType) trace->loginfo[1]);
1383 info[1] = trace->loginfo[1];
1384 tracemsg = "enter to IocEmptyQueue IOC ID=%s(%d).";
1385 break;
1386
1387 default:
1388 tracemsg = "unknown service call";
1389 break;
1390 }
1391
1392 return(tracemsg);
1393}
1394
1395
1396/*
1397 * IOC - 出口ログ
1398 */
1399static const char8 *
1400trace_print_iocleave(const TRACE *trace, uintptr info[])
1401{
1402 uint32 type;
1403 const char8 *tracemsg;
1404
1405 type = (const uint32) trace->loginfo[0];
1406
1407 switch (type) {
1408
1409 case TFN_IOC_SEND_GENERIC:
1410 info[0] = (uintptr) atk2_ioc_strerror((StatusType) trace->loginfo[1]);
1411 tracemsg = "leave from IocSend %s.";
1412 break;
1413
1414 case TFN_IOC_WRITE_GENERIC:
1415 info[0] = (uintptr) atk2_ioc_strerror((StatusType) trace->loginfo[1]);
1416 tracemsg = "leave from IocWrite %s.";
1417 break;
1418
1419 case TFN_IOC_RECEIVE_GENERIC:
1420 info[0] = (uintptr) atk2_ioc_strerror((StatusType) trace->loginfo[1]);
1421 tracemsg = "leave from IocReceive %s.";
1422 break;
1423
1424 case TFN_IOC_READ_GENERIC:
1425 info[0] = (uintptr) atk2_ioc_strerror((StatusType) trace->loginfo[1]);
1426 tracemsg = "leave from IocRead %s.";
1427 break;
1428
1429 case TFN_IOC_EMPTY_QUEUE_GENERIC:
1430 info[0] = (uintptr) atk2_ioc_strerror((StatusType) trace->loginfo[1]);
1431 tracemsg = "leave from IocEmptyQueue %s.";
1432 break;
1433
1434 default:
1435 tracemsg = "unknown tsk service call";
1436 break;
1437 }
1438
1439 return(tracemsg);
1440}
1441
1442/*
1443 * メモリアクセス関連機能 - å…
1444¥å£ãƒ­ã‚°
1445 */
1446static const char8 *
1447trace_print_memoryenter(const TRACE *trace, uintptr info[])
1448{
1449 uint32 type;
1450 const char8 *tracemsg;
1451
1452 type = (const uint32) trace->loginfo[0];
1453
1454 switch (type) {
1455 case TFN_CHECKISRMEMORYACCESS:
1456 info[0] = (uintptr) atk2_isrid_str((ISRType) trace->loginfo[1]);
1457 info[1] = trace->loginfo[1];
1458 info[2] = trace->loginfo[2];
1459 info[3] = trace->loginfo[3];
1460 tracemsg = "enter to CheckISRMemoryAccess ISRID=%s(%d)/Address=0x%x/Size=0x%x.";
1461 break;
1462
1463 case TFN_CHECKTASKMEMORYACCESS:
1464 info[0] = (uintptr) atk2_isrid_str((ISRType) trace->loginfo[1]);
1465 info[1] = trace->loginfo[1];
1466 info[2] = trace->loginfo[2];
1467 info[3] = trace->loginfo[3];
1468 tracemsg = "enter to CheckTaskMemoryAccess TaskID=%s(%d)/Address=0x%x/Size=0x%x.";
1469 break;
1470
1471 default:
1472 tracemsg = "unknown servic call";
1473 break;
1474 }
1475
1476 return(tracemsg);
1477}
1478
1479/*
1480 * AccessTypeを文字列変換
1481 */
1482static void
1483trace_get_memory_access(AccessType access, uintptr info[])
1484{
1485 boolean add_slash = FALSE;
1486
1487 info[0] = (uintptr) "";
1488 info[1] = (uintptr) "";
1489 info[2] = (uintptr) "";
1490 info[3] = (uintptr) "";
1491
1492 if (OSMEMORY_IS_STACKSPACE(access) != AP_NoAccess) {
1493 info[3] = (uintptr) "Stack";
1494 add_slash = TRUE;
1495 }
1496 if (OSMEMORY_IS_EXECUTABLE(access) != AP_NoAccess) {
1497 if (add_slash != FALSE) {
1498 info[2] = (uintptr) "Exec/";
1499 }
1500 else {
1501 info[2] = (uintptr) "Exec";
1502 }
1503 add_slash = TRUE;
1504 }
1505 if (OSMEMORY_IS_WRITEABLE(access) != AP_NoAccess) {
1506 if (add_slash != FALSE) {
1507 info[1] = (uintptr) "Write/";
1508 }
1509 else {
1510 info[1] = (uintptr) "Write";
1511 }
1512 add_slash = TRUE;
1513 }
1514 if (OSMEMORY_IS_READABLE(access) != AP_NoAccess) {
1515 if (add_slash != FALSE) {
1516 info[0] = (uintptr) "Read/";
1517 }
1518 else {
1519 info[0] = (uintptr) "Read";
1520 }
1521 add_slash = TRUE;
1522 }
1523 if (add_slash == FALSE) {
1524 info[0] = (uintptr) "NoAccess";
1525 }
1526}
1527
1528/*
1529 * メモリアクセス関連機能 - 出口ログ
1530 */
1531static const char8 *
1532trace_print_memoryleave(const TRACE *trace, uintptr info[])
1533{
1534 uint32 type;
1535 const char8 *tracemsg;
1536
1537 type = (const uint32) trace->loginfo[0];
1538
1539 switch (type) {
1540 case TFN_CHECKISRMEMORYACCESS:
1541 trace_get_memory_access((AccessType) trace->loginfo[1], info);
1542 tracemsg = "leave from CheckISRMemoryAccess %s%s%s%s.";
1543 break;
1544
1545 case TFN_CHECKTASKMEMORYACCESS:
1546 trace_get_memory_access((AccessType) trace->loginfo[1], info);
1547 tracemsg = "leave from CheckTaskMemoryAccess %s%s%s%s.";
1548 break;
1549
1550 default:
1551 tracemsg = "unknown servic call";
1552 break;
1553 }
1554
1555 return(tracemsg);
1556}
1557
1558
1559/*
1560 * システムコールのå…
1561¥å£ãƒ­ã‚°(LOG_TYPE_SVC|ENTER)
1562 */
1563static const char8 *
1564trace_print_svcenter(const TRACE *trace, uintptr info[], void (*outputc)(char8 c))
1565{
1566 uint32 type;
1567 const char8 *tracemsg;
1568
1569 type = (const uint32) trace->loginfo[0];
1570
1571 switch (type) {
1572
1573 /* タスク管理 */
1574 case TFN_ACTIVATETASK:
1575 case TFN_TERMINATETASK:
1576 case TFN_CHAINTASK:
1577 case TFN_SCHEDULE:
1578 tracemsg = trace_print_tskenter(trace, info);
1579 break;
1580
1581 /* イベント機能 */
1582 case TFN_SETEVENT:
1583 case TFN_CLEAREVENT:
1584 case TFN_GETEVENT:
1585 case TFN_WAITEVENT:
1586 tracemsg = trace_print_evententer(trace, info);
1587 break;
1588
1589 /* リソース機能 */
1590 case TFN_RELEASERESOURCE:
1591 case TFN_GETRESOURCE:
1592 tracemsg = trace_print_resenter(trace, info);
1593 break;
1594
1595 /* アラーム機能 */
1596 case TFN_GETALARMBASE:
1597 case TFN_GETALARM:
1598 case TFN_SETRELALARM:
1599 case TFN_SETABSALARM:
1600 case TFN_CANCELALARM:
1601 case TFN_INCREMENTCOUNTER:
1602 case TFN_GETCOUNTERVALUE:
1603 case TFN_GETELAPSEDVALUE:
1604 tracemsg = trace_print_almenter(trace, info);
1605 break;
1606
1607 /* スケジュールテーブル機能 */
1608 case TFN_STARTSCHEDULETABLEREL:
1609 case TFN_STARTSCHEDULETABLEABS:
1610 case TFN_STOPSCHEDULETABLE:
1611 case TFN_NEXTSCHEDULETABLE:
1612 case TFN_GETSCHEDULETABLESTATUS:
1613 tracemsg = trace_print_schtblenter(trace, info);
1614 break;
1615
1616 /* 割込み管理機能 */
1617 case TFN_DISABLEALLINTERRUPTS:
1618 case TFN_SUSPENDALLINTERRUPTS:
1619 case TFN_SUSPENDOSINTERRUPTS:
1620 case TFN_ENABLEALLINTERRUPTS:
1621 case TFN_RESUMEALLINTERRUPTS:
1622 case TFN_RESUMEOSINTERRUPTS:
1623 case TFN_GETISRID:
1624 case TFN_DISABLEINTERRUPTSOURCE:
1625 case TFN_ENABLEINTERRUPTSOURCE:
1626 tracemsg = trace_print_intenter(trace, info);
1627 break;
1628
1629 /* システム状æ…
1630‹ç®¡ç†æ©Ÿèƒ½ */
1631 case TFN_GETTASKID:
1632 case TFN_GETTASKSTATE:
1633 case TFN_GETACTIVEAPPLICATIONMODE:
1634 tracemsg = trace_print_sysenter(trace, info);
1635 break;
1636
1637 /* カーネルの初期化と終了処理 */
1638 case TFN_SHUTDOWNOS:
1639 tracemsg = trace_print_kerenter(trace, info, outputc);
1640 break;
1641
1642 /* OSAP機能 */
1643 case TFN_GETAPPLICATIONID:
1644 case TFN_GETAPPLICATIONSTATE:
1645 case TFN_CALLTRUSTEDFUNCTION:
1646 case TFN_CHECKTASKACCESS:
1647 case TFN_CHECKISRACCESS:
1648 case TFN_CHECKALARMACCESS:
1649 case TFN_CHECKRESOURCEACCESS:
1650 case TFN_CHECKCOUNTERACCESS:
1651 case TFN_CHECKSCHEDULETABLEACCESS:
1652 case TFN_CHECKTASKOWNERSHIP:
1653 case TFN_CHECKISROWNERSHIP:
1654 case TFN_CHECKALARMOWNERSHIP:
1655 case TFN_CHECKCOUNTEROWNERSHIP:
1656 case TFN_CHECKSCHEDULETABLEOWNERSHIP:
1657 tracemsg = trace_print_osapenter(trace, info);
1658 break;
1659
1660 /* IOC機能 */
1661 case TFN_IOC_SEND_GENERIC:
1662 case TFN_IOC_WRITE_GENERIC:
1663 case TFN_IOC_RECEIVE_GENERIC:
1664 case TFN_IOC_READ_GENERIC:
1665 case TFN_IOC_EMPTY_QUEUE_GENERIC:
1666 tracemsg = trace_print_iocenter(trace, info);
1667 break;
1668
1669 /* メモリアクセス関連機能 */
1670 case TFN_CHECKISRMEMORYACCESS:
1671 case TFN_CHECKTASKMEMORYACCESS:
1672 tracemsg = trace_print_memoryenter(trace, info);
1673 break;
1674
1675 default:
1676 tracemsg = "unknown LOG_TYPE_SVC|ENTER service call";
1677 break;
1678 }
1679 return(tracemsg);
1680}
1681
1682
1683/*
1684 * システムコールの出口ログ(LOG_TYPE_SVC|LEAVE)
1685 */
1686static const char8 *
1687trace_print_svcleave(const TRACE *trace, uintptr info[])
1688{
1689 uint32 type;
1690 const char8 *tracemsg;
1691
1692 type = (const uint32) trace->loginfo[0];
1693
1694 switch (type) {
1695 case TFN_ACTIVATETASK:
1696 case TFN_TERMINATETASK:
1697 case TFN_CHAINTASK:
1698 case TFN_SCHEDULE:
1699 /* タスク管理 */
1700 tracemsg = trace_print_tskleave(trace, info);
1701 break;
1702
1703 /* イベント機能 */
1704 case TFN_SETEVENT:
1705 case TFN_CLEAREVENT:
1706 case TFN_GETEVENT:
1707 case TFN_WAITEVENT:
1708 tracemsg = trace_print_eventleave(trace, info);
1709 break;
1710
1711 /* リソース機能 */
1712 case TFN_RELEASERESOURCE:
1713 case TFN_GETRESOURCE:
1714 tracemsg = trace_print_resleave(trace, info);
1715 break;
1716
1717 /* アラーム機能 */
1718 case TFN_GETALARMBASE:
1719 case TFN_GETALARM:
1720 case TFN_SETRELALARM:
1721 case TFN_SETABSALARM:
1722 case TFN_CANCELALARM:
1723 case TFN_INCREMENTCOUNTER:
1724 case TFN_GETCOUNTERVALUE:
1725 case TFN_GETELAPSEDVALUE:
1726 tracemsg = trace_print_almleave(trace, info);
1727 break;
1728
1729 /* スケジュールテーブル機能 */
1730 case TFN_STARTSCHEDULETABLEREL:
1731 case TFN_STARTSCHEDULETABLEABS:
1732 case TFN_STOPSCHEDULETABLE:
1733 case TFN_NEXTSCHEDULETABLE:
1734 case TFN_GETSCHEDULETABLESTATUS:
1735 tracemsg = trace_print_schtblleave(trace, info);
1736 break;
1737
1738 /* 割込み管理機能 */
1739 case TFN_DISABLEALLINTERRUPTS:
1740 case TFN_SUSPENDALLINTERRUPTS:
1741 case TFN_SUSPENDOSINTERRUPTS:
1742 case TFN_ENABLEALLINTERRUPTS:
1743 case TFN_RESUMEALLINTERRUPTS:
1744 case TFN_RESUMEOSINTERRUPTS:
1745 case TFN_GETISRID:
1746 case TFN_DISABLEINTERRUPTSOURCE:
1747 case TFN_ENABLEINTERRUPTSOURCE:
1748 tracemsg = trace_print_intleave(trace, info);
1749 break;
1750
1751 /* システム状æ…
1752‹ç®¡ç†æ©Ÿèƒ½ */
1753 case TFN_GETTASKID:
1754 case TFN_GETTASKSTATE:
1755 case TFN_GETACTIVEAPPLICATIONMODE:
1756 tracemsg = trace_print_sysleave(trace, info);
1757 break;
1758
1759 /* OSAP機能 */
1760 case TFN_GETAPPLICATIONID:
1761 case TFN_GETAPPLICATIONSTATE:
1762 case TFN_CALLTRUSTEDFUNCTION:
1763 case TFN_CHECKTASKACCESS:
1764 case TFN_CHECKISRACCESS:
1765 case TFN_CHECKALARMACCESS:
1766 case TFN_CHECKRESOURCEACCESS:
1767 case TFN_CHECKCOUNTERACCESS:
1768 case TFN_CHECKSCHEDULETABLEACCESS:
1769 case TFN_CHECKTASKOWNERSHIP:
1770 case TFN_CHECKISROWNERSHIP:
1771 case TFN_CHECKALARMOWNERSHIP:
1772 case TFN_CHECKCOUNTEROWNERSHIP:
1773 case TFN_CHECKSCHEDULETABLEOWNERSHIP:
1774 tracemsg = trace_print_osapleave(trace, info);
1775 break;
1776
1777 /* IOC機能 */
1778 case TFN_IOC_SEND_GENERIC:
1779 case TFN_IOC_WRITE_GENERIC:
1780 case TFN_IOC_RECEIVE_GENERIC:
1781 case TFN_IOC_READ_GENERIC:
1782 case TFN_IOC_EMPTY_QUEUE_GENERIC:
1783 tracemsg = trace_print_iocleave(trace, info);
1784 break;
1785
1786 /* メモリアクセス関連機能 */
1787 case TFN_CHECKISRMEMORYACCESS:
1788 case TFN_CHECKTASKMEMORYACCESS:
1789 tracemsg = trace_print_memoryleave(trace, info);
1790 break;
1791
1792
1793 default:
1794 tracemsg = "unknown LOG_TYPE_SVC|LEAVE servic call";
1795 break;
1796 }
1797
1798 return(tracemsg);
1799}
1800
1801/*
1802 * 処理単位を切り替える
1803 * 通常はtrace_push_contextから呼ばれるが,
1804 * trace_push_contextを経由しない場合もある(タスク,スタートアップフック)
1805 */
1806static void
1807trace_set_context(PR_UNIT_TYPE type, ObjectIDType id)
1808{
1809 context_stack[context_index].type = type;
1810 context_stack[context_index].id = id;
1811}
1812
1813/*
1814 * 処理単位スタックにtype, idで指定される処理単位をプッシュする
1815 */
1816static void
1817trace_push_context(PR_UNIT_TYPE type, ObjectIDType id)
1818{
1819 context_index++;
1820 trace_set_context(type, id);
1821}
1822
1823/*
1824 * 現在の処理単位を返す
1825 * p_obj_type_strには処理単位種別の文字列をå…
1826¥ã‚Œã‚‹
1827 * p_idには処理単位のIDをå…
1828¥ã‚Œã‚‹
1829 * タスク,C2ISR実行中の場合で,アラーム満了処理,
1830 * スケジュールテーブル満了処理,信頼関数を行なっている場合は,それらを
1831 * 現在の処理単位として返す
1832 */
1833static void
1834trace_get_context(uintptr *p_obj_type_str, uintptr *p_id)
1835{
1836 PR_UNIT_TYPE type;
1837 ObjectIDType id;
1838 sint32 index;
1839
1840 type = context_stack[context_index].type;
1841 id = context_stack[context_index].id;
1842 if (type == PR_UNIT_TASK) {
1843 index = task_context_index[id];
1844 if (index >= 0) {
1845 id = task_exec[id][index].id;
1846 type = task_exec[id][index].type;
1847 }
1848 }
1849 else if (type == PR_UNIT_ISR) {
1850 index = isr_context_index[id];
1851 if (index >= 0) {
1852 id = isr_exec[id][index].id;
1853 type = isr_exec[id][index].type;
1854 }
1855 }
1856 else {
1857 /* typeが上記以外の場合,処理は行わない */
1858 }
1859 *p_obj_type_str = (const uintptr) obj_type_to_str[type];
1860 *p_id = (uintptr) id;
1861}
1862
1863/*
1864 * trace_push_contextでプッシュした処理単位をポップ(取り除く)する
1865 * 1つ前の処理単位を返す
1866 */
1867static void
1868trace_pop_context(uintptr *p_obj_type_str, uintptr *p_id)
1869{
1870 context_index--;
1871 trace_get_context(p_obj_type_str, p_id);
1872}
1873
1874/*
1875 * タスク,C2ISR実行中にアラーム満了処理,スケジュールテーブ
1876 * ル満了処理,信頼関数が発生した場合に,現在の処理単位をそれらの満了処理にする
1877 */
1878static void
1879trace_change_context(PR_UNIT_TYPE type, ObjectIDType id)
1880{
1881 sint32 index;
1882 TaskType tskid;
1883 ISRType isrid;
1884 if (context_stack[context_index].type == PR_UNIT_TASK) {
1885 tskid = context_stack[context_index].id;
1886 task_context_index[tskid]++;
1887 index = task_context_index[tskid];
1888 task_exec[tskid][index].id = id;
1889 task_exec[tskid][index].type = type;
1890 }
1891 else if (context_stack[context_index].type == PR_UNIT_ISR) {
1892 isrid = context_stack[context_index].id;
1893 isr_context_index[isrid]++;
1894 index = isr_context_index[isrid];
1895 isr_exec[isrid][index].id = id;
1896 isr_exec[isrid][index].type = type;
1897 }
1898 else {
1899 /* ここには来ない.万が一来た場合,以降のログ内
1900容が未保証となる */
1901 }
1902}
1903
1904/*
1905 * タスク,C2ISR実行中のアラーム満了処理,スケジュールテーブ
1906 * ル満了処理,信頼関数の終了時に呼び出し,処理単位を戻す
1907 */
1908static void
1909trace_resume_context(void)
1910{
1911 TaskType tskid;
1912 ISRType isrid;
1913 if (context_stack[context_index].type == PR_UNIT_TASK) {
1914 tskid = context_stack[context_index].id;
1915 task_context_index[tskid]--;
1916 }
1917 else if (context_stack[context_index].type == PR_UNIT_ISR) {
1918 isrid = context_stack[context_index].id;
1919 isr_context_index[isrid]--;
1920 }
1921 else {
1922 /* ここには来ない.万が一来た場合,以降のログ内
1923容が未保証となる */
1924 }
1925}
1926
1927/*
1928 * トレースログの表示
1929 */
1930static void
1931trace_print(const TRACE *p_trace, void (*outputc)(char8 c))
1932{
1933 uintptr traceinfo[TMAX_LOGINFO + 1U];
1934 const char8 *tracemsg;
1935 uint32 i;
1936 TaskType tskid;
1937 AlarmType almid;
1938 ISRType isrid;
1939 ScheduleTableType schtblid;
1940 ApplicationType osapid;
1941
1942 traceinfo[0] = (uintptr) (p_trace->logtim);
1943 syslog_printf("[%d] ", traceinfo, outputc);
1944
1945 switch (p_trace->logtype) {
1946 /* C2ISRの開始 */
1947 case LOG_TYPE_ISR | LOG_ENTER:
1948 isrid = p_trace->loginfo[0];
1949 trace_push_context(PR_UNIT_ISR, isrid);
1950
1951 traceinfo[0] = (uintptr) isrid;
1952 tracemsg = "enter to isr %d.";
1953 break;
1954
1955 /* C2ISRの終了 */
1956 case LOG_TYPE_ISR | LOG_LEAVE:
1957 isrid = p_trace->loginfo[0];
1958
1959 traceinfo[0] = (uintptr) isrid;
1960 trace_pop_context(&(traceinfo[1]), &(traceinfo[2]));
1961 tracemsg = "leave from isr %d, context is %s %d.";
1962 break;
1963
1964 /* アラーム満了処理の開始 */
1965 case LOG_TYPE_ALM | LOG_ENTER:
1966 almid = (uintptr) (((ALMCB *) (p_trace->loginfo[0])) - almcb_table);
1967 trace_change_context(PR_UNIT_ALARM, almid);
1968
1969 traceinfo[0] = (uintptr) almid;
1970 tracemsg = "enter to alarm %d.";
1971 break;
1972
1973 /* アラーム満了処理の終了 */
1974 case LOG_TYPE_ALM | LOG_LEAVE:
1975 almid = (uintptr) (((ALMCB *) (p_trace->loginfo[0])) - almcb_table);
1976 trace_resume_context();
1977
1978 traceinfo[0] = (uintptr) almid;
1979 trace_get_context(&(traceinfo[1]), &(traceinfo[2]));
1980 tracemsg = "leave from alarm %d, context is %s %d.";
1981 break;
1982
1983 /* スケジュールテーブル満了処理の開始 */
1984 case LOG_TYPE_SCHTBL | LOG_ENTER:
1985 schtblid = (uintptr) (((SCHTBLCB *) (p_trace->loginfo[0])) - schtblcb_table);
1986 trace_change_context(PR_UNIT_SCHTBL, schtblid);
1987
1988 traceinfo[0] = (uintptr) schtblid;
1989 tracemsg = "enter to scheduletable %d.";
1990 break;
1991
1992 /* スケジュールテーブル満了処理の終了 */
1993 case LOG_TYPE_SCHTBL | LOG_LEAVE:
1994 schtblid = (uintptr) (((SCHTBLCB *) (p_trace->loginfo[0])) - schtblcb_table);
1995 trace_resume_context();
1996
1997 traceinfo[0] = (uintptr) schtblid;
1998 trace_get_context(&(traceinfo[1]), &(traceinfo[2]));
1999 tracemsg = "leave from scheduletable %d, context is %s %d.";
2000 break;
2001
2002 /* スタートアップフックの開始 */
2003 case LOG_TYPE_STAHOOK | LOG_ENTER:
2004 trace_set_context(PR_UNIT_STA, 0U);
2005 tracemsg = "enter to startup hook.";
2006 break;
2007
2008 /* スタートアップフックの終了 */
2009 case LOG_TYPE_STAHOOK | LOG_LEAVE:
2010 tracemsg = "leave from startup hook.";
2011 break;
2012
2013 /* エラーフックの開始 */
2014 case LOG_TYPE_ERRHOOK | LOG_ENTER:
2015 trace_push_context(PR_UNIT_ERR, 0U);
2016
2017 traceinfo[0] = (uintptr) atk2_strerror((StatusType) p_trace->loginfo[0]);
2018 tracemsg = "enter to error hook ercd=%s.";
2019 break;
2020
2021 /* エラーフックの終了 */
2022 case LOG_TYPE_ERRHOOK | LOG_LEAVE:
2023 trace_pop_context(&(traceinfo[0]), &(traceinfo[1]));
2024 tracemsg = "leave from error hook, context is %s %d.";
2025 break;
2026
2027 /* プロテクションフックの開始 */
2028 case LOG_TYPE_PROHOOK | LOG_ENTER:
2029 trace_push_context(PR_UNIT_PRO, 0U);
2030
2031 traceinfo[0] = (uintptr) atk2_strerror((StatusType) p_trace->loginfo[0]);
2032 tracemsg = "enter to protection hook ercd=%s.";
2033 break;
2034
2035 /* プロテクションフックの終了 */
2036 case LOG_TYPE_PROHOOK | LOG_LEAVE:
2037 traceinfo[0] = (uintptr) trace_proret_str((ProtectionReturnType) p_trace->loginfo[0]);
2038 trace_pop_context(&(traceinfo[1]), &(traceinfo[2]));
2039 tracemsg = "leave from protection hook ercd=%s, context is %s %d.";
2040 break;
2041
2042 /* シャットダウンフックの開始 */
2043 case LOG_TYPE_SHUTHOOK | LOG_ENTER:
2044 trace_push_context(PR_UNIT_SHUT, 0U);
2045
2046 traceinfo[0] = (uintptr) atk2_strerror((StatusType) p_trace->loginfo[0]);
2047 tracemsg = "enter to shutdown hook ercd=%s.";
2048 break;
2049
2050 /* シャットダウンフックの終了 */
2051 case LOG_TYPE_SHUTHOOK | LOG_LEAVE:
2052 trace_pop_context(&(traceinfo[0]), &(traceinfo[1]));
2053 tracemsg = "leave from shutdown hook.";
2054 break;
2055
2056 /* 信頼関数の開始 */
2057 case LOG_TYPE_TFN | LOG_ENTER:
2058 trace_change_context(PR_UNIT_TFN, p_trace->loginfo[0]);
2059
2060 traceinfo[0] = (const uintptr) p_trace->loginfo[0];
2061 tracemsg = "enter to trusted function %d.";
2062 break;
2063
2064 /* 信頼関数の終了 */
2065 case LOG_TYPE_TFN | LOG_LEAVE:
2066 trace_resume_context();
2067
2068 traceinfo[0] = (const uintptr) p_trace->loginfo[0];
2069 traceinfo[1] = (uintptr) atk2_strerror((StatusType) p_trace->loginfo[1]);
2070 traceinfo[2] = p_trace->loginfo[1];
2071 trace_get_context(&(traceinfo[3]), &(traceinfo[4]));
2072 tracemsg = "leave from trusted function %d ercd=%s(%d), context is %s %d.";
2073 break;
2074
2075 /* タスク状æ…
2076‹ã®å¤‰åŒ– */
2077 case LOG_TYPE_TSKSTAT:
2078 traceinfo[0] = trace_get_tskid(p_trace->loginfo[0]);
2079 traceinfo[1] = (uintptr) atk2_task_state_str((TaskStateType) p_trace->loginfo[1]);
2080 tracemsg = "task %d becomes %s.";
2081 break;
2082
2083 /* ディスパッチャのå…
2084¥å£ */
2085 case LOG_TYPE_DSP | LOG_ENTER:
2086 traceinfo[0] = trace_get_tskid(p_trace->loginfo[0]);
2087 tracemsg = "dispatch from task %d.";
2088 break;
2089
2090 /* ディスパッチャの出口 */
2091 case LOG_TYPE_DSP | LOG_LEAVE:
2092 tskid = (TaskType) trace_get_tskid(p_trace->loginfo[0]);
2093 traceinfo[0] = (uintptr) tskid;
2094 trace_set_context(PR_UNIT_TASK, tskid);
2095 /* 満了処理をしているかもしれないので,現在の処理単位を取得する */
2096 trace_get_context(&(traceinfo[1]), &(traceinfo[2]));
2097
2098 if (traceinfo[1] != (const uintptr) obj_type_to_str[PR_UNIT_TASK]) {
2099 tracemsg = "dispatch to task %d, executing %s %d.";
2100 }
2101 else {
2102 tracemsg = "dispatch to task %d.";
2103 }
2104 break;
2105
2106 /* システムサービスのå…
2107¥å£ */
2108 case LOG_TYPE_SVC | LOG_ENTER:
2109 tracemsg = trace_print_svcenter(p_trace, traceinfo, outputc);
2110 break;
2111
2112 /* システムサービスの出口 */
2113 case LOG_TYPE_SVC | LOG_LEAVE:
2114 tracemsg = trace_print_svcleave(p_trace, traceinfo);
2115 break;
2116
2117 case LOG_TYPE_COMMENT:
2118 for (i = 1U; i < TMAX_LOGINFO; i++) {
2119 traceinfo[i - 1U] = p_trace->loginfo[i];
2120 }
2121 tracemsg = (const char8 *) (p_trace->loginfo[0]);
2122 break;
2123
2124 case LOG_TYPE_ASSERT:
2125 traceinfo[0] = p_trace->loginfo[0];
2126 traceinfo[1] = p_trace->loginfo[1];
2127 traceinfo[2] = p_trace->loginfo[2];
2128 tracemsg = "%s:%u: Assertion '%s' failed.";
2129 break;
2130
2131 case LOG_TYPE_USER_MARK:
2132 traceinfo[0] = p_trace->loginfo[0];
2133 tracemsg = "user mark=%s.";
2134 break;
2135
2136 default:
2137 traceinfo[0] = p_trace->logtype;
2138 tracemsg = "unknown trace log type: %d.";
2139 break;
2140 }
2141 syslog_printf(tracemsg, traceinfo, outputc);
2142 (*outputc)('\n');
2143}
2144
2145/*
2146 * トレースログのダンプ
2147 */
2148void
2149trace_dump(void (*exinf)(char8 c))
2150{
2151 TRACE trace;
2152 void (*outputc)(char8 c);
2153 uint32 i;
2154
2155 for (i = 0U; i < TNUM_TASK; i++) {
2156 task_context_index[i] = -1;
2157 }
2158 for (i = 0U; i < TNUM_ISR2; i++) {
2159 isr_context_index[i] = -1;
2160 }
2161
2162 outputc = exinf;
2163 while (trace_rea_log(&trace) == E_OK) {
2164 trace_print(&trace, outputc);
2165 }
2166 syslog(LOG_NOTICE, "sizeof TRACE=%d", sizeof(TRACE));
2167
2168}
Note: See TracBrowser for help on using the repository browser.