aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-11-24 18:29:03 -0500
committerSteven Rostedt <rostedt@goodmis.org>2009-11-24 18:29:03 -0500
commitf0a67a9120e5bc2872df37d5f10fff8f327cfebd (patch)
tree383ffe0d22b8aebec91debafb5e2bbf088fb232a
parent1f3b17f087c29d8977953bbbadfffc382aad7ba4 (diff)
Separate out the printk formats from the library
The mappings for the printk format strings and their addresses may be done differently by different utilities. This separates out the mapping of printk formats with their in kernel addresses. It also adds the function: pevent_register_print_string Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-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}