aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--parse-events.c80
-rw-r--r--parse-events.h1
-rw-r--r--trace-util.c19
3 files changed, 62 insertions, 38 deletions
diff --git a/parse-events.c b/parse-events.c
index 7582304..646490e 100644
--- a/parse-events.c
+++ b/parse-events.c
@@ -279,9 +279,15 @@ void pevent_print_funcs(void)
279static struct printk_map { 279static struct printk_map {
280 unsigned long long addr; 280 unsigned long long addr;
281 char *printk; 281 char *printk;
282} *printk_list; 282} *printk_map;
283static unsigned int printk_count; 283static unsigned int printk_count;
284 284
285static struct printk_list {
286 struct printk_list *next;
287 unsigned long long addr;
288 char *printk;
289} *printklist;
290
285static int printk_cmp(const void *a, const void *b) 291static int printk_cmp(const void *a, const void *b)
286{ 292{
287 const struct func_map *fa = a; 293 const struct func_map *fa = a;
@@ -295,58 +301,56 @@ static int printk_cmp(const void *a, const void *b)
295 return 0; 301 return 0;
296} 302}
297 303
304static void printk_map_init(void)
305{
306 struct printk_list *item;
307 int i;
308
309 printk_map = malloc_or_die(sizeof(*printk_map) * printk_count + 1);
310
311 i = 0;
312 while (printklist) {
313 printk_map[i].printk = printklist->printk;
314 printk_map[i].addr = printklist->addr;
315 i++;
316 item = printklist;
317 printklist = printklist->next;
318 free(item);
319 }
320
321 qsort(printk_map, printk_count, sizeof(*printk_map), printk_cmp);
322}
323
298static struct printk_map *find_printk(unsigned long long addr) 324static struct printk_map *find_printk(unsigned long long addr)
299{ 325{
300 struct printk_map *printk; 326 struct printk_map *printk;
301 struct printk_map key; 327 struct printk_map key;
302 328
329 if (!printk_map)
330 printk_map_init();
331
303 key.addr = addr; 332 key.addr = addr;
304 333
305 printk = bsearch(&key, printk_list, printk_count, sizeof(*printk_list), 334 printk = bsearch(&key, printk_map, printk_count, sizeof(*printk_map),
306 printk_cmp); 335 printk_cmp);
307 336
308 return printk; 337 return printk;
309} 338}
310 339
311void parse_ftrace_printk(char *file, unsigned int size __unused) 340int pevent_register_print_string(char *fmt, unsigned long long addr)
312{ 341{
313 struct printk_list { 342 struct printk_list *item;
314 struct printk_list *next;
315 unsigned long long addr;
316 char *printk;
317 } *list = NULL, *item;
318 char *line;
319 char *next = NULL;
320 char *addr_str;
321 char *fmt;
322 int i;
323 343
324 line = strtok_r(file, "\n", &next); 344 item = malloc_or_die(sizeof(*item));
325 while (line) {
326 item = malloc_or_die(sizeof(*item));
327 addr_str = strtok_r(line, ":", &fmt);
328 item->addr = strtoull(addr_str, NULL, 16);
329 /* fmt still has a space, skip it */
330 item->printk = strdup(fmt+1);
331 item->next = list;
332 list = item;
333 line = strtok_r(NULL, "\n", &next);
334 printk_count++;
335 }
336 345
337 printk_list = malloc_or_die(sizeof(*printk_list) * printk_count + 1); 346 item->next = printklist;
347 printklist = item;
348 item->printk = fmt;
349 item->addr = addr;
338 350
339 i = 0; 351 printk_count++;
340 while (list) {
341 printk_list[i].printk = list->printk;
342 printk_list[i].addr = list->addr;
343 i++;
344 item = list;
345 list = list->next;
346 free(item);
347 }
348 352
349 qsort(printk_list, printk_count, sizeof(*printk_list), printk_cmp); 353 return 0;
350} 354}
351 355
352void print_printk(void) 356void print_printk(void)
@@ -355,8 +359,8 @@ void print_printk(void)
355 359
356 for (i = 0; i < (int)printk_count; i++) { 360 for (i = 0; i < (int)printk_count; i++) {
357 printf("%016llx %s\n", 361 printf("%016llx %s\n",
358 printk_list[i].addr, 362 printk_map[i].addr,
359 printk_list[i].printk); 363 printk_map[i].printk);
360 } 364 }
361} 365}
362 366
diff --git a/parse-events.h b/parse-events.h
index 631d3dd..9a27585 100644
--- a/parse-events.h
+++ b/parse-events.h
@@ -307,6 +307,7 @@ enum trace_flag_type {
307 307
308int pevent_register_comm(char *comm, int pid); 308int pevent_register_comm(char *comm, int pid);
309int pevent_register_function(char *name, unsigned long long addr, char *mod); 309int pevent_register_function(char *name, unsigned long long addr, char *mod);
310int pevent_register_print_string(char *fmt, unsigned long long addr);
310 311
311/* for debugging */ 312/* for debugging */
312void pevent_print_funcs(void); 313void pevent_print_funcs(void);
diff --git a/trace-util.c b/trace-util.c
index 2fe5ff6..1ff5d5f 100644
--- a/trace-util.c
+++ b/trace-util.c
@@ -54,3 +54,22 @@ void parse_proc_kallsyms(char *file, unsigned int size __unused)
54 line = strtok_r(NULL, "\n", &next); 54 line = strtok_r(NULL, "\n", &next);
55 } 55 }
56} 56}
57
58void parse_ftrace_printk(char *file, unsigned int size __unused)
59{
60 unsigned long long addr;
61 char *printk;
62 char *line;
63 char *next = NULL;
64 char *addr_str;
65 char *fmt;
66
67 line = strtok_r(file, "\n", &next);
68 while (line) {
69 addr_str = strtok_r(line, ":", &fmt);
70 addr = strtoull(addr_str, NULL, 16);
71 /* fmt still has a space, skip it */
72 printk = strdup(fmt+1);
73 line = strtok_r(NULL, "\n", &next);
74 }
75}