diff options
| -rw-r--r-- | parse-events.c | 80 | ||||
| -rw-r--r-- | parse-events.h | 1 | ||||
| -rw-r--r-- | trace-util.c | 19 |
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) | |||
| 279 | static struct printk_map { | 279 | static 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; |
| 283 | static unsigned int printk_count; | 283 | static unsigned int printk_count; |
| 284 | 284 | ||
| 285 | static struct printk_list { | ||
| 286 | struct printk_list *next; | ||
| 287 | unsigned long long addr; | ||
| 288 | char *printk; | ||
| 289 | } *printklist; | ||
| 290 | |||
| 285 | static int printk_cmp(const void *a, const void *b) | 291 | static 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 | ||
| 304 | static 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 | |||
| 298 | static struct printk_map *find_printk(unsigned long long addr) | 324 | static 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 | ||
| 311 | void parse_ftrace_printk(char *file, unsigned int size __unused) | 340 | int 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 | ||
| 352 | void print_printk(void) | 356 | void 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 | ||
| 308 | int pevent_register_comm(char *comm, int pid); | 308 | int pevent_register_comm(char *comm, int pid); |
| 309 | int pevent_register_function(char *name, unsigned long long addr, char *mod); | 309 | int pevent_register_function(char *name, unsigned long long addr, char *mod); |
| 310 | int pevent_register_print_string(char *fmt, unsigned long long addr); | ||
| 310 | 311 | ||
| 311 | /* for debugging */ | 312 | /* for debugging */ |
| 312 | void pevent_print_funcs(void); | 313 | void 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 | |||
| 58 | void 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 | } | ||
