Index: common/cmd_time.c |
diff --git a/common/cmd_time.c b/common/cmd_time.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..98c19930c7f670bde03102fa5b5fe709a617ceca |
--- /dev/null |
+++ b/common/cmd_time.c |
@@ -0,0 +1,81 @@ |
+/* |
+ * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ * |
+ * Alternatively, this software may be distributed under the terms of the |
+ * GNU General Public License ("GPL") version 2 as published by the Free |
+ * Software Foundation. |
+ */ |
+ |
+/* time - run a command and report its run time */ |
+ |
+#include <common.h> |
+#include <command.h> |
+ |
+static void report_time(unsigned long int cycles) |
+{ |
+#ifdef CONFIG_SYS_HZ |
+ unsigned long int minutes, seconds, milliseconds; |
+ unsigned long int total_seconds, remainder; |
+ |
+ total_seconds = cycles / CONFIG_SYS_HZ; |
+ remainder = cycles % CONFIG_SYS_HZ; |
+ minutes = total_seconds / 60; |
+ seconds = total_seconds % 60; |
+ /* approximate millisecond value */ |
+ milliseconds = (remainder * 1000 + CONFIG_SYS_HZ / 2) / CONFIG_SYS_HZ; |
+ |
+ printf("time:"); |
+ if (minutes) |
+ printf(" %lu minutes,", minutes); |
+ printf(" %lu.%03lu seconds,", seconds, milliseconds); |
+ printf(" %lu ticks\n", cycles); |
+#else |
+ printf("CONFIG_SYS_HZ not defined\n"); |
+ printf("time: %lu ticks\n", cycles); |
+#endif |
+} |
+ |
+int do_time(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
+{ |
+ const int target_argc = argc - 1; |
+ int retval = 0; |
+ unsigned long int cycles = 0; |
+ cmd_tbl_t *target_cmdtp = NULL; |
+ |
+ if (argc == 1) { |
+ printf("no command provided\n"); |
+ return 1; |
+ } |
+ |
+ /* parse command */ |
+ target_cmdtp = find_cmd(argv[1]); |
+ if (!target_cmdtp) { |
+ printf("command not found: %s\n", argv[1]); |
+ return 1; |
+ } |
+ |
+ if (target_argc > target_cmdtp->maxargs) { |
+ printf("maxarags exceeded: %d > %d\n", target_argc, |
+ target_cmdtp->maxargs); |
+ return 1; |
+ } |
+ |
+ /* run the command and report run time */ |
+ cycles = get_timer_masked(); |
+ retval = target_cmdtp->cmd(target_cmdtp, 0, target_argc, argv + 1); |
+ cycles = get_timer_masked() - cycles; |
+ |
+ putc('\n'); |
+ report_time(cycles); |
+ |
+ return retval; |
+} |
+ |
+U_BOOT_CMD(time, CONFIG_SYS_MAXARGS, 0, do_time, |
+ "run a command and report its run time", |
+ "command [args...]\n" |
+ "the return value of time is the return value of " |
+ "the command it executed, " |
+ "or non-zero if there is an internal error of time.\n"); |