diff options
| -rw-r--r-- | README | 1 | ||||
| -rw-r--r-- | common/Makefile | 1 | ||||
| -rw-r--r-- | common/cmd_time.c | 90 | 
3 files changed, 92 insertions, 0 deletions
| @@ -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 371a0d99b..fdc420685 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 000000000..c937ae4af --- /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 <common.h> +#include <command.h> + +/* + * 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"); |