diff --git a/README b/README index c5cfb13..3a8938f 100644 --- a/README +++ b/README @@ -783,6 +783,7 @@ The following options need to be configured: CONFIG_CMD_SOURCE "source" command Support CONFIG_CMD_SPI * SPI serial bus support CONFIG_CMD_TFTPSRV * TFTP transfer in server mode + CONFIG_CMD_TIME * run command and report execution time CONFIG_CMD_USB * USB support CONFIG_CMD_CDP * Cisco Discover Protocol support CONFIG_CMD_FSL * Microblaze FSL support diff --git a/common/Makefile b/common/Makefile index 371a0d9..fdc4206 100644 --- a/common/Makefile +++ b/common/Makefile @@ -147,6 +147,7 @@ COBJS-$(CONFIG_CMD_SPI) += cmd_spi.o COBJS-$(CONFIG_CMD_SPIBOOTLDR) += cmd_spibootldr.o COBJS-$(CONFIG_CMD_STRINGS) += cmd_strings.o COBJS-$(CONFIG_CMD_TERMINAL) += cmd_terminal.o +COBJS-$(CONFIG_CMD_TIME) += cmd_time.o COBJS-$(CONFIG_SYS_HUSH_PARSER) += cmd_test.o COBJS-$(CONFIG_CMD_TSI148) += cmd_tsi148.o COBJS-$(CONFIG_CMD_UBI) += cmd_ubi.o diff --git a/common/cmd_time.c b/common/cmd_time.c new file mode 100644 index 0000000..c937ae4 --- /dev/null +++ b/common/cmd_time.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2011 The Chromium OS Authors. + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include +#include + +/* + * TODO(clchiou): This function actually minics the bottom-half of the + * run_command() function. Since this function has ARM-dependent timer + * codes, we cannot merge it with the run_command() for now. + */ +static int run_command_and_time_it(int flag, int argc, char * const argv[], + ulong *cycles) +{ + cmd_tbl_t *cmdtp = find_cmd(argv[0]); + int retval = 0; + + if (!cmdtp) { + printf("%s: command not found\n", argv[0]); + return 1; + } + if (argc > cmdtp->maxargs) + return cmd_usage(cmdtp); + + /* + * TODO(clchiou): get_timer_masked() is only defined in certain ARM + * boards. We could use the new timer API that Graeme is proposing + * so that this piece of code would be arch-independent. + */ + *cycles = get_timer_masked(); + retval = cmdtp->cmd(cmdtp, flag, argc, argv); + *cycles = get_timer_masked() - *cycles; + + return retval; +} + +static void report_time(ulong cycles) +{ + ulong minutes, seconds, milliseconds; + ulong 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("\ntime:"); + if (minutes) + printf(" %lu minutes,", minutes); + printf(" %lu.%03lu seconds, %lu ticks\n", + seconds, milliseconds, cycles); +} + +static int do_time(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + ulong cycles = 0; + int retval = 0; + + if (argc == 1) + return cmd_usage(cmdtp); + + retval = run_command_and_time_it(0, argc - 1, argv + 1, &cycles); + report_time(cycles); + + return retval; +} + +U_BOOT_CMD(time, CONFIG_SYS_MAXARGS, 0, do_time, + "run commands and summarize execution time", + "command [args...]\n");