]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
cabcbb56 SG |
2 | /* |
3 | * Copyright (c) 2011 The Chromium OS Authors. | |
cabcbb56 SG |
4 | */ |
5 | ||
cabcbb56 | 6 | #include <command.h> |
c7694dd4 | 7 | #include <env.h> |
0eb25b61 | 8 | #include <mapmem.h> |
cabcbb56 | 9 | #include <trace.h> |
03de305e | 10 | #include <vsprintf.h> |
cabcbb56 SG |
11 | #include <asm/io.h> |
12 | ||
09140113 | 13 | static int get_args(int argc, char *const argv[], char **buff, |
cabcbb56 SG |
14 | size_t *buff_ptr, size_t *buff_size) |
15 | { | |
16 | if (argc < 2) | |
17 | return -1; | |
18 | if (argc < 4) { | |
bfebc8c9 SG |
19 | *buff_size = env_get_ulong("profsize", 16, 0); |
20 | *buff = map_sysmem(env_get_ulong("profbase", 16, 0), | |
cabcbb56 | 21 | *buff_size); |
bfebc8c9 | 22 | *buff_ptr = env_get_ulong("profoffset", 16, 0); |
cabcbb56 | 23 | } else { |
7e5f460e SG |
24 | *buff_size = hextoul(argv[3], NULL); |
25 | *buff = map_sysmem(hextoul(argv[2], NULL), | |
cabcbb56 SG |
26 | *buff_size); |
27 | *buff_ptr = 0; | |
28 | }; | |
29 | return 0; | |
30 | } | |
31 | ||
09140113 | 32 | static int create_func_list(int argc, char *const argv[]) |
cabcbb56 | 33 | { |
2b7a3882 | 34 | size_t buff_size, avail, buff_ptr, needed, used; |
cabcbb56 SG |
35 | char *buff; |
36 | int err; | |
37 | ||
38 | if (get_args(argc, argv, &buff, &buff_ptr, &buff_size)) | |
39 | return -1; | |
40 | ||
41 | avail = buff_size - buff_ptr; | |
42 | err = trace_list_functions(buff + buff_ptr, avail, &needed); | |
43 | if (err) | |
2b7a3882 | 44 | printf("Error: truncated (%#zx bytes needed)\n", needed); |
5eca9779 | 45 | used = min(avail, (size_t)needed); |
cabcbb56 SG |
46 | printf("Function trace dumped to %08lx, size %#zx\n", |
47 | (ulong)map_to_sysmem(buff + buff_ptr), used); | |
018f5303 SG |
48 | env_set_hex("profbase", map_to_sysmem(buff)); |
49 | env_set_hex("profsize", buff_size); | |
50 | env_set_hex("profoffset", buff_ptr + used); | |
cabcbb56 SG |
51 | |
52 | return 0; | |
53 | } | |
54 | ||
09140113 | 55 | static int create_call_list(int argc, char *const argv[]) |
cabcbb56 | 56 | { |
2b7a3882 | 57 | size_t buff_size, avail, buff_ptr, needed, used; |
cabcbb56 SG |
58 | char *buff; |
59 | int err; | |
60 | ||
61 | if (get_args(argc, argv, &buff, &buff_ptr, &buff_size)) | |
62 | return -1; | |
63 | ||
64 | avail = buff_size - buff_ptr; | |
65 | err = trace_list_calls(buff + buff_ptr, avail, &needed); | |
66 | if (err) | |
2b7a3882 | 67 | printf("Error: truncated (%#zx bytes needed)\n", needed); |
5eca9779 | 68 | used = min(avail, (size_t)needed); |
cabcbb56 SG |
69 | printf("Call list dumped to %08lx, size %#zx\n", |
70 | (ulong)map_to_sysmem(buff + buff_ptr), used); | |
71 | ||
018f5303 SG |
72 | env_set_hex("profbase", map_to_sysmem(buff)); |
73 | env_set_hex("profsize", buff_size); | |
74 | env_set_hex("profoffset", buff_ptr + used); | |
cabcbb56 SG |
75 | |
76 | return 0; | |
77 | } | |
78 | ||
09140113 | 79 | int do_trace(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) |
cabcbb56 SG |
80 | { |
81 | const char *cmd = argc < 2 ? NULL : argv[1]; | |
82 | ||
83 | if (!cmd) | |
84 | return cmd_usage(cmdtp); | |
85 | switch (*cmd) { | |
86 | case 'p': | |
87 | trace_set_enabled(0); | |
88 | break; | |
89 | case 'c': | |
90 | if (create_call_list(argc, argv)) | |
91 | return cmd_usage(cmdtp); | |
92 | break; | |
93 | case 'r': | |
94 | trace_set_enabled(1); | |
95 | break; | |
96 | case 'f': | |
97 | if (create_func_list(argc, argv)) | |
98 | return cmd_usage(cmdtp); | |
99 | break; | |
100 | case 's': | |
101 | trace_print_stats(); | |
102 | break; | |
103 | default: | |
104 | return CMD_RET_USAGE; | |
105 | } | |
106 | ||
107 | return 0; | |
108 | } | |
109 | ||
110 | U_BOOT_CMD( | |
111 | trace, 4, 1, do_trace, | |
112 | "trace utility commands", | |
113 | "stats - display tracing statistics\n" | |
114 | "trace pause - pause tracing\n" | |
115 | "trace resume - resume tracing\n" | |
116 | "trace funclist [<addr> <size>] - dump function list into buffer\n" | |
117 | "trace calls [<addr> <size>] " | |
118 | "- dump function call trace into buffer" | |
119 | ); |