X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=cmd%2Fiotrace.c;h=fa6c68b19825a3f7c934712f3b173bae60e04a7c;hb=e0212dfa1353310ab903263f8c737b8fb40b4fff;hp=f54276d2f578cb862acec59db98f31df78549377;hpb=cd85bec36d0e0d16fedb00e0c434ed070a9c6b37;p=u-boot diff --git a/cmd/iotrace.c b/cmd/iotrace.c index f54276d2f5..fa6c68b198 100644 --- a/cmd/iotrace.c +++ b/cmd/iotrace.c @@ -1,7 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2014 Google, Inc - * - * SPDX-License-Identifier: GPL-2.0+ */ #include @@ -10,11 +9,15 @@ static void do_print_stats(void) { - ulong start, size, offset, count; + ulong start, size, needed_size, offset, count; printf("iotrace is %sabled\n", iotrace_get_enabled() ? "en" : "dis"); - iotrace_get_buffer(&start, &size, &offset, &count); + iotrace_get_buffer(&start, &size, &needed_size, &offset, &count); printf("Start: %08lx\n", start); + printf("Actual Size: %08lx\n", size); + printf("Needed Size: %08lx\n", needed_size); + iotrace_get_region(&start, &size); + printf("Region: %08lx\n", start); printf("Size: %08lx\n", size); printf("Offset: %08lx\n", offset); printf("Output: %08lx\n", start + offset); @@ -22,6 +25,36 @@ static void do_print_stats(void) printf("CRC32: %08lx\n", (ulong)iotrace_get_checksum()); } +static void do_print_trace(void) +{ + ulong start, size, needed_size, offset, count; + + struct iotrace_record *cur_record; + + iotrace_get_buffer(&start, &size, &needed_size, &offset, &count); + + if (!start || !size || !count) + return; + + printf("Timestamp Value Address\n"); + + cur_record = (struct iotrace_record *)start; + for (int i = 0; i < count; i++) { + if (cur_record->flags & IOT_WRITE) + printf("%08llu: 0x%08lx --> 0x%08llx\n", + cur_record->timestamp, + cur_record->value, + (unsigned long long)cur_record->addr); + else + printf("%08llu: 0x%08lx <-- 0x%08llx\n", + cur_record->timestamp, + cur_record->value, + (unsigned long long)cur_record->addr); + + cur_record++; + } +} + static int do_set_buffer(int argc, char * const argv[]) { ulong addr = 0, size = 0; @@ -38,6 +71,22 @@ static int do_set_buffer(int argc, char * const argv[]) return 0; } +static int do_set_region(int argc, char * const argv[]) +{ + ulong addr = 0, size = 0; + + if (argc == 2) { + addr = simple_strtoul(*argv++, NULL, 16); + size = simple_strtoul(*argv++, NULL, 16); + } else if (argc != 0) { + return CMD_RET_USAGE; + } + + iotrace_set_region(addr, size); + + return 0; +} + int do_iotrace(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { const char *cmd = argc < 2 ? NULL : argv[1]; @@ -47,6 +96,8 @@ int do_iotrace(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) switch (*cmd) { case 'b': return do_set_buffer(argc - 2, argv + 2); + case 'l': + return do_set_region(argc - 2, argv + 2); case 'p': iotrace_set_enabled(0); break; @@ -56,6 +107,9 @@ int do_iotrace(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) case 's': do_print_stats(); break; + case 'd': + do_print_trace(); + break; default: return CMD_RET_USAGE; } @@ -68,6 +122,8 @@ U_BOOT_CMD( "iotrace utility commands", "stats - display iotrace stats\n" "iotrace buffer
- set iotrace buffer\n" + "iotrace limit
- set iotrace region limit\n" "iotrace pause - pause tracing\n" - "iotrace resume - resume tracing" + "iotrace resume - resume tracing\n" + "iotrace dump - dump iotrace buffer" );