GadgetSeed  0.9.6
calltrace.c
[詳解]
1 /** @file
2  @brief デバッグ用システムコールトレース
3 
4  @date 2015.11.08
5  @author Takashi SHUDO
6 */
7 
8 #include "sysconfig.h"
9 
10 #include "calltrace.h"
11 #include "syscall.h"
12 #include "timer.h"
13 #include "tkprintf.h"
14 #include "syscall_param.h"
15 #include "task_opration.h"
16 
17 #ifndef GSC_KERNEL_MAX_CALLTRACE_RECORD
18 #define GSC_KERNEL_MAX_CALLTRACE_RECORD 32 // $gsc カーネルシステムコールトレース記録数
19 #endif
20 
21 static struct st_call_record call_record[GSC_KERNEL_MAX_CALLTRACE_RECORD];
22 int callrec_num = 0;
23 char flg_rec_round = 0;
24 
25 extern const char syscall_name[][16];
26 
27 void init_calltrace(void)
28 {
29  callrec_num = 0;
30  flg_rec_round = 0;
31 }
32 
33 void record_calltrace(int syscall, int status, void *resource, int arg, int count, void *sp)
34 {
35  struct st_call_record *rp;
36 
37  rp = &call_record[callrec_num];
38 
39  rp->time = get_system_utime();
40  rp->tcb = run_task;
41 
42  rp->syscall = syscall;
43  rp->status = status;
44  rp->resource = resource;
45  rp->arg = arg;
46  rp->count = count;
47  rp->sp = sp;
48 
49  callrec_num ++;
50  if(callrec_num >= GSC_KERNEL_MAX_CALLTRACE_RECORD) {
51  callrec_num = 0;
52  flg_rec_round = 1;
53  }
54 }
55 
56 extern const char status_str[][7];
57 
58 static void print_record(struct st_call_record *rp)
59 {
60  tkprintf("%8ld.%03ld : [%2d]%10s %6s %12s",
61  rp->time/1000,
62  rp->time%1000,
63  rp->tcb->id,
64  rp->tcb->name,
65  status_str[rp->status],
66  syscall_name[rp->syscall]);
67 
68  switch(rp->syscall) {
69  case SYSCALL_DISPATCH:
70  tkprintf("%10s", ((struct st_tcb *)(rp->resource))->name);
71  break;
72 
73  case SYSCALL_TASK_ADD:
74  case SYSCALL_TASK_EXEC:
75  case SYSCALL_TASK_EXIT:
76  case SYSCALL_TASK_PAUSE:
77  break;
78 
79  case SYSCALL_TASK_SLEEP:
80  tkprintf("%10s %8d", "", rp->arg);
81  break;
82 
83  case SYSCALL_TASK_KILL:
84  case SYSCALL_TASK_WAKEUP:
85  case SYSCALL_EVTQUE_INIT:
86  break;
87 
88  case SYSCALL_EVTQUE_WAIT:
89  tkprintf("%10s %8d", ((struct st_event *)(rp->resource))->name, rp->arg);
90  break;
91 
92  case SYSCALL_EVTQUE_PUSH:
93  tkprintf("%10s", ((struct st_tcb *)(rp->resource))->name);
94  break;
95 
96  case SYSCALL_EVTQUE_CLEAR:
97  tkprintf("%10s %8s %8d", ((struct st_event *)(rp->resource))->name, "", rp->count);
98  break;
99 
100  case SYSCALL_EVTQUE_CHECK:
101  tkprintf("%10s", ((struct st_tcb *)(rp->resource))->name);
102  break;
103 
104  case SYSCALL_EVTQUE_WAKEUP:
105  tkprintf("%10s %8s %8d", ((struct st_event *)(rp->resource))->name, "", rp->count);
106  break;
107 
108  case SYSCALL_EVTQUE_DISPOSE:
109  tkprintf("%10s", ((struct st_tcb *)(rp->resource))->name);
110  break;
111 
112  case SYSCALL_MUTEX_INIT:
113  tkprintf("%10s", ((struct st_tcb *)(rp->resource))->name);
114  break;
115 
116  case SYSCALL_MUTEX_LOCK:
117  tkprintf("%10s %8d", ((struct st_mutex *)(rp->resource))->name, rp->arg);
118  break;
119 
120  case SYSCALL_MUTEX_UNLOCK:
121  tkprintf("%10s", ((struct st_mutex *)(rp->resource))->name);
122  break;
123 
124  case SYSCALL_MUTEX_DISPOSE:
125  tkprintf("%10s", ((struct st_tcb *)(rp->resource))->name);
126  break;
127 
128  case SYSCALL_SET_CONSOLE_IN:
129  case SYSCALL_SET_CONSOLE_OUT:
130  case SYSCALL_SET_ERROR_OUT:
131  break;
132 
133  case SYSCALL_TIMEOUT_WAKEUP:
134  break;
135 
136  case SYSCALL_PRINT_TASK_LIST:
137  case SYSCALL_PRINT_TASK_QUEUE:
138  case SYSCALL_PRINT_CALLTRACE:
139  break;
140  default:
141  tkprintf("Invalid syscall");
142  break;
143  }
144 
145  tkprintf("\n");
146 // tkprintf(" %p\n", rp->sp);
147 }
148 
149 void print_calltrace(void)
150 {
151  int i;
152 
153  if(flg_rec_round != 0) {
154  for(i=callrec_num; i<GSC_KERNEL_MAX_CALLTRACE_RECORD; i++) {
155  print_record(&call_record[i]);
156  }
157  }
158 
159  for(i=0; i<callrec_num; i++) {
160  print_record(&call_record[i]);
161  }
162 }
int status
タスク状態(PSTAT_*)
Definition: tcb.h:50
unsigned long long get_system_utime(void)
システム時間を取得する
Definition: timer.c:202
カーネルタイマ
#define init_calltrace(...)
< $gsc カーネルシステムコールトレースを有効にする
Definition: calltrace.h:30
int tkprintf(const char *fmt,...)
非タスクコンテキスト実行用メッセージ出力
Definition: tkprintf.c:100
カーネル用機能限定printf
システムコールパラメータ定義
MUTEX
Definition: mutex.h:13
イベント
Definition: event.h:15
システムコール
デバッグ用システムコールトレース
タスク操作
タスクコンテキスト
Definition: tcb.h:32