* Code cleanup:
- remove trailing white space, trailing empty lines, C++ comments, etc.
- split cmd_boot.c (separate cmd_bdinfo.c and cmd_load.c)
* Patches by Kenneth Johansson, 25 Jun 2003:
- major rework of command structure
(work done mostly by Michal Cendrowski and Joakim Kristiansen)
diff --git a/common/Makefile b/common/Makefile
index d93dbb3..3aa9b65 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -28,21 +28,24 @@
AOBJS =
COBJS = main.o altera.o bedbug.o \
- cmd_autoscript.o cmd_bedbug.o cmd_bmp.o cmd_boot.o \
- cmd_bootm.o cmd_cache.o cmd_console.o cmd_date.o \
- cmd_dcr.o cmd_diag.o cmd_doc.o cmd_nand.o cmd_dtt.o \
+ cmd_autoscript.o \
+ cmd_bdinfo.o cmd_bedbug.o cmd_bmp.o cmd_boot.o cmd_bootm.o \
+ cmd_cache.o cmd_console.o \
+ cmd_date.o cmd_dcr.o cmd_diag.o cmd_doc.o cmd_dtt.o \
cmd_eeprom.o cmd_elf.o \
- cmd_fat.o cmd_fdc.o cmd_fdos.o cmd_flash.o \
- cmd_fpga.o cmd_i2c.o cmd_ide.o cmd_immap.o \
- cmd_jffs2.o cmd_log.o cmd_mem.o cmd_mii.o cmd_misc.o \
- cmd_mmc.o cmd_net.o cmd_nvedit.o env_common.o \
- env_flash.o env_eeprom.o env_nvram.o env_nowhere.o \
+ cmd_fat.o cmd_fdc.o cmd_fdos.o cmd_flash.o cmd_fpga.o \
+ cmd_i2c.o cmd_ide.o cmd_immap.o cmd_jffs2.o \
+ cmd_load.o cmd_log.o \
+ cmd_mem.o cmd_mii.o cmd_misc.o cmd_mmc.o \
+ cmd_nand.o cmd_net.o cmd_nvedit.o \
cmd_pci.o cmd_pcmcia.o cmd_portio.o \
- cmd_reginfo.o cmd_scsi.o cmd_vfd.o cmd_usb.o \
- command.o console.o devices.o dlmalloc.o \
- docecc.o environment.o flash.o fpga.o \
+ cmd_reginfo.o cmd_scsi.o cmd_spi.o cmd_usb.o cmd_vfd.o \
+ command.o console.o devices.o dlmalloc.o docecc.o \
+ environment.o env_common.o \
+ env_flash.o env_eeprom.o env_nvram.o env_nowhere.o \
+ flash.o fpga.o \
hush.o kgdb.o lists.o miiphybb.o miiphyutil.o \
- s_record.o soft_i2c.o soft_spi.o cmd_spi.o spartan2.o \
+ s_record.o soft_i2c.o soft_spi.o spartan2.o \
usb.o usb_kbd.o usb_storage.o \
virtex2.o xilinx.o
diff --git a/common/bedbug.c b/common/bedbug.c
index fe54d17..6966de7 100644
--- a/common/bedbug.c
+++ b/common/bedbug.c
@@ -27,7 +27,7 @@
int print_operands __P ((struct ppc_ctx *));
int get_operand_value __P ((struct opcode *, unsigned long,
- enum OP_FIELD, unsigned long *));
+ enum OP_FIELD, unsigned long *));
struct opcode *find_opcode __P ((unsigned long));
struct opcode *find_opcode_by_name __P ((char *));
char *spr_name __P ((int));
@@ -35,7 +35,7 @@
char *tbr_name __P ((int));
int tbr_value __P ((char *));
int parse_operand __P ((unsigned long, struct opcode *,
- struct operand *, char *, int *));
+ struct operand *, char *, int *));
int get_word __P ((char **, char *));
long read_number __P ((char *));
int downstring __P ((char *));
diff --git a/common/cmd_autoscript.c b/common/cmd_autoscript.c
index 7e706c9..d3d04c3 100644
--- a/common/cmd_autoscript.c
+++ b/common/cmd_autoscript.c
@@ -40,8 +40,6 @@
#include <image.h>
#include <malloc.h>
#include <asm/byteorder.h>
-#include <cmd_boot.h>
-#include <cmd_autoscript.h>
#if defined(CONFIG_8xx)
#include <mpc8xx.h>
#endif
@@ -49,8 +47,9 @@
#include <hush.h>
#endif
+#define AUTOSCRIPT_MAGIC 0x09011962
#if defined(CONFIG_AUTOSCRIPT) || \
- (CONFIG_COMMANDS & CFG_CMD_AUTOSCRIPT)
+ (CONFIG_COMMANDS & CFG_CMD_AUTOSCRIPT )
extern image_header_t header; /* from cmd_bootm.c */
int
@@ -118,7 +117,7 @@
memmove (cmd, (char *)len_ptr, len);
*(cmd + len) = 0;
-#ifdef CFG_HUSH_PARSER
+#ifdef CFG_HUSH_PARSER /*?? */
rcode = parse_string_outer (cmd, FLAG_PARSE_SEMICOLON);
#else
{
@@ -153,7 +152,7 @@
}
#endif /* CONFIG_AUTOSCRIPT || CFG_CMD_AUTOSCRIPT */
-
+/**************************************************/
#if (CONFIG_COMMANDS & CFG_CMD_AUTOSCRIPT)
int
do_autoscript (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
@@ -171,4 +170,14 @@
rcode = autoscript (addr);
return rcode;
}
+
+#if (CONFIG_COMMANDS & CFG_CMD_AUTOSCRIPT)
+cmd_tbl_t U_BOOT_CMD(AUTOSCRIPT) = MK_CMD_ENTRY(
+ "autoscr", 2, 0, do_autoscript,
+ "autoscr - run script from memory\n",
+ "[addr] - run script starting at addr"
+ " - A valid autoscr header must be present\n"
+);
#endif /* CFG_CMD_AUTOSCRIPT */
+
+#endif /* CONFIG_AUTOSCRIPT || CFG_CMD_AUTOSCRIPT */
diff --git a/common/cmd_bdinfo.c b/common/cmd_bdinfo.c
new file mode 100644
index 0000000..3f73cf8
--- /dev/null
+++ b/common/cmd_bdinfo.c
@@ -0,0 +1,180 @@
+/*
+ * (C) Copyright 2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * 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
+ */
+
+/*
+ * Boot support
+ */
+#include <common.h>
+#include <command.h>
+
+
+#if (CONFIG_COMMANDS & CFG_CMD_BDI)
+static void print_num(const char *, ulong);
+
+#ifndef CONFIG_ARM /* PowerPC and other */
+
+#ifdef CONFIG_PPC
+static void print_str(const char *, const char *);
+
+int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ DECLARE_GLOBAL_DATA_PTR;
+
+ int i;
+ bd_t *bd = gd->bd;
+ char buf[32];
+
+#ifdef DEBUG
+ print_num ("bd address", (ulong)bd );
+#endif
+ print_num ("memstart", bd->bi_memstart );
+ print_num ("memsize", bd->bi_memsize );
+ print_num ("flashstart", bd->bi_flashstart );
+ print_num ("flashsize", bd->bi_flashsize );
+ print_num ("flashoffset", bd->bi_flashoffset );
+ print_num ("sramstart", bd->bi_sramstart );
+ print_num ("sramsize", bd->bi_sramsize );
+#if defined(CONFIG_5xx) || defined(CONFIG_8xx) || defined(CONFIG_8260)
+ print_num ("immr_base", bd->bi_immr_base );
+#endif
+ print_num ("bootflags", bd->bi_bootflags );
+#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_405EP)
+ print_str ("procfreq", strmhz(buf, bd->bi_procfreq));
+ print_str ("plb_busfreq", strmhz(buf, bd->bi_plb_busfreq));
+#if defined(CONFIG_405GP) || defined(CONFIG_405EP)
+ print_str ("pci_busfreq", strmhz(buf, bd->bi_pci_busfreq));
+#endif
+#else /* ! CONFIG_405GP, CONFIG_405CR, CONFIG_405EP */
+#if defined(CONFIG_8260)
+ print_str ("vco", strmhz(buf, bd->bi_vco));
+ print_str ("sccfreq", strmhz(buf, bd->bi_sccfreq));
+ print_str ("brgfreq", strmhz(buf, bd->bi_brgfreq));
+#endif
+ print_str ("intfreq", strmhz(buf, bd->bi_intfreq));
+#if defined(CONFIG_8260)
+ print_str ("cpmfreq", strmhz(buf, bd->bi_cpmfreq));
+#endif
+ print_str ("busfreq", strmhz(buf, bd->bi_busfreq));
+#endif /* CONFIG_405GP, CONFIG_405CR, CONFIG_405EP */
+ printf ("ethaddr =");
+ for (i=0; i<6; ++i) {
+ printf ("%c%02X", i ? ':' : ' ', bd->bi_enetaddr[i]);
+ }
+#ifdef CONFIG_PN62
+ printf ("\neth1addr =");
+ for (i=0; i<6; ++i) {
+ printf ("%c%02X", i ? ':' : ' ', bd->bi_enet1addr[i]);
+ }
+#endif /* CONFIG_PN62 */
+#ifdef CONFIG_HERMES
+ print_str ("ethspeed", strmhz(buf, bd->bi_ethspeed));
+#endif
+ printf ("\nIP addr = "); print_IPaddr (bd->bi_ip_addr);
+ printf ("\nbaudrate = %6ld bps\n", bd->bi_baudrate );
+ return 0;
+}
+
+#else /* ! PPC, which leaves MIPS */
+
+int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ DECLARE_GLOBAL_DATA_PTR;
+
+ int i;
+ bd_t *bd = gd->bd;
+
+ print_num ("boot_params", (ulong)bd->bi_boot_params);
+ print_num ("memstart", (ulong)bd->bi_memstart);
+ print_num ("memsize", (ulong)bd->bi_memsize);
+ print_num ("flashstart", (ulong)bd->bi_flashstart);
+ print_num ("flashsize", (ulong)bd->bi_flashsize);
+ print_num ("flashoffset", (ulong)bd->bi_flashoffset);
+
+ printf ("ethaddr =");
+ for (i=0; i<6; ++i) {
+ printf ("%c%02X", i ? ':' : ' ', bd->bi_enetaddr[i]);
+ }
+ printf ("\nip_addr = ");
+ print_IPaddr (bd->bi_ip_addr);
+ printf ("\nbaudrate = %d bps\n", bd->bi_baudrate);
+
+ return 0;
+}
+#endif /* MIPS */
+
+#else /* ARM */
+
+int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ DECLARE_GLOBAL_DATA_PTR;
+
+ int i;
+ bd_t *bd = gd->bd;
+
+ print_num ("arch_number", bd->bi_arch_number);
+ print_num ("env_t", (ulong)bd->bi_env);
+ print_num ("boot_params", (ulong)bd->bi_boot_params);
+
+ for (i=0; i<CONFIG_NR_DRAM_BANKS; ++i) {
+ print_num("DRAM bank", i);
+ print_num("-> start", bd->bi_dram[i].start);
+ print_num("-> size", bd->bi_dram[i].size);
+ }
+
+ printf ("ethaddr =");
+ for (i=0; i<6; ++i) {
+ printf ("%c%02X", i ? ':' : ' ', bd->bi_enetaddr[i]);
+ }
+ printf ("\n"
+ "ip_addr = ");
+ print_IPaddr (bd->bi_ip_addr);
+ printf ("\n"
+ "baudrate = %d bps\n", bd->bi_baudrate);
+
+ return 0;
+}
+
+#endif /* CONFIG_ARM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
+
+static void print_num(const char *name, ulong value)
+{
+ printf ("%-12s= 0x%08lX\n", name, value);
+}
+
+#ifdef CONFIG_PPC
+static void print_str(const char *name, const char *str)
+{
+ printf ("%-12s= %6s MHz\n", name, str);
+}
+#endif /* CONFIG_PPC */
+
+
+/* -------------------------------------------------------------------- */
+
+cmd_tbl_t U_BOOT_CMD(BDINFO) = MK_CMD_ENTRY(
+ "bdinfo", 1, 1, do_bdinfo,
+ "bdinfo - print Board Info structure\n",
+ NULL
+);
+#endif /* CFG_CMD_BDI */
+
diff --git a/common/cmd_bedbug.c b/common/cmd_bedbug.c
index f3b5f88..6ee01d5 100644
--- a/common/cmd_bedbug.c
+++ b/common/cmd_bedbug.c
@@ -6,12 +6,10 @@
#include <command.h>
#include <linux/ctype.h>
#include <net.h>
-
-#include <cmd_bedbug.h>
+#include <bedbug/type.h>
#include <bedbug/bedbug.h>
#include <bedbug/regs.h>
#include <bedbug/ppc.h>
-#include <elf.h>
#if (CONFIG_COMMANDS & CFG_CMD_BEDBUG)
@@ -110,8 +108,11 @@
dis_last_len = len;
return 0;
} /* do_bedbug_dis */
-
-
+cmd_tbl_t U_BOOT_CMD(DIS) = MK_CMD_ENTRY(
+ "ds", 3, 1, do_bedbug_dis,
+ "ds - disassemble memory\n",
+ "ds <address> [# instructions]\n"
+);
/* ======================================================================
* Entry point from the interpreter to the assembler. Assembles
@@ -154,7 +155,7 @@
else
{
printf( "*** Error: %s ***\n", asm_error_str( asm_err ));
- rcode = 1;
+ rcode = 1;
}
}
else
@@ -164,8 +165,11 @@
}
return rcode;
} /* do_bedbug_asm */
-
-
+cmd_tbl_t U_BOOT_CMD(ASM) = MK_CMD_ENTRY(
+ "as", 2, 0, do_bedbug_asm,
+ "as - assemble memory\n",
+ "as <address>\n"
+);
/* ======================================================================
* Used to set a break point from the interpreter. Simply calls into the
@@ -180,8 +184,14 @@
return 0;
} /* do_bedbug_break */
-
-
+cmd_tbl_t U_BOOT_CMD(BREAK) = MK_CMD_ENTRY(
+ "break", 3, 0, do_bedbug_break,
+ "break - set or clear a breakpoint\n",
+ " - Set or clear a breakpoint\n"
+ "break <address> - Break at an address\n"
+ "break off <bp#> - Disable breakpoint.\n"
+ "break show - List breakpoints.\n"
+);
/* ======================================================================
* Called from the debug interrupt routine. Simply calls the CPU-specific
@@ -278,8 +288,11 @@
bug_ctx.stopped = 0;
return 0;
} /* do_bedbug_continue */
-
-
+cmd_tbl_t U_BOOT_CMD(CONTINUE) = MK_CMD_ENTRY(
+ "continue", 1, 0, do_bedbug_continue,
+ "continue- continue from a breakpoint\n",
+ " - continue from a breakpoint.\n"
+);
/* ======================================================================
* Interpreter command to continue to the next instruction, stepping into
@@ -307,8 +320,11 @@
bug_ctx.stopped = 0;
return 0;
} /* do_bedbug_step */
-
-
+cmd_tbl_t U_BOOT_CMD(STEP) = MK_CMD_ENTRY(
+ "step", 1, 1, do_bedbug_step,
+ "step - single step execution.\n",
+ " - single step execution.\n"
+);
/* ======================================================================
* Interpreter command to continue to the next instruction, stepping over
@@ -336,8 +352,11 @@
bug_ctx.stopped = 0;
return 0;
} /* do_bedbug_next */
-
-
+cmd_tbl_t U_BOOT_CMD(NEXT) = MK_CMD_ENTRY(
+ "next", 1, 1, do_bedbug_next,
+ "next - single step execution, stepping over subroutines.\n",
+ " - single step execution, stepping over subroutines.\n"
+);
/* ======================================================================
* Interpreter command to print the current stack. This assumes an EABI
@@ -382,8 +401,11 @@
}
return 0;
} /* do_bedbug_stack */
-
-
+cmd_tbl_t U_BOOT_CMD(STACK) = MK_CMD_ENTRY(
+ "where", 1, 1, do_bedbug_stack,
+ "where - Print the running stack.\n",
+ " - Print the running stack.\n"
+);
/* ======================================================================
* Interpreter command to dump the registers. Calls the CPU-specific
@@ -402,8 +424,11 @@
show_regs( bug_ctx.regs );
return 0;
} /* do_bedbug_rdump */
-
-
+cmd_tbl_t U_BOOT_CMD(RDUMP) = MK_CMD_ENTRY(
+ "rdump", 1, 1, do_bedbug_rdump,
+ "rdump - Show registers.\n",
+ " - Show registers.\n"
+);
/* ====================================================================== */
#endif /* CFG_CMD_BEDBUG */
diff --git a/common/cmd_boot.c b/common/cmd_boot.c
index fef8459..a0bc04b 100644
--- a/common/cmd_boot.c
+++ b/common/cmd_boot.c
@@ -1,5 +1,5 @@
/*
- * (C) Copyright 2000-2002
+ * (C) Copyright 2000-2003
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* See file CREDITS for list of people who contributed to this
@@ -22,170 +22,16 @@
*/
/*
- * Boot support
+ * Misc boot support
*/
#include <common.h>
#include <command.h>
-#include <cmd_boot.h>
#include <cmd_autoscript.h>
-#include <s_record.h>
#include <net.h>
#include <syscall.h>
-#if (CONFIG_COMMANDS & CFG_CMD_LOADS)
-static ulong load_serial (ulong offset);
-static int read_record (char *buf, ulong len);
-# if (CONFIG_COMMANDS & CFG_CMD_SAVES)
-static int save_serial (ulong offset, ulong size);
-static int write_record (char *buf);
-# endif /* CFG_CMD_SAVES */
-
-static int do_echo = 1;
-#endif /* CFG_CMD_LOADS */
-
-
-#if (CONFIG_COMMANDS & CFG_CMD_BDI)
-static void print_num(const char *, ulong);
-
-#ifndef CONFIG_ARM /* PowerPC and other */
-
-#ifdef CONFIG_PPC
-static void print_str(const char *, const char *);
-
-int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
- DECLARE_GLOBAL_DATA_PTR;
-
- int i;
- bd_t *bd = gd->bd;
- char buf[32];
-
-#ifdef DEBUG
- print_num ("bd address", (ulong)bd );
-#endif
- print_num ("memstart", bd->bi_memstart );
- print_num ("memsize", bd->bi_memsize );
- print_num ("flashstart", bd->bi_flashstart );
- print_num ("flashsize", bd->bi_flashsize );
- print_num ("flashoffset", bd->bi_flashoffset );
- print_num ("sramstart", bd->bi_sramstart );
- print_num ("sramsize", bd->bi_sramsize );
-#if defined(CONFIG_5xx) || defined(CONFIG_8xx) || defined(CONFIG_8260)
- print_num ("immr_base", bd->bi_immr_base );
-#endif
- print_num ("bootflags", bd->bi_bootflags );
-#if defined(CONFIG_405GP) || defined(CONFIG_405CR) || defined(CONFIG_405EP)
- print_str ("procfreq", strmhz(buf, bd->bi_procfreq));
- print_str ("plb_busfreq", strmhz(buf, bd->bi_plb_busfreq));
-#if defined(CONFIG_405GP) || defined(CONFIG_405EP)
- print_str ("pci_busfreq", strmhz(buf, bd->bi_pci_busfreq));
-#endif
-#else
-#if defined(CONFIG_8260)
- print_str ("vco", strmhz(buf, bd->bi_vco));
- print_str ("sccfreq", strmhz(buf, bd->bi_sccfreq));
- print_str ("brgfreq", strmhz(buf, bd->bi_brgfreq));
-#endif
- print_str ("intfreq", strmhz(buf, bd->bi_intfreq));
-#if defined(CONFIG_8260)
- print_str ("cpmfreq", strmhz(buf, bd->bi_cpmfreq));
-#endif
- print_str ("busfreq", strmhz(buf, bd->bi_busfreq));
-#endif /* defined(CONFIG_405GP) || defined(CONFIG_405CR) */
- printf ("ethaddr =");
- for (i=0; i<6; ++i) {
- printf ("%c%02X", i ? ':' : ' ', bd->bi_enetaddr[i]);
- }
-#ifdef CONFIG_PN62
- printf ("\neth1addr =");
- for (i=0; i<6; ++i) {
- printf ("%c%02X", i ? ':' : ' ', bd->bi_enet1addr[i]);
- }
-#endif /* CONFIG_PN62 */
-#ifdef CONFIG_HERMES
- print_str ("ethspeed", strmhz(buf, bd->bi_ethspeed));
-#endif
- printf ("\nIP addr = "); print_IPaddr (bd->bi_ip_addr);
- printf ("\nbaudrate = %6ld bps\n", bd->bi_baudrate );
- return 0;
-}
-
-#else /* MIPS */
-
-int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
- DECLARE_GLOBAL_DATA_PTR;
-
- int i;
- bd_t *bd = gd->bd;
-
- print_num ("boot_params", (ulong)bd->bi_boot_params);
- print_num ("memstart", (ulong)bd->bi_memstart);
- print_num ("memsize", (ulong)bd->bi_memsize);
- print_num ("flashstart", (ulong)bd->bi_flashstart);
- print_num ("flashsize", (ulong)bd->bi_flashsize);
- print_num ("flashoffset", (ulong)bd->bi_flashoffset);
-
- printf ("ethaddr =");
- for (i=0; i<6; ++i) {
- printf ("%c%02X", i ? ':' : ' ', bd->bi_enetaddr[i]);
- }
- printf ("\nip_addr = ");
- print_IPaddr (bd->bi_ip_addr);
- printf ("\nbaudrate = %d bps\n", bd->bi_baudrate);
-
- return 0;
-}
-#endif /* MIPS */
-
-#else /* ARM */
-
-int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
- DECLARE_GLOBAL_DATA_PTR;
-
- int i;
- bd_t *bd = gd->bd;
-
- print_num ("arch_number", bd->bi_arch_number);
- print_num ("env_t", (ulong)bd->bi_env);
- print_num ("boot_params", (ulong)bd->bi_boot_params);
-
- for (i=0; i<CONFIG_NR_DRAM_BANKS; ++i) {
- print_num("DRAM bank", i);
- print_num("-> start", bd->bi_dram[i].start);
- print_num("-> size", bd->bi_dram[i].size);
- }
-
- printf ("ethaddr =");
- for (i=0; i<6; ++i) {
- printf ("%c%02X", i ? ':' : ' ', bd->bi_enetaddr[i]);
- }
- printf ("\n"
- "ip_addr = ");
- print_IPaddr (bd->bi_ip_addr);
- printf ("\n"
- "baudrate = %d bps\n", bd->bi_baudrate);
-
- return 0;
-}
-
-#endif /* CONFIG_ARM XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
-
-static void print_num(const char *name, ulong value)
-{
- printf ("%-12s= 0x%08lX\n", name, value);
-}
-
-#ifdef CONFIG_PPC
-static void print_str(const char *name, const char *str)
-{
- printf ("%-12s= %6s MHz\n", name, str);
-}
-#endif /* CONFIG_PPC */
-
-#endif /* CFG_CMD_BDI */
+/* -------------------------------------------------------------------- */
int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
@@ -212,947 +58,19 @@
return rcode;
}
-#if (CONFIG_COMMANDS & CFG_CMD_LOADS)
-int do_load_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
- ulong offset = 0;
- ulong addr;
- int i;
- char *env_echo;
- int rcode = 0;
-#ifdef CFG_LOADS_BAUD_CHANGE
- DECLARE_GLOBAL_DATA_PTR;
- int load_baudrate, current_baudrate;
+/* -------------------------------------------------------------------- */
- load_baudrate = current_baudrate = gd->baudrate;
-#endif
+cmd_tbl_t U_BOOT_CMD(GO) = MK_CMD_ENTRY(
+ "go", CFG_MAXARGS, 1, do_go,
+ "go - start application at address 'addr'\n",
+ "addr [arg ...]\n - start application at address 'addr'\n"
+ " passing 'arg' as arguments\n"
+);
- if (((env_echo = getenv("loads_echo")) != NULL) && (*env_echo == '1')) {
- do_echo = 1;
- } else {
- do_echo = 0;
- }
+extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
-#ifdef CFG_LOADS_BAUD_CHANGE
- if (argc >= 2) {
- offset = simple_strtoul(argv[1], NULL, 16);
- }
- if (argc == 3) {
- load_baudrate = (int)simple_strtoul(argv[2], NULL, 10);
-
- /* default to current baudrate */
- if (load_baudrate == 0)
- load_baudrate = current_baudrate;
- }
-#else /* ! CFG_LOADS_BAUD_CHANGE */
- if (argc == 2) {
- offset = simple_strtoul(argv[1], NULL, 16);
- }
-#endif /* CFG_LOADS_BAUD_CHANGE */
-
-#ifdef CFG_LOADS_BAUD_CHANGE
- if (load_baudrate != current_baudrate) {
- printf ("## Switch baudrate to %d bps and press ENTER ...\n",
- load_baudrate);
- udelay(50000);
- gd->baudrate = load_baudrate;
- serial_setbrg ();
- udelay(50000);
- for (;;) {
- if (getc() == '\r')
- break;
- }
- }
-#endif /* CFG_LOADS_BAUD_CHANGE */
- printf ("## Ready for S-Record download ...\n");
-
- addr = load_serial (offset);
-
- /*
- * Gather any trailing characters (for instance, the ^D which
- * is sent by 'cu' after sending a file), and give the
- * box some time (100 * 1 ms)
- */
- for (i=0; i<100; ++i) {
- if (serial_tstc()) {
- (void) serial_getc();
- }
- udelay(1000);
- }
-
- if (addr == ~0) {
- printf ("## S-Record download aborted\n");
- rcode = 1;
- } else {
- printf ("## Start Addr = 0x%08lX\n", addr);
- load_addr = addr;
- }
-
-#ifdef CFG_LOADS_BAUD_CHANGE
- if (load_baudrate != current_baudrate) {
- printf ("## Switch baudrate to %d bps and press ESC ...\n",
- current_baudrate);
- udelay (50000);
- gd->baudrate = current_baudrate;
- serial_setbrg ();
- udelay (50000);
- for (;;) {
- if (getc() == 0x1B) /* ESC */
- break;
- }
- }
-#endif
- return rcode;
-}
-
-static ulong
-load_serial (ulong offset)
-{
- char record[SREC_MAXRECLEN + 1]; /* buffer for one S-Record */
- char binbuf[SREC_MAXBINLEN]; /* buffer for binary data */
- int binlen; /* no. of data bytes in S-Rec. */
- int type; /* return code for record type */
- ulong addr; /* load address from S-Record */
- ulong size; /* number of bytes transferred */
- char buf[32];
- ulong store_addr;
- ulong start_addr = ~0;
- ulong end_addr = 0;
- int line_count = 0;
-
- while (read_record(record, SREC_MAXRECLEN + 1) >= 0) {
- type = srec_decode (record, &binlen, &addr, binbuf);
-
- if (type < 0) {
- return (~0); /* Invalid S-Record */
- }
-
- switch (type) {
- case SREC_DATA2:
- case SREC_DATA3:
- case SREC_DATA4:
- store_addr = addr + offset;
-#ifndef CFG_NO_FLASH
- if (addr2info(store_addr)) {
- int rc;
-
- rc = flash_write((uchar *)binbuf,store_addr,binlen);
- if (rc != 0) {
- flash_perror (rc);
- return (~0);
- }
- } else
-#endif
- {
- memcpy ((char *)(store_addr), binbuf, binlen);
- }
- if ((store_addr) < start_addr)
- start_addr = store_addr;
- if ((store_addr + binlen - 1) > end_addr)
- end_addr = store_addr + binlen - 1;
- break;
- case SREC_END2:
- case SREC_END3:
- case SREC_END4:
- udelay (10000);
- size = end_addr - start_addr + 1;
- printf ("\n"
- "## First Load Addr = 0x%08lX\n"
- "## Last Load Addr = 0x%08lX\n"
- "## Total Size = 0x%08lX = %ld Bytes\n",
- start_addr, end_addr, size, size
- );
- flush_cache (addr, size);
- sprintf(buf, "%lX", size);
- setenv("filesize", buf);
- return (addr);
- case SREC_START:
- break;
- default:
- break;
- }
- if (!do_echo) { /* print a '.' every 100 lines */
- if ((++line_count % 100) == 0)
- putc ('.');
- }
- }
-
- return (~0); /* Download aborted */
-}
-
-static int
-read_record (char *buf, ulong len)
-{
- char *p;
- char c;
-
- --len; /* always leave room for terminating '\0' byte */
-
- for (p=buf; p < buf+len; ++p) {
- c = serial_getc(); /* read character */
- if (do_echo)
- serial_putc (c); /* ... and echo it */
-
- switch (c) {
- case '\r':
- case '\n':
- *p = '\0';
- return (p - buf);
- case '\0':
- case 0x03: /* ^C - Control C */
- return (-1);
- default:
- *p = c;
- }
-
- /* Check for the console hangup (if any different from serial) */
-#ifdef CONFIG_PPC /* we don't have syscall_tbl anywhere else */
- if (syscall_tbl[SYSCALL_GETC] != serial_getc) {
- if (ctrlc()) {
- return (-1);
- }
- }
-#endif
- }
-
- /* line too long - truncate */
- *p = '\0';
- return (p - buf);
-}
-
-#if (CONFIG_COMMANDS & CFG_CMD_SAVES)
-
-int do_save_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
- ulong offset = 0;
- ulong size = 0;
-#ifdef CFG_LOADS_BAUD_CHANGE
- DECLARE_GLOBAL_DATA_PTR;
- int save_baudrate, current_baudrate;
-
- save_baudrate = current_baudrate = gd->baudrate;
-#endif
-
- if (argc >= 2) {
- offset = simple_strtoul(argv[1], NULL, 16);
- }
-#ifdef CFG_LOADS_BAUD_CHANGE
- if (argc >= 3) {
- size = simple_strtoul(argv[2], NULL, 16);
- }
- if (argc == 4) {
- save_baudrate = (int)simple_strtoul(argv[3], NULL, 10);
-
- /* default to current baudrate */
- if (save_baudrate == 0)
- save_baudrate = current_baudrate;
- }
-#else /* ! CFG_LOADS_BAUD_CHANGE */
- if (argc == 3) {
- size = simple_strtoul(argv[2], NULL, 16);
- }
-#endif /* CFG_LOADS_BAUD_CHANGE */
-
-#ifdef CFG_LOADS_BAUD_CHANGE
- if (save_baudrate != current_baudrate) {
- printf ("## Switch baudrate to %d bps and press ENTER ...\n",
- save_baudrate);
- udelay(50000);
- gd->baudrate = save_baudrate;
- serial_setbrg ();
- udelay(50000);
- for (;;) {
- if (getc() == '\r')
- break;
- }
- }
-#endif /* CFG_LOADS_BAUD_CHANGE */
- printf ("## Ready for S-Record upload, press ENTER to proceed ...\n");
- for (;;) {
- if (getc() == '\r')
- break;
- }
- if(save_serial (offset, size)) {
- printf ("## S-Record upload aborted\n");
- } else {
- printf ("## S-Record upload complete\n");
- }
-#ifdef CFG_LOADS_BAUD_CHANGE
- if (save_baudrate != current_baudrate) {
- printf ("## Switch baudrate to %d bps and press ESC ...\n",
- (int)current_baudrate);
- udelay (50000);
- gd->baudrate = current_baudrate;
- serial_setbrg ();
- udelay (50000);
- for (;;) {
- if (getc() == 0x1B) /* ESC */
- break;
- }
- }
-#endif
- return 0;
-}
-
-#define SREC3_START "S0030000FC\n"
-#define SREC3_FORMAT "S3%02X%08lX%s%02X\n"
-#define SREC3_END "S70500000000FA\n"
-#define SREC_BYTES_PER_RECORD 16
-
-static int save_serial (ulong address, ulong count)
-{
- int i, c, reclen, checksum, length;
- char *hex = "0123456789ABCDEF";
- char record[2*SREC_BYTES_PER_RECORD+16]; /* buffer for one S-Record */
- char data[2*SREC_BYTES_PER_RECORD+1]; /* buffer for hex data */
-
- reclen = 0;
- checksum = 0;
-
- if(write_record(SREC3_START)) /* write the header */
- return (-1);
- do {
- if(count) { /* collect hex data in the buffer */
- c = *(volatile uchar*)(address + reclen); /* get one byte */
- checksum += c; /* accumulate checksum */
- data[2*reclen] = hex[(c>>4)&0x0f];
- data[2*reclen+1] = hex[c & 0x0f];
- data[2*reclen+2] = '\0';
- ++reclen;
- --count;
- }
- if(reclen == SREC_BYTES_PER_RECORD || count == 0) {
- /* enough data collected for one record: dump it */
- if(reclen) { /* build & write a data record: */
- /* address + data + checksum */
- length = 4 + reclen + 1;
-
- /* accumulate length bytes into checksum */
- for(i = 0; i < 2; i++)
- checksum += (length >> (8*i)) & 0xff;
-
- /* accumulate address bytes into checksum: */
- for(i = 0; i < 4; i++)
- checksum += (address >> (8*i)) & 0xff;
-
- /* make proper checksum byte: */
- checksum = ~checksum & 0xff;
-
- /* output one record: */
- sprintf(record, SREC3_FORMAT, length, address, data, checksum);
- if(write_record(record))
- return (-1);
- }
- address += reclen; /* increment address */
- checksum = 0;
- reclen = 0;
- }
- }
- while(count);
- if(write_record(SREC3_END)) /* write the final record */
- return (-1);
- return(0);
-}
-
-static int
-write_record (char *buf)
-{
- char c;
-
- while((c = *buf++))
- serial_putc(c);
-
- /* Check for the console hangup (if any different from serial) */
-
- if (ctrlc()) {
- return (-1);
- }
- return (0);
-}
-# endif /* CFG_CMD_SAVES */
-
-#endif /* CFG_CMD_LOADS */
-
-
-#if (CONFIG_COMMANDS & CFG_CMD_LOADB) /* loadb command (load binary) included */
-
-#define XON_CHAR 17
-#define XOFF_CHAR 19
-#define START_CHAR 0x01
-#define ETX_CHAR 0x03
-#define END_CHAR 0x0D
-#define SPACE 0x20
-#define K_ESCAPE 0x23
-#define SEND_TYPE 'S'
-#define DATA_TYPE 'D'
-#define ACK_TYPE 'Y'
-#define NACK_TYPE 'N'
-#define BREAK_TYPE 'B'
-#define tochar(x) ((char) (((x) + SPACE) & 0xff))
-#define untochar(x) ((int) (((x) - SPACE) & 0xff))
-
-extern int os_data_count;
-extern int os_data_header[8];
-
-static void set_kerm_bin_mode(unsigned long *);
-static int k_recv(void);
-static ulong load_serial_bin (ulong offset);
-
-
-char his_eol; /* character he needs at end of packet */
-int his_pad_count; /* number of pad chars he needs */
-char his_pad_char; /* pad chars he needs */
-char his_quote; /* quote chars he'll use */
-
-int do_load_serial_bin (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
- DECLARE_GLOBAL_DATA_PTR;
-
- ulong offset = 0;
- ulong addr;
- int load_baudrate, current_baudrate;
- int rcode = 0;
- char *s;
-
- /* pre-set offset from CFG_LOAD_ADDR */
- offset = CFG_LOAD_ADDR;
-
- /* pre-set offset from $loadaddr */
- if ((s = getenv("loadaddr")) != NULL) {
- offset = simple_strtoul(s, NULL, 16);
- }
-
- load_baudrate = current_baudrate = gd->baudrate;
-
- if (argc >= 2) {
- offset = simple_strtoul(argv[1], NULL, 16);
- }
- if (argc == 3) {
- load_baudrate = (int)simple_strtoul(argv[2], NULL, 10);
-
- /* default to current baudrate */
- if (load_baudrate == 0)
- load_baudrate = current_baudrate;
- }
-
- if (load_baudrate != current_baudrate) {
- printf ("## Switch baudrate to %d bps and press ENTER ...\n",
- load_baudrate);
- udelay(50000);
- gd->baudrate = load_baudrate;
- serial_setbrg ();
- udelay(50000);
- for (;;) {
- if (getc() == '\r')
- break;
- }
- }
-
- printf ("## Ready for binary (kermit) download "
- "to 0x%08lX at %d bps...\n",
- offset,
- current_baudrate);
- addr = load_serial_bin (offset);
-
- if (addr == ~0) {
- load_addr = 0;
- printf ("## Binary (kermit) download aborted\n");
- rcode = 1;
- } else {
- printf ("## Start Addr = 0x%08lX\n", addr);
- load_addr = addr;
- }
-
- if (load_baudrate != current_baudrate) {
- printf ("## Switch baudrate to %d bps and press ESC ...\n",
- current_baudrate);
- udelay (50000);
- gd->baudrate = current_baudrate;
- serial_setbrg ();
- udelay (50000);
- for (;;) {
- if (getc() == 0x1B) /* ESC */
- break;
- }
- }
-
-#ifdef CONFIG_AUTOSCRIPT
- if (load_addr) {
- char *s;
-
- if (((s = getenv("autoscript")) != NULL) && (strcmp(s,"yes") == 0)) {
- printf("Running autoscript at addr 0x%08lX ...\n", load_addr);
- rcode = autoscript (load_addr);
- }
- }
-#endif
- return rcode;
-}
-
-
-static ulong load_serial_bin (ulong offset)
-{
- int size, i;
- char buf[32];
-
- set_kerm_bin_mode ((ulong *) offset);
- size = k_recv ();
-
- /*
- * Gather any trailing characters (for instance, the ^D which
- * is sent by 'cu' after sending a file), and give the
- * box some time (100 * 1 ms)
- */
- for (i=0; i<100; ++i) {
- if (serial_tstc()) {
- (void) serial_getc();
- }
- udelay(1000);
- }
-
- flush_cache (offset, size);
-
- printf("## Total Size = 0x%08x = %d Bytes\n", size, size);
- sprintf(buf, "%X", size);
- setenv("filesize", buf);
-
- return offset;
-}
-
-void send_pad (void)
-{
- int count = his_pad_count;
-
- while (count-- > 0)
- serial_putc (his_pad_char);
-}
-
-/* converts escaped kermit char to binary char */
-char ktrans (char in)
-{
- if ((in & 0x60) == 0x40) {
- return (char) (in & ~0x40);
- } else if ((in & 0x7f) == 0x3f) {
- return (char) (in | 0x40);
- } else
- return in;
-}
-
-int chk1 (char *buffer)
-{
- int total = 0;
-
- while (*buffer) {
- total += *buffer++;
- }
- return (int) ((total + ((total >> 6) & 0x03)) & 0x3f);
-}
-
-void s1_sendpacket (char *packet)
-{
- send_pad ();
- while (*packet) {
- serial_putc (*packet++);
- }
-}
-
-static char a_b[24];
-void send_ack (int n)
-{
- a_b[0] = START_CHAR;
- a_b[1] = tochar (3);
- a_b[2] = tochar (n);
- a_b[3] = ACK_TYPE;
- a_b[4] = '\0';
- a_b[4] = tochar (chk1 (&a_b[1]));
- a_b[5] = his_eol;
- a_b[6] = '\0';
- s1_sendpacket (a_b);
-}
-
-void send_nack (int n)
-{
- a_b[0] = START_CHAR;
- a_b[1] = tochar (3);
- a_b[2] = tochar (n);
- a_b[3] = NACK_TYPE;
- a_b[4] = '\0';
- a_b[4] = tochar (chk1 (&a_b[1]));
- a_b[5] = his_eol;
- a_b[6] = '\0';
- s1_sendpacket (a_b);
-}
-
-
-
-/* os_data_* takes an OS Open image and puts it into memory, and
- puts the boot header in an array named os_data_header
-
- if image is binary, no header is stored in os_data_header.
-*/
-void (*os_data_init) (void);
-void (*os_data_char) (char new_char);
-static int os_data_state, os_data_state_saved;
-int os_data_count;
-static int os_data_count_saved;
-static char *os_data_addr, *os_data_addr_saved;
-static char *bin_start_address;
-int os_data_header[8];
-static void bin_data_init (void)
-{
- os_data_state = 0;
- os_data_count = 0;
- os_data_addr = bin_start_address;
-}
-static void os_data_save (void)
-{
- os_data_state_saved = os_data_state;
- os_data_count_saved = os_data_count;
- os_data_addr_saved = os_data_addr;
-}
-static void os_data_restore (void)
-{
- os_data_state = os_data_state_saved;
- os_data_count = os_data_count_saved;
- os_data_addr = os_data_addr_saved;
-}
-static void bin_data_char (char new_char)
-{
- switch (os_data_state) {
- case 0: /* data */
- *os_data_addr++ = new_char;
- --os_data_count;
- break;
- }
-}
-static void set_kerm_bin_mode (unsigned long *addr)
-{
- bin_start_address = (char *) addr;
- os_data_init = bin_data_init;
- os_data_char = bin_data_char;
-}
-
-
-/* k_data_* simply handles the kermit escape translations */
-static int k_data_escape, k_data_escape_saved;
-void k_data_init (void)
-{
- k_data_escape = 0;
- os_data_init ();
-}
-void k_data_save (void)
-{
- k_data_escape_saved = k_data_escape;
- os_data_save ();
-}
-void k_data_restore (void)
-{
- k_data_escape = k_data_escape_saved;
- os_data_restore ();
-}
-void k_data_char (char new_char)
-{
- if (k_data_escape) {
- /* last char was escape - translate this character */
- os_data_char (ktrans (new_char));
- k_data_escape = 0;
- } else {
- if (new_char == his_quote) {
- /* this char is escape - remember */
- k_data_escape = 1;
- } else {
- /* otherwise send this char as-is */
- os_data_char (new_char);
- }
- }
-}
-
-#define SEND_DATA_SIZE 20
-char send_parms[SEND_DATA_SIZE];
-char *send_ptr;
-
-/* handle_send_packet interprits the protocol info and builds and
- sends an appropriate ack for what we can do */
-void handle_send_packet (int n)
-{
- int length = 3;
- int bytes;
-
- /* initialize some protocol parameters */
- his_eol = END_CHAR; /* default end of line character */
- his_pad_count = 0;
- his_pad_char = '\0';
- his_quote = K_ESCAPE;
-
- /* ignore last character if it filled the buffer */
- if (send_ptr == &send_parms[SEND_DATA_SIZE - 1])
- --send_ptr;
- bytes = send_ptr - send_parms; /* how many bytes we'll process */
- do {
- if (bytes-- <= 0)
- break;
- /* handle MAXL - max length */
- /* ignore what he says - most I'll take (here) is 94 */
- a_b[++length] = tochar (94);
- if (bytes-- <= 0)
- break;
- /* handle TIME - time you should wait for my packets */
- /* ignore what he says - don't wait for my ack longer than 1 second */
- a_b[++length] = tochar (1);
- if (bytes-- <= 0)
- break;
- /* handle NPAD - number of pad chars I need */
- /* remember what he says - I need none */
- his_pad_count = untochar (send_parms[2]);
- a_b[++length] = tochar (0);
- if (bytes-- <= 0)
- break;
- /* handle PADC - pad chars I need */
- /* remember what he says - I need none */
- his_pad_char = ktrans (send_parms[3]);
- a_b[++length] = 0x40; /* He should ignore this */
- if (bytes-- <= 0)
- break;
- /* handle EOL - end of line he needs */
- /* remember what he says - I need CR */
- his_eol = untochar (send_parms[4]);
- a_b[++length] = tochar (END_CHAR);
- if (bytes-- <= 0)
- break;
- /* handle QCTL - quote control char he'll use */
- /* remember what he says - I'll use '#' */
- his_quote = send_parms[5];
- a_b[++length] = '#';
- if (bytes-- <= 0)
- break;
- /* handle QBIN - 8-th bit prefixing */
- /* ignore what he says - I refuse */
- a_b[++length] = 'N';
- if (bytes-- <= 0)
- break;
- /* handle CHKT - the clock check type */
- /* ignore what he says - I do type 1 (for now) */
- a_b[++length] = '1';
- if (bytes-- <= 0)
- break;
- /* handle REPT - the repeat prefix */
- /* ignore what he says - I refuse (for now) */
- a_b[++length] = 'N';
- if (bytes-- <= 0)
- break;
- /* handle CAPAS - the capabilities mask */
- /* ignore what he says - I only do long packets - I don't do windows */
- a_b[++length] = tochar (2); /* only long packets */
- a_b[++length] = tochar (0); /* no windows */
- a_b[++length] = tochar (94); /* large packet msb */
- a_b[++length] = tochar (94); /* large packet lsb */
- } while (0);
-
- a_b[0] = START_CHAR;
- a_b[1] = tochar (length);
- a_b[2] = tochar (n);
- a_b[3] = ACK_TYPE;
- a_b[++length] = '\0';
- a_b[length] = tochar (chk1 (&a_b[1]));
- a_b[++length] = his_eol;
- a_b[++length] = '\0';
- s1_sendpacket (a_b);
-}
-
-/* k_recv receives a OS Open image file over kermit line */
-static int k_recv (void)
-{
- char new_char;
- char k_state, k_state_saved;
- int sum;
- int done;
- int length;
- int n, last_n;
- int z = 0;
- int len_lo, len_hi;
-
- /* initialize some protocol parameters */
- his_eol = END_CHAR; /* default end of line character */
- his_pad_count = 0;
- his_pad_char = '\0';
- his_quote = K_ESCAPE;
-
- /* initialize the k_recv and k_data state machine */
- done = 0;
- k_state = 0;
- k_data_init ();
- k_state_saved = k_state;
- k_data_save ();
- n = 0; /* just to get rid of a warning */
- last_n = -1;
-
- /* expect this "type" sequence (but don't check):
- S: send initiate
- F: file header
- D: data (multiple)
- Z: end of file
- B: break transmission
- */
-
- /* enter main loop */
- while (!done) {
- /* set the send packet pointer to begining of send packet parms */
- send_ptr = send_parms;
-
- /* With each packet, start summing the bytes starting with the length.
- Save the current sequence number.
- Note the type of the packet.
- If a character less than SPACE (0x20) is received - error.
- */
-
-#if 0
- /* OLD CODE, Prior to checking sequence numbers */
- /* first have all state machines save current states */
- k_state_saved = k_state;
- k_data_save ();
-#endif
-
- /* get a packet */
- /* wait for the starting character or ^C */
- for (;;) {
- switch (serial_getc ()) {
- case START_CHAR: /* start packet */
- goto START;
- case ETX_CHAR: /* ^C waiting for packet */
- return (0);
- default:
- ;
- }
- }
-START:
- /* get length of packet */
- sum = 0;
- new_char = serial_getc ();
- if ((new_char & 0xE0) == 0)
- goto packet_error;
- sum += new_char & 0xff;
- length = untochar (new_char);
- /* get sequence number */
- new_char = serial_getc ();
- if ((new_char & 0xE0) == 0)
- goto packet_error;
- sum += new_char & 0xff;
- n = untochar (new_char);
- --length;
-
- /* NEW CODE - check sequence numbers for retried packets */
- /* Note - this new code assumes that the sequence number is correctly
- * received. Handling an invalid sequence number adds another layer
- * of complexity that may not be needed - yet! At this time, I'm hoping
- * that I don't need to buffer the incoming data packets and can write
- * the data into memory in real time.
- */
- if (n == last_n) {
- /* same sequence number, restore the previous state */
- k_state = k_state_saved;
- k_data_restore ();
- } else {
- /* new sequence number, checkpoint the download */
- last_n = n;
- k_state_saved = k_state;
- k_data_save ();
- }
- /* END NEW CODE */
-
- /* get packet type */
- new_char = serial_getc ();
- if ((new_char & 0xE0) == 0)
- goto packet_error;
- sum += new_char & 0xff;
- k_state = new_char;
- --length;
- /* check for extended length */
- if (length == -2) {
- /* (length byte was 0, decremented twice) */
- /* get the two length bytes */
- new_char = serial_getc ();
- if ((new_char & 0xE0) == 0)
- goto packet_error;
- sum += new_char & 0xff;
- len_hi = untochar (new_char);
- new_char = serial_getc ();
- if ((new_char & 0xE0) == 0)
- goto packet_error;
- sum += new_char & 0xff;
- len_lo = untochar (new_char);
- length = len_hi * 95 + len_lo;
- /* check header checksum */
- new_char = serial_getc ();
- if ((new_char & 0xE0) == 0)
- goto packet_error;
- if (new_char != tochar ((sum + ((sum >> 6) & 0x03)) & 0x3f))
- goto packet_error;
- sum += new_char & 0xff;
-/* --length; */ /* new length includes only data and block check to come */
- }
- /* bring in rest of packet */
- while (length > 1) {
- new_char = serial_getc ();
- if ((new_char & 0xE0) == 0)
- goto packet_error;
- sum += new_char & 0xff;
- --length;
- if (k_state == DATA_TYPE) {
- /* pass on the data if this is a data packet */
- k_data_char (new_char);
- } else if (k_state == SEND_TYPE) {
- /* save send pack in buffer as is */
- *send_ptr++ = new_char;
- /* if too much data, back off the pointer */
- if (send_ptr >= &send_parms[SEND_DATA_SIZE])
- --send_ptr;
- }
- }
- /* get and validate checksum character */
- new_char = serial_getc ();
- if ((new_char & 0xE0) == 0)
- goto packet_error;
- if (new_char != tochar ((sum + ((sum >> 6) & 0x03)) & 0x3f))
- goto packet_error;
- /* get END_CHAR */
- new_char = serial_getc ();
- if (new_char != END_CHAR) {
- packet_error:
- /* restore state machines */
- k_state = k_state_saved;
- k_data_restore ();
- /* send a negative acknowledge packet in */
- send_nack (n);
- } else if (k_state == SEND_TYPE) {
- /* crack the protocol parms, build an appropriate ack packet */
- handle_send_packet (n);
- } else {
- /* send simple acknowledge packet in */
- send_ack (n);
- /* quit if end of transmission */
- if (k_state == BREAK_TYPE)
- done = 1;
- }
- ++z;
- }
- return ((ulong) os_data_addr - (ulong) bin_start_address);
-}
-#endif /* CFG_CMD_LOADB */
-#if (CONFIG_COMMANDS & CFG_CMD_HWFLOW)
-int do_hwflow (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-{
- extern int hwflow_onoff(int);
-
- if (argc == 2) {
- if (strcmp(argv[1], "off") == 0)
- hwflow_onoff(-1);
- else
- if (strcmp(argv[1], "on") == 0)
- hwflow_onoff(1);
- else
- printf("Usage: %s\n", cmdtp->usage);
- }
- printf("RTS/CTS hardware flow control: %s\n", hwflow_onoff(0) ? "on" : "off");
- return 0;
-}
-#endif /* CFG_CMD_HWFLOW */
+cmd_tbl_t U_BOOT_CMD(RESET) = MK_CMD_ENTRY(
+ "reset", 1, 0, do_reset,
+ "reset - Perform RESET of the CPU\n",
+ NULL
+);
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 8af7c7c..7ade068 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -27,12 +27,15 @@
#include <common.h>
#include <watchdog.h>
#include <command.h>
-#include <cmd_boot.h>
#include <image.h>
#include <malloc.h>
#include <zlib.h>
#include <environment.h>
#include <asm/byteorder.h>
+
+ /*cmd_boot.c*/
+ extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+
#if (CONFIG_COMMANDS & CFG_CMD_DATE) || defined(CONFIG_TIMESTAMP)
#include <rtc.h>
#endif
@@ -97,6 +100,10 @@
ulong *len_ptr, /* multi-file image length table */
int verify); /* getenv("verify")[0] != 'n' */
+#ifdef DEBUG
+extern int do_bdinfo ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+#endif
+
#ifdef CONFIG_PPC
static boot_os_Fcn do_bootm_linux;
#else
@@ -192,7 +199,7 @@
read_dataflash(data, len, (char *)CFG_LOAD_ADDR);
data = CFG_LOAD_ADDR;
}
-#endif
+#endif
if (verify) {
printf (" Verifying Checksum ... ");
@@ -214,7 +221,7 @@
#elif defined(__I386__)
if (hdr->ih_arch != IH_CPU_I386)
#elif defined(__mips__)
- if (hdr->ih_arch != IH_CPU_MIPS)
+ if (hdr->ih_arch != IH_CPU_MIPS)
#else
# error Unknown CPU type
#endif
@@ -253,7 +260,7 @@
#ifdef CONFIG_AMIGAONEG3SE
/*
- * We've possible left the caches enabled during
+ * We've possible left the caches enabled during
* bios emulation, so turn them off again
*/
icache_disable();
@@ -342,12 +349,12 @@
do_bootm_netbsd (cmdtp, flag, argc, argv,
addr, len_ptr, verify);
break;
-
+
case IH_OS_RTEMS:
do_bootm_rtems (cmdtp, flag, argc, argv,
addr, len_ptr, verify);
break;
-
+
#if (CONFIG_COMMANDS & CFG_CMD_ELF)
case IH_OS_VXWORKS:
do_bootm_vxworks (cmdtp, flag, argc, argv,
@@ -374,6 +381,14 @@
return 1;
}
+cmd_tbl_t U_BOOT_CMD(BOOTM) = MK_CMD_ENTRY(
+ "bootm", CFG_MAXARGS, 1, do_bootm,
+ "bootm - boot application image from memory\n",
+ "[addr [arg ...]]\n - boot application image stored in memory\n"
+ " passing arguments 'arg ...'; when booting a Linux kernel,\n"
+ " 'arg' can be the address of an initrd image\n"
+);
+
#ifdef CONFIG_PPC
static void
do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
@@ -856,6 +871,13 @@
#endif
return rcode;
}
+
+cmd_tbl_t U_BOOT_CMD(BOOTD) = MK_CMD_ENTRY(
+ "bootd", 1, 1, do_bootd,
+ "bootd - boot default, i.e., run 'bootcmd'\n",
+ NULL
+);
+
#endif
#if (CONFIG_COMMANDS & CFG_CMD_IMI)
@@ -916,6 +938,15 @@
printf ("OK\n");
return 0;
}
+cmd_tbl_t U_BOOT_CMD(IMINFO) = MK_CMD_ENTRY(
+ "iminfo", CFG_MAXARGS, 1, do_iminfo,
+ "iminfo - print header information for application image\n",
+ "addr [addr ...]\n"
+ " - print header information for application image starting at\n"
+ " address 'addr' in memory; this includes verification of the\n"
+ " image contents (magic number, header and payload checksums)\n"
+);
+
#endif /* CFG_CMD_IMI */
void
diff --git a/common/cmd_cache.c b/common/cmd_cache.c
index f2015b3..0016b72 100644
--- a/common/cmd_cache.c
+++ b/common/cmd_cache.c
@@ -26,7 +26,6 @@
*/
#include <common.h>
#include <command.h>
-#include <cmd_cache.h>
#if (CONFIG_COMMANDS & CFG_CMD_CACHE)
@@ -95,4 +94,19 @@
return (-1);
}
+
+cmd_tbl_t U_BOOT_CMD(ICACHE) = MK_CMD_ENTRY(
+ "icache", 2, 1, do_icache,
+ "icache - enable or disable instruction cache\n",
+ "[on, off]\n"
+ " - enable or disable instruction cache\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(DCACHE) = MK_CMD_ENTRY(
+ "dcache", 2, 1, do_dcache,
+ "dcache - enable or disable data cache\n",
+ "[on, off]\n"
+ " - enable or disable data (writethrough) cache\n"
+);
+
#endif /* CFG_CMD_CACHE */
diff --git a/common/cmd_console.c b/common/cmd_console.c
index a5f792b..e6b001a 100644
--- a/common/cmd_console.c
+++ b/common/cmd_console.c
@@ -58,4 +58,14 @@
}
return 0;
}
+
+
+/***************************************************/
+
+cmd_tbl_t U_BOOT_CMD(CONINFO) = MK_CMD_ENTRY(
+ "coninfo", 3, 1, do_coninfo,
+ "coninfo - print console devices and informations\n",
+ ""
+);
+
#endif /* CFG_CMD_CONSOLE */
diff --git a/common/cmd_date.c b/common/cmd_date.c
index 2139ceb..6b75210 100644
--- a/common/cmd_date.c
+++ b/common/cmd_date.c
@@ -189,4 +189,15 @@
return (-1);
}
+/***************************************************/
+
+cmd_tbl_t U_BOOT_CMD(DATE) = MK_CMD_ENTRY(
+ "date", 2, 1, do_date,
+ "date - get/set/reset date & time\n",
+ "[MMDDhhmm[[CC]YY][.ss]]\ndate reset\n"
+ " - without arguments: print date & time\n"
+ " - with numeric argument: set the system date & time\n"
+ " - with 'reset' argument: reset the RTC\n"
+);
+
#endif /* CFG_CMD_DATE */
diff --git a/common/cmd_dcr.c b/common/cmd_dcr.c
index 072685e..3ec11b0 100644
--- a/common/cmd_dcr.c
+++ b/common/cmd_dcr.c
@@ -28,7 +28,6 @@
#include <common.h>
#include <config.h>
#include <command.h>
-#include <cmd_dcr.h>
#if defined(CONFIG_4xx) && defined(CFG_CMD_SETGETDCR)
@@ -41,10 +40,12 @@
unsigned short dcrn; /* Device Control Register Num */
unsigned long value; /* DCR's value */
+ unsigned long get_dcr(unsigned short);
+
/* Validate arguments */
if (argc < 2) {
- printf("Usage:\n%s\n", cmdtp->usage);
- return 1;
+ printf("Usage:\n%s\n", cmdtp->usage);
+ return 1;
}
/* Get a DCR */
@@ -63,41 +64,57 @@
*/
int do_setdcr ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
+ unsigned long get_dcr(unsigned short );
+ unsigned long set_dcr(unsigned short , unsigned long );
unsigned short dcrn; /* Device Control Register Num */
- unsigned long value; /* DCR's value */
+ unsigned long value;
+ /* DCR's value */
int nbytes;
extern char console_buffer[];
/* Validate arguments */
if (argc < 2) {
- printf("Usage:\n%s\n", cmdtp->usage);
- return 1;
+ printf("Usage:\n%s\n", cmdtp->usage);
+ return 1;
}
/* Set a DCR */
dcrn = (unsigned short)simple_strtoul(argv[1], NULL, 16);
do {
- value = get_dcr(dcrn);
- printf("%04x: %08lx", dcrn, value);
- nbytes = readline(" ? ");
- if (nbytes == 0) {
- /*
- * <CR> pressed as only input, don't modify current
- * location and exit command.
- */
- nbytes = 1;
- return 0;
- } else {
- unsigned long i;
- char *endp;
- i = simple_strtoul(console_buffer, &endp, 16);
- nbytes = endp - console_buffer;
- if (nbytes)
- set_dcr(dcrn, i);
- }
+ value = get_dcr(dcrn);
+ printf("%04x: %08lx", dcrn, value);
+ nbytes = readline(" ? ");
+ if (nbytes == 0) {
+ /*
+ * <CR> pressed as only input, don't modify current
+ * location and exit command.
+ */
+ nbytes = 1;
+ return 0;
+ } else {
+ unsigned long i;
+ char *endp;
+ i = simple_strtoul(console_buffer, &endp, 16);
+ nbytes = endp - console_buffer;
+ if (nbytes)
+ set_dcr(dcrn, i);
+ }
} while (nbytes);
return 0;
} /* do_setdcr */
+/***************************************************/
+
+cmd_tbl_t U_BOOT_CMD(GETDCR) = MK_CMD_ENTRY(
+ "getdcr", 2, 1, do_getdcr,
+ "getdcr - Get an IBM PPC 4xx DCR's value\n",
+ "dcrn - return a DCR's value.\n"
+);
+cmd_tbl_t U_BOOT_CMD(SETDCR) = MK_CMD_ENTRY(
+ "setdcr", 2, 1, do_setdcr,
+ "setdcr - Set an IBM PPC 4xx DCR's value\n",
+ "dcrn - set a DCR's value.\n"
+);
+
#endif /* CONFIG_4xx & CFG_CMD_SETGETDCR */
diff --git a/common/cmd_diag.c b/common/cmd_diag.c
index 31471ba..0bb6c7f 100644
--- a/common/cmd_diag.c
+++ b/common/cmd_diag.c
@@ -26,7 +26,6 @@
*/
#include <common.h>
#include <command.h>
-#include <cmd_diag.h>
#include <post.h>
#if (CONFIG_COMMANDS & CFG_CMD_DIAG) && defined(CONFIG_POST)
@@ -65,5 +64,17 @@
return 0;
}
+/***************************************************/
+
+cmd_tbl_t U_BOOT_CMD(DIAG) = MK_CMD_ENTRY(
+ "diag", CFG_MAXARGS, 0, do_diag,
+ "diag - perform board diagnostics\n",
+ " - print list of available tests\n"
+ "diag [test1 [test2]]\n"
+ " - print information about specified tests\n"
+ "diag run - run all available tests\n"
+ "diag run [test1 [test2]]\n"
+ " - run specified tests\n"
+);
#endif /* CFG_CMD_DIAG */
diff --git a/common/cmd_doc.c b/common/cmd_doc.c
index 612a6d5..17c9d0d 100644
--- a/common/cmd_doc.c
+++ b/common/cmd_doc.c
@@ -80,7 +80,7 @@
printf ("Usage:\n%s\n", cmdtp->usage);
return 1;
case 2:
- if (strcmp(argv[1],"info") == 0) {
+ if (strcmp(argv[1],"info") == 0) {
int i;
putc ('\n');
@@ -170,6 +170,17 @@
return rcode;
}
}
+cmd_tbl_t U_BOOT_CMD(DOC) = MK_CMD_ENTRY(
+ "doc", 5, 1, do_doc,
+ "doc - Disk-On-Chip sub-system\n",
+ "info - show available DOC devices\n"
+ "doc device [dev] - show or set current device\n"
+ "doc read addr off size\n"
+ "doc write addr off size - read/write `size'"
+ " bytes starting at offset `off'\n"
+ " to/from memory address `addr'\n"
+ "doc erase off size - erase `size' bytes of DOC from offset `off'\n"
+);
int do_docboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
@@ -273,6 +284,12 @@
return rcode;
}
+cmd_tbl_t U_BOOT_CMD(DOCBOOT) = MK_CMD_ENTRY(
+ "docboot", 4, 1, do_docboot,
+ "docboot - boot from DOC device\n",
+ "loadAddr dev\n"
+);
+
int doc_rw (struct DiskOnChip* this, int cmd,
loff_t from, size_t len,
size_t * retlen, u_char * buf)
@@ -385,7 +402,7 @@
}
#endif
udelay(1);
- }
+ }
return 0;
}
@@ -938,7 +955,7 @@
/* Get physical parameters */
nftl->EraseSize = this->erasesize;
- nftl->nb_blocks = this->totlen / this->erasesize;
+ nftl->nb_blocks = this->totlen / this->erasesize;
nftl->mtd = this;
if (find_boot_record(nftl) != 0)
@@ -1054,18 +1071,18 @@
syndrome[i] =
ReadDOC(docptr, ECCSyndrome0 + i);
}
- nb_errors = doc_decode_ecc(buf, syndrome);
+ nb_errors = doc_decode_ecc(buf, syndrome);
#ifdef ECC_DEBUG
printf("Errors corrected: %x\n", nb_errors);
#endif
- if (nb_errors < 0) {
+ if (nb_errors < 0) {
/* We return error, but have actually done the read. Not that
this can be told to user-space, via sys_read(), but at least
MTD-aware stuff can know about it by checking *retlen */
printf("ECC Errors at %lx\n", (long)from);
ret = DOC_EECC;
- }
+ }
}
#ifdef PSYCHO_DEBUG
@@ -1079,7 +1096,7 @@
}
/* according to 11.4.1, we need to wait for the busy line
- * drop if we read to the end of the page. */
+ * drop if we read to the end of the page. */
if(0 == ((from + *retlen) & 0x1ff))
{
DoC_WaitReady(this);
@@ -1291,8 +1308,8 @@
*retlen = len;
/* Reading the full OOB data drops us off of the end of the page,
- * causing the flash device to go into busy mode, so we need
- * to wait until ready 11.4.1 and Toshiba TC58256FT docs */
+ * causing the flash device to go into busy mode, so we need
+ * to wait until ready 11.4.1 and Toshiba TC58256FT docs */
ret = DoC_WaitReady(this);
diff --git a/common/cmd_dtt.c b/common/cmd_dtt.c
index 943b0c7..447076c 100644
--- a/common/cmd_dtt.c
+++ b/common/cmd_dtt.c
@@ -24,7 +24,6 @@
#include <common.h>
#include <config.h>
#include <command.h>
-#include <cmd_dtt.h>
#if (CONFIG_COMMANDS & CFG_CMD_DTT)
@@ -46,4 +45,12 @@
return 0;
} /* do_dtt() */
+/***************************************************/
+
+cmd_tbl_t U_BOOT_CMD(DTT) = MK_CMD_ENTRY(
+ "dtt", 1, 1, do_dtt,
+ "dtt - Digital Thermometer and Themostat\n",
+ " - Read temperature from digital thermometer and thermostat.\n"
+);
+
#endif /* CONFIG_COMMANDS & CFG_CMD_DTT */
diff --git a/common/cmd_eeprom.c b/common/cmd_eeprom.c
index 3db0bca..0a78319 100644
--- a/common/cmd_eeprom.c
+++ b/common/cmd_eeprom.c
@@ -371,3 +371,26 @@
/*-----------------------------------------------------------------------
*/
#endif /* CFG_CMD_EEPROM */
+/***************************************************/
+
+#if (CONFIG_COMMANDS & CFG_CMD_EEPROM)
+
+#ifdef CFG_I2C_MULTI_EEPROMS
+cmd_tbl_t U_BOOT_CMD(EEPROM) = MK_CMD_ENTRY(
+ "eeprom", 6, 1, do_eeprom,
+ "eeprom - EEPROM sub-system\n",
+ "read devaddr addr off cnt\n"
+ "eeprom write devaddr addr off cnt\n"
+ " - read/write `cnt' bytes from `devaddr` EEPROM at offset `off'\n"
+);
+#else /* One EEPROM */
+cmd_tbl_t U_BOOT_CMD(EEPROM) = MK_CMD_ENTRY(
+ "eeprom", 5, 1, do_eeprom,
+ "eeprom - EEPROM sub-system\n",
+ "read addr off cnt\n"
+ "eeprom write addr off cnt\n"
+ " - read/write `cnt' bytes at EEPROM offset `off'\n"
+);
+#endif /* CFG_I2C_MULTI_EEPROMS */
+
+#endif /* CFG_CMD_EEPROM */
diff --git a/common/cmd_elf.c b/common/cmd_elf.c
index 7495762..c068c10 100644
--- a/common/cmd_elf.c
+++ b/common/cmd_elf.c
@@ -17,8 +17,6 @@
#include <command.h>
#include <linux/ctype.h>
#include <net.h>
-
-#include <cmd_elf.h>
#include <elf.h>
@@ -28,6 +26,8 @@
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#endif
+int valid_elf_image (unsigned long addr);
+unsigned long load_elf_image (unsigned long addr);
/* ======================================================================
* Interpreter command to boot an arbitrary ELF image from memory.
@@ -136,11 +136,11 @@
printf ("## Ethernet MAC address not copied to NV RAM\n");
#endif
- /*
- * Use bootaddr to find the location in memory that VxWorks
- * will look for the bootline string. The default value for
- * PowerPC is LOCAL_MEM_LOCAL_ADRS + BOOT_LINE_OFFSET which
- * defaults to 0x4200
+ /*
+ * Use bootaddr to find the location in memory that VxWorks
+ * will look for the bootline string. The default value for
+ * PowerPC is LOCAL_MEM_LOCAL_ADRS + BOOT_LINE_OFFSET which
+ * defaults to 0x4200
*/
if ((tmp = getenv ("bootaddr")) == NULL)
@@ -148,10 +148,10 @@
else
bootaddr = simple_strtoul (tmp, NULL, 16);
- /*
- * Check to see if the bootline is defined in the 'bootargs'
- * parameter. If it is not defined, we may be able to
- * construct the info
+ /*
+ * Check to see if the bootline is defined in the 'bootargs'
+ * parameter. If it is not defined, we may be able to
+ * construct the info
*/
if ((bootline = getenv ("bootargs")) != NULL) {
@@ -194,10 +194,10 @@
flush_cache (bootaddr, MAX(strlen(build_buf), 255));
#else
- /*
- * I'm not sure what the device should be for other
- * PPC flavors, the hostname and ipaddr should be ok
- * to just copy
+ /*
+ * I'm not sure what the device should be for other
+ * PPC flavors, the hostname and ipaddr should be ok
+ * to just copy
*/
printf ("No bootargs defined\n");
@@ -205,10 +205,10 @@
#endif
}
- /*
- * If the data at the load address is an elf image, then
- * treat it like an elf image. Otherwise, assume that it is a
- * binary image
+ /*
+ * If the data at the load address is an elf image, then
+ * treat it like an elf image. Otherwise, assume that it is a
+ * binary image
*/
if (valid_elf_image (addr)) {
@@ -321,4 +321,16 @@
}
/* ====================================================================== */
+cmd_tbl_t U_BOOT_CMD(BOOTELF) = MK_CMD_ENTRY(
+ "bootelf", 2, 0, do_bootelf,
+ "bootelf - Boot from an ELF image in memory\n",
+ " [address] - load address of ELF image.\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(BOOTVX) = MK_CMD_ENTRY(
+ "bootvx", 2, 0, do_bootvx,
+ "bootvx - Boot vxWorks from an ELF image\n",
+ " [address] - load address of vxWorks ELF image.\n"
+);
+
#endif /* CFG_CMD_ELF */
diff --git a/common/cmd_fat.c b/common/cmd_fat.c
index 4db70e1..12eb764 100644
--- a/common/cmd_fat.c
+++ b/common/cmd_fat.c
@@ -26,7 +26,6 @@
*/
#include <common.h>
#include <command.h>
-#include <cmd_boot.h>
#include <cmd_autoscript.h>
#include <s_record.h>
#include <net.h>
diff --git a/common/cmd_fdc.c b/common/cmd_fdc.c
index 3ee342f..3030750 100644
--- a/common/cmd_fdc.c
+++ b/common/cmd_fdc.c
@@ -47,9 +47,9 @@
#endif
-#if (CONFIG_COMMANDS & CFG_CMD_DATE)
-#include <rtc.h>
-#endif
+/*#if (CONFIG_COMMANDS & CFG_CMD_DATE) */
+/*#include <rtc.h> */
+/*#endif */
#if ((CONFIG_COMMANDS & CFG_CMD_FDC) || (CONFIG_COMMANDS & CFG_CMD_FDOS))
@@ -211,7 +211,7 @@
return TRUE;
}
#endif
-
+
/* Supporting Functions */
/* reads a Register of the FDC */
unsigned char read_fdc_reg(unsigned int addr)
@@ -220,14 +220,14 @@
(volatile unsigned char *)(CFG_ISA_IO_BASE_ADDRESS +
(addr * CFG_ISA_IO_STRIDE) +
CFG_ISA_IO_OFFSET);
-
+
return val [0];
}
/* writes a Register of the FDC */
void write_fdc_reg(unsigned int addr, unsigned char val)
{
- volatile unsigned char *tmp =
+ volatile unsigned char *tmp =
(volatile unsigned char *)(CFG_ISA_IO_BASE_ADDRESS +
(addr * CFG_ISA_IO_STRIDE) +
CFG_ISA_IO_OFFSET);
@@ -642,7 +642,6 @@
}
-
/**************************************************************************
* int fdc_setup
* setup the fdc according the datasheet
@@ -658,7 +657,7 @@
#endif
#ifdef CFG_FDC_HW_INIT
- fdc_hw_init ();
+ fdc_hw_init ();
#endif
/* first, we reset the FDC via the DOR */
write_fdc_reg(FDC_DOR,0x00);
@@ -716,14 +715,14 @@
/**************************************************************************
* int fdc_fdos_init
-* initialize the FDC layer
-*
+* initialize the FDC layer
+*
*/
int fdc_fdos_init (int drive)
{
FD_GEO_STRUCT *pFG = (FD_GEO_STRUCT *)floppy_type;
FDC_COMMAND_STRUCT *pCMD = &cmd;
-
+
/* setup FDC and scan for drives */
if(fdc_setup(drive,pCMD,pFG)==FALSE) {
printf("\n** Error in setup FDC **\n");
@@ -748,19 +747,19 @@
/* read first block */
pCMD->blnr=0;
- return TRUE;
+ return TRUE;
}
/**************************************************************************
* int fdc_fdos_seek
-* parameter is a block number
+* parameter is a block number
*/
int fdc_fdos_seek (int where)
{
FD_GEO_STRUCT *pFG = (FD_GEO_STRUCT *)floppy_type;
FDC_COMMAND_STRUCT *pCMD = &cmd;
- pCMD -> blnr = where ;
- return (fdc_seek (pCMD, pFG));
+ pCMD -> blnr = where ;
+ return (fdc_seek (pCMD, pFG));
}
/**************************************************************************
* int fdc_fdos_read
@@ -771,7 +770,7 @@
FD_GEO_STRUCT *pFG = (FD_GEO_STRUCT *)floppy_type;
FDC_COMMAND_STRUCT *pCMD = &cmd;
- return (fdc_read_data (buffer, len, pCMD, pFG));
+ return (fdc_read_data (buffer, len, pCMD, pFG));
}
#endif /* (CONFIG_COMMANDS & CFG_CMD_FDOS) */
@@ -783,7 +782,7 @@
{
FD_GEO_STRUCT *pFG = (FD_GEO_STRUCT *)floppy_type;
FDC_COMMAND_STRUCT *pCMD = &cmd;
- unsigned long addr,imsize;
+ unsigned long addr,imsize;
image_header_t *hdr; /* used for fdc boot */
unsigned char boot_drive;
int i,nrofblk;
@@ -793,7 +792,7 @@
switch (argc) {
case 1:
addr = CFG_LOAD_ADDR;
- boot_drive=CFG_FDC_DRIVE_NUMBER;
+ boot_drive=CFG_FDC_DRIVE_NUMBER;
break;
case 2:
addr = simple_strtoul(argv[1], NULL, 16);
@@ -881,7 +880,17 @@
}
-
#endif /* CONFIG_COMMANDS & CFG_CMD_FDC */
+/***************************************************/
+
+
+#if (CONFIG_COMMANDS & CFG_CMD_FDC)
+
+cmd_tbl_t U_BOOT_CMD(FDC) = MK_CMD_ENTRY(
+ "fdcboot", 3, 1, do_fdcboot,
+ "fdcboot - boot from floppy device\n",
+ "loadAddr drive\n"
+);
+#endif
diff --git a/common/cmd_fdos.c b/common/cmd_fdos.c
index 4b411b3..8257e70 100644
--- a/common/cmd_fdos.c
+++ b/common/cmd_fdos.c
@@ -34,7 +34,7 @@
#if (CONFIG_COMMANDS & CFG_CMD_FDOS)
/*-----------------------------------------------------------------------------
- * do_fdosboot --
+ * do_fdosboot --
*-----------------------------------------------------------------------------
*/
int do_fdosboot(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
@@ -45,53 +45,53 @@
int rcode = 0;
char buf [10];
int drive = CFG_FDC_DRIVE_NUMBER;
-
+
/* pre-set load_addr */
if ((ep = getenv("loadaddr")) != NULL) {
- load_addr = simple_strtoul(ep, NULL, 16);
+ load_addr = simple_strtoul(ep, NULL, 16);
}
/* pre-set Boot file name */
if ((name = getenv("bootfile")) == NULL) {
- name = "uImage";
+ name = "uImage";
}
switch (argc) {
case 1:
- break;
+ break;
case 2:
/* only one arg - accept two forms:
- * just load address, or just boot file name.
- * The latter form must be written "filename" here.
- */
- if (argv[1][0] == '"') { /* just boot filename */
- name = argv [1];
- } else { /* load address */
- load_addr = simple_strtoul(argv[1], NULL, 16);
- }
- break;
+ * just load address, or just boot file name.
+ * The latter form must be written "filename" here.
+ */
+ if (argv[1][0] == '"') { /* just boot filename */
+ name = argv [1];
+ } else { /* load address */
+ load_addr = simple_strtoul(argv[1], NULL, 16);
+ }
+ break;
case 3:
- load_addr = simple_strtoul(argv[1], NULL, 16);
- name = argv [2];
- break;
+ load_addr = simple_strtoul(argv[1], NULL, 16);
+ name = argv [2];
+ break;
default:
- printf ("Usage:\n%s\n", cmdtp->usage);
- break;
+ printf ("Usage:\n%s\n", cmdtp->usage);
+ break;
}
/* Init physical layer */
if (!fdc_fdos_init (drive)) {
- return (-1);
+ return (-1);
}
-
+
/* Open file */
if (dos_open (name) < 0) {
- printf ("Unable to open %s\n", name);
- return 1;
+ printf ("Unable to open %s\n", name);
+ return 1;
}
if ((size = dos_read (load_addr)) < 0) {
- printf ("boot error\n");
- return 1;
+ printf ("boot error\n");
+ return 1;
}
flush_cache (load_addr, size);
@@ -99,47 +99,59 @@
setenv("filesize", buf);
printf("Floppy DOS load complete: %d bytes loaded to 0x%lx\n",
- size, load_addr);
-
+ size, load_addr);
+
/* Check if we should attempt an auto-start */
if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) {
- char *local_args[2];
- extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
- local_args[0] = argv[0];
- local_args[1] = NULL;
- printf ("Automatic boot of image at addr 0x%08lX ...\n", load_addr);
- rcode = do_bootm (cmdtp, 0, 1, local_args);
+ char *local_args[2];
+ extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
+ local_args[0] = argv[0];
+ local_args[1] = NULL;
+ printf ("Automatic boot of image at addr 0x%08lX ...\n", load_addr);
+ rcode = do_bootm (cmdtp, 0, 1, local_args);
}
return rcode;
}
/*-----------------------------------------------------------------------------
- * do_fdosls --
+ * do_fdosls --
*-----------------------------------------------------------------------------
*/
int do_fdosls(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
char *path = "";
int drive = CFG_FDC_DRIVE_NUMBER;
-
+
switch (argc) {
case 1:
- break;
+ break;
case 2:
- path = argv [1];
- break;
+ path = argv [1];
+ break;
}
/* Init physical layer */
if (!fdc_fdos_init (drive)) {
- return (-1);
+ return (-1);
}
/* Open directory */
if (dos_open (path) < 0) {
- printf ("Unable to open %s\n", path);
- return 1;
+ printf ("Unable to open %s\n", path);
+ return 1;
}
return (dos_dir ());
}
-#endif
+cmd_tbl_t U_BOOT_CMD(FDOS_BOOT) = MK_CMD_ENTRY(
+ "fdosboot", 3, 0, do_fdosboot,
+ "fdosboot- boot from a dos floppy file\n",
+ "[loadAddr] [filename]\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(FDOS_LS) = MK_CMD_ENTRY(
+ "fdosls", 2, 0, do_fdosls,
+ "fdosls - list files in a directory\n",
+ "[directory]\n"
+);
+
+#endif /* CONFIG_COMMANDS & CFG_CMD_FDOS */
diff --git a/common/cmd_flash.c b/common/cmd_flash.c
index efc89dc..6914f59 100644
--- a/common/cmd_flash.c
+++ b/common/cmd_flash.c
@@ -26,8 +26,7 @@
*/
#include <common.h>
#include <command.h>
-#include <cmd_boot.h>
-#include <flash.h>
+
#ifdef CONFIG_HAS_DATAFLASH
#include <dataflash.h>
@@ -438,4 +437,41 @@
return rcode;
}
+
+/**************************************************/
+
+cmd_tbl_t U_BOOT_CMD(FLINFO) = MK_CMD_ENTRY(
+ "flinfo", 2, 1, do_flinfo,
+ "flinfo - print FLASH memory information\n",
+ "\n - print information for all FLASH memory banks\n"
+ "flinfo N\n - print information for FLASH memory bank # N\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(ERASE) = MK_CMD_ENTRY(
+ "erase", 3, 1, do_flerase,
+ "erase - erase FLASH memory\n",
+ "start end\n"
+ " - erase FLASH from addr 'start' to addr 'end'\n"
+ "erase N:SF[-SL]\n - erase sectors SF-SL in FLASH bank # N\n"
+ "erase bank N\n - erase FLASH bank # N\n"
+ "erase all\n - erase all FLASH banks\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(PROTECT) = MK_CMD_ENTRY(
+ "protect", 4, 1, do_protect,
+ "protect - enable or disable FLASH write protection\n",
+ "on start end\n"
+ " - protect FLASH from addr 'start' to addr 'end'\n"
+ "protect on N:SF[-SL]\n"
+ " - protect sectors SF-SL in FLASH bank # N\n"
+ "protect on bank N\n - protect FLASH bank # N\n"
+ "protect on all\n - protect all FLASH banks\n"
+ "protect off start end\n"
+ " - make FLASH from addr 'start' to addr 'end' writable\n"
+ "protect off N:SF[-SL]\n"
+ " - make sectors SF-SL writable in FLASH bank # N\n"
+ "protect off bank N\n - make FLASH bank # N writable\n"
+ "protect off all\n - make all FLASH banks writable\n"
+);
+
#endif /* CFG_CMD_FLASH */
diff --git a/common/cmd_fpga.c b/common/cmd_fpga.c
index 4e4c4ab..f8ae52a 100644
--- a/common/cmd_fpga.c
+++ b/common/cmd_fpga.c
@@ -27,11 +27,11 @@
*/
#include <common.h>
#include <command.h>
-#include <cmd_fpga.h>
-#include <fpga.h>
+#include <cmd_bsp.h>
#if (CONFIG_COMMANDS & CFG_CMD_NET)
#include <net.h>
#endif
+#include <fpga.h>
#if 0
#define FPGA_DEBUG
@@ -155,4 +155,13 @@
return op;
}
+cmd_tbl_t U_BOOT_CMD(FPGA) = MK_CMD_ENTRY(
+ "fpga", 6, 1, do_fpga,
+ "fpga - loadable FPGA image support\n",
+ "fpga [operation type] [device number] [image address] [image size]\n"
+ "fpga operations:\n"
+ "\tinfo\tlist known device information.\n"
+ "\tload\tLoad device from memory buffer.\n"
+ "\tdump\tLoad device to memory buffer.\n"
+);
#endif /* CONFIG_FPGA && CONFIG_COMMANDS & CFG_CMD_FPGA */
diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c
index fe5841e..203e803 100644
--- a/common/cmd_i2c.c
+++ b/common/cmd_i2c.c
@@ -83,7 +83,6 @@
#include <common.h>
#include <command.h>
-#include <cmd_i2c.h>
#include <i2c.h>
#include <asm/byteorder.h>
@@ -865,4 +864,61 @@
}
#endif /* CFG_CMD_SDRAM */
+
+/***************************************************/
+
+cmd_tbl_t U_BOOT_CMD(IMD) = MK_CMD_ENTRY(
+ "imd", 4, 1, do_i2c_md, \
+ "imd - i2c memory display\n", \
+ "chip address[.0, .1, .2] [# of objects]\n - i2c memory display\n" \
+);
+
+cmd_tbl_t U_BOOT_CMD(IMM) = MK_CMD_ENTRY(
+ "imm", 3, 1, do_i2c_mm,
+ "imm - i2c memory modify (auto-incrementing)\n",
+ "chip address[.0, .1, .2]\n"
+ " - memory modify, auto increment address\n"
+);
+cmd_tbl_t U_BOOT_CMD(INM) = MK_CMD_ENTRY(
+ "inm", 3, 1, do_i2c_nm,
+ "inm - memory modify (constant address)\n",
+ "chip address[.0, .1, .2]\n - memory modify, read and keep address\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(IMW) = MK_CMD_ENTRY(
+ "imw", 5, 1, do_i2c_mw,
+ "imw - memory write (fill)\n",
+ "chip address[.0, .1, .2] value [count]\n - memory write (fill)\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(ICRC) = MK_CMD_ENTRY(
+ "icrc32", 5, 1, do_i2c_crc,
+ "icrc32 - checksum calculation\n",
+ "chip address[.0, .1, .2] count\n - compute CRC32 checksum\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(IPROBE) = MK_CMD_ENTRY(
+ "iprobe", 1, 1, do_i2c_probe,
+ "iprobe - probe to discover valid I2C chip addresses\n",
+ "\n -discover valid I2C chip addresses\n"
+);
+
+/*
+ * Require full name for "iloop" because it is an infinite loop!
+ */
+cmd_tbl_t U_BOOT_CMD(ILOOP) = MK_CMD_ENTRY(
+ "iloop", 5, 1, do_i2c_loop,
+ "iloop - infinite loop on address range\n",
+ "chip address[.0, .1, .2] [# of objects]\n"
+ " - loop, reading a set of addresses\n"
+);
+
+#if (CONFIG_COMMANDS & CFG_CMD_SDRAM)
+cmd_tbl_t U_BOOT_CMD(ISDRAM) = MK_CMD_ENTRY(
+ "isdram", 2, 1, do_sdram,
+ "isdram - print SDRAM configuration information\n",
+ "chip\n - print SDRAM configuration information\n"
+ " (valid chip values 50..57)\n"
+);
+#endif
#endif /* CFG_CMD_I2C */
diff --git a/common/cmd_ide.c b/common/cmd_ide.c
index f1b24be..c1e610a 100644
--- a/common/cmd_ide.c
+++ b/common/cmd_ide.c
@@ -39,7 +39,6 @@
#endif
#include <ide.h>
#include <ata.h>
-#include <cmd_ide.h>
#include <cmd_disk.h>
#ifdef CONFIG_STATUS_LED
# include <status_led.h>
@@ -798,7 +797,7 @@
{
ushort *dbuf;
volatile ushort *pbuf;
-
+
pbuf = (ushort *)(ATA_CURR_BASE(dev)+ATA_DATA_REG);
dbuf = (ushort *)sect_buf;
while (words--) {
@@ -828,8 +827,6 @@
#endif /* __PPC__ */
-
-
#ifdef __PPC__
static void
output_data(int dev, ulong *sect_buf, int words)
@@ -1381,7 +1378,6 @@
*/
-
#undef ATAPI_DEBUG
#ifdef ATAPI_DEBUG
@@ -1681,7 +1677,6 @@
}
-
static void atapi_inquiry(block_dev_desc_t * dev_desc)
{
unsigned char ccb[12]; /* Command descriptor block */
@@ -1816,4 +1811,23 @@
#endif /* CONFIG_ATAPI */
+cmd_tbl_t U_BOOT_CMD(IDE) = MK_CMD_ENTRY(
+ "ide", 5, 1, do_ide,
+ "ide - IDE sub-system\n",
+ "reset - reset IDE controller\n"
+ "ide info - show available IDE devices\n"
+ "ide device [dev] - show or set current device\n"
+ "ide part [dev] - print partition table of one or all IDE devices\n"
+ "ide read addr blk# cnt\n"
+ "ide write addr blk# cnt - read/write `cnt'"
+ " blocks starting at block `blk#'\n"
+ " to/from memory address `addr'\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(DISK) = MK_CMD_ENTRY(
+ "diskboot", 3, 1, do_diskboot,
+ "diskboot- boot from IDE device\n",
+ "loadAddr dev:part\n"
+);
+
#endif /* CONFIG_COMMANDS & CFG_CMD_IDE */
diff --git a/common/cmd_immap.c b/common/cmd_immap.c
index 3eb5895..fbb4a7d 100644
--- a/common/cmd_immap.c
+++ b/common/cmd_immap.c
@@ -27,7 +27,6 @@
#include <common.h>
#include <command.h>
-#include <cmd_immap.h>
#if (CONFIG_COMMANDS & CFG_CMD_IMMAP) && \
(defined(CONFIG_8xx) || defined(CONFIG_8260))
@@ -592,4 +591,112 @@
unimplemented (cmdtp, flag, argc, argv);
return 0;
}
+
+/***************************************************/
+
+cmd_tbl_t U_BOOT_CMD(SIUINFO) = MK_CMD_ENTRY(
+ "siuinfo", 1, 1, do_siuinfo,
+ "siuinfo - print System Interface Unit (SIU) registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(MEMCINFO) = MK_CMD_ENTRY(
+ "memcinfo", 1, 1, do_memcinfo,
+ "memcinfo- print Memory Controller registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(SITINFO) = MK_CMD_ENTRY(
+ "sitinfo", 1, 1, do_sitinfo,
+ "sitinfo - print System Integration Timers (SIT) registers\n",
+ NULL
+);
+
+#ifdef CONFIG_8260
+cmd_tbl_t U_BOOT_CMD(ICINFO) = MK_CMD_ENTRY(
+ "icinfo", 1, 1, do_icinfo,
+ "icinfo - print Interrupt Controller registers\n",
+ NULL
+);
+#endif
+
+cmd_tbl_t U_BOOT_CMD(CARINFO) = MK_CMD_ENTRY(
+ "carinfo", 1, 1, do_carinfo,
+ "carinfo - print Clocks and Reset registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(IOPINFO) = MK_CMD_ENTRY(
+ "iopinfo", 1, 1, do_iopinfo,
+ "iopinfo - print I/O Port registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(IOPSET) = MK_CMD_ENTRY(
+ "iopset", 5, 0, do_iopset,
+ "iopset - set I/O Port registers\n",
+ "PORT PIN CMD VALUE\nPORT: A-D, PIN: 0-31, CMD: [dat|dir|odr|sor], VALUE: 0|1"
+);
+
+cmd_tbl_t U_BOOT_CMD(DMAINFO) = MK_CMD_ENTRY(
+ "dmainfo", 1, 1, do_dmainfo,
+ "dmainfo - print SDMA/IDMA registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(FCCINFO) = MK_CMD_ENTRY(
+ "fccinfo", 1, 1, do_fccinfo,
+ "fccinfo - print FCC registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(BRGINFO) = MK_CMD_ENTRY(
+ "brginfo", 1, 1, do_brginfo,
+ "brginfo - print Baud Rate Generator (BRG) registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(I2CINFO) = MK_CMD_ENTRY(
+ "i2cinfo", 1, 1, do_i2cinfo,
+ "i2cinfo - print I2C registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(SCCINFO) = MK_CMD_ENTRY(
+ "sccinfo", 1, 1, do_sccinfo,
+ "sccinfo - print SCC registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(SMCINFO) = MK_CMD_ENTRY(
+ "smcinfo", 1, 1, do_smcinfo,
+ "smcinfo - print SMC registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(SPIINFO) = MK_CMD_ENTRY(
+ "spiinfo", 1, 1, do_spiinfo,
+ "spiinfo - print Serial Peripheral Interface (SPI) registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(MUXINFO) = MK_CMD_ENTRY(
+ "muxinfo", 1, 1, do_muxinfo,
+ "muxinfo - print CPM Multiplexing registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(SIINFO) = MK_CMD_ENTRY(
+ "siinfo", 1, 1, do_siinfo,
+ "siinfo - print Serial Interface (SI) registers\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(MCCINFO) = MK_CMD_ENTRY(
+ "mccinfo", 1, 1, do_mccinfo,
+ "mccinfo - print MCC registers\n",
+ NULL
+);
+
+
#endif /* CFG_CMD_IMMAP && (CONFIG_8xx || CONFIG_8260) */
diff --git a/common/cmd_jffs2.c b/common/cmd_jffs2.c
index 8df8061..e45a2ce 100644
--- a/common/cmd_jffs2.c
+++ b/common/cmd_jffs2.c
@@ -26,14 +26,11 @@
*/
#include <common.h>
#include <command.h>
-#include <cmd_boot.h>
-#include <cmd_autoscript.h>
#include <s_record.h>
+#include <jffs2/load_kernel.h>
#include <net.h>
#if (CONFIG_COMMANDS & CFG_CMD_JFFS2)
-
-#include <jffs2/jffs2.h>
static int part_num=0;
#ifndef CFG_JFFS_CUSTOM_PART
@@ -83,6 +80,9 @@
int
do_jffs2_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
+ struct part_info* jffs2_part_info(int);
+ int jffs2_1pass_load(char *, struct part_info *,const char *);
+
char *filename = "uImage";
ulong offset = CFG_LOAD_ADDR;
int size;
@@ -120,7 +120,10 @@
int
do_jffs2_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
- char *filename = "/";
+ struct part_info* jffs2_part_info(int);
+ int jffs2_1pass_ls(struct part_info *,char *);
+
+ char *filename = "/";
int ret;
struct part_info *part;
@@ -140,6 +143,9 @@
int
do_jffs2_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
+ struct part_info* jffs2_part_info(int);
+ int jffs2_1pass_info(struct part_info *);
+
int ret;
struct part_info *part;
@@ -157,8 +163,9 @@
do_jffs2_chpart(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
int tmp_part;
+ struct part_info* jffs2_part_info(int);
- if (argc >= 2) {
+ if (argc >= 2) {
tmp_part = simple_strtoul(argv[1], NULL, 16);
}else{
printf("Need partition number in argument list\n");
@@ -176,4 +183,34 @@
return 0;
}
+
+/***************************************************/
+
+cmd_tbl_t U_BOOT_CMD(JFFS2_FSLOAD) = MK_CMD_ENTRY(
+ "fsload", 3, 0, do_jffs2_fsload,
+ "fsload - load binary file from a filesystem image\n",
+ "[ off ] [ filename ]\n"
+ " - load binary file from flash bank\n"
+ " with offset 'off'\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(JFFS2_FSINFO) = MK_CMD_ENTRY(
+ "fsinfo", 1, 1, do_jffs2_fsinfo,
+ "fsinfo - print information about filesystems\n",
+ " - print information about filesystems\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(JFFS2_LS) = MK_CMD_ENTRY(
+ "ls", 2, 1, do_jffs2_ls,
+ "ls - list files in a directory (default /)\n",
+ "[ directory ]\n"
+ " - list files in a directory.\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(JFFS2_CHPART) = MK_CMD_ENTRY(
+ "chpart", 2, 0, do_jffs2_chpart,
+ "chpart - change active partition\n",
+ " - change active partition\n"
+);
+
#endif /* CFG_CMD_JFFS2 */
diff --git a/common/cmd_load.c b/common/cmd_load.c
new file mode 100644
index 0000000..d784e83
--- /dev/null
+++ b/common/cmd_load.c
@@ -0,0 +1,1057 @@
+/*
+ * (C) Copyright 2000-2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * 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
+ */
+
+/*
+ * Serial up- and download support
+ */
+#include <common.h>
+#include <command.h>
+#include <cmd_autoscript.h>
+#include <s_record.h>
+#include <net.h>
+#include <syscall.h>
+
+
+#if (CONFIG_COMMANDS & CFG_CMD_LOADS)
+static ulong load_serial (ulong offset);
+static int read_record (char *buf, ulong len);
+# if (CONFIG_COMMANDS & CFG_CMD_SAVES)
+static int save_serial (ulong offset, ulong size);
+static int write_record (char *buf);
+# endif /* CFG_CMD_SAVES */
+
+static int do_echo = 1;
+#endif /* CFG_CMD_LOADS */
+
+/* -------------------------------------------------------------------- */
+
+#if (CONFIG_COMMANDS & CFG_CMD_LOADS)
+int do_load_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ ulong offset = 0;
+ ulong addr;
+ int i;
+ char *env_echo;
+ int rcode = 0;
+#ifdef CFG_LOADS_BAUD_CHANGE
+ DECLARE_GLOBAL_DATA_PTR;
+ int load_baudrate, current_baudrate;
+
+ load_baudrate = current_baudrate = gd->baudrate;
+#endif
+
+ if (((env_echo = getenv("loads_echo")) != NULL) && (*env_echo == '1')) {
+ do_echo = 1;
+ } else {
+ do_echo = 0;
+ }
+
+#ifdef CFG_LOADS_BAUD_CHANGE
+ if (argc >= 2) {
+ offset = simple_strtoul(argv[1], NULL, 16);
+ }
+ if (argc == 3) {
+ load_baudrate = (int)simple_strtoul(argv[2], NULL, 10);
+
+ /* default to current baudrate */
+ if (load_baudrate == 0)
+ load_baudrate = current_baudrate;
+ }
+ if (load_baudrate != current_baudrate) {
+ printf ("## Switch baudrate to %d bps and press ENTER ...\n",
+ load_baudrate);
+ udelay(50000);
+ gd->baudrate = load_baudrate;
+ serial_setbrg ();
+ udelay(50000);
+ for (;;) {
+ if (getc() == '\r')
+ break;
+ }
+ }
+#else /* ! CFG_LOADS_BAUD_CHANGE */
+ if (argc == 2) {
+ offset = simple_strtoul(argv[1], NULL, 16);
+ }
+#endif /* CFG_LOADS_BAUD_CHANGE */
+
+ printf ("## Ready for S-Record download ...\n");
+
+ addr = load_serial (offset);
+
+ /*
+ * Gather any trailing characters (for instance, the ^D which
+ * is sent by 'cu' after sending a file), and give the
+ * box some time (100 * 1 ms)
+ */
+ for (i=0; i<100; ++i) {
+ if (serial_tstc()) {
+ (void) serial_getc();
+ }
+ udelay(1000);
+ }
+
+ if (addr == ~0) {
+ printf ("## S-Record download aborted\n");
+ rcode = 1;
+ } else {
+ printf ("## Start Addr = 0x%08lX\n", addr);
+ load_addr = addr;
+ }
+
+#ifdef CFG_LOADS_BAUD_CHANGE
+ if (load_baudrate != current_baudrate) {
+ printf ("## Switch baudrate to %d bps and press ESC ...\n",
+ current_baudrate);
+ udelay (50000);
+ gd->baudrate = current_baudrate;
+ serial_setbrg ();
+ udelay (50000);
+ for (;;) {
+ if (getc() == 0x1B) /* ESC */
+ break;
+ }
+ }
+#endif
+ return rcode;
+}
+
+static ulong
+load_serial (ulong offset)
+{
+ char record[SREC_MAXRECLEN + 1]; /* buffer for one S-Record */
+ char binbuf[SREC_MAXBINLEN]; /* buffer for binary data */
+ int binlen; /* no. of data bytes in S-Rec. */
+ int type; /* return code for record type */
+ ulong addr; /* load address from S-Record */
+ ulong size; /* number of bytes transferred */
+ char buf[32];
+ ulong store_addr;
+ ulong start_addr = ~0;
+ ulong end_addr = 0;
+ int line_count = 0;
+
+ while (read_record(record, SREC_MAXRECLEN + 1) >= 0) {
+ type = srec_decode (record, &binlen, &addr, binbuf);
+
+ if (type < 0) {
+ return (~0); /* Invalid S-Record */
+ }
+
+ switch (type) {
+ case SREC_DATA2:
+ case SREC_DATA3:
+ case SREC_DATA4:
+ store_addr = addr + offset;
+#ifndef CFG_NO_FLASH
+ if (addr2info(store_addr)) {
+ int rc;
+
+ rc = flash_write((uchar *)binbuf,store_addr,binlen);
+ if (rc != 0) {
+ flash_perror (rc);
+ return (~0);
+ }
+ } else
+#endif
+ {
+ memcpy ((char *)(store_addr), binbuf, binlen);
+ }
+ if ((store_addr) < start_addr)
+ start_addr = store_addr;
+ if ((store_addr + binlen - 1) > end_addr)
+ end_addr = store_addr + binlen - 1;
+ break;
+ case SREC_END2:
+ case SREC_END3:
+ case SREC_END4:
+ udelay (10000);
+ size = end_addr - start_addr + 1;
+ printf ("\n"
+ "## First Load Addr = 0x%08lX\n"
+ "## Last Load Addr = 0x%08lX\n"
+ "## Total Size = 0x%08lX = %ld Bytes\n",
+ start_addr, end_addr, size, size
+ );
+ flush_cache (addr, size);
+ sprintf(buf, "%lX", size);
+ setenv("filesize", buf);
+ return (addr);
+ case SREC_START:
+ break;
+ default:
+ break;
+ }
+ if (!do_echo) { /* print a '.' every 100 lines */
+ if ((++line_count % 100) == 0)
+ putc ('.');
+ }
+ }
+
+ return (~0); /* Download aborted */
+}
+
+static int
+read_record (char *buf, ulong len)
+{
+ char *p;
+ char c;
+
+ --len; /* always leave room for terminating '\0' byte */
+
+ for (p=buf; p < buf+len; ++p) {
+ c = serial_getc(); /* read character */
+ if (do_echo)
+ serial_putc (c); /* ... and echo it */
+
+ switch (c) {
+ case '\r':
+ case '\n':
+ *p = '\0';
+ return (p - buf);
+ case '\0':
+ case 0x03: /* ^C - Control C */
+ return (-1);
+ default:
+ *p = c;
+ }
+
+ /* Check for the console hangup (if any different from serial) */
+#ifdef CONFIG_PPC /* we don't have syscall_tbl anywhere else */
+ if (syscall_tbl[SYSCALL_GETC] != serial_getc) {
+ if (ctrlc()) {
+ return (-1);
+ }
+ }
+#endif
+ }
+
+ /* line too long - truncate */
+ *p = '\0';
+ return (p - buf);
+}
+
+#if (CONFIG_COMMANDS & CFG_CMD_SAVES)
+
+int do_save_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ ulong offset = 0;
+ ulong size = 0;
+#ifdef CFG_LOADS_BAUD_CHANGE
+ DECLARE_GLOBAL_DATA_PTR;
+ int save_baudrate, current_baudrate;
+
+ save_baudrate = current_baudrate = gd->baudrate;
+#endif
+
+ if (argc >= 2) {
+ offset = simple_strtoul(argv[1], NULL, 16);
+ }
+#ifdef CFG_LOADS_BAUD_CHANGE
+ if (argc >= 3) {
+ size = simple_strtoul(argv[2], NULL, 16);
+ }
+ if (argc == 4) {
+ save_baudrate = (int)simple_strtoul(argv[3], NULL, 10);
+
+ /* default to current baudrate */
+ if (save_baudrate == 0)
+ save_baudrate = current_baudrate;
+ }
+ if (save_baudrate != current_baudrate) {
+ printf ("## Switch baudrate to %d bps and press ENTER ...\n",
+ save_baudrate);
+ udelay(50000);
+ gd->baudrate = save_baudrate;
+ serial_setbrg ();
+ udelay(50000);
+ for (;;) {
+ if (getc() == '\r')
+ break;
+ }
+ }
+#else /* ! CFG_LOADS_BAUD_CHANGE */
+ if (argc == 3) {
+ size = simple_strtoul(argv[2], NULL, 16);
+ }
+#endif /* CFG_LOADS_BAUD_CHANGE */
+
+ printf ("## Ready for S-Record upload, press ENTER to proceed ...\n");
+ for (;;) {
+ if (getc() == '\r')
+ break;
+ }
+ if(save_serial (offset, size)) {
+ printf ("## S-Record upload aborted\n");
+ } else {
+ printf ("## S-Record upload complete\n");
+ }
+#ifdef CFG_LOADS_BAUD_CHANGE
+ if (save_baudrate != current_baudrate) {
+ printf ("## Switch baudrate to %d bps and press ESC ...\n",
+ (int)current_baudrate);
+ udelay (50000);
+ gd->baudrate = current_baudrate;
+ serial_setbrg ();
+ udelay (50000);
+ for (;;) {
+ if (getc() == 0x1B) /* ESC */
+ break;
+ }
+ }
+#endif
+ return 0;
+}
+
+#define SREC3_START "S0030000FC\n"
+#define SREC3_FORMAT "S3%02X%08lX%s%02X\n"
+#define SREC3_END "S70500000000FA\n"
+#define SREC_BYTES_PER_RECORD 16
+
+static int save_serial (ulong address, ulong count)
+{
+ int i, c, reclen, checksum, length;
+ char *hex = "0123456789ABCDEF";
+ char record[2*SREC_BYTES_PER_RECORD+16]; /* buffer for one S-Record */
+ char data[2*SREC_BYTES_PER_RECORD+1]; /* buffer for hex data */
+
+ reclen = 0;
+ checksum = 0;
+
+ if(write_record(SREC3_START)) /* write the header */
+ return (-1);
+ do {
+ if(count) { /* collect hex data in the buffer */
+ c = *(volatile uchar*)(address + reclen); /* get one byte */
+ checksum += c; /* accumulate checksum */
+ data[2*reclen] = hex[(c>>4)&0x0f];
+ data[2*reclen+1] = hex[c & 0x0f];
+ data[2*reclen+2] = '\0';
+ ++reclen;
+ --count;
+ }
+ if(reclen == SREC_BYTES_PER_RECORD || count == 0) {
+ /* enough data collected for one record: dump it */
+ if(reclen) { /* build & write a data record: */
+ /* address + data + checksum */
+ length = 4 + reclen + 1;
+
+ /* accumulate length bytes into checksum */
+ for(i = 0; i < 2; i++)
+ checksum += (length >> (8*i)) & 0xff;
+
+ /* accumulate address bytes into checksum: */
+ for(i = 0; i < 4; i++)
+ checksum += (address >> (8*i)) & 0xff;
+
+ /* make proper checksum byte: */
+ checksum = ~checksum & 0xff;
+
+ /* output one record: */
+ sprintf(record, SREC3_FORMAT, length, address, data, checksum);
+ if(write_record(record))
+ return (-1);
+ }
+ address += reclen; /* increment address */
+ checksum = 0;
+ reclen = 0;
+ }
+ }
+ while(count);
+ if(write_record(SREC3_END)) /* write the final record */
+ return (-1);
+ return(0);
+}
+
+static int
+write_record (char *buf)
+{
+ char c;
+
+ while((c = *buf++))
+ serial_putc(c);
+
+ /* Check for the console hangup (if any different from serial) */
+
+ if (ctrlc()) {
+ return (-1);
+ }
+ return (0);
+}
+# endif /* CFG_CMD_SAVES */
+
+#endif /* CFG_CMD_LOADS */
+
+
+#if (CONFIG_COMMANDS & CFG_CMD_LOADB) /* loadb command (load binary) included */
+
+#define XON_CHAR 17
+#define XOFF_CHAR 19
+#define START_CHAR 0x01
+#define ETX_CHAR 0x03
+#define END_CHAR 0x0D
+#define SPACE 0x20
+#define K_ESCAPE 0x23
+#define SEND_TYPE 'S'
+#define DATA_TYPE 'D'
+#define ACK_TYPE 'Y'
+#define NACK_TYPE 'N'
+#define BREAK_TYPE 'B'
+#define tochar(x) ((char) (((x) + SPACE) & 0xff))
+#define untochar(x) ((int) (((x) - SPACE) & 0xff))
+
+extern int os_data_count;
+extern int os_data_header[8];
+
+static void set_kerm_bin_mode(unsigned long *);
+static int k_recv(void);
+static ulong load_serial_bin (ulong offset);
+
+
+char his_eol; /* character he needs at end of packet */
+int his_pad_count; /* number of pad chars he needs */
+char his_pad_char; /* pad chars he needs */
+char his_quote; /* quote chars he'll use */
+
+int do_load_serial_bin (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ DECLARE_GLOBAL_DATA_PTR;
+
+ ulong offset = 0;
+ ulong addr;
+ int load_baudrate, current_baudrate;
+ int rcode = 0;
+ char *s;
+
+ /* pre-set offset from CFG_LOAD_ADDR */
+ offset = CFG_LOAD_ADDR;
+
+ /* pre-set offset from $loadaddr */
+ if ((s = getenv("loadaddr")) != NULL) {
+ offset = simple_strtoul(s, NULL, 16);
+ }
+
+ load_baudrate = current_baudrate = gd->baudrate;
+
+ if (argc >= 2) {
+ offset = simple_strtoul(argv[1], NULL, 16);
+ }
+ if (argc == 3) {
+ load_baudrate = (int)simple_strtoul(argv[2], NULL, 10);
+
+ /* default to current baudrate */
+ if (load_baudrate == 0)
+ load_baudrate = current_baudrate;
+ }
+
+ if (load_baudrate != current_baudrate) {
+ printf ("## Switch baudrate to %d bps and press ENTER ...\n",
+ load_baudrate);
+ udelay(50000);
+ gd->baudrate = load_baudrate;
+ serial_setbrg ();
+ udelay(50000);
+ for (;;) {
+ if (getc() == '\r')
+ break;
+ }
+ }
+
+ printf ("## Ready for binary (kermit) download "
+ "to 0x%08lX at %d bps...\n",
+ offset,
+ current_baudrate);
+ addr = load_serial_bin (offset);
+
+ if (addr == ~0) {
+ load_addr = 0;
+ printf ("## Binary (kermit) download aborted\n");
+ rcode = 1;
+ } else {
+ printf ("## Start Addr = 0x%08lX\n", addr);
+ load_addr = addr;
+ }
+
+ if (load_baudrate != current_baudrate) {
+ printf ("## Switch baudrate to %d bps and press ESC ...\n",
+ current_baudrate);
+ udelay (50000);
+ gd->baudrate = current_baudrate;
+ serial_setbrg ();
+ udelay (50000);
+ for (;;) {
+ if (getc() == 0x1B) /* ESC */
+ break;
+ }
+ }
+
+#ifdef CONFIG_AUTOSCRIPT
+ if (load_addr) {
+ char *s;
+
+ if (((s = getenv("autoscript")) != NULL) && (strcmp(s,"yes") == 0)) {
+ printf("Running autoscript at addr 0x%08lX ...\n", load_addr);
+ rcode = autoscript (load_addr);
+ }
+ }
+#endif
+ return rcode;
+}
+
+
+static ulong load_serial_bin (ulong offset)
+{
+ int size, i;
+ char buf[32];
+
+ set_kerm_bin_mode ((ulong *) offset);
+ size = k_recv ();
+
+ /*
+ * Gather any trailing characters (for instance, the ^D which
+ * is sent by 'cu' after sending a file), and give the
+ * box some time (100 * 1 ms)
+ */
+ for (i=0; i<100; ++i) {
+ if (serial_tstc()) {
+ (void) serial_getc();
+ }
+ udelay(1000);
+ }
+
+ flush_cache (offset, size);
+
+ printf("## Total Size = 0x%08x = %d Bytes\n", size, size);
+ sprintf(buf, "%X", size);
+ setenv("filesize", buf);
+
+ return offset;
+}
+
+void send_pad (void)
+{
+ int count = his_pad_count;
+
+ while (count-- > 0)
+ serial_putc (his_pad_char);
+}
+
+/* converts escaped kermit char to binary char */
+char ktrans (char in)
+{
+ if ((in & 0x60) == 0x40) {
+ return (char) (in & ~0x40);
+ } else if ((in & 0x7f) == 0x3f) {
+ return (char) (in | 0x40);
+ } else
+ return in;
+}
+
+int chk1 (char *buffer)
+{
+ int total = 0;
+
+ while (*buffer) {
+ total += *buffer++;
+ }
+ return (int) ((total + ((total >> 6) & 0x03)) & 0x3f);
+}
+
+void s1_sendpacket (char *packet)
+{
+ send_pad ();
+ while (*packet) {
+ serial_putc (*packet++);
+ }
+}
+
+static char a_b[24];
+void send_ack (int n)
+{
+ a_b[0] = START_CHAR;
+ a_b[1] = tochar (3);
+ a_b[2] = tochar (n);
+ a_b[3] = ACK_TYPE;
+ a_b[4] = '\0';
+ a_b[4] = tochar (chk1 (&a_b[1]));
+ a_b[5] = his_eol;
+ a_b[6] = '\0';
+ s1_sendpacket (a_b);
+}
+
+void send_nack (int n)
+{
+ a_b[0] = START_CHAR;
+ a_b[1] = tochar (3);
+ a_b[2] = tochar (n);
+ a_b[3] = NACK_TYPE;
+ a_b[4] = '\0';
+ a_b[4] = tochar (chk1 (&a_b[1]));
+ a_b[5] = his_eol;
+ a_b[6] = '\0';
+ s1_sendpacket (a_b);
+}
+
+
+/* os_data_* takes an OS Open image and puts it into memory, and
+ puts the boot header in an array named os_data_header
+
+ if image is binary, no header is stored in os_data_header.
+*/
+void (*os_data_init) (void);
+void (*os_data_char) (char new_char);
+static int os_data_state, os_data_state_saved;
+int os_data_count;
+static int os_data_count_saved;
+static char *os_data_addr, *os_data_addr_saved;
+static char *bin_start_address;
+int os_data_header[8];
+static void bin_data_init (void)
+{
+ os_data_state = 0;
+ os_data_count = 0;
+ os_data_addr = bin_start_address;
+}
+static void os_data_save (void)
+{
+ os_data_state_saved = os_data_state;
+ os_data_count_saved = os_data_count;
+ os_data_addr_saved = os_data_addr;
+}
+static void os_data_restore (void)
+{
+ os_data_state = os_data_state_saved;
+ os_data_count = os_data_count_saved;
+ os_data_addr = os_data_addr_saved;
+}
+static void bin_data_char (char new_char)
+{
+ switch (os_data_state) {
+ case 0: /* data */
+ *os_data_addr++ = new_char;
+ --os_data_count;
+ break;
+ }
+}
+static void set_kerm_bin_mode (unsigned long *addr)
+{
+ bin_start_address = (char *) addr;
+ os_data_init = bin_data_init;
+ os_data_char = bin_data_char;
+}
+
+
+/* k_data_* simply handles the kermit escape translations */
+static int k_data_escape, k_data_escape_saved;
+void k_data_init (void)
+{
+ k_data_escape = 0;
+ os_data_init ();
+}
+void k_data_save (void)
+{
+ k_data_escape_saved = k_data_escape;
+ os_data_save ();
+}
+void k_data_restore (void)
+{
+ k_data_escape = k_data_escape_saved;
+ os_data_restore ();
+}
+void k_data_char (char new_char)
+{
+ if (k_data_escape) {
+ /* last char was escape - translate this character */
+ os_data_char (ktrans (new_char));
+ k_data_escape = 0;
+ } else {
+ if (new_char == his_quote) {
+ /* this char is escape - remember */
+ k_data_escape = 1;
+ } else {
+ /* otherwise send this char as-is */
+ os_data_char (new_char);
+ }
+ }
+}
+
+#define SEND_DATA_SIZE 20
+char send_parms[SEND_DATA_SIZE];
+char *send_ptr;
+
+/* handle_send_packet interprits the protocol info and builds and
+ sends an appropriate ack for what we can do */
+void handle_send_packet (int n)
+{
+ int length = 3;
+ int bytes;
+
+ /* initialize some protocol parameters */
+ his_eol = END_CHAR; /* default end of line character */
+ his_pad_count = 0;
+ his_pad_char = '\0';
+ his_quote = K_ESCAPE;
+
+ /* ignore last character if it filled the buffer */
+ if (send_ptr == &send_parms[SEND_DATA_SIZE - 1])
+ --send_ptr;
+ bytes = send_ptr - send_parms; /* how many bytes we'll process */
+ do {
+ if (bytes-- <= 0)
+ break;
+ /* handle MAXL - max length */
+ /* ignore what he says - most I'll take (here) is 94 */
+ a_b[++length] = tochar (94);
+ if (bytes-- <= 0)
+ break;
+ /* handle TIME - time you should wait for my packets */
+ /* ignore what he says - don't wait for my ack longer than 1 second */
+ a_b[++length] = tochar (1);
+ if (bytes-- <= 0)
+ break;
+ /* handle NPAD - number of pad chars I need */
+ /* remember what he says - I need none */
+ his_pad_count = untochar (send_parms[2]);
+ a_b[++length] = tochar (0);
+ if (bytes-- <= 0)
+ break;
+ /* handle PADC - pad chars I need */
+ /* remember what he says - I need none */
+ his_pad_char = ktrans (send_parms[3]);
+ a_b[++length] = 0x40; /* He should ignore this */
+ if (bytes-- <= 0)
+ break;
+ /* handle EOL - end of line he needs */
+ /* remember what he says - I need CR */
+ his_eol = untochar (send_parms[4]);
+ a_b[++length] = tochar (END_CHAR);
+ if (bytes-- <= 0)
+ break;
+ /* handle QCTL - quote control char he'll use */
+ /* remember what he says - I'll use '#' */
+ his_quote = send_parms[5];
+ a_b[++length] = '#';
+ if (bytes-- <= 0)
+ break;
+ /* handle QBIN - 8-th bit prefixing */
+ /* ignore what he says - I refuse */
+ a_b[++length] = 'N';
+ if (bytes-- <= 0)
+ break;
+ /* handle CHKT - the clock check type */
+ /* ignore what he says - I do type 1 (for now) */
+ a_b[++length] = '1';
+ if (bytes-- <= 0)
+ break;
+ /* handle REPT - the repeat prefix */
+ /* ignore what he says - I refuse (for now) */
+ a_b[++length] = 'N';
+ if (bytes-- <= 0)
+ break;
+ /* handle CAPAS - the capabilities mask */
+ /* ignore what he says - I only do long packets - I don't do windows */
+ a_b[++length] = tochar (2); /* only long packets */
+ a_b[++length] = tochar (0); /* no windows */
+ a_b[++length] = tochar (94); /* large packet msb */
+ a_b[++length] = tochar (94); /* large packet lsb */
+ } while (0);
+
+ a_b[0] = START_CHAR;
+ a_b[1] = tochar (length);
+ a_b[2] = tochar (n);
+ a_b[3] = ACK_TYPE;
+ a_b[++length] = '\0';
+ a_b[length] = tochar (chk1 (&a_b[1]));
+ a_b[++length] = his_eol;
+ a_b[++length] = '\0';
+ s1_sendpacket (a_b);
+}
+
+/* k_recv receives a OS Open image file over kermit line */
+static int k_recv (void)
+{
+ char new_char;
+ char k_state, k_state_saved;
+ int sum;
+ int done;
+ int length;
+ int n, last_n;
+ int z = 0;
+ int len_lo, len_hi;
+
+ /* initialize some protocol parameters */
+ his_eol = END_CHAR; /* default end of line character */
+ his_pad_count = 0;
+ his_pad_char = '\0';
+ his_quote = K_ESCAPE;
+
+ /* initialize the k_recv and k_data state machine */
+ done = 0;
+ k_state = 0;
+ k_data_init ();
+ k_state_saved = k_state;
+ k_data_save ();
+ n = 0; /* just to get rid of a warning */
+ last_n = -1;
+
+ /* expect this "type" sequence (but don't check):
+ S: send initiate
+ F: file header
+ D: data (multiple)
+ Z: end of file
+ B: break transmission
+ */
+
+ /* enter main loop */
+ while (!done) {
+ /* set the send packet pointer to begining of send packet parms */
+ send_ptr = send_parms;
+
+ /* With each packet, start summing the bytes starting with the length.
+ Save the current sequence number.
+ Note the type of the packet.
+ If a character less than SPACE (0x20) is received - error.
+ */
+
+#if 0
+ /* OLD CODE, Prior to checking sequence numbers */
+ /* first have all state machines save current states */
+ k_state_saved = k_state;
+ k_data_save ();
+#endif
+
+ /* get a packet */
+ /* wait for the starting character or ^C */
+ for (;;) {
+ switch (serial_getc ()) {
+ case START_CHAR: /* start packet */
+ goto START;
+ case ETX_CHAR: /* ^C waiting for packet */
+ return (0);
+ default:
+ ;
+ }
+ }
+START:
+ /* get length of packet */
+ sum = 0;
+ new_char = serial_getc ();
+ if ((new_char & 0xE0) == 0)
+ goto packet_error;
+ sum += new_char & 0xff;
+ length = untochar (new_char);
+ /* get sequence number */
+ new_char = serial_getc ();
+ if ((new_char & 0xE0) == 0)
+ goto packet_error;
+ sum += new_char & 0xff;
+ n = untochar (new_char);
+ --length;
+
+ /* NEW CODE - check sequence numbers for retried packets */
+ /* Note - this new code assumes that the sequence number is correctly
+ * received. Handling an invalid sequence number adds another layer
+ * of complexity that may not be needed - yet! At this time, I'm hoping
+ * that I don't need to buffer the incoming data packets and can write
+ * the data into memory in real time.
+ */
+ if (n == last_n) {
+ /* same sequence number, restore the previous state */
+ k_state = k_state_saved;
+ k_data_restore ();
+ } else {
+ /* new sequence number, checkpoint the download */
+ last_n = n;
+ k_state_saved = k_state;
+ k_data_save ();
+ }
+ /* END NEW CODE */
+
+ /* get packet type */
+ new_char = serial_getc ();
+ if ((new_char & 0xE0) == 0)
+ goto packet_error;
+ sum += new_char & 0xff;
+ k_state = new_char;
+ --length;
+ /* check for extended length */
+ if (length == -2) {
+ /* (length byte was 0, decremented twice) */
+ /* get the two length bytes */
+ new_char = serial_getc ();
+ if ((new_char & 0xE0) == 0)
+ goto packet_error;
+ sum += new_char & 0xff;
+ len_hi = untochar (new_char);
+ new_char = serial_getc ();
+ if ((new_char & 0xE0) == 0)
+ goto packet_error;
+ sum += new_char & 0xff;
+ len_lo = untochar (new_char);
+ length = len_hi * 95 + len_lo;
+ /* check header checksum */
+ new_char = serial_getc ();
+ if ((new_char & 0xE0) == 0)
+ goto packet_error;
+ if (new_char != tochar ((sum + ((sum >> 6) & 0x03)) & 0x3f))
+ goto packet_error;
+ sum += new_char & 0xff;
+/* --length; */ /* new length includes only data and block check to come */
+ }
+ /* bring in rest of packet */
+ while (length > 1) {
+ new_char = serial_getc ();
+ if ((new_char & 0xE0) == 0)
+ goto packet_error;
+ sum += new_char & 0xff;
+ --length;
+ if (k_state == DATA_TYPE) {
+ /* pass on the data if this is a data packet */
+ k_data_char (new_char);
+ } else if (k_state == SEND_TYPE) {
+ /* save send pack in buffer as is */
+ *send_ptr++ = new_char;
+ /* if too much data, back off the pointer */
+ if (send_ptr >= &send_parms[SEND_DATA_SIZE])
+ --send_ptr;
+ }
+ }
+ /* get and validate checksum character */
+ new_char = serial_getc ();
+ if ((new_char & 0xE0) == 0)
+ goto packet_error;
+ if (new_char != tochar ((sum + ((sum >> 6) & 0x03)) & 0x3f))
+ goto packet_error;
+ /* get END_CHAR */
+ new_char = serial_getc ();
+ if (new_char != END_CHAR) {
+ packet_error:
+ /* restore state machines */
+ k_state = k_state_saved;
+ k_data_restore ();
+ /* send a negative acknowledge packet in */
+ send_nack (n);
+ } else if (k_state == SEND_TYPE) {
+ /* crack the protocol parms, build an appropriate ack packet */
+ handle_send_packet (n);
+ } else {
+ /* send simple acknowledge packet in */
+ send_ack (n);
+ /* quit if end of transmission */
+ if (k_state == BREAK_TYPE)
+ done = 1;
+ }
+ ++z;
+ }
+ return ((ulong) os_data_addr - (ulong) bin_start_address);
+}
+#endif /* CFG_CMD_LOADB */
+
+/* -------------------------------------------------------------------- */
+
+#if (CONFIG_COMMANDS & CFG_CMD_LOADS)
+
+#ifdef CFG_LOADS_BAUD_CHANGE
+cmd_tbl_t U_BOOT_CMD(LOADS) = MK_CMD_ENTRY(
+ "loads", 3, 0, do_load_serial,
+ "loads - load S-Record file over serial line\n",
+ "[ off ] [ baud ]\n"
+ " - load S-Record file over serial line"
+ " with offset 'off' and baudrate 'baud'\n"
+);
+
+#else /* ! CFG_LOADS_BAUD_CHANGE */
+cmd_tbl_t U_BOOT_CMD(LOADS) = MK_CMD_ENTRY(
+ "loads", 2, 0, do_load_serial,
+ "loads - load S-Record file over serial line\n",
+ "[ off ]\n"
+ " - load S-Record file over serial line with offset 'off'\n"
+);
+#endif /* CFG_LOADS_BAUD_CHANGE */
+
+/*
+ * SAVES always requires LOADS support, but not vice versa
+ */
+
+
+#if (CONFIG_COMMANDS & CFG_CMD_SAVES)
+#ifdef CFG_LOADS_BAUD_CHANGE
+cmd_tbl_t U_BOOT_CMD(SAVES) = MK_CMD_ENTRY(
+ "saves", 4, 0, do_save_serial,
+ "saves - save S-Record file over serial line\n",
+ "[ off ] [size] [ baud ]\n"
+ " - save S-Record file over serial line"
+ " with offset 'off', size 'size' and baudrate 'baud'\n"
+);
+#else /* ! CFG_LOADS_BAUD_CHANGE */
+cmd_tbl_t U_BOOT_CMD(SAVES) = MK_CMD_ENTRY(
+ "saves", 3, 0, do_save_serial,
+ "saves - save S-Record file over serial line\n",
+ "[ off ] [size]\n"
+ " - save S-Record file over serial line with offset 'off' and size 'size'\n"
+);
+#endif /* CFG_LOADS_BAUD_CHANGE */
+#endif /* CFG_CMD_SAVES */
+#endif /* CFG_CMD_LOADS */
+
+
+#if (CONFIG_COMMANDS & CFG_CMD_LOADB)
+cmd_tbl_t U_BOOT_CMD(LOADB) = MK_CMD_ENTRY(
+ "loadb", 3, 0, do_load_serial_bin,
+ "loadb - load binary file over serial line (kermit mode)\n",
+ "[ off ] [ baud ]\n"
+ " - load binary file over serial line"
+ " with offset 'off' and baudrate 'baud'\n"
+);
+
+#endif /* CFG_CMD_LOADB */
+
+/* -------------------------------------------------------------------- */
+
+#if (CONFIG_COMMANDS & CFG_CMD_HWFLOW)
+int do_hwflow (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+ extern int hwflow_onoff(int);
+
+ if (argc == 2) {
+ if (strcmp(argv[1], "off") == 0)
+ hwflow_onoff(-1);
+ else
+ if (strcmp(argv[1], "on") == 0)
+ hwflow_onoff(1);
+ else
+ printf("Usage: %s\n", cmdtp->usage);
+ }
+ printf("RTS/CTS hardware flow control: %s\n", hwflow_onoff(0) ? "on" : "off");
+ return 0;
+}
+
+/* -------------------------------------------------------------------- */
+
+cmd_tbl_t U_BOOT_CMD(HWFLOW) = MK_CMD_ENTRY(
+ "hwflow [on|off]", 2, 0, do_hwflow,
+ "hwflow - turn the harwdare flow control on/off\n",
+ "\n - change RTS/CTS hardware flow control over serial line\n"
+);
+
+#endif /* CFG_CMD_HWFLOW */
diff --git a/common/cmd_log.c b/common/cmd_log.c
index 84306ef..b07dc75 100644
--- a/common/cmd_log.c
+++ b/common/cmd_log.c
@@ -195,7 +195,16 @@
return 1;
}
}
-
+#if defined(CONFIG_LOGBUFFER)
+cmd_tbl_t U_BOOT_CMD(LOG) = MK_CMD_ENTRY(
+ "log", 255, 1, do_log,
+ "log - manipulate logbuffer\n",
+ "log info - show pointer details\n"
+ "log reset - clear contents\n"
+ "log show - show contents\n"
+ "log append <msg> - append <msg> to the logbuffer\n"
+);
+#endif /* CONFIG_LOGBUFFER */
static int logbuff_printk(const char *line)
{
int i;
diff --git a/common/cmd_mem.c b/common/cmd_mem.c
index aca6926..944aada 100644
--- a/common/cmd_mem.c
+++ b/common/cmd_mem.c
@@ -29,7 +29,6 @@
#include <common.h>
#include <command.h>
-#include <cmd_mem.h>
#if (CONFIG_COMMANDS & CFG_CMD_MMC)
#include <mmc.h>
#endif
@@ -148,7 +147,7 @@
}
addr += size;
}
-
+
} else { /* addr does not correspond to DataFlash */
#endif
for (i=0; i<linebytes; i+= size) {
@@ -416,7 +415,7 @@
puts ("done\n");
return 0;
}
-
+
/* Check if we are copying from DataFlash to RAM */
if (addr_dataflash(addr) && !addr_dataflash(dest) && (addr2info(dest)==NULL) ){
read_dataflash(addr, count * size, (char *) dest);
@@ -960,4 +959,72 @@
return 0;
}
+/**************************************************/
+#if (CONFIG_COMMANDS & CFG_CMD_MEMORY)
+cmd_tbl_t U_BOOT_CMD(MD) = MK_CMD_ENTRY(
+ "md", 3, 1, do_mem_md,
+ "md - memory display\n",
+ "[.b, .w, .l] address [# of objects]\n - memory display\n"
+);
+
+
+cmd_tbl_t U_BOOT_CMD(MM) = MK_CMD_ENTRY(
+ "mm", 2, 1, do_mem_mm,
+ "mm - memory modify (auto-incrementing)\n",
+ "[.b, .w, .l] address\n" " - memory modify, auto increment address\n"
+);
+
+
+cmd_tbl_t U_BOOT_CMD(NM) = MK_CMD_ENTRY(
+ "nm", 2, 1, do_mem_nm,
+ "nm - memory modify (constant address)\n",
+ "[.b, .w, .l] address\n - memory modify, read and keep address\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(MW) = MK_CMD_ENTRY(
+ "mw", 4, 1, do_mem_mw,
+ "mw - memory write (fill)\n",
+ "[.b, .w, .l] address value [count]\n - write memory\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(CP) = MK_CMD_ENTRY(
+ "cp", 4, 1, do_mem_cp,
+ "cp - memory copy\n",
+ "[.b, .w, .l] source target count\n - copy memory\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(CMP) = MK_CMD_ENTRY(
+ "cmp", 4, 1, do_mem_cmp,
+ "cmp - memory compare\n",
+ "[.b, .w, .l] addr1 addr2 count\n - compare memory\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(CRC32) = MK_CMD_ENTRY(
+ "crc32", 4, 1, do_mem_crc,
+ "crc32 - checksum calculation\n",
+ "address count [addr]\n - compute CRC32 checksum [save at addr]\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(BASE) = MK_CMD_ENTRY(
+ "base", 2, 1, do_mem_base,
+ "base - print or set address offset\n",
+ "\n - print address offset for memory commands\n"
+ "base off\n - set address offset for memory commands to 'off'\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(LOOP) = MK_CMD_ENTRY(
+ "loop", 3, 1, do_mem_loop,
+ "loop - infinite loop on address range\n",
+ "[.b, .w, .l] address number_of_objects\n"
+ " - loop on a set of addresses\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(MTEST) = MK_CMD_ENTRY(
+ "mtest", 4, 1, do_mem_mtest,
+ "mtest - simple RAM test\n",
+ "[start [end [pattern]]]\n"
+ " - simple RAM read/write test\n"
+);
+
+#endif
#endif /* CFG_CMD_MEMORY */
diff --git a/common/cmd_mii.c b/common/cmd_mii.c
index bb97c0d..d74a06f 100644
--- a/common/cmd_mii.c
+++ b/common/cmd_mii.c
@@ -27,7 +27,6 @@
#include <common.h>
#include <command.h>
-#include <cmd_mii.h>
#include <miiphy.h>
#if (CONFIG_COMMANDS & CFG_CMD_MII)
@@ -128,4 +127,15 @@
return rcode;
}
+/***************************************************/
+
+cmd_tbl_t U_BOOT_CMD(MII) = MK_CMD_ENTRY(
+ "mii", 5, 1, do_mii,
+ "mii - MII utility commands\n",
+ "info <addr> - display MII PHY info\n"
+ "mii read <addr> <reg> - read MII PHY <addr> register <reg>\n"
+ "mii write <addr> <reg> <data> - write MII PHY <addr> register <reg>\n"
+);
+
+
#endif /* CFG_CMD_MII */
diff --git a/common/cmd_misc.c b/common/cmd_misc.c
index e3e0e44..76fe267 100644
--- a/common/cmd_misc.c
+++ b/common/cmd_misc.c
@@ -52,5 +52,22 @@
}
return 0;
}
+/* Implemented in $(CPU)/interrupts.c */
+#if (CONFIG_COMMANDS & CFG_CMD_IRQ)
+int do_irqinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+
+cmd_tbl_t U_BOOT_CMD(IRQINFO) = MK_CMD_ENTRY(
+ "irqinfo", 1, 1, do_irqinfo,
+ "irqinfo - print information about IRQs\n",
+ NULL
+);
+#endif /* CONFIG_COMMANDS & CFG_CMD_IRQ */
+
+cmd_tbl_t U_BOOT_CMD(MISC) = MK_CMD_ENTRY(
+ "sleep" , 2, 2, do_sleep,
+ "sleep - delay execution for some time\n",
+ "N\n"
+ " - delay execution for N seconds (N is _decimal_ !!!)\n"
+);
#endif /* CFG_CMD_MISC */
diff --git a/common/cmd_nand.c b/common/cmd_nand.c
index 4b27c77..41f84fd 100644
--- a/common/cmd_nand.c
+++ b/common/cmd_nand.c
@@ -98,7 +98,7 @@
printf ("Usage:\n%s\n", cmdtp->usage);
return 1;
case 2:
- if (strcmp(argv[1],"info") == 0) {
+ if (strcmp(argv[1],"info") == 0) {
int i;
putc ('\n');
@@ -376,7 +376,7 @@
return 0;
}
-
+
/* print bad blocks in NAND flash */
static void nand_print_bad(struct nand_chip* nand)
{
@@ -473,7 +473,7 @@
nand->totlen >> 20, nand->erasesize >> 10);
}
else {
- printf("%s at 0x%lx (", nand->chips_name, nand->IO_ADDR);
+ printf("%s at 0x%lx (", nand->chips_name, nand->IO_ADDR);
print_size(nand->totlen, ", ");
print_size(nand->erasesize, " sector)\n");
}
@@ -599,7 +599,7 @@
id = READ_NAND(nand->IO_ADDR);
- NAND_DISABLE_CE(nand); /* set pin high */
+ NAND_DISABLE_CE(nand); /* set pin high */
/* No response - return failure */
if (mfr == 0xff || mfr == 0) {
printf("NanD_Command (ReadID) got %d %d\n", mfr, id);
@@ -806,7 +806,7 @@
goto readdata;
/* Send the read command */
NanD_Command(nand, NAND_CMD_READ0);
- NanD_Address(nand, ADDR_COLUMN_PAGE, (page << nand->page_shift) + col);
+ NanD_Address(nand, ADDR_COLUMN_PAGE, (page << nand->page_shift) + col);
/* Read in a page + oob data */
NanD_ReadBuf(nand, nand->data_buf, nand->oobblock + nand->oobsize);
@@ -873,7 +873,7 @@
#else
/* Send the read command */
NanD_Command(nand, NAND_CMD_READ0);
- NanD_Address(nand, ADDR_COLUMN_PAGE, (page << nand->page_shift) + col);
+ NanD_Address(nand, ADDR_COLUMN_PAGE, (page << nand->page_shift) + col);
/* Read the data directly into the return buffer */
if ((*retlen + (nand->oobblock - col)) >= len) {
NanD_ReadBuf(nand, buf + *retlen, len - *retlen);
@@ -1136,11 +1136,11 @@
*retlen = len;
/* Reading the full OOB data drops us off of the end of the page,
- * causing the flash device to go into busy mode, so we need
- * to wait until ready 11.4.1 and Toshiba TC58256FT nands */
+ * causing the flash device to go into busy mode, so we need
+ * to wait until ready 11.4.1 and Toshiba TC58256FT nands */
ret = NanD_WaitReady(nand);
- NAND_DISABLE_CE(nand); /* set pin high */
+ NAND_DISABLE_CE(nand); /* set pin high */
return ret;
@@ -1244,7 +1244,7 @@
if (ofs & (nand->erasesize-1) || len & (nand->erasesize-1)) {
printf ("Offset and size must be sector aligned, erasesize = %d\n",
- (int) nand->erasesize);
+ (int) nand->erasesize);
return -1;
}
diff --git a/common/cmd_net.c b/common/cmd_net.c
index e8bf0ae..44c86e2 100644
--- a/common/cmd_net.c
+++ b/common/cmd_net.c
@@ -26,14 +26,11 @@
*/
#include <common.h>
#include <command.h>
-#include <cmd_net.h>
+#include <cmd_autoscript.h>
#include <net.h>
#if (CONFIG_COMMANDS & CFG_CMD_NET)
-# if (CONFIG_COMMANDS & CFG_CMD_AUTOSCRIPT)
-# include <cmd_autoscript.h>
-# endif
extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
@@ -44,21 +41,46 @@
return netboot_common (BOOTP, cmdtp, argc, argv);
}
+cmd_tbl_t U_BOOT_CMD(BOOTP) = MK_CMD_ENTRY(
+ "bootp", 3, 1, do_bootp,
+ "bootp - boot image via network using BootP/TFTP protocol\n",
+ "[loadAddress] [bootfilename]\n"
+);
+
int do_tftpb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
return netboot_common (TFTP, cmdtp, argc, argv);
}
+cmd_tbl_t U_BOOT_CMD(TFTPB) = MK_CMD_ENTRY(
+ "tftpboot", 3, 1, do_tftpb,
+ "tftpboot- boot image via network using TFTP protocol\n"
+ " and env variables ipaddr and serverip\n",
+ "[loadAddress] [bootfilename]\n"
+);
+
int do_rarpb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
return netboot_common (RARP, cmdtp, argc, argv);
}
+cmd_tbl_t U_BOOT_CMD(RARPB) = MK_CMD_ENTRY(
+ "rarpboot", 3, 1, do_rarpb,
+ "rarpboot- boot image via network using RARP/TFTP protocol\n",
+ "[loadAddress] [bootfilename]\n"
+);
+
#if (CONFIG_COMMANDS & CFG_CMD_DHCP)
int do_dhcp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
return netboot_common(DHCP, cmdtp, argc, argv);
}
+
+cmd_tbl_t U_BOOT_CMD(DHCP) = MK_CMD_ENTRY(
+ "dhcp", 3, 1, do_dhcp,
+ "dhcp - invoke DHCP client to obtain IP/boot params\n",
+ "\n"
+);
#endif /* CFG_CMD_DHCP */
static void netboot_update_env(void)
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index 3c2a553..9cf8b90 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -43,7 +43,6 @@
#include <command.h>
#include <environment.h>
#include <watchdog.h>
-#include <cmd_nvedit.h>
#include <linux/stddef.h>
#include <asm/byteorder.h>
#if (CONFIG_COMMANDS & CFG_CMD_NET)
@@ -534,6 +533,8 @@
return (saveenv() ? 1 : 0);
}
+
+
#endif
@@ -556,3 +557,60 @@
return(i2);
return(-1);
}
+
+
+/**************************************************/
+
+cmd_tbl_t U_BOOT_CMD(PRINTENV) = MK_CMD_ENTRY(
+ "printenv", CFG_MAXARGS, 1, do_printenv,
+ "printenv- print environment variables\n",
+ "\n - print values of all environment variables\n"
+ "printenv name ...\n"
+ " - print value of environment variable 'name'\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(SETENV) = MK_CMD_ENTRY(
+ "setenv", CFG_MAXARGS, 0, do_setenv,
+ "setenv - set environment variables\n",
+ "name value ...\n"
+ " - set environment variable 'name' to 'value ...'\n"
+ "setenv name\n"
+ " - delete environment variable 'name'\n"
+);
+
+#if ((CONFIG_COMMANDS & (CFG_CMD_ENV|CFG_CMD_FLASH)) == (CFG_CMD_ENV|CFG_CMD_FLASH))
+
+cmd_tbl_t U_BOOT_CMD(SAVEENV) = MK_CMD_ENTRY(
+ "saveenv", 1, 0, do_saveenv,
+ "saveenv - save environment variables to persistent storage\n",
+ NULL
+);
+
+#endif /* CFG_CMD_ENV */
+
+#if (CONFIG_COMMANDS & CFG_CMD_ASKENV)
+
+cmd_tbl_t U_BOOT_CMD(ASKENV) = MK_CMD_ENTRY(
+ "askenv", CFG_MAXARGS, 1, do_askenv,
+ "askenv - get environment variables from stdin\n",
+ "name [message] [size]\n"
+ " - get environment variable 'name' from stdin (max 'size' chars)\n"
+ "askenv name\n"
+ " - get environment variable 'name' from stdin\n"
+ "askenv name size\n"
+ " - get environment variable 'name' from stdin (max 'size' chars)\n"
+ "askenv name [message] size\n"
+ " - display 'message' string and get environment variable 'name'"
+ "from stdin (max 'size' chars)\n"
+);
+#endif /* CFG_CMD_ASKENV */
+
+#if (CONFIG_COMMANDS & CFG_CMD_RUN)
+int do_run (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+cmd_tbl_t U_BOOT_CMD(RUN) = MK_CMD_ENTRY(
+ "run", CFG_MAXARGS, 1, do_run,
+ "run - run commands in an environment variable\n",
+ "var [...]\n"
+ " - run the commands in the environment variable(s) 'var'\n"
+);
+#endif /* CFG_CMD_RUN */
diff --git a/common/cmd_pci.c b/common/cmd_pci.c
index ca712ce..7641d5c 100644
--- a/common/cmd_pci.c
+++ b/common/cmd_pci.c
@@ -34,10 +34,8 @@
#ifdef CONFIG_PCI
#include <command.h>
-#include <cmd_boot.h>
#include <asm/processor.h>
#include <asm/io.h>
-#include <cmd_pci.h>
#include <pci.h>
#if (CONFIG_COMMANDS & CFG_CMD_PCI)
@@ -116,63 +114,63 @@
static char *pci_classes_str(u8 class)
{
switch (class) {
- case PCI_CLASS_NOT_DEFINED:
- return "Build before PCI Rev2.0";
- break;
- case PCI_BASE_CLASS_STORAGE:
- return "Mass storage controller";
- break;
- case PCI_BASE_CLASS_NETWORK:
- return "Network controller";
- break;
- case PCI_BASE_CLASS_DISPLAY:
- return "Display controller";
- break;
- case PCI_BASE_CLASS_MULTIMEDIA:
- return "Multimedia device";
- break;
- case PCI_BASE_CLASS_MEMORY:
- return "Memory controller";
- break;
- case PCI_BASE_CLASS_BRIDGE:
- return "Bridge device";
- break;
- case PCI_BASE_CLASS_COMMUNICATION:
- return "Simple comm. controller";
- break;
- case PCI_BASE_CLASS_SYSTEM:
- return "Base system peripheral";
- break;
- case PCI_BASE_CLASS_INPUT:
- return "Input device";
- break;
- case PCI_BASE_CLASS_DOCKING:
- return "Docking station";
- break;
- case PCI_BASE_CLASS_PROCESSOR:
- return "Processor";
- break;
- case PCI_BASE_CLASS_SERIAL:
- return "Serial bus controller";
- break;
- case PCI_BASE_CLASS_INTELLIGENT:
- return "Intelligent controller";
- break;
- case PCI_BASE_CLASS_SATELLITE:
- return "Satellite controller";
- break;
- case PCI_BASE_CLASS_CRYPT:
- return "Cryptographic device";
- break;
- case PCI_BASE_CLASS_SIGNAL_PROCESSING:
- return "DSP";
- break;
- case PCI_CLASS_OTHERS:
- return "Does not fit any class";
- break;
- default:
+ case PCI_CLASS_NOT_DEFINED:
+ return "Build before PCI Rev2.0";
+ break;
+ case PCI_BASE_CLASS_STORAGE:
+ return "Mass storage controller";
+ break;
+ case PCI_BASE_CLASS_NETWORK:
+ return "Network controller";
+ break;
+ case PCI_BASE_CLASS_DISPLAY:
+ return "Display controller";
+ break;
+ case PCI_BASE_CLASS_MULTIMEDIA:
+ return "Multimedia device";
+ break;
+ case PCI_BASE_CLASS_MEMORY:
+ return "Memory controller";
+ break;
+ case PCI_BASE_CLASS_BRIDGE:
+ return "Bridge device";
+ break;
+ case PCI_BASE_CLASS_COMMUNICATION:
+ return "Simple comm. controller";
+ break;
+ case PCI_BASE_CLASS_SYSTEM:
+ return "Base system peripheral";
+ break;
+ case PCI_BASE_CLASS_INPUT:
+ return "Input device";
+ break;
+ case PCI_BASE_CLASS_DOCKING:
+ return "Docking station";
+ break;
+ case PCI_BASE_CLASS_PROCESSOR:
+ return "Processor";
+ break;
+ case PCI_BASE_CLASS_SERIAL:
+ return "Serial bus controller";
+ break;
+ case PCI_BASE_CLASS_INTELLIGENT:
+ return "Intelligent controller";
+ break;
+ case PCI_BASE_CLASS_SATELLITE:
+ return "Satellite controller";
+ break;
+ case PCI_BASE_CLASS_CRYPT:
+ return "Cryptographic device";
+ break;
+ case PCI_BASE_CLASS_SIGNAL_PROCESSING:
+ return "DSP";
+ break;
+ case PCI_CLASS_OTHERS:
+ return "Does not fit any class";
+ break;
+ default:
return "???";
- break;
+ break;
};
}
@@ -234,7 +232,7 @@
PRINT (" status register = 0x%.4x\n", word, PCI_STATUS);
PRINT (" revision ID = 0x%.2x\n", byte, PCI_REVISION_ID);
PRINT2(" class code = 0x%.2x (%s)\n", byte, PCI_CLASS_CODE,
- pci_classes_str);
+ pci_classes_str);
PRINT (" sub class code = 0x%.2x\n", byte, PCI_CLASS_SUB_CODE);
PRINT (" programming interface = 0x%.2x\n", byte, PCI_CLASS_PROG);
PRINT (" cache line = 0x%.2x\n", byte, PCI_CACHE_LINE_SIZE);
@@ -259,7 +257,7 @@
PRINT (" min Grant = 0x%.2x\n", byte, PCI_MIN_GNT);
PRINT (" max Latency = 0x%.2x\n", byte, PCI_MAX_LAT);
break;
-
+
case PCI_HEADER_TYPE_BRIDGE: /* PCI-to-PCI bridge */
PRINT (" base address 1 = 0x%.8x\n", dword, PCI_BASE_ADDRESS_1);
@@ -291,7 +289,7 @@
PRINT (" primary bus number = 0x%.2x\n", byte, PCI_CB_PRIMARY_BUS);
PRINT (" CardBus number = 0x%.2x\n", byte, PCI_CB_CARD_BUS);
PRINT (" subordinate bus number = 0x%.2x\n", byte, PCI_CB_SUBORDINATE_BUS);
- PRINT (" CardBus latency timer = 0x%.2x\n", byte, PCI_CB_LATENCY_TIMER);
+ PRINT (" CardBus latency timer = 0x%.2x\n", byte, PCI_CB_LATENCY_TIMER);
PRINT (" CardBus memory base 0 = 0x%.8x\n", dword, PCI_CB_MEMORY_BASE_0);
PRINT (" CardBus memory limit 0 = 0x%.8x\n", dword, PCI_CB_MEMORY_LIMIT_0);
PRINT (" CardBus memory base 1 = 0x%.8x\n", dword, PCI_CB_MEMORY_BASE_1);
@@ -311,10 +309,10 @@
PRINT (" subdevice ID = 0x%.4x\n", word, PCI_CB_SUBSYSTEM_ID);
PRINT (" PC Card 16bit base address = 0x%.8x\n", dword, PCI_CB_LEGACY_MODE_BASE);
break;
-
+
default:
printf("unknown header\n");
- break;
+ break;
}
#undef PRINT
@@ -547,6 +545,26 @@
return 1;
}
+/***************************************************/
+
+
+cmd_tbl_t U_BOOT_CMD(PCI) = MK_CMD_ENTRY(
+ "pci", 5, 1, do_pci,
+ "pci - list and access PCI Configuraton Space\n",
+ "[bus] [long]\n"
+ " - short or long list of PCI devices on bus 'bus'\n"
+ "pci header b.d.f\n"
+ " - show header of PCI device 'bus.device.function'\n"
+ "pci display[.b, .w, .l] b.d.f [address] [# of objects]\n"
+ " - display PCI configuration space (CFG)\n"
+ "pci next[.b, .w, .l] b.d.f address\n"
+ " - modify, read and keep CFG address\n"
+ "pci modify[.b, .w, .l] b.d.f address\n"
+ " - modify, auto increment CFG address\n"
+ "pci write[.b, .w, .l] b.d.f address value\n"
+ " - write to CFG address\n"
+);
+
#endif /* (CONFIG_COMMANDS & CFG_CMD_PCI) */
#endif /* CONFIG_PCI */
diff --git a/common/cmd_pcmcia.c b/common/cmd_pcmcia.c
index 10ba84c..2aa2a23 100644
--- a/common/cmd_pcmcia.c
+++ b/common/cmd_pcmcia.c
@@ -57,7 +57,6 @@
#include <command.h>
#include <config.h>
#include <pcmcia.h>
-#include <cmd_pcmcia.h>
#if defined(CONFIG_IDE_8xx_PCCARD) && defined(CONFIG_8xx)
#include <mpc8xx.h>
#endif
@@ -669,7 +668,6 @@
}
-
#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
static int hardware_disable(int slot)
{
@@ -698,7 +696,6 @@
#endif /* CFG_CMD_PCMCIA */
-
static int voltage_set(int slot, int vcc, int vpp)
{
volatile immap_t *immap;
@@ -890,7 +887,6 @@
}
-
#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
static int hardware_disable(int slot)
{
@@ -933,7 +929,6 @@
#endif /* CFG_CMD_PCMCIA */
-
static int voltage_set(int slot, int vcc, int vpp)
{
volatile immap_t *immap;
@@ -1206,7 +1201,6 @@
}
-
#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
static int hardware_disable(int slot)
{
@@ -1238,7 +1232,6 @@
#endif /* CFG_CMD_PCMCIA */
-
static int voltage_set(int slot, int vcc, int vpp)
{
volatile immap_t *immap;
@@ -1470,7 +1463,6 @@
}
-
#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
static int hardware_disable(int slot)
{
@@ -1502,7 +1494,6 @@
#endif /* CFG_CMD_PCMCIA */
-
static int voltage_set(int slot, int vcc, int vpp)
{
volatile immap_t *immap;
@@ -1895,7 +1886,6 @@
}
-
#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
static int hardware_disable(int slot)
{
@@ -1926,7 +1916,6 @@
#endif /* CFG_CMD_PCMCIA */
-
static int voltage_set(int slot, int vcc, int vpp)
{
volatile immap_t *immap;
@@ -2115,7 +2104,6 @@
}
-
#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
static int hardware_disable(int slot)
{
@@ -2148,7 +2136,6 @@
#endif /* CFG_CMD_PCMCIA */
-
static int voltage_set(int slot, int vcc, int vpp)
{
volatile immap_t *immap;
@@ -2227,9 +2214,6 @@
#endif /* KUP4K */
-
-
-
/* -------------------------------------------------------------------- */
/* End of Board Specific Stuff */
/* -------------------------------------------------------------------- */
@@ -2499,3 +2483,14 @@
/* -------------------------------------------------------------------- */
#endif /* CFG_CMD_PCMCIA || (CFG_CMD_IDE && CONFIG_IDE_8xx_PCCARD) */
+
+/**************************************************/
+
+#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)
+cmd_tbl_t U_BOOT_CMD(PINIT) = MK_CMD_ENTRY(
+ "pinit", 2, 1, do_pinit,
+ "pinit - PCMCIA sub-system\n",
+ "on - power on PCMCIA socket\n"
+ "pinit off - power off PCMCIA socket\n"
+);
+#endif
diff --git a/common/cmd_reginfo.c b/common/cmd_reginfo.c
index 198b9c7..aa9abf9 100644
--- a/common/cmd_reginfo.c
+++ b/common/cmd_reginfo.c
@@ -23,7 +23,6 @@
#include <common.h>
#include <command.h>
-#include <cmd_boot.h>
#if defined(CONFIG_8xx)
#include <mpc8xx.h>
#elif defined (CONFIG_405GP)
@@ -213,3 +212,15 @@
}
#endif /* CONFIG_COMMANDS & CFG_CMD_REGINFO */
+
+
+ /**************************************************/
+
+#if (defined(CONFIG_8xx) || defined(CONFIG_405GP)) && \
+ (CONFIG_COMMANDS & CFG_CMD_REGINFO)
+
+cmd_tbl_t U_BOOT_CMD(REGINFO) = MK_CMD_ENTRY(
+ "reginfo", 2, 1, do_reginfo,
+ "reginfo - print register information\n",
+);
+#endif
diff --git a/common/cmd_scsi.c b/common/cmd_scsi.c
index f3d0c72..c925823 100644
--- a/common/cmd_scsi.c
+++ b/common/cmd_scsi.c
@@ -30,7 +30,6 @@
#include <common.h>
#include <command.h>
-#include <cmd_boot.h>
#include <asm/processor.h>
#include <scsi.h>
#include <image.h>
@@ -181,7 +180,6 @@
}
-
void scsi_init(void)
{
int busdevfunc;
@@ -206,7 +204,6 @@
}
-
/******************************************************************************
* scsi boot command intepreter. Derived from diskboot
*/
@@ -494,7 +491,6 @@
}
-
/* Trim trailing blanks, and NUL-terminate string
*/
void scsi_trim_trail (unsigned char *str, unsigned int len)
@@ -594,5 +590,3 @@
}
#endif /* #if (CONFIG_COMMANDS & CFG_CMD_SCSI) */
-
-
diff --git a/common/cmd_spi.c b/common/cmd_spi.c
index d544b27..82cb673 100644
--- a/common/cmd_spi.c
+++ b/common/cmd_spi.c
@@ -28,7 +28,6 @@
#include <common.h>
#include <command.h>
#include <spi.h>
-#include <cmd_spi.h>
#if (CONFIG_COMMANDS & CFG_CMD_SPI)
@@ -107,11 +106,11 @@
if ((device < 0) || (device >= spi_chipsel_cnt)) {
printf("Invalid device %d, giving up.\n", device);
return 1;
- }
+ }
if ((bitlen < 0) || (bitlen > (MAX_SPI_BYTES * 8))) {
printf("Invalid bitlen %d, giving up.\n", bitlen);
return 1;
- }
+ }
debug ("spi_chipsel[%d] = %08X\n",
device, (uint)spi_chipsel[device]);
@@ -130,4 +129,15 @@
return rcode;
}
+/***************************************************/
+
+cmd_tbl_t U_BOOT_CMD(SPI) = MK_CMD_ENTRY(
+ "sspi", 5, 1, do_spi,
+ "sspi - SPI utility commands\n",
+ "<device> <bit_len> <dout> - Send <bit_len> bits from <dout> out the SPI\n"
+ "<device> - Identifies the chip select of the device\n"
+ "<bit_len> - Number of bits to send (base 10)\n"
+ "<dout> - Hexadecimal string that gets sent\n"
+);
+
#endif /* CFG_CMD_SPI */
diff --git a/common/cmd_usb.c b/common/cmd_usb.c
index 8a3f471..d8f2f2c 100644
--- a/common/cmd_usb.c
+++ b/common/cmd_usb.c
@@ -309,7 +309,6 @@
}
-
/******************************************************************************
* usb boot command intepreter. Derived from diskboot
*/
@@ -433,7 +432,6 @@
#endif /* CONFIG_USB_STORAGE */
-
/*********************************************************************************
* usb command intepreter
*/
@@ -594,3 +592,37 @@
#endif /* (CONFIG_COMMANDS & CFG_CMD_USB) */
+#if (CONFIG_COMMANDS & CFG_CMD_USB)
+
+#ifdef CONFIG_USB_STORAGE
+cmd_tbl_t U_BOOT_CMD(USB) = MK_CMD_ENTRY(
+ "usb", 5, 1, do_usb,
+ "usb - USB sub-system\n",
+ "reset - reset (rescan) USB controller\n"
+ "usb stop [f] - stop USB [f]=force stop\n"
+ "usb tree - show USB device tree\n"
+ "usb info [dev] - show available USB devices\n"
+ "usb scan - (re-)scan USB bus for storage devices\n"
+ "usb device [dev] - show or set current USB storage device\n"
+ "usb part [dev] - print partition table of one or all USB storage devices\n"
+ "usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'\n"
+ " to memory address `addr'\n"
+);
+
+
+cmd_tbl_t U_BOOT_CMD(USBBOOT) = MK_CMD_ENTRY(
+ "usbboot", 3, 1, do_usbboot,
+ "usbboot - boot from USB device\n",
+ "loadAddr dev:part\n"
+);
+
+#else
+cmd_tbl_t U_BOOT_CMD(USB) = MK_CMD_ENTRY(
+ "usb", 5, 1, do_usb,
+ "usb - USB sub-system\n",
+ "reset - reset (rescan) USB controller\n"
+ "usb tree - show USB device tree\n"
+ "usb info [dev] - show available USB devices\n"
+);
+#endif
+#endif
diff --git a/common/cmd_vfd.c b/common/cmd_vfd.c
index 3ef1395..61ebe1c 100644
--- a/common/cmd_vfd.c
+++ b/common/cmd_vfd.c
@@ -64,6 +64,13 @@
transfer_pic(3, (uchar *)bitmap, VFD_LOGO_HEIGHT, VFD_LOGO_WIDTH);
return 0;
}
+
+cmd_tbl_t U_BOOT_CMD(VFD) = MK_CMD_ENTRY(
+ "vfd", 2, 0, do_vfd,
+ "vfd - load a bitmap to the VFDs on TRAB\n",
+ "N\n"
+ " - load bitmap N to the VFDs (N is _decimal_ !!!)\n"
+);
#endif /* CFG_CMD_VFD */
#ifdef CONFIG_VFD
diff --git a/common/command.c b/common/command.c
index 842e784..607c746 100644
--- a/common/command.c
+++ b/common/command.c
@@ -1,5 +1,5 @@
/*
- * (C) Copyright 2000
+ * (C) Copyright 2000-2003
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* See file CREDITS for list of people who contributed to this
@@ -27,93 +27,6 @@
#include <common.h>
#include <command.h>
-#include <cmd_cache.h>
-#include <cmd_mem.h>
-#include <cmd_boot.h>
-#include <cmd_flash.h>
-#include <cmd_bootm.h>
-#include <cmd_net.h>
-#include <cmd_nvedit.h>
-#include <cmd_misc.h>
-#include <cmd_kgdb.h>
-#include <cmd_ide.h>
-#include <cmd_disk.h>
-#include <cmd_console.h>
-#include <cmd_reginfo.h>
-#include <cmd_pcmcia.h>
-#include <cmd_autoscript.h>
-#include <cmd_diag.h>
-
-#include <cmd_eeprom.h>
-#include <cmd_i2c.h>
-#include <cmd_spi.h>
-#include <cmd_immap.h>
-#include <cmd_rtc.h>
-
-#include <cmd_elf.h>
-#include <cmd_fdc.h> /* Floppy support */
-#include <cmd_usb.h> /* USB support */
-#include <cmd_scsi.h>
-#include <cmd_pci.h>
-#include <cmd_mii.h>
-#include <cmd_dcr.h> /* 4xx DCR register access */
-#include <cmd_doc.h>
-#include <cmd_nand.h>
-#include <cmd_jffs2.h>
-#include <cmd_fpga.h>
-
-#include <cmd_bsp.h> /* board special functions */
-
-#include <cmd_bedbug.h>
-#include <cmd_elf.h>
-
-#include <cmd_dtt.h>
-
-#include <cmd_vfd.h> /* load a bitmap to the VFDs on TRAB */
-#include <cmd_log.h>
-#include <cmd_fdos.h>
-#include <cmd_bmp.h>
-#include <cmd_portio.h>
-#include <cmd_mmc.h>
-#include <cmd_fat.h>
-
-#ifdef CONFIG_AMIGAONEG3SE
-#include <cmd_menu.h>
-#include <cmd_boota.h>
-#endif
-
-/*
- * HELP command
- */
-#define CMD_TBL_HELP MK_CMD_TBL_ENTRY( \
- "help", 1, CFG_MAXARGS, 1, do_help, \
- "help - print online help\n", \
- "[command ...]\n" \
- " - show help information (for 'command')\n" \
- "'help' prints online help for the monitor commands.\n\n" \
- "Without arguments, it prints a short usage message for all commands.\n\n" \
- "To get detailed help information for specific commands you can type\n" \
- "'help' with one or more command names as arguments.\n" \
- ),
-
-#define CMD_TBL_QUES MK_CMD_TBL_ENTRY( \
- "?", 1, CFG_MAXARGS, 1, do_help, \
- "? - alias for 'help'\n", \
- NULL \
- ),
-
-#define CMD_TBL_VERS MK_CMD_TBL_ENTRY( \
- "version", 4, 1, 1, do_version, \
- "version - print monitor version\n", \
- NULL \
- ),
-
-#define CMD_TBL_ECHO MK_CMD_TBL_ENTRY( \
- "echo", 4, CFG_MAXARGS, 1, do_echo, \
- "echo - echo args to console\n", \
- "[args..]\n" \
- " - echo args to console; \\c suppresses newline\n" \
- ),
int
do_version (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
@@ -152,32 +65,59 @@
* Use puts() instead of printf() to avoid printf buffer overflow
* for long help messages
*/
-int
-do_help (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+int do_help (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{
int i;
int rcode = 0;
- if (argc == 1) { /* print short help (usage) */
+ if (argc == 1) { /*show list of commands */
- for (cmdtp=&cmd_tbl[0]; cmdtp->name; cmdtp++) {
+ int cmd_items = (((int) &__u_boot_cmd_end) -
+ ((int) &__u_boot_cmd_start)) /
+ sizeof (*cmdtp);
+ int end_sort;
+ cmd_tbl_t *cmd_array[(cmd_items + 1)];
+ int i;
+
+ /* Make list of commands from .uboot_cmd section */
+ cmdtp = (cmd_tbl_t *) & __u_boot_cmd_start;
+ for (i = 1; i <= cmd_items; i++) {
+ cmd_array[i] = cmdtp;
+ cmdtp++;
+ }
+ /* Sort command list */
+ end_sort = 0;
+ for (i = 1; end_sort != 1 || i <= cmd_items - 1; i++) {
+ if (i == cmd_items) { /* Last command */
+ end_sort = 1;
+ i = 1;
+ }
+
+ if (strcmp (cmd_array[i]->name, cmd_array[i + 1]->name) > 0) {
+ end_sort = 0;
+ *cmd_array[0] = *cmd_array[i];
+ *cmd_array[i] = *cmd_array[i + 1];
+ *cmd_array[i + 1] = *cmd_array[0];
+ }
+ }
+
+ /* print short help (usage) */
+ for (cmdtp = (cmd_tbl_t *) & __u_boot_cmd_start;
+ cmdtp != (cmd_tbl_t *) & __u_boot_cmd_end; cmdtp++) {
/* allow user abort */
- if (ctrlc())
+ if (ctrlc ())
return 1;
-
if (cmdtp->usage == NULL)
continue;
puts (cmdtp->usage);
}
-
return 0;
}
-
/*
* command help (long version)
*/
- for (i=1; i<argc; ++i) {
- if ((cmdtp = find_cmd(argv[i])) != NULL) {
+ for (i = 1; i < argc; ++i) {
+ if ((cmdtp = find_cmd (argv[i])) != NULL) {
#ifdef CFG_LONGHELP
/* found - print (long) help info */
puts (cmdtp->name);
@@ -196,164 +136,66 @@
} else {
printf ("Unknown command '%s' - try 'help'"
" without arguments for list of all"
- " known commands\n\n",
- argv[i]
- );
+ " known commands\n\n", argv[i]
+ );
rcode = 1;
}
}
return rcode;
}
+
+cmd_tbl_t U_BOOT_CMD(HELP) = MK_CMD_ENTRY(
+ "help", CFG_MAXARGS, 1, do_help,
+ "help - print online help\n",
+ "[command ...]\n"
+ " - show help information (for 'command')\n"
+ "'help' prints online help for the monitor commands.\n\n"
+ "Without arguments, it prints a short usage message for all commands.\n\n"
+ "To get detailed help information for specific commands you can type\n"
+ "'help' with one or more command names as arguments.\n"
+);
+
+cmd_tbl_t U_BOOT_CMD(QUES) = MK_CMD_ENTRY(
+ "?", CFG_MAXARGS, 1, do_help,
+ "? - alias for 'help'\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(VERS) = MK_CMD_ENTRY(
+ "version", 1, 1, do_version,
+ "version - print monitor version\n",
+ NULL
+);
+
+cmd_tbl_t U_BOOT_CMD(ECHO) = MK_CMD_ENTRY(
+ "echo", CFG_MAXARGS, 1, do_echo,
+ "echo - echo args to console\n",
+ "[args..]\n"
+ " - echo args to console; \\c suppresses newline\n"
+);
+
/***************************************************************************
* find command table entry for a command
*/
-cmd_tbl_t *find_cmd(const char *cmd)
+cmd_tbl_t *find_cmd (const char *cmd)
{
cmd_tbl_t *cmdtp;
- /* Search command table - Use linear search - it's a small table */
- for (cmdtp = &cmd_tbl[0]; cmdtp->name; cmdtp++) {
- if (strncmp (cmd, cmdtp->name, cmdtp->lmin) == 0)
+ cmd_tbl_t *cmdtp_temp = &__u_boot_cmd_start; /*Init value */
+ int one_cmd_name = 0;
+
+ for (cmdtp = &__u_boot_cmd_start; cmdtp != &__u_boot_cmd_end; cmdtp++) {
+ if ((strncmp (cmd, cmdtp->name, strlen (cmd)) == 0) &&
+ (strlen (cmd) == strlen (cmdtp->name)))
return cmdtp;
+ else if (strncmp (cmd, cmdtp->name, strlen (cmd)) == 0) {
+ cmdtp_temp = cmdtp;
+ one_cmd_name++;
+ } else;
}
- return NULL; /* not found */
+ if (one_cmd_name == 1)
+ return cmdtp_temp;
+
+ return NULL; /* not found || one_cmd_name >2 */
}
-
-/*
- * The commands in this table are sorted alphabetically by the
- * command name and in descending order by the command name string
- * length. This is to prevent conflicts in command name parsing.
- * Please ensure that new commands are added according to that rule.
- * Please use $(TOPDIR)/doc/README.commands as a reference AND make
- * sure it gets updated.
- */
-
-cmd_tbl_t cmd_tbl[] = {
- CMD_TBL_ASKENV
- CMD_TBL_ASM
- CMD_TBL_AUTOSCRIPT
- CMD_TBL_BASE
- CMD_TBL_BDINFO
- CMD_TBL_BMP
-#ifdef CONFIG_AMIGAONEG3SE
- CMD_TBL_BOOTA
-#endif
- CMD_TBL_BOOTELF
- CMD_TBL_BOOTM
- CMD_TBL_BOOTP
- CMD_TBL_BOOTVX
- CMD_TBL_BOOTD
- CMD_TBL_BREAK
- CMD_TBL_BRGINFO
- CMD_TBL_CARINFO
- CMD_TBL_JFFS2_CHPART
- CMD_TBL_CMP
- CMD_TBL_CONINFO
- CMD_TBL_CONTINUE
- CMD_TBL_CP
- CMD_TBL_CRC
- CMD_TBL_DATE
- CMD_TBL_DCACHE
- CMD_TBL_DHCP
- CMD_TBL_DIAG
- CMD_TBL_DISK
- CMD_TBL_DMAINFO
- CMD_TBL_DIS
- CMD_TBL_DOCBOOT
- CMD_TBL_DOC
- CMD_TBL_DTT
- CMD_TBL_ECHO
- CMD_TBL_EEPROM
- CMD_TBL_FAT
- CMD_TBL_FCCINFO
- CMD_TBL_FLERASE
- CMD_TBL_FDC
- CMD_TBL_FDOS_BOOT
- CMD_TBL_FDOS_LS
- CMD_TBL_FLINFO
- CMD_TBL_FPGA
- CMD_TBL_JFFS2_FSINFO
- CMD_TBL_JFFS2_FSLOAD
- CMD_TBL_GETDCR
- CMD_TBL_GO
- CMD_TBL_HELP
- CMD_TBL_HWFLOW
- CMD_TBL_I2CINFO
- CMD_TBL_ICACHE
-#ifdef CONFIG_8260
- CMD_TBL_ICINFO
-#endif
- CMD_TBL_IMD
- CMD_TBL_IMM
- CMD_TBL_INM
- CMD_TBL_IMW
- CMD_TBL_PORTIO_IN
- CMD_TBL_ICRC
- CMD_TBL_IPROBE
- CMD_TBL_ILOOP
- CMD_TBL_ISDRAM
- CMD_TBL_IDE
- CMD_TBL_IMINFO
- CMD_TBL_IOPINFO
- CMD_TBL_IOPSET
- CMD_TBL_IRQINFO
- CMD_TBL_KGDB
- CMD_TBL_LOADB
- CMD_TBL_LOADS
- CMD_TBL_LOG
- CMD_TBL_LOOP
- CMD_TBL_JFFS2_LS
- CMD_TBL_MCCINFO
- CMD_TBL_MMC
- CMD_TBL_MD
- CMD_TBL_MEMCINFO
-#ifdef CONFIG_AMIGAONEG3SE
- CMD_TBL_MENU
-#endif
- CMD_TBL_MII
- CMD_TBL_MM
- CMD_TBL_MTEST
- CMD_TBL_MUXINFO
- CMD_TBL_MW
- CMD_TBL_NAND
- CMD_TBL_NANDBOOT
- CMD_TBL_NEXT
- CMD_TBL_NM
- CMD_TBL_PING
- CMD_TBL_PORTIO_OUT
- CMD_TBL_PCI
- CMD_TBL_PRINTENV
- CMD_TBL_PROTECT
- CMD_TBL_RARPB
- CMD_TBL_RDUMP
- CMD_TBL_PINIT
- CMD_TBL_REGINFO
- CMD_TBL_RESET
- CMD_TBL_RUN
- CMD_TBL_SAVEENV
- CMD_TBL_SAVES
- CMD_TBL_SCCINFO
- CMD_TBL_SCSIBOOT
- CMD_TBL_SCSI
- CMD_TBL_SETDCR
- CMD_TBL_SETENV
- CMD_TBL_SIINFO
- CMD_TBL_SITINFO
- CMD_TBL_SIUINFO
- CMD_TBL_MISC /* sleep */
- CMD_TBL_SMCINFO
- CMD_TBL_SPIINFO
- CMD_TBL_SPI
- CMD_TBL_STACK
- CMD_TBL_STEP
- CMD_TBL_TFTPB
- CMD_TBL_USBBOOT
- CMD_TBL_USB
- CMD_TBL_VERS
- CMD_TBL_BSP
- CMD_TBL_VFD
- CMD_TBL_QUES /* keep this ("help") the last entry */
- /* the following entry terminates this table */
- MK_CMD_TBL_ENTRY( NULL, 0, 0, 0, NULL, NULL, NULL )
-};
diff --git a/common/dlmalloc.c b/common/dlmalloc.c
index 9261507..0c04872 100644
--- a/common/dlmalloc.c
+++ b/common/dlmalloc.c
@@ -9,8 +9,8 @@
* VERSION 2.6.6 Sun Mar 5 19:10:03 2000 Doug Lea (dl at gee)
Note: There may be an updated version of this malloc obtainable at
- ftp://g.oswego.edu/pub/misc/malloc.c
- Check before installing!
+ ftp://g.oswego.edu/pub/misc/malloc.c
+ Check before installing!
* Why use this malloc?
@@ -87,7 +87,7 @@
and status information.
Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead)
- 8-byte ptrs: 24/32 bytes (including, 4/8 overhead)
+ 8-byte ptrs: 24/32 bytes (including, 4/8 overhead)
When a chunk is freed, 12 (for 4byte ptrs) or 20 (for 8 byte
ptrs but 4 byte size) or 24 (for 8/8) additional bytes are
@@ -99,7 +99,7 @@
pointer to something of the minimum allocatable size.
Maximum allocated size: 4-byte size_t: 2^31 - 8 bytes
- 8-byte size_t: 2^63 - 16 bytes
+ 8-byte size_t: 2^63 - 16 bytes
It is assumed that (possibly signed) size_t bit values suffice to
represent chunk sizes. `Possibly signed' is due to the fact
@@ -115,11 +115,11 @@
make the normal worst-case wastage 15 bytes (i.e., up to 15
more bytes will be allocated than were requested in malloc), with
two exceptions:
- 1. Because requests for zero bytes allocate non-zero space,
- the worst case wastage for a request of zero bytes is 24 bytes.
- 2. For requests >= mmap_threshold that are serviced via
- mmap(), the worst case wastage is 8 bytes plus the remainder
- from a system page (the minimal mmap unit); typically 4096 bytes.
+ 1. Because requests for zero bytes allocate non-zero space,
+ the worst case wastage for a request of zero bytes is 24 bytes.
+ 2. For requests >= mmap_threshold that are serviced via
+ mmap(), the worst case wastage is 8 bytes plus the remainder
+ from a system page (the minimal mmap unit); typically 4096 bytes.
* Limitations
@@ -372,8 +372,8 @@
void* memcpy(void*, const void*, size_t);
#else
#ifdef WIN32
-// On Win32 platforms, 'memset()' and 'memcpy()' are already declared in
-// 'windows.h'
+/* On Win32 platforms, 'memset()' and 'memcpy()' are already declared in */
+/* 'windows.h' */
#else
Void_t* memset();
Void_t* memcpy();
@@ -393,14 +393,14 @@
if(mzsz <= 9*sizeof(mzsz)) { \
INTERNAL_SIZE_T* mz = (INTERNAL_SIZE_T*) (charp); \
if(mzsz >= 5*sizeof(mzsz)) { *mz++ = 0; \
- *mz++ = 0; \
+ *mz++ = 0; \
if(mzsz >= 7*sizeof(mzsz)) { *mz++ = 0; \
- *mz++ = 0; \
- if(mzsz >= 9*sizeof(mzsz)) { *mz++ = 0; \
- *mz++ = 0; }}} \
- *mz++ = 0; \
- *mz++ = 0; \
- *mz = 0; \
+ *mz++ = 0; \
+ if(mzsz >= 9*sizeof(mzsz)) { *mz++ = 0; \
+ *mz++ = 0; }}} \
+ *mz++ = 0; \
+ *mz++ = 0; \
+ *mz = 0; \
} else memset((charp), 0, mzsz); \
} while(0)
@@ -411,14 +411,14 @@
INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) (src); \
INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) (dest); \
if(mcsz >= 5*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
- *mcdst++ = *mcsrc++; \
+ *mcdst++ = *mcsrc++; \
if(mcsz >= 7*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
- *mcdst++ = *mcsrc++; \
- if(mcsz >= 9*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
- *mcdst++ = *mcsrc++; }}} \
- *mcdst++ = *mcsrc++; \
- *mcdst++ = *mcsrc++; \
- *mcdst = *mcsrc ; \
+ *mcdst++ = *mcsrc++; \
+ if(mcsz >= 9*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
+ *mcdst++ = *mcsrc++; }}} \
+ *mcdst++ = *mcsrc++; \
+ *mcdst++ = *mcsrc++; \
+ *mcdst = *mcsrc ; \
} else memcpy(dest, src, mcsz); \
} while(0)
@@ -558,7 +558,6 @@
#endif
-
/*
This version of malloc supports the standard SVID/XPG mallinfo
@@ -622,7 +621,6 @@
#define M_MMAP_MAX -4
-
#ifndef DEFAULT_TRIM_THRESHOLD
#define DEFAULT_TRIM_THRESHOLD (128 * 1024)
#endif
@@ -686,11 +684,11 @@
retain whenever sbrk is called. It is used in two ways internally:
* When sbrk is called to extend the top of the arena to satisfy
- a new malloc request, this much padding is added to the sbrk
- request.
+ a new malloc request, this much padding is added to the sbrk
+ request.
* When malloc_trim is called automatically from free(),
- it is used as the `pad' argument.
+ it is used as the `pad' argument.
In both cases, the actual amount of padding is rounded
so that the end of the arena is always a system page boundary.
@@ -736,15 +734,15 @@
However, it has the disadvantages that:
- 1. The space cannot be reclaimed, consolidated, and then
- used to service later requests, as happens with normal chunks.
- 2. It can lead to more wastage because of mmap page alignment
- requirements
- 3. It causes malloc performance to be more dependent on host
- system memory management support routines which may vary in
- implementation quality and may impose arbitrary
- limitations. Generally, servicing a request via normal
- malloc steps is faster than going through a system's mmap.
+ 1. The space cannot be reclaimed, consolidated, and then
+ used to service later requests, as happens with normal chunks.
+ 2. It can lead to more wastage because of mmap page alignment
+ requirements
+ 3. It causes malloc performance to be more dependent on host
+ system memory management support routines which may vary in
+ implementation quality and may impose arbitrary
+ limitations. Generally, servicing a request via normal
+ malloc steps is faster than going through a system's mmap.
All together, these considerations should lead you to use mmap
only for relatively large requests.
@@ -753,7 +751,6 @@
*/
-
#ifndef DEFAULT_MMAP_MAX
#if HAVE_MMAP
#define DEFAULT_MMAP_MAX (64)
@@ -766,15 +763,15 @@
M_MMAP_MAX is the maximum number of requests to simultaneously
service using mmap. This parameter exists because:
- 1. Some systems have a limited number of internal tables for
- use by mmap.
- 2. In most systems, overreliance on mmap can degrade overall
- performance.
- 3. If a program allocates many large regions, it is probably
- better off using normal sbrk-based allocation routines that
- can reclaim and reallocate normal heap memory. Using a
- small value allows transition into this mode after the
- first few allocations.
+ 1. Some systems have a limited number of internal tables for
+ use by mmap.
+ 2. In most systems, overreliance on mmap can degrade overall
+ performance.
+ 3. If a program allocates many large regions, it is probably
+ better off using normal sbrk-based allocation routines that
+ can reclaim and reallocate normal heap memory. Using a
+ small value allows transition into this mode after the
+ first few allocations.
Setting to 0 disables all use of mmap. If HAVE_MMAP is not set,
the default value is 0, and attempts to set it to non-zero values
@@ -782,8 +779,6 @@
*/
-
-
/*
USE_DL_PREFIX will prefix all public routines with the string 'dl'.
Useful to quickly avoid procedure declaration conflicts and linker
@@ -794,8 +789,6 @@
/* #define USE_DL_PREFIX */
-
-
/*
Special defines for linux libc
@@ -1013,7 +1006,7 @@
rval = VirtualFree ((void*)gAddressBase,
gNextAddress - gAddressBase,
MEM_DECOMMIT);
- assert (rval);
+ assert (rval);
}
while (head)
{
@@ -1038,24 +1031,24 @@
return start_address;
else
{
- // Requested region is not available so see if the
- // next region is available. Set 'start_address'
- // to the next region and call 'VirtualQuery()'
- // again.
+ /* Requested region is not available so see if the */
+ /* next region is available. Set 'start_address' */
+ /* to the next region and call 'VirtualQuery()' */
+ /* again. */
start_address = (char*)info.BaseAddress + info.RegionSize;
- // Make sure we start looking for the next region
- // on the *next* 64K boundary. Otherwise, even if
- // the new region is free according to
- // 'VirtualQuery()', the subsequent call to
- // 'VirtualAlloc()' (which follows the call to
- // this routine in 'wsbrk()') will round *down*
- // the requested address to a 64K boundary which
- // we already know is an address in the
- // unavailable region. Thus, the subsequent call
- // to 'VirtualAlloc()' will fail and bring us back
- // here, causing us to go into an infinite loop.
+ /* Make sure we start looking for the next region */
+ /* on the *next* 64K boundary. Otherwise, even if */
+ /* the new region is free according to */
+ /* 'VirtualQuery()', the subsequent call to */
+ /* 'VirtualAlloc()' (which follows the call to */
+ /* this routine in 'wsbrk()') will round *down* */
+ /* the requested address to a 64K boundary which */
+ /* we already know is an address in the */
+ /* unavailable region. Thus, the subsequent call */
+ /* to 'VirtualAlloc()' will fail and bring us back */
+ /* here, causing us to go into an infinite loop. */
start_address =
(void *) AlignPage64K((unsigned long) start_address);
@@ -1092,9 +1085,9 @@
gAddressBase = gNextAddress =
(unsigned int)VirtualAlloc (new_address, new_size,
MEM_RESERVE, PAGE_NOACCESS);
- // repeat in case of race condition
- // The region that we found has been snagged
- // by another thread
+ /* repeat in case of race condition */
+ /* The region that we found has been snagged */
+ /* by another thread */
}
while (gAddressBase == 0);
@@ -1182,17 +1175,17 @@
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of previous chunk, if allocated | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of chunk, in bytes |P|
+ | Size of previous chunk, if allocated | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of chunk, in bytes |P|
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | User data starts here... .
- . .
- . (malloc_usable_space() bytes) .
- . |
+ | User data starts here... .
+ . .
+ . (malloc_usable_space() bytes) .
+ . |
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of chunk |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of chunk |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Where "chunk" is the front of the chunk for the purpose of most of
@@ -1206,20 +1199,20 @@
Free chunks are stored in circular doubly-linked lists, and look like this:
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of previous chunk |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of previous chunk |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
`head:' | Size of chunk, in bytes |P|
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Forward pointer to next chunk in list |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Back pointer to previous chunk in list |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Unused space (may be 0 bytes long) .
- . .
- . |
+ | Forward pointer to next chunk in list |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Back pointer to previous chunk in list |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Unused space (may be 0 bytes long) .
+ . .
+ . |
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
`foot:' | Size of chunk, in bytes |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The P (PREV_INUSE) bit, stored in the unused low-order bit of the
chunk size (which is always a multiple of two words), is an in-use
@@ -1236,16 +1229,16 @@
The two exceptions to all this are
1. The special chunk `top', which doesn't bother using the
- trailing size field since there is no
- next contiguous chunk that would have to index off it. (After
- initialization, `top' is forced to always exist. If it would
- become less than MINSIZE bytes long, it is replenished via
- malloc_extend_top.)
+ trailing size field since there is no
+ next contiguous chunk that would have to index off it. (After
+ initialization, `top' is forced to always exist. If it would
+ become less than MINSIZE bytes long, it is replenished via
+ malloc_extend_top.)
2. Chunks allocated via mmap, which have the second-lowest-order
- bit (IS_MMAPPED) set in their size fields. Because they are
- never merged or traversed from any other chunk, they have no
- foot size or inuse information.
+ bit (IS_MMAPPED) set in their size fields. Because they are
+ never merged or traversed from any other chunk, they have no
+ foot size or inuse information.
Available chunks are kept in any of several places (all declared below):
@@ -1286,12 +1279,7 @@
serviced via calls to mmap, and then later released via munmap.
*/
-
-
-
-
-
/* sizes, alignments */
#define SIZE_SZ (sizeof(INTERNAL_SIZE_T))
@@ -1531,7 +1519,7 @@
((((unsigned long)(sz)) >> 9) <= 84) ? 110 + (((unsigned long)(sz)) >> 12): \
((((unsigned long)(sz)) >> 9) <= 340) ? 119 + (((unsigned long)(sz)) >> 15): \
((((unsigned long)(sz)) >> 9) <= 1364) ? 124 + (((unsigned long)(sz)) >> 18): \
- 126)
+ 126)
/*
bins for chunks < 512 are all spaced 8 bytes apart, and hold
identically sized chunks. This is exploited in malloc.
@@ -1829,7 +1817,6 @@
(last_remainder->fd = last_remainder->bk = last_remainder)
-
@@ -2030,7 +2017,7 @@
/* Guarantee the next brk will be at a page boundary */
correction += ((((unsigned long)(brk + sbrk_size))+(pagesz-1)) &
- ~(pagesz - 1)) - ((unsigned long)(brk + sbrk_size));
+ ~(pagesz - 1)) - ((unsigned long)(brk + sbrk_size));
/* Allocate correction */
new_brk = (char*)(MORECORE (correction));
@@ -2051,20 +2038,20 @@
/* If not enough space to do this, then user did something very wrong */
if (old_top_size < MINSIZE)
{
- set_head(top, PREV_INUSE); /* will force null return from malloc */
- return;
+ set_head(top, PREV_INUSE); /* will force null return from malloc */
+ return;
}
/* Also keep size a multiple of MALLOC_ALIGNMENT */
old_top_size = (old_top_size - 3*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
set_head_size(old_top, old_top_size);
chunk_at_offset(old_top, old_top_size )->size =
- SIZE_SZ|PREV_INUSE;
+ SIZE_SZ|PREV_INUSE;
chunk_at_offset(old_top, old_top_size + SIZE_SZ)->size =
- SIZE_SZ|PREV_INUSE;
+ SIZE_SZ|PREV_INUSE;
/* If possible, release the rest. */
if (old_top_size >= MINSIZE)
- fREe(chunk2mem(old_top));
+ fREe(chunk2mem(old_top));
}
}
@@ -2095,43 +2082,43 @@
From there, the first successful of the following steps is taken:
1. The bin corresponding to the request size is scanned, and if
- a chunk of exactly the right size is found, it is taken.
+ a chunk of exactly the right size is found, it is taken.
2. The most recently remaindered chunk is used if it is big
- enough. This is a form of (roving) first fit, used only in
- the absence of exact fits. Runs of consecutive requests use
- the remainder of the chunk used for the previous such request
- whenever possible. This limited use of a first-fit style
- allocation strategy tends to give contiguous chunks
- coextensive lifetimes, which improves locality and can reduce
- fragmentation in the long run.
+ enough. This is a form of (roving) first fit, used only in
+ the absence of exact fits. Runs of consecutive requests use
+ the remainder of the chunk used for the previous such request
+ whenever possible. This limited use of a first-fit style
+ allocation strategy tends to give contiguous chunks
+ coextensive lifetimes, which improves locality and can reduce
+ fragmentation in the long run.
3. Other bins are scanned in increasing size order, using a
- chunk big enough to fulfill the request, and splitting off
- any remainder. This search is strictly by best-fit; i.e.,
- the smallest (with ties going to approximately the least
- recently used) chunk that fits is selected.
+ chunk big enough to fulfill the request, and splitting off
+ any remainder. This search is strictly by best-fit; i.e.,
+ the smallest (with ties going to approximately the least
+ recently used) chunk that fits is selected.
4. If large enough, the chunk bordering the end of memory
- (`top') is split off. (This use of `top' is in accord with
- the best-fit search rule. In effect, `top' is treated as
- larger (and thus less well fitting) than any other available
- chunk since it can be extended to be as large as necessary
- (up to system limitations).
+ (`top') is split off. (This use of `top' is in accord with
+ the best-fit search rule. In effect, `top' is treated as
+ larger (and thus less well fitting) than any other available
+ chunk since it can be extended to be as large as necessary
+ (up to system limitations).
5. If the request size meets the mmap threshold and the
- system supports mmap, and there are few enough currently
- allocated mmapped regions, and a call to mmap succeeds,
- the request is allocated via direct memory mapping.
+ system supports mmap, and there are few enough currently
+ allocated mmapped regions, and a call to mmap succeeds,
+ the request is allocated via direct memory mapping.
6. Otherwise, the top of memory is extended by
- obtaining more space from the system (normally using sbrk,
- but definable to anything else via the MORECORE macro).
- Memory is gathered from the system (in system page-sized
- units) in a way that allows chunks obtained across different
- sbrk calls to be consolidated, but does not require
- contiguous memory. Thus, it should be safe to intersperse
- mallocs with other sbrk calls.
+ obtaining more space from the system (normally using sbrk,
+ but definable to anything else via the MORECORE macro).
+ Memory is gathered from the system (in system page-sized
+ units) in a way that allows chunks obtained across different
+ sbrk calls to be consolidated, but does not require
+ contiguous memory. Thus, it should be safe to intersperse
+ mallocs with other sbrk calls.
All allocations are made from the the `lowest' part of any found
@@ -2208,16 +2195,16 @@
if (remainder_size >= (long)MINSIZE) /* too big */
{
- --idx; /* adjust to rescan below after checking last remainder */
- break;
+ --idx; /* adjust to rescan below after checking last remainder */
+ break;
}
else if (remainder_size >= 0) /* exact fit */
{
- unlink(victim, bck, fwd);
- set_inuse_bit_at_offset(victim, victim_size);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
+ unlink(victim, bck, fwd);
+ set_inuse_bit_at_offset(victim, victim_size);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
}
}
@@ -2274,8 +2261,8 @@
block <<= 1;
while ((block & binblocks) == 0)
{
- idx += BINBLOCKWIDTH;
- block <<= 1;
+ idx += BINBLOCKWIDTH;
+ block <<= 1;
}
}
@@ -2288,34 +2275,34 @@
/* For each bin in this block ... */
do
{
- /* Find and use first big enough chunk ... */
+ /* Find and use first big enough chunk ... */
- for (victim = last(bin); victim != bin; victim = victim->bk)
- {
- victim_size = chunksize(victim);
- remainder_size = victim_size - nb;
+ for (victim = last(bin); victim != bin; victim = victim->bk)
+ {
+ victim_size = chunksize(victim);
+ remainder_size = victim_size - nb;
- if (remainder_size >= (long)MINSIZE) /* split */
- {
- remainder = chunk_at_offset(victim, nb);
- set_head(victim, nb | PREV_INUSE);
- unlink(victim, bck, fwd);
- link_last_remainder(remainder);
- set_head(remainder, remainder_size | PREV_INUSE);
- set_foot(remainder, remainder_size);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
+ if (remainder_size >= (long)MINSIZE) /* split */
+ {
+ remainder = chunk_at_offset(victim, nb);
+ set_head(victim, nb | PREV_INUSE);
+ unlink(victim, bck, fwd);
+ link_last_remainder(remainder);
+ set_head(remainder, remainder_size | PREV_INUSE);
+ set_foot(remainder, remainder_size);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
- else if (remainder_size >= 0) /* take */
- {
- set_inuse_bit_at_offset(victim, victim_size);
- unlink(victim, bck, fwd);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
+ else if (remainder_size >= 0) /* take */
+ {
+ set_inuse_bit_at_offset(victim, victim_size);
+ unlink(victim, bck, fwd);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
- }
+ }
bin = next_bin(bin);
@@ -2325,12 +2312,12 @@
do /* Possibly backtrack to try to clear a partial block */
{
- if ((startidx & (BINBLOCKWIDTH - 1)) == 0)
- {
- binblocks &= ~block;
- break;
- }
- --startidx;
+ if ((startidx & (BINBLOCKWIDTH - 1)) == 0)
+ {
+ binblocks &= ~block;
+ break;
+ }
+ --startidx;
q = prev_bin(q);
} while (first(q) == q);
@@ -2338,14 +2325,14 @@
if ( (block <<= 1) <= binblocks && (block != 0) )
{
- while ((block & binblocks) == 0)
- {
- idx += BINBLOCKWIDTH;
- block <<= 1;
- }
+ while ((block & binblocks) == 0)
+ {
+ idx += BINBLOCKWIDTH;
+ block <<= 1;
+ }
}
else
- break;
+ break;
}
}
@@ -2359,7 +2346,7 @@
#if HAVE_MMAP
/* If big and would otherwise need to extend, try to use mmap instead */
if ((unsigned long)nb >= (unsigned long)mmap_threshold &&
- (victim = mmap_chunk(nb)) != 0)
+ (victim = mmap_chunk(nb)) != 0)
return chunk2mem(victim);
#endif
@@ -2392,13 +2379,13 @@
2. If the chunk was allocated via mmap, it is release via munmap().
3. If a returned chunk borders the current high end of memory,
- it is consolidated into the top, and if the total unused
- topmost memory exceeds the trim threshold, malloc_trim is
- called.
+ it is consolidated into the top, and if the total unused
+ topmost memory exceeds the trim threshold, malloc_trim is
+ called.
4. Other chunks are consolidated as they arrive, and
- placed in corresponding bins. (This includes the case of
- consolidating with the current `last_remainder').
+ placed in corresponding bins. (This includes the case of
+ consolidating with the current `last_remainder').
*/
@@ -2610,22 +2597,22 @@
/* Forward into top only if a remainder */
if (next == top)
{
- if ((long)(nextsize + newsize) >= (long)(nb + MINSIZE))
- {
- newsize += nextsize;
- top = chunk_at_offset(oldp, nb);
- set_head(top, (newsize - nb) | PREV_INUSE);
- set_head_size(oldp, nb);
- return chunk2mem(oldp);
- }
+ if ((long)(nextsize + newsize) >= (long)(nb + MINSIZE))
+ {
+ newsize += nextsize;
+ top = chunk_at_offset(oldp, nb);
+ set_head(top, (newsize - nb) | PREV_INUSE);
+ set_head_size(oldp, nb);
+ return chunk2mem(oldp);
+ }
}
/* Forward into next chunk */
else if (((long)(nextsize + newsize) >= (long)(nb)))
{
- unlink(next, bck, fwd);
- newsize += nextsize;
- goto split;
+ unlink(next, bck, fwd);
+ newsize += nextsize;
+ goto split;
}
}
else
@@ -2645,45 +2632,45 @@
if (next != 0)
{
- /* into top */
- if (next == top)
- {
- if ((long)(nextsize + prevsize + newsize) >= (long)(nb + MINSIZE))
- {
- unlink(prev, bck, fwd);
- newp = prev;
- newsize += prevsize + nextsize;
- newmem = chunk2mem(newp);
- MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
- top = chunk_at_offset(newp, nb);
- set_head(top, (newsize - nb) | PREV_INUSE);
- set_head_size(newp, nb);
- return newmem;
- }
- }
+ /* into top */
+ if (next == top)
+ {
+ if ((long)(nextsize + prevsize + newsize) >= (long)(nb + MINSIZE))
+ {
+ unlink(prev, bck, fwd);
+ newp = prev;
+ newsize += prevsize + nextsize;
+ newmem = chunk2mem(newp);
+ MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
+ top = chunk_at_offset(newp, nb);
+ set_head(top, (newsize - nb) | PREV_INUSE);
+ set_head_size(newp, nb);
+ return newmem;
+ }
+ }
- /* into next chunk */
- else if (((long)(nextsize + prevsize + newsize) >= (long)(nb)))
- {
- unlink(next, bck, fwd);
- unlink(prev, bck, fwd);
- newp = prev;
- newsize += nextsize + prevsize;
- newmem = chunk2mem(newp);
- MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
- goto split;
- }
+ /* into next chunk */
+ else if (((long)(nextsize + prevsize + newsize) >= (long)(nb)))
+ {
+ unlink(next, bck, fwd);
+ unlink(prev, bck, fwd);
+ newp = prev;
+ newsize += nextsize + prevsize;
+ newmem = chunk2mem(newp);
+ MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
+ goto split;
+ }
}
/* backward only */
if (prev != 0 && (long)(prevsize + newsize) >= (long)nb)
{
- unlink(prev, bck, fwd);
- newp = prev;
- newsize += prevsize;
- newmem = chunk2mem(newp);
- MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
- goto split;
+ unlink(prev, bck, fwd);
+ newp = prev;
+ newsize += prevsize;
+ newmem = chunk2mem(newp);
+ MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
+ goto split;
}
}
@@ -3015,25 +3002,25 @@
if (new_brk == (char*)(MORECORE_FAILURE)) /* sbrk failed? */
{
- /* Try to figure out what we have */
- current_brk = (char*)(MORECORE (0));
- top_size = current_brk - (char*)top;
- if (top_size >= (long)MINSIZE) /* if not, we are very very dead! */
- {
- sbrked_mem = current_brk - sbrk_base;
- set_head(top, top_size | PREV_INUSE);
- }
- check_chunk(top);
- return 0;
+ /* Try to figure out what we have */
+ current_brk = (char*)(MORECORE (0));
+ top_size = current_brk - (char*)top;
+ if (top_size >= (long)MINSIZE) /* if not, we are very very dead! */
+ {
+ sbrked_mem = current_brk - sbrk_base;
+ set_head(top, top_size | PREV_INUSE);
+ }
+ check_chunk(top);
+ return 0;
}
else
{
- /* Success. Adjust top accordingly. */
- set_head(top, (top_size - extra) | PREV_INUSE);
- sbrked_mem -= extra;
- check_chunk(top);
- return 1;
+ /* Success. Adjust top accordingly. */
+ set_head(top, (top_size - extra) | PREV_INUSE);
+ sbrked_mem -= extra;
+ check_chunk(top);
+ return 1;
}
}
}
@@ -3100,9 +3087,9 @@
#ifdef DEBUG
check_free_chunk(p);
for (q = next_chunk(p);
- q < top && inuse(q) && (long)(chunksize(q)) >= (long)MINSIZE;
- q = next_chunk(q))
- check_inuse_chunk(q);
+ q < top && inuse(q) && (long)(chunksize(q)) >= (long)MINSIZE;
+ q = next_chunk(q))
+ check_inuse_chunk(q);
#endif
avail += chunksize(p);
navail++;
@@ -3141,14 +3128,14 @@
{
malloc_update_mallinfo();
printf("max system bytes = %10u\n",
- (unsigned int)(max_total_mem));
+ (unsigned int)(max_total_mem));
printf("system bytes = %10u\n",
- (unsigned int)(sbrked_mem + mmapped_mem));
+ (unsigned int)(sbrked_mem + mmapped_mem));
printf("in use bytes = %10u\n",
- (unsigned int)(current_mallinfo.uordblks + mmapped_mem));
+ (unsigned int)(current_mallinfo.uordblks + mmapped_mem));
#if HAVE_MMAP
printf("max mmap regions = %10u\n",
- (unsigned int)max_n_mmaps);
+ (unsigned int)max_n_mmaps);
#endif
}
#endif /* 0 */
@@ -3214,17 +3201,17 @@
V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee)
* return null for negative arguments
* Added Several WIN32 cleanups from Martin C. Fong <mcfong@yahoo.com>
- * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
- (e.g. WIN32 platforms)
- * Cleanup up header file inclusion for WIN32 platforms
- * Cleanup code to avoid Microsoft Visual C++ compiler complaints
- * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
- memory allocation routines
- * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
- * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
+ * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
+ (e.g. WIN32 platforms)
+ * Cleanup up header file inclusion for WIN32 platforms
+ * Cleanup code to avoid Microsoft Visual C++ compiler complaints
+ * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
+ memory allocation routines
+ * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
+ * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
usage of 'assert' in non-WIN32 code
- * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
- avoid infinite loop
+ * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
+ avoid infinite loop
* Always call 'fREe()' rather than 'free()'
V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee)
@@ -3236,13 +3223,13 @@
* Added anonymously donated WIN32 sbrk emulation
* Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
* malloc_extend_top: fix mask error that caused wastage after
- foreign sbrks
+ foreign sbrks
* Add linux mremap support code from HJ Liu
V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee)
* Integrated most documentation with the code.
* Add support for mmap, with help from
- Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+ Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
* Use last_remainder in more cases.
* Pack bins using idea from colin@nyx10.cs.du.edu
* Use ordered bins instead of best-fit threshhold
@@ -3250,34 +3237,34 @@
* Support another case of realloc via move into top
* Fix error occuring when initial sbrk_base not word-aligned.
* Rely on page size for units instead of SBRK_UNIT to
- avoid surprises about sbrk alignment conventions.
+ avoid surprises about sbrk alignment conventions.
* Add mallinfo, mallopt. Thanks to Raymond Nijssen
- (raymond@es.ele.tue.nl) for the suggestion.
+ (raymond@es.ele.tue.nl) for the suggestion.
* Add `pad' argument to malloc_trim and top_pad mallopt parameter.
* More precautions for cases where other routines call sbrk,
- courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+ courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
* Added macros etc., allowing use in linux libc from
- H.J. Lu (hjl@gnu.ai.mit.edu)
+ H.J. Lu (hjl@gnu.ai.mit.edu)
* Inverted this history list
V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee)
* Re-tuned and fixed to behave more nicely with V2.6.0 changes.
* Removed all preallocation code since under current scheme
- the work required to undo bad preallocations exceeds
- the work saved in good cases for most test programs.
+ the work required to undo bad preallocations exceeds
+ the work saved in good cases for most test programs.
* No longer use return list or unconsolidated bins since
- no scheme using them consistently outperforms those that don't
- given above changes.
+ no scheme using them consistently outperforms those that don't
+ given above changes.
* Use best fit for very large chunks to prevent some worst-cases.
* Added some support for debugging
V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee)
* Removed footers when chunks are in use. Thanks to
- Paul Wilson (wilson@cs.texas.edu) for the suggestion.
+ Paul Wilson (wilson@cs.texas.edu) for the suggestion.
V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee)
* Added malloc_trim, with help from Wolfram Gloger
- (wmglo@Dent.MED.Uni-Muenchen.DE).
+ (wmglo@Dent.MED.Uni-Muenchen.DE).
V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g)
@@ -3293,11 +3280,11 @@
V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g)
* faster bin computation & slightly different binning
* merged all consolidations to one part of malloc proper
- (eliminating old malloc_find_space & malloc_clean_bin)
+ (eliminating old malloc_find_space & malloc_clean_bin)
* Scan 2 returns chunks (not just 1)
* Propagate failure in realloc if malloc returns 0
* Add stuff to allow compilation on non-ANSI compilers
- from kpv@research.att.com
+ from kpv@research.att.com
V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu)
* removed potential for odd address access in prev_chunk
@@ -3305,13 +3292,11 @@
* misc cosmetics and a bit more internal documentation
* anticosmetics: mangled names in macros to evade debugger strangeness
* tested on sparc, hp-700, dec-mips, rs6000
- with gcc & native cc (hp, dec only) allowing
- Detlefs & Zorn comparison study (in SIGPLAN Notices.)
+ with gcc & native cc (hp, dec only) allowing
+ Detlefs & Zorn comparison study (in SIGPLAN Notices.)
Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu)
* Based loosely on libg++-1.2X malloc. (It retains some of the overall
- structure of old version, but most details differ.)
+ structure of old version, but most details differ.)
*/
-
-
diff --git a/common/dlmalloc.src b/common/dlmalloc.src
index 12b85bb..32a38bc 100644
--- a/common/dlmalloc.src
+++ b/common/dlmalloc.src
@@ -8,8 +8,8 @@
* VERSION 2.6.6 Sun Mar 5 19:10:03 2000 Doug Lea (dl at gee)
Note: There may be an updated version of this malloc obtainable at
- ftp://g.oswego.edu/pub/misc/malloc.c
- Check before installing!
+ ftp://g.oswego.edu/pub/misc/malloc.c
+ Check before installing!
* Why use this malloc?
@@ -86,7 +86,7 @@
and status information.
Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead)
- 8-byte ptrs: 24/32 bytes (including, 4/8 overhead)
+ 8-byte ptrs: 24/32 bytes (including, 4/8 overhead)
When a chunk is freed, 12 (for 4byte ptrs) or 20 (for 8 byte
ptrs but 4 byte size) or 24 (for 8/8) additional bytes are
@@ -98,7 +98,7 @@
pointer to something of the minimum allocatable size.
Maximum allocated size: 4-byte size_t: 2^31 - 8 bytes
- 8-byte size_t: 2^63 - 16 bytes
+ 8-byte size_t: 2^63 - 16 bytes
It is assumed that (possibly signed) size_t bit values suffice to
represent chunk sizes. `Possibly signed' is due to the fact
@@ -114,11 +114,11 @@
make the normal worst-case wastage 15 bytes (i.e., up to 15
more bytes will be allocated than were requested in malloc), with
two exceptions:
- 1. Because requests for zero bytes allocate non-zero space,
- the worst case wastage for a request of zero bytes is 24 bytes.
- 2. For requests >= mmap_threshold that are serviced via
- mmap(), the worst case wastage is 8 bytes plus the remainder
- from a system page (the minimal mmap unit); typically 4096 bytes.
+ 1. Because requests for zero bytes allocate non-zero space,
+ the worst case wastage for a request of zero bytes is 24 bytes.
+ 2. For requests >= mmap_threshold that are serviced via
+ mmap(), the worst case wastage is 8 bytes plus the remainder
+ from a system page (the minimal mmap unit); typically 4096 bytes.
* Limitations
@@ -371,8 +371,8 @@
void* memcpy(void*, const void*, size_t);
#else
#ifdef WIN32
-// On Win32 platforms, 'memset()' and 'memcpy()' are already declared in
-// 'windows.h'
+/* On Win32 platforms, 'memset()' and 'memcpy()' are already declared in */
+/* 'windows.h' */
#else
Void_t* memset();
Void_t* memcpy();
@@ -392,14 +392,14 @@
if(mzsz <= 9*sizeof(mzsz)) { \
INTERNAL_SIZE_T* mz = (INTERNAL_SIZE_T*) (charp); \
if(mzsz >= 5*sizeof(mzsz)) { *mz++ = 0; \
- *mz++ = 0; \
+ *mz++ = 0; \
if(mzsz >= 7*sizeof(mzsz)) { *mz++ = 0; \
- *mz++ = 0; \
- if(mzsz >= 9*sizeof(mzsz)) { *mz++ = 0; \
- *mz++ = 0; }}} \
- *mz++ = 0; \
- *mz++ = 0; \
- *mz = 0; \
+ *mz++ = 0; \
+ if(mzsz >= 9*sizeof(mzsz)) { *mz++ = 0; \
+ *mz++ = 0; }}} \
+ *mz++ = 0; \
+ *mz++ = 0; \
+ *mz = 0; \
} else memset((charp), 0, mzsz); \
} while(0)
@@ -410,14 +410,14 @@
INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) (src); \
INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) (dest); \
if(mcsz >= 5*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
- *mcdst++ = *mcsrc++; \
+ *mcdst++ = *mcsrc++; \
if(mcsz >= 7*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
- *mcdst++ = *mcsrc++; \
- if(mcsz >= 9*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
- *mcdst++ = *mcsrc++; }}} \
- *mcdst++ = *mcsrc++; \
- *mcdst++ = *mcsrc++; \
- *mcdst = *mcsrc ; \
+ *mcdst++ = *mcsrc++; \
+ if(mcsz >= 9*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \
+ *mcdst++ = *mcsrc++; }}} \
+ *mcdst++ = *mcsrc++; \
+ *mcdst++ = *mcsrc++; \
+ *mcdst = *mcsrc ; \
} else memcpy(dest, src, mcsz); \
} while(0)
@@ -557,7 +557,6 @@
#endif
-
/*
This version of malloc supports the standard SVID/XPG mallinfo
@@ -621,7 +620,6 @@
#define M_MMAP_MAX -4
-
#ifndef DEFAULT_TRIM_THRESHOLD
#define DEFAULT_TRIM_THRESHOLD (128 * 1024)
#endif
@@ -685,11 +683,11 @@
retain whenever sbrk is called. It is used in two ways internally:
* When sbrk is called to extend the top of the arena to satisfy
- a new malloc request, this much padding is added to the sbrk
- request.
+ a new malloc request, this much padding is added to the sbrk
+ request.
* When malloc_trim is called automatically from free(),
- it is used as the `pad' argument.
+ it is used as the `pad' argument.
In both cases, the actual amount of padding is rounded
so that the end of the arena is always a system page boundary.
@@ -735,15 +733,15 @@
However, it has the disadvantages that:
- 1. The space cannot be reclaimed, consolidated, and then
- used to service later requests, as happens with normal chunks.
- 2. It can lead to more wastage because of mmap page alignment
- requirements
- 3. It causes malloc performance to be more dependent on host
- system memory management support routines which may vary in
- implementation quality and may impose arbitrary
- limitations. Generally, servicing a request via normal
- malloc steps is faster than going through a system's mmap.
+ 1. The space cannot be reclaimed, consolidated, and then
+ used to service later requests, as happens with normal chunks.
+ 2. It can lead to more wastage because of mmap page alignment
+ requirements
+ 3. It causes malloc performance to be more dependent on host
+ system memory management support routines which may vary in
+ implementation quality and may impose arbitrary
+ limitations. Generally, servicing a request via normal
+ malloc steps is faster than going through a system's mmap.
All together, these considerations should lead you to use mmap
only for relatively large requests.
@@ -752,7 +750,6 @@
*/
-
#ifndef DEFAULT_MMAP_MAX
#if HAVE_MMAP
#define DEFAULT_MMAP_MAX (64)
@@ -765,15 +762,15 @@
M_MMAP_MAX is the maximum number of requests to simultaneously
service using mmap. This parameter exists because:
- 1. Some systems have a limited number of internal tables for
- use by mmap.
- 2. In most systems, overreliance on mmap can degrade overall
- performance.
- 3. If a program allocates many large regions, it is probably
- better off using normal sbrk-based allocation routines that
- can reclaim and reallocate normal heap memory. Using a
- small value allows transition into this mode after the
- first few allocations.
+ 1. Some systems have a limited number of internal tables for
+ use by mmap.
+ 2. In most systems, overreliance on mmap can degrade overall
+ performance.
+ 3. If a program allocates many large regions, it is probably
+ better off using normal sbrk-based allocation routines that
+ can reclaim and reallocate normal heap memory. Using a
+ small value allows transition into this mode after the
+ first few allocations.
Setting to 0 disables all use of mmap. If HAVE_MMAP is not set,
the default value is 0, and attempts to set it to non-zero values
@@ -781,8 +778,6 @@
*/
-
-
/*
USE_DL_PREFIX will prefix all public routines with the string 'dl'.
Useful to quickly avoid procedure declaration conflicts and linker
@@ -793,8 +788,6 @@
/* #define USE_DL_PREFIX */
-
-
/*
Special defines for linux libc
@@ -998,7 +991,7 @@
rval = VirtualFree ((void*)gAddressBase,
gNextAddress - gAddressBase,
MEM_DECOMMIT);
- assert (rval);
+ assert (rval);
}
while (head)
{
@@ -1023,24 +1016,24 @@
return start_address;
else
{
- // Requested region is not available so see if the
- // next region is available. Set 'start_address'
- // to the next region and call 'VirtualQuery()'
- // again.
+ /* Requested region is not available so see if the */
+ /* next region is available. Set 'start_address' */
+ /* to the next region and call 'VirtualQuery()' */
+ /* again. */
start_address = (char*)info.BaseAddress + info.RegionSize;
- // Make sure we start looking for the next region
- // on the *next* 64K boundary. Otherwise, even if
- // the new region is free according to
- // 'VirtualQuery()', the subsequent call to
- // 'VirtualAlloc()' (which follows the call to
- // this routine in 'wsbrk()') will round *down*
- // the requested address to a 64K boundary which
- // we already know is an address in the
- // unavailable region. Thus, the subsequent call
- // to 'VirtualAlloc()' will fail and bring us back
- // here, causing us to go into an infinite loop.
+ /* Make sure we start looking for the next region */
+ /* on the *next* 64K boundary. Otherwise, even if */
+ /* the new region is free according to */
+ /* 'VirtualQuery()', the subsequent call to */
+ /* 'VirtualAlloc()' (which follows the call to */
+ /* this routine in 'wsbrk()') will round *down* */
+ /* the requested address to a 64K boundary which */
+ /* we already know is an address in the */
+ /* unavailable region. Thus, the subsequent call */
+ /* to 'VirtualAlloc()' will fail and bring us back */
+ /* here, causing us to go into an infinite loop. */
start_address =
(void *) AlignPage64K((unsigned long) start_address);
@@ -1077,9 +1070,9 @@
gAddressBase = gNextAddress =
(unsigned int)VirtualAlloc (new_address, new_size,
MEM_RESERVE, PAGE_NOACCESS);
- // repeat in case of race condition
- // The region that we found has been snagged
- // by another thread
+ /* repeat in case of race condition */
+ /* The region that we found has been snagged */
+ /* by another thread */
}
while (gAddressBase == 0);
@@ -1167,17 +1160,17 @@
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of previous chunk, if allocated | |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of chunk, in bytes |P|
+ | Size of previous chunk, if allocated | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of chunk, in bytes |P|
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | User data starts here... .
- . .
- . (malloc_usable_space() bytes) .
- . |
+ | User data starts here... .
+ . .
+ . (malloc_usable_space() bytes) .
+ . |
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of chunk |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of chunk |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Where "chunk" is the front of the chunk for the purpose of most of
@@ -1191,20 +1184,20 @@
Free chunks are stored in circular doubly-linked lists, and look like this:
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Size of previous chunk |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Size of previous chunk |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
`head:' | Size of chunk, in bytes |P|
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Forward pointer to next chunk in list |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Back pointer to previous chunk in list |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- | Unused space (may be 0 bytes long) .
- . .
- . |
+ | Forward pointer to next chunk in list |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Back pointer to previous chunk in list |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Unused space (may be 0 bytes long) .
+ . .
+ . |
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
`foot:' | Size of chunk, in bytes |
- +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The P (PREV_INUSE) bit, stored in the unused low-order bit of the
chunk size (which is always a multiple of two words), is an in-use
@@ -1221,16 +1214,16 @@
The two exceptions to all this are
1. The special chunk `top', which doesn't bother using the
- trailing size field since there is no
- next contiguous chunk that would have to index off it. (After
- initialization, `top' is forced to always exist. If it would
- become less than MINSIZE bytes long, it is replenished via
- malloc_extend_top.)
+ trailing size field since there is no
+ next contiguous chunk that would have to index off it. (After
+ initialization, `top' is forced to always exist. If it would
+ become less than MINSIZE bytes long, it is replenished via
+ malloc_extend_top.)
2. Chunks allocated via mmap, which have the second-lowest-order
- bit (IS_MMAPPED) set in their size fields. Because they are
- never merged or traversed from any other chunk, they have no
- foot size or inuse information.
+ bit (IS_MMAPPED) set in their size fields. Because they are
+ never merged or traversed from any other chunk, they have no
+ foot size or inuse information.
Available chunks are kept in any of several places (all declared below):
@@ -1273,7 +1266,6 @@
*/
-
@@ -1506,7 +1498,7 @@
((((unsigned long)(sz)) >> 9) <= 84) ? 110 + (((unsigned long)(sz)) >> 12): \
((((unsigned long)(sz)) >> 9) <= 340) ? 119 + (((unsigned long)(sz)) >> 15): \
((((unsigned long)(sz)) >> 9) <= 1364) ? 124 + (((unsigned long)(sz)) >> 18): \
- 126)
+ 126)
/*
bins for chunks < 512 are all spaced 8 bytes apart, and hold
identically sized chunks. This is exploited in malloc.
@@ -1794,7 +1786,6 @@
(last_remainder->fd = last_remainder->bk = last_remainder)
-
@@ -1995,7 +1986,7 @@
/* Guarantee the next brk will be at a page boundary */
correction += ((((unsigned long)(brk + sbrk_size))+(pagesz-1)) &
- ~(pagesz - 1)) - ((unsigned long)(brk + sbrk_size));
+ ~(pagesz - 1)) - ((unsigned long)(brk + sbrk_size));
/* Allocate correction */
new_brk = (char*)(MORECORE (correction));
@@ -2016,20 +2007,20 @@
/* If not enough space to do this, then user did something very wrong */
if (old_top_size < MINSIZE)
{
- set_head(top, PREV_INUSE); /* will force null return from malloc */
- return;
+ set_head(top, PREV_INUSE); /* will force null return from malloc */
+ return;
}
/* Also keep size a multiple of MALLOC_ALIGNMENT */
old_top_size = (old_top_size - 3*SIZE_SZ) & ~MALLOC_ALIGN_MASK;
set_head_size(old_top, old_top_size);
chunk_at_offset(old_top, old_top_size )->size =
- SIZE_SZ|PREV_INUSE;
+ SIZE_SZ|PREV_INUSE;
chunk_at_offset(old_top, old_top_size + SIZE_SZ)->size =
- SIZE_SZ|PREV_INUSE;
+ SIZE_SZ|PREV_INUSE;
/* If possible, release the rest. */
if (old_top_size >= MINSIZE)
- fREe(chunk2mem(old_top));
+ fREe(chunk2mem(old_top));
}
}
@@ -2060,43 +2051,43 @@
From there, the first successful of the following steps is taken:
1. The bin corresponding to the request size is scanned, and if
- a chunk of exactly the right size is found, it is taken.
+ a chunk of exactly the right size is found, it is taken.
2. The most recently remaindered chunk is used if it is big
- enough. This is a form of (roving) first fit, used only in
- the absence of exact fits. Runs of consecutive requests use
- the remainder of the chunk used for the previous such request
- whenever possible. This limited use of a first-fit style
- allocation strategy tends to give contiguous chunks
- coextensive lifetimes, which improves locality and can reduce
- fragmentation in the long run.
+ enough. This is a form of (roving) first fit, used only in
+ the absence of exact fits. Runs of consecutive requests use
+ the remainder of the chunk used for the previous such request
+ whenever possible. This limited use of a first-fit style
+ allocation strategy tends to give contiguous chunks
+ coextensive lifetimes, which improves locality and can reduce
+ fragmentation in the long run.
3. Other bins are scanned in increasing size order, using a
- chunk big enough to fulfill the request, and splitting off
- any remainder. This search is strictly by best-fit; i.e.,
- the smallest (with ties going to approximately the least
- recently used) chunk that fits is selected.
+ chunk big enough to fulfill the request, and splitting off
+ any remainder. This search is strictly by best-fit; i.e.,
+ the smallest (with ties going to approximately the least
+ recently used) chunk that fits is selected.
4. If large enough, the chunk bordering the end of memory
- (`top') is split off. (This use of `top' is in accord with
- the best-fit search rule. In effect, `top' is treated as
- larger (and thus less well fitting) than any other available
- chunk since it can be extended to be as large as necessary
- (up to system limitations).
+ (`top') is split off. (This use of `top' is in accord with
+ the best-fit search rule. In effect, `top' is treated as
+ larger (and thus less well fitting) than any other available
+ chunk since it can be extended to be as large as necessary
+ (up to system limitations).
5. If the request size meets the mmap threshold and the
- system supports mmap, and there are few enough currently
- allocated mmapped regions, and a call to mmap succeeds,
- the request is allocated via direct memory mapping.
+ system supports mmap, and there are few enough currently
+ allocated mmapped regions, and a call to mmap succeeds,
+ the request is allocated via direct memory mapping.
6. Otherwise, the top of memory is extended by
- obtaining more space from the system (normally using sbrk,
- but definable to anything else via the MORECORE macro).
- Memory is gathered from the system (in system page-sized
- units) in a way that allows chunks obtained across different
- sbrk calls to be consolidated, but does not require
- contiguous memory. Thus, it should be safe to intersperse
- mallocs with other sbrk calls.
+ obtaining more space from the system (normally using sbrk,
+ but definable to anything else via the MORECORE macro).
+ Memory is gathered from the system (in system page-sized
+ units) in a way that allows chunks obtained across different
+ sbrk calls to be consolidated, but does not require
+ contiguous memory. Thus, it should be safe to intersperse
+ mallocs with other sbrk calls.
All allocations are made from the the `lowest' part of any found
@@ -2173,16 +2164,16 @@
if (remainder_size >= (long)MINSIZE) /* too big */
{
- --idx; /* adjust to rescan below after checking last remainder */
- break;
+ --idx; /* adjust to rescan below after checking last remainder */
+ break;
}
else if (remainder_size >= 0) /* exact fit */
{
- unlink(victim, bck, fwd);
- set_inuse_bit_at_offset(victim, victim_size);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
+ unlink(victim, bck, fwd);
+ set_inuse_bit_at_offset(victim, victim_size);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
}
}
@@ -2239,8 +2230,8 @@
block <<= 1;
while ((block & binblocks) == 0)
{
- idx += BINBLOCKWIDTH;
- block <<= 1;
+ idx += BINBLOCKWIDTH;
+ block <<= 1;
}
}
@@ -2253,34 +2244,34 @@
/* For each bin in this block ... */
do
{
- /* Find and use first big enough chunk ... */
+ /* Find and use first big enough chunk ... */
- for (victim = last(bin); victim != bin; victim = victim->bk)
- {
- victim_size = chunksize(victim);
- remainder_size = victim_size - nb;
+ for (victim = last(bin); victim != bin; victim = victim->bk)
+ {
+ victim_size = chunksize(victim);
+ remainder_size = victim_size - nb;
- if (remainder_size >= (long)MINSIZE) /* split */
- {
- remainder = chunk_at_offset(victim, nb);
- set_head(victim, nb | PREV_INUSE);
- unlink(victim, bck, fwd);
- link_last_remainder(remainder);
- set_head(remainder, remainder_size | PREV_INUSE);
- set_foot(remainder, remainder_size);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
+ if (remainder_size >= (long)MINSIZE) /* split */
+ {
+ remainder = chunk_at_offset(victim, nb);
+ set_head(victim, nb | PREV_INUSE);
+ unlink(victim, bck, fwd);
+ link_last_remainder(remainder);
+ set_head(remainder, remainder_size | PREV_INUSE);
+ set_foot(remainder, remainder_size);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
- else if (remainder_size >= 0) /* take */
- {
- set_inuse_bit_at_offset(victim, victim_size);
- unlink(victim, bck, fwd);
- check_malloced_chunk(victim, nb);
- return chunk2mem(victim);
- }
+ else if (remainder_size >= 0) /* take */
+ {
+ set_inuse_bit_at_offset(victim, victim_size);
+ unlink(victim, bck, fwd);
+ check_malloced_chunk(victim, nb);
+ return chunk2mem(victim);
+ }
- }
+ }
bin = next_bin(bin);
@@ -2290,12 +2281,12 @@
do /* Possibly backtrack to try to clear a partial block */
{
- if ((startidx & (BINBLOCKWIDTH - 1)) == 0)
- {
- binblocks &= ~block;
- break;
- }
- --startidx;
+ if ((startidx & (BINBLOCKWIDTH - 1)) == 0)
+ {
+ binblocks &= ~block;
+ break;
+ }
+ --startidx;
q = prev_bin(q);
} while (first(q) == q);
@@ -2303,14 +2294,14 @@
if ( (block <<= 1) <= binblocks && (block != 0) )
{
- while ((block & binblocks) == 0)
- {
- idx += BINBLOCKWIDTH;
- block <<= 1;
- }
+ while ((block & binblocks) == 0)
+ {
+ idx += BINBLOCKWIDTH;
+ block <<= 1;
+ }
}
else
- break;
+ break;
}
}
@@ -2324,7 +2315,7 @@
#if HAVE_MMAP
/* If big and would otherwise need to extend, try to use mmap instead */
if ((unsigned long)nb >= (unsigned long)mmap_threshold &&
- (victim = mmap_chunk(nb)) != 0)
+ (victim = mmap_chunk(nb)) != 0)
return chunk2mem(victim);
#endif
@@ -2357,13 +2348,13 @@
2. If the chunk was allocated via mmap, it is release via munmap().
3. If a returned chunk borders the current high end of memory,
- it is consolidated into the top, and if the total unused
- topmost memory exceeds the trim threshold, malloc_trim is
- called.
+ it is consolidated into the top, and if the total unused
+ topmost memory exceeds the trim threshold, malloc_trim is
+ called.
4. Other chunks are consolidated as they arrive, and
- placed in corresponding bins. (This includes the case of
- consolidating with the current `last_remainder').
+ placed in corresponding bins. (This includes the case of
+ consolidating with the current `last_remainder').
*/
@@ -2575,22 +2566,22 @@
/* Forward into top only if a remainder */
if (next == top)
{
- if ((long)(nextsize + newsize) >= (long)(nb + MINSIZE))
- {
- newsize += nextsize;
- top = chunk_at_offset(oldp, nb);
- set_head(top, (newsize - nb) | PREV_INUSE);
- set_head_size(oldp, nb);
- return chunk2mem(oldp);
- }
+ if ((long)(nextsize + newsize) >= (long)(nb + MINSIZE))
+ {
+ newsize += nextsize;
+ top = chunk_at_offset(oldp, nb);
+ set_head(top, (newsize - nb) | PREV_INUSE);
+ set_head_size(oldp, nb);
+ return chunk2mem(oldp);
+ }
}
/* Forward into next chunk */
else if (((long)(nextsize + newsize) >= (long)(nb)))
{
- unlink(next, bck, fwd);
- newsize += nextsize;
- goto split;
+ unlink(next, bck, fwd);
+ newsize += nextsize;
+ goto split;
}
}
else
@@ -2610,45 +2601,45 @@
if (next != 0)
{
- /* into top */
- if (next == top)
- {
- if ((long)(nextsize + prevsize + newsize) >= (long)(nb + MINSIZE))
- {
- unlink(prev, bck, fwd);
- newp = prev;
- newsize += prevsize + nextsize;
- newmem = chunk2mem(newp);
- MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
- top = chunk_at_offset(newp, nb);
- set_head(top, (newsize - nb) | PREV_INUSE);
- set_head_size(newp, nb);
- return newmem;
- }
- }
+ /* into top */
+ if (next == top)
+ {
+ if ((long)(nextsize + prevsize + newsize) >= (long)(nb + MINSIZE))
+ {
+ unlink(prev, bck, fwd);
+ newp = prev;
+ newsize += prevsize + nextsize;
+ newmem = chunk2mem(newp);
+ MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
+ top = chunk_at_offset(newp, nb);
+ set_head(top, (newsize - nb) | PREV_INUSE);
+ set_head_size(newp, nb);
+ return newmem;
+ }
+ }
- /* into next chunk */
- else if (((long)(nextsize + prevsize + newsize) >= (long)(nb)))
- {
- unlink(next, bck, fwd);
- unlink(prev, bck, fwd);
- newp = prev;
- newsize += nextsize + prevsize;
- newmem = chunk2mem(newp);
- MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
- goto split;
- }
+ /* into next chunk */
+ else if (((long)(nextsize + prevsize + newsize) >= (long)(nb)))
+ {
+ unlink(next, bck, fwd);
+ unlink(prev, bck, fwd);
+ newp = prev;
+ newsize += nextsize + prevsize;
+ newmem = chunk2mem(newp);
+ MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
+ goto split;
+ }
}
/* backward only */
if (prev != 0 && (long)(prevsize + newsize) >= (long)nb)
{
- unlink(prev, bck, fwd);
- newp = prev;
- newsize += prevsize;
- newmem = chunk2mem(newp);
- MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
- goto split;
+ unlink(prev, bck, fwd);
+ newp = prev;
+ newsize += prevsize;
+ newmem = chunk2mem(newp);
+ MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ);
+ goto split;
}
}
@@ -2980,25 +2971,25 @@
if (new_brk == (char*)(MORECORE_FAILURE)) /* sbrk failed? */
{
- /* Try to figure out what we have */
- current_brk = (char*)(MORECORE (0));
- top_size = current_brk - (char*)top;
- if (top_size >= (long)MINSIZE) /* if not, we are very very dead! */
- {
- sbrked_mem = current_brk - sbrk_base;
- set_head(top, top_size | PREV_INUSE);
- }
- check_chunk(top);
- return 0;
+ /* Try to figure out what we have */
+ current_brk = (char*)(MORECORE (0));
+ top_size = current_brk - (char*)top;
+ if (top_size >= (long)MINSIZE) /* if not, we are very very dead! */
+ {
+ sbrked_mem = current_brk - sbrk_base;
+ set_head(top, top_size | PREV_INUSE);
+ }
+ check_chunk(top);
+ return 0;
}
else
{
- /* Success. Adjust top accordingly. */
- set_head(top, (top_size - extra) | PREV_INUSE);
- sbrked_mem -= extra;
- check_chunk(top);
- return 1;
+ /* Success. Adjust top accordingly. */
+ set_head(top, (top_size - extra) | PREV_INUSE);
+ sbrked_mem -= extra;
+ check_chunk(top);
+ return 1;
}
}
}
@@ -3064,9 +3055,9 @@
#if DEBUG
check_free_chunk(p);
for (q = next_chunk(p);
- q < top && inuse(q) && (long)(chunksize(q)) >= (long)MINSIZE;
- q = next_chunk(q))
- check_inuse_chunk(q);
+ q < top && inuse(q) && (long)(chunksize(q)) >= (long)MINSIZE;
+ q = next_chunk(q))
+ check_inuse_chunk(q);
#endif
avail += chunksize(p);
navail++;
@@ -3103,14 +3094,14 @@
{
malloc_update_mallinfo();
fprintf(stderr, "max system bytes = %10u\n",
- (unsigned int)(max_total_mem));
+ (unsigned int)(max_total_mem));
fprintf(stderr, "system bytes = %10u\n",
- (unsigned int)(sbrked_mem + mmapped_mem));
+ (unsigned int)(sbrked_mem + mmapped_mem));
fprintf(stderr, "in use bytes = %10u\n",
- (unsigned int)(current_mallinfo.uordblks + mmapped_mem));
+ (unsigned int)(current_mallinfo.uordblks + mmapped_mem));
#if HAVE_MMAP
fprintf(stderr, "max mmap regions = %10u\n",
- (unsigned int)max_n_mmaps);
+ (unsigned int)max_n_mmaps);
#endif
}
@@ -3173,17 +3164,17 @@
V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee)
* return null for negative arguments
* Added Several WIN32 cleanups from Martin C. Fong <mcfong@yahoo.com>
- * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
- (e.g. WIN32 platforms)
- * Cleanup up header file inclusion for WIN32 platforms
- * Cleanup code to avoid Microsoft Visual C++ compiler complaints
- * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
- memory allocation routines
- * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
- * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
+ * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h'
+ (e.g. WIN32 platforms)
+ * Cleanup up header file inclusion for WIN32 platforms
+ * Cleanup code to avoid Microsoft Visual C++ compiler complaints
+ * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing
+ memory allocation routines
+ * Set 'malloc_getpagesize' for WIN32 platforms (needs more work)
+ * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to
usage of 'assert' in non-WIN32 code
- * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
- avoid infinite loop
+ * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to
+ avoid infinite loop
* Always call 'fREe()' rather than 'free()'
V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee)
@@ -3195,13 +3186,13 @@
* Added anonymously donated WIN32 sbrk emulation
* Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen
* malloc_extend_top: fix mask error that caused wastage after
- foreign sbrks
+ foreign sbrks
* Add linux mremap support code from HJ Liu
V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee)
* Integrated most documentation with the code.
* Add support for mmap, with help from
- Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+ Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
* Use last_remainder in more cases.
* Pack bins using idea from colin@nyx10.cs.du.edu
* Use ordered bins instead of best-fit threshhold
@@ -3209,34 +3200,34 @@
* Support another case of realloc via move into top
* Fix error occuring when initial sbrk_base not word-aligned.
* Rely on page size for units instead of SBRK_UNIT to
- avoid surprises about sbrk alignment conventions.
+ avoid surprises about sbrk alignment conventions.
* Add mallinfo, mallopt. Thanks to Raymond Nijssen
- (raymond@es.ele.tue.nl) for the suggestion.
+ (raymond@es.ele.tue.nl) for the suggestion.
* Add `pad' argument to malloc_trim and top_pad mallopt parameter.
* More precautions for cases where other routines call sbrk,
- courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
+ courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de).
* Added macros etc., allowing use in linux libc from
- H.J. Lu (hjl@gnu.ai.mit.edu)
+ H.J. Lu (hjl@gnu.ai.mit.edu)
* Inverted this history list
V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee)
* Re-tuned and fixed to behave more nicely with V2.6.0 changes.
* Removed all preallocation code since under current scheme
- the work required to undo bad preallocations exceeds
- the work saved in good cases for most test programs.
+ the work required to undo bad preallocations exceeds
+ the work saved in good cases for most test programs.
* No longer use return list or unconsolidated bins since
- no scheme using them consistently outperforms those that don't
- given above changes.
+ no scheme using them consistently outperforms those that don't
+ given above changes.
* Use best fit for very large chunks to prevent some worst-cases.
* Added some support for debugging
V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee)
* Removed footers when chunks are in use. Thanks to
- Paul Wilson (wilson@cs.texas.edu) for the suggestion.
+ Paul Wilson (wilson@cs.texas.edu) for the suggestion.
V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee)
* Added malloc_trim, with help from Wolfram Gloger
- (wmglo@Dent.MED.Uni-Muenchen.DE).
+ (wmglo@Dent.MED.Uni-Muenchen.DE).
V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g)
@@ -3252,11 +3243,11 @@
V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g)
* faster bin computation & slightly different binning
* merged all consolidations to one part of malloc proper
- (eliminating old malloc_find_space & malloc_clean_bin)
+ (eliminating old malloc_find_space & malloc_clean_bin)
* Scan 2 returns chunks (not just 1)
* Propagate failure in realloc if malloc returns 0
* Add stuff to allow compilation on non-ANSI compilers
- from kpv@research.att.com
+ from kpv@research.att.com
V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu)
* removed potential for odd address access in prev_chunk
@@ -3264,13 +3255,11 @@
* misc cosmetics and a bit more internal documentation
* anticosmetics: mangled names in macros to evade debugger strangeness
* tested on sparc, hp-700, dec-mips, rs6000
- with gcc & native cc (hp, dec only) allowing
- Detlefs & Zorn comparison study (in SIGPLAN Notices.)
+ with gcc & native cc (hp, dec only) allowing
+ Detlefs & Zorn comparison study (in SIGPLAN Notices.)
Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu)
* Based loosely on libg++-1.2X malloc. (It retains some of the overall
- structure of old version, but most details differ.)
+ structure of old version, but most details differ.)
*/
-
-
diff --git a/common/docecc.c b/common/docecc.c
index 74ac741..cf45e0f 100644
--- a/common/docecc.c
+++ b/common/docecc.c
@@ -98,30 +98,30 @@
/* generate GF(2**m) from the irreducible polynomial p(X) in Pp[0]..Pp[m]
lookup tables: index->polynomial form alpha_to[] contains j=alpha**i;
- polynomial form -> index form index_of[j=alpha**i] = i
+ polynomial form -> index form index_of[j=alpha**i] = i
alpha=2 is the primitive element of GF(2**m)
HARI's COMMENT: (4/13/94) alpha_to[] can be used as follows:
- Let @ represent the primitive element commonly called "alpha" that
+ Let @ represent the primitive element commonly called "alpha" that
is the root of the primitive polynomial p(x). Then in GF(2^m), for any
0 <= i <= 2^m-2,
- @^i = a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1)
+ @^i = a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1)
where the binary vector (a(0),a(1),a(2),...,a(m-1)) is the representation
of the integer "alpha_to[i]" with a(0) being the LSB and a(m-1) the MSB. Thus for
example the polynomial representation of @^5 would be given by the binary
representation of the integer "alpha_to[5]".
- Similarily, index_of[] can be used as follows:
- As above, let @ represent the primitive element of GF(2^m) that is
+ Similarily, index_of[] can be used as follows:
+ As above, let @ represent the primitive element of GF(2^m) that is
the root of the primitive polynomial p(x). In order to find the power
of @ (alpha) that has the polynomial representation
- a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1)
+ a(0) + a(1) @ + a(2) @^2 + ... + a(m-1) @^(m-1)
we consider the integer "i" whose binary representation with a(0) being LSB
and a(m-1) MSB is (a(0),a(1),...,a(m-1)) and locate the entry
"index_of[i]". Now, @^index_of[i] is that element whose polynomial
representation is (a(0),a(1),a(2),...,a(m-1)).
NOTE:
- The element alpha_to[2^m-1] = 0 always signifying that the
+ The element alpha_to[2^m-1] = 0 always signifying that the
representation of "@^infinity" = 0 is (0,0,0,...,0).
- Similarily, the element index_of[0] = A0 always signifying
+ Similarily, the element index_of[0] = A0 always signifying
that the power of alpha which has the polynomial representation
(0,0,...,0) is "infinity".
@@ -183,8 +183,8 @@
* */
static int
eras_dec_rs(dtype Alpha_to[NN + 1], dtype Index_of[NN + 1],
- gf bb[NN - KK + 1], gf eras_val[NN-KK], int eras_pos[NN-KK],
- int no_eras)
+ gf bb[NN - KK + 1], gf eras_val[NN-KK], int eras_pos[NN-KK],
+ int no_eras)
{
int deg_lambda, el, deg_omega;
int i, j, r,k;
@@ -225,7 +225,7 @@
for(i=1;i<=NN-KK;i++) {
tmp = Index_of[s[i]];
if (tmp != A0)
- tmp = modnn(tmp + 2 * KK * (B0+i-1)*PRIM);
+ tmp = modnn(tmp + 2 * KK * (B0+i-1)*PRIM);
s[i] = tmp;
}
@@ -412,9 +412,9 @@
}
/* Apply error to data */
if (num1 != 0) {
- eras_val[j] = Alpha_to[modnn(Index_of[num1] + Index_of[num2] + NN - Index_of[den])];
+ eras_val[j] = Alpha_to[modnn(Index_of[num1] + Index_of[num2] + NN - Index_of[den])];
} else {
- eras_val[j] = 0;
+ eras_val[j] = 0;
}
}
finish:
@@ -447,12 +447,12 @@
/* init log and exp tables here to save memory. However, it is slower */
Alpha_to = malloc((NN + 1) * sizeof(dtype));
if (!Alpha_to)
- return -1;
+ return -1;
Index_of = malloc((NN + 1) * sizeof(dtype));
if (!Index_of) {
- free(Alpha_to);
- return -1;
+ free(Alpha_to);
+ return -1;
}
generate_gf(Alpha_to, Index_of);
@@ -465,48 +465,48 @@
bb[3] = ((ecc1[3] & 0xc0) >> 6) | ((ecc1[0] & 0xff) << 2);
nb_errors = eras_dec_rs(Alpha_to, Index_of, bb,
- error_val, error_pos, 0);
+ error_val, error_pos, 0);
if (nb_errors <= 0)
- goto the_end;
+ goto the_end;
/* correct the errors */
for(i=0;i<nb_errors;i++) {
- pos = error_pos[i];
- if (pos >= NB_DATA && pos < KK) {
- nb_errors = -1;
- goto the_end;
- }
- if (pos < NB_DATA) {
- /* extract bit position (MSB first) */
- pos = 10 * (NB_DATA - 1 - pos) - 6;
- /* now correct the following 10 bits. At most two bytes
- can be modified since pos is even */
- index = (pos >> 3) ^ 1;
- bitpos = pos & 7;
- if ((index >= 0 && index < SECTOR_SIZE) ||
- index == (SECTOR_SIZE + 1)) {
- val = error_val[i] >> (2 + bitpos);
- parity ^= val;
- if (index < SECTOR_SIZE)
- sector[index] ^= val;
- }
- index = ((pos >> 3) + 1) ^ 1;
- bitpos = (bitpos + 10) & 7;
- if (bitpos == 0)
- bitpos = 8;
- if ((index >= 0 && index < SECTOR_SIZE) ||
- index == (SECTOR_SIZE + 1)) {
- val = error_val[i] << (8 - bitpos);
- parity ^= val;
- if (index < SECTOR_SIZE)
- sector[index] ^= val;
- }
- }
+ pos = error_pos[i];
+ if (pos >= NB_DATA && pos < KK) {
+ nb_errors = -1;
+ goto the_end;
+ }
+ if (pos < NB_DATA) {
+ /* extract bit position (MSB first) */
+ pos = 10 * (NB_DATA - 1 - pos) - 6;
+ /* now correct the following 10 bits. At most two bytes
+ can be modified since pos is even */
+ index = (pos >> 3) ^ 1;
+ bitpos = pos & 7;
+ if ((index >= 0 && index < SECTOR_SIZE) ||
+ index == (SECTOR_SIZE + 1)) {
+ val = error_val[i] >> (2 + bitpos);
+ parity ^= val;
+ if (index < SECTOR_SIZE)
+ sector[index] ^= val;
+ }
+ index = ((pos >> 3) + 1) ^ 1;
+ bitpos = (bitpos + 10) & 7;
+ if (bitpos == 0)
+ bitpos = 8;
+ if ((index >= 0 && index < SECTOR_SIZE) ||
+ index == (SECTOR_SIZE + 1)) {
+ val = error_val[i] << (8 - bitpos);
+ parity ^= val;
+ if (index < SECTOR_SIZE)
+ sector[index] ^= val;
+ }
+ }
}
/* use parity to test extra errors */
if ((parity & 0xff) != 0)
- nb_errors = -1;
+ nb_errors = -1;
the_end:
free(Alpha_to);
diff --git a/common/env_common.c b/common/env_common.c
index ea08501..e7ee499 100644
--- a/common/env_common.c
+++ b/common/env_common.c
@@ -27,7 +27,6 @@
#include <common.h>
#include <command.h>
#include <environment.h>
-#include <cmd_nvedit.h>
#include <linux/stddef.h>
#include <malloc.h>
diff --git a/common/env_eeprom.c b/common/env_eeprom.c
index 9f1d82a..300af6f 100644
--- a/common/env_eeprom.c
+++ b/common/env_eeprom.c
@@ -30,7 +30,6 @@
#include <command.h>
#include <environment.h>
-#include <cmd_nvedit.h>
#include <linux/stddef.h>
#include <malloc.h>
diff --git a/common/env_flash.c b/common/env_flash.c
index 426d01b..af99880 100644
--- a/common/env_flash.c
+++ b/common/env_flash.c
@@ -32,7 +32,6 @@
#include <command.h>
#include <environment.h>
-#include <cmd_nvedit.h>
#include <linux/stddef.h>
#include <malloc.h>
@@ -185,14 +184,14 @@
debug ("Data to save 0x%x\n", up_data);
if (up_data) {
if ((saved_data = malloc(up_data)) == NULL) {
- printf("Unable to save the rest of sector (%ld)\n",
+ printf("Unable to save the rest of sector (%ld)\n",
up_data);
goto Done;
}
- memcpy(saved_data,
+ memcpy(saved_data,
(void *)((long)flash_addr_new + CFG_ENV_SIZE), up_data);
- debug ("Data (start 0x%x, len 0x%x) saved at 0x%x\n",
- (long)flash_addr_new + CFG_ENV_SIZE,
+ debug ("Data (start 0x%x, len 0x%x) saved at 0x%x\n",
+ (long)flash_addr_new + CFG_ENV_SIZE,
up_data, saved_data);
}
#endif
@@ -209,19 +208,19 @@
(ulong)&(flash_addr_new->data),
sizeof(env_ptr->data)+(ulong)&(flash_addr_new->data));
if (flash_write(env_ptr->data,
- (ulong)&(flash_addr_new->data),
+ (ulong)&(flash_addr_new->data),
sizeof(env_ptr->data)) ||
flash_write((char *)&(env_ptr->crc),
- (ulong)&(flash_addr_new->crc),
+ (ulong)&(flash_addr_new->crc),
sizeof(env_ptr->crc)) ||
flash_write((char *)&obsolete_flag,
- (ulong)&(flash_addr->flags),
+ (ulong)&(flash_addr->flags),
sizeof(flash_addr->flags)) ||
flash_write((char *)&active_flag,
- (ulong)&(flash_addr_new->flags),
+ (ulong)&(flash_addr_new->flags),
sizeof(flash_addr_new->flags)))
{
flash_perror (rc);
@@ -233,8 +232,8 @@
if (up_data) { /* restore the rest of sector */
debug ("Restoring the rest of data to 0x%x len 0x%x\n",
(long)flash_addr_new + CFG_ENV_SIZE, up_data);
- if (flash_write(saved_data,
- (long)flash_addr_new + CFG_ENV_SIZE,
+ if (flash_write(saved_data,
+ (long)flash_addr_new + CFG_ENV_SIZE,
up_data)) {
flash_perror(rc);
goto Done;
@@ -381,8 +380,8 @@
gd->env_valid = 2;
flash_sect_protect (0, (ulong)flash_addr_new, end_addr_new);
flash_write((char *)&obsolete_flag,
- (ulong)&(flash_addr_new->flags),
- sizeof(flash_addr_new->flags));
+ (ulong)&(flash_addr_new->flags),
+ sizeof(flash_addr_new->flags));
flash_sect_protect (1, (ulong)flash_addr_new, end_addr_new);
}
@@ -392,8 +391,8 @@
gd->env_valid = 2;
flash_sect_protect (0, (ulong)flash_addr, end_addr);
flash_write((char *)&active_flag,
- (ulong)&(flash_addr->flags),
- sizeof(flash_addr->flags));
+ (ulong)&(flash_addr->flags),
+ sizeof(flash_addr->flags));
flash_sect_protect (1, (ulong)flash_addr, end_addr);
}
diff --git a/common/env_nvram.c b/common/env_nvram.c
index 76e8438..2c831d1 100644
--- a/common/env_nvram.c
+++ b/common/env_nvram.c
@@ -46,7 +46,6 @@
#include <command.h>
#include <environment.h>
-#include <cmd_nvedit.h>
#include <linux/stddef.h>
#include <malloc.h>
diff --git a/common/fpga.c b/common/fpga.c
index c5975bc..c41c6f8 100644
--- a/common/fpga.c
+++ b/common/fpga.c
@@ -55,7 +55,7 @@
/* Local static functions */
static const fpga_desc * const fpga_get_desc( int devnum );
static const fpga_desc * const fpga_validate( int devnum, void *buf,
- size_t bsize, char *fn );
+ size_t bsize, char *fn );
static int fpga_dev_info( int devnum );
@@ -100,7 +100,7 @@
* generic parameter checking code
*/
static const fpga_desc * const fpga_validate( int devnum, void *buf,
- size_t bsize, char *fn )
+ size_t bsize, char *fn )
{
const fpga_desc * const desc = fpga_get_desc( devnum );
diff --git a/common/hush.c b/common/hush.c
index 1993398..dbb952d 100644
--- a/common/hush.c
+++ b/common/hush.c
@@ -94,7 +94,8 @@
#include <common.h> /* readline */
#include <hush.h>
#include <command.h> /* find_cmd */
-#include <cmd_bootm.h> /* do_bootd */
+/*cmd_boot.c*/
+extern int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); /* do_bootd */
#endif
#ifdef CFG_HUSH_PARSER
#ifndef __U_BOOT__
@@ -1048,12 +1049,12 @@
i->p = the_command;
}
else {
- if (console_buffer[0] != '\n') {
- if (strlen(the_command) + strlen(console_buffer)
+ if (console_buffer[0] != '\n') {
+ if (strlen(the_command) + strlen(console_buffer)
< CFG_CBSIZE) {
- n = strlen(the_command);
- the_command[n-1] = ' ';
- strcpy(&the_command[n],console_buffer);
+ n = strlen(the_command);
+ the_command[n-1] = ' ';
+ strcpy(&the_command[n],console_buffer);
}
else {
the_command[0] = '\n';
@@ -1257,8 +1258,8 @@
if (p != child->argv[i]) free(p);
}
child->argv+=i; /* XXX this hack isn't so horrible, since we are about
- to exit, and therefore don't need to keep data
- structures consistent for free() use. */
+ to exit, and therefore don't need to keep data
+ structures consistent for free() use. */
/* If a variable is assigned in a forest, and nobody listens,
* was it ever really set?
*/
@@ -1648,14 +1649,18 @@
child->argv[i]);
return -1;
}
- /* Look up command in command table */
+ /* Look up command in command table */
+
+
if ((cmdtp = find_cmd(child->argv[i])) == NULL) {
printf ("Unknown command '%s' - try 'help'\n", child->argv[i]);
return -1; /* give up after bad command */
} else {
int rcode;
#if (CONFIG_COMMANDS & CFG_CMD_BOOTD)
- /* avoid "bootd" recursion */
+ extern int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+
+ /* avoid "bootd" recursion */
if (cmdtp->cmd == do_bootd) {
if (flag & CMD_FLAG_BOOTD) {
printf ("'bootd' recursion detected\n");
@@ -1665,7 +1670,7 @@
flag |= CMD_FLAG_BOOTD;
}
#endif /* CFG_CMD_BOOTD */
- /* found - check max args */
+ /* found - check max args */
if ((child->argc - i) > cmdtp->maxargs) {
printf ("Usage:\n%s\n", cmdtp->usage);
return -1;
@@ -1676,15 +1681,20 @@
rcode = x->function(child);
#else
/* OK - call function to do the command */
+
rcode = (cmdtp->cmd)
- (cmdtp, flag,child->argc-i,&child->argv[i]);
+(cmdtp, flag,child->argc-i,&child->argv[i]);
if ( !cmdtp->repeatable )
flag_repeat = 0;
+
+
#endif
child->argv-=i; /* XXX restore hack so free() can work right */
#ifndef __U_BOOT__
+
restore_redirects(squirrel);
#endif
+
return rcode;
}
}
@@ -1965,11 +1975,11 @@
#ifndef __U_BOOT__
globfree(&child->glob_result);
#else
- for (a = child->argc;a >= 0;a--) {
- free(child->argv[a]);
- }
+ for (a = child->argc;a >= 0;a--) {
+ free(child->argv[a]);
+ }
free(child->argv);
- child->argc = 0;
+ child->argc = 0;
#endif
child->argv=NULL;
} else if (child->group) {
@@ -2103,17 +2113,17 @@
{
int gr;
- /* short-circuit for null word */
+ /* short-circuit for null word */
/* we can code this better when the debug_printf's are gone */
- if (dest->length == 0) {
- if (dest->nonnull) {
- /* bash man page calls this an "explicit" null */
- gr = globhack(dest->data, flags, pglob);
- debug_printf("globhack returned %d\n",gr);
- } else {
+ if (dest->length == 0) {
+ if (dest->nonnull) {
+ /* bash man page calls this an "explicit" null */
+ gr = globhack(dest->data, flags, pglob);
+ debug_printf("globhack returned %d\n",gr);
+ } else {
return 0;
}
- } else if (glob_needed(dest->data)) {
+ } else if (glob_needed(dest->data)) {
gr = glob(dest->data, flags, NULL, pglob);
debug_printf("glob returned %d\n",gr);
if (gr == GLOB_NOMATCH) {
@@ -2462,7 +2472,7 @@
}
#ifndef __U_BOOT__
glob_target = &child->glob_result;
- if (child->argv) flags |= GLOB_APPEND;
+ if (child->argv) flags |= GLOB_APPEND;
#else
for (cnt = 1, s = dest->data; s && *s; s++) {
if (*s == '\\') s++;
@@ -2522,9 +2532,9 @@
struct child_prog *prog=ctx->child;
if (prog && prog->group == NULL
- && prog->argv == NULL
+ && prog->argv == NULL
#ifndef __U_BOOT__
- && prog->redirects == NULL) {
+ && prog->redirects == NULL) {
#else
) {
#endif
@@ -3339,7 +3349,7 @@
debug_printf("\ninteractive=%d\n", interactive);
if (interactive) {
/* Looks like they want an interactive shell */
-#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
+#ifndef CONFIG_FEATURE_SH_EXTRA_QUIET
printf( "\n\n" BB_BANNER " hush - the humble shell v0.01 (testing)\n");
printf( "Enter 'help' for a list of built-in commands.\n\n");
#endif
diff --git a/common/kgdb.c b/common/kgdb.c
index b563094..73fd9a8 100644
--- a/common/kgdb.c
+++ b/common/kgdb.c
@@ -573,6 +573,20 @@
return 0;
}
+cmd_tbl_t U_BOOT_CMD(KGDB) = MK_CMD_ENTRY(
+ "kgdb", CFG_MAXARGS, 1, do_kgdb,
+ "kgdb - enter gdb remote debug mode\n",
+ "[arg0 arg1 .. argN]\n"
+ " - executes a breakpoint so that kgdb mode is\n"
+ " entered via the exception handler. To return\n"
+ " to the monitor, the remote gdb debugger must\n"
+ " execute a \"continue\" or \"quit\" command.\n"
+ "\n"
+ " if a program is loaded by the remote gdb, any args\n"
+ " passed to the kgdb command are given to the loaded\n"
+ " program if it is executed (see the \"hello_world\"\n"
+ " example program in the U-Boot examples directory)."
+);
#else
int kgdb_not_configured = 1;
diff --git a/common/main.c b/common/main.c
index f538870..f7830a1 100644
--- a/common/main.c
+++ b/common/main.c
@@ -26,17 +26,19 @@
#include <common.h>
#include <watchdog.h>
#include <command.h>
-#include <cmd_nvedit.h>
-#include <cmd_bootm.h>
#include <malloc.h>
-#if defined(CONFIG_BOOT_RETRY_TIME) && defined(CONFIG_RESET_TO_RETRY)
-#include <cmd_boot.h> /* for do_reset() prototype */
-#endif
#ifdef CFG_HUSH_PARSER
#include <hush.h>
#endif
+#if defined(CONFIG_BOOT_RETRY_TIME) && defined(CONFIG_RESET_TO_RETRY)
+extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]); /* for do_reset() prototype */
+#endif
+
+extern int do_bootd (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+
+
#define MAX_DELAY_STOP_STR 32
static char * delete_char (char *buffer, char *p, int *colp, int *np, int plen);
@@ -143,7 +145,7 @@
if (delaykey[i].len > 0 &&
presskey_len >= delaykey[i].len &&
memcmp (presskey + presskey_len - delaykey[i].len,
- delaykey[i].str,
+ delaykey[i].str,
delaykey[i].len) == 0) {
# if DEBUG_BOOTKEYS
printf("got %skey\n",
@@ -196,17 +198,17 @@
#endif
#if defined CONFIG_ZERO_BOOTDELAY_CHECK
- /*
- * Check if key already pressed
- * Don't check if bootdelay < 0
- */
+ /*
+ * Check if key already pressed
+ * Don't check if bootdelay < 0
+ */
if (bootdelay >= 0) {
if (tstc()) { /* we got a key press */
(void) getc(); /* consume input */
printf ("\b\b\b 0\n");
return 1; /* don't auto boot */
}
- }
+ }
#endif
while (bootdelay > 0) {
@@ -633,7 +635,7 @@
int state = 0; /* 0 = waiting for '$' */
/* 1 = waiting for '(' */
/* 2 = waiting for ')' */
- /* 3 = waiting for ''' */
+ /* 3 = waiting for ''' */
#ifdef DEBUG_PARSER
char *output_start = output;
@@ -652,7 +654,7 @@
if (inputcnt-- == 0)
break;
prev = c;
- c = *input++;
+ c = *input++;
}
}
diff --git a/common/miiphybb.c b/common/miiphybb.c
index dfc1992..8d18919 100644
--- a/common/miiphybb.c
+++ b/common/miiphybb.c
@@ -228,4 +228,3 @@
}
#endif /* CONFIG_BITBANGMII */
-
diff --git a/common/soft_i2c.c b/common/soft_i2c.c
index dc26d6f..9a10b31 100644
--- a/common/soft_i2c.c
+++ b/common/soft_i2c.c
@@ -267,10 +267,10 @@
void i2c_init (int speed, int slaveaddr)
{
/*
- * WARNING: Do NOT save speed in a static variable: if the
- * I2C routines are called before RAM is initialized (to read
- * the DIMM SPD, for instance), RAM won't be usable and your
- * system will crash.
+ * WARNING: Do NOT save speed in a static variable: if the
+ * I2C routines are called before RAM is initialized (to read
+ * the DIMM SPD, for instance), RAM won't be usable and your
+ * system will crash.
*/
send_reset ();
}
diff --git a/common/soft_spi.c b/common/soft_spi.c
index b9a8fa8..00a57de 100644
--- a/common/soft_spi.c
+++ b/common/soft_spi.c
@@ -40,7 +40,6 @@
#endif
-
/*=====================================================================*/
/* Public Functions */
/*=====================================================================*/
@@ -132,4 +131,3 @@
}
#endif /* CONFIG_SOFT_SPI */
-
diff --git a/common/spartan2.c b/common/spartan2.c
index dcda0c4..279a426 100644
--- a/common/spartan2.c
+++ b/common/spartan2.c
@@ -438,11 +438,11 @@
static int Spartan2_ss_load (Xilinx_desc * desc, void *buf, size_t bsize)
{
- int ret_val = FPGA_FAIL; /* assume the worst */
+ int ret_val = FPGA_FAIL; /* assume the worst */
Xilinx_Spartan2_Slave_Serial_fns *fn = desc->iface_fns;
- int i;
- char val;
-
+ int i;
+ char val;
+
PRINTF ("%s: start with interface functions @ 0x%p\n",
__FUNCTION__, fn);
@@ -460,8 +460,8 @@
"clk:\t0x%p\n"
"wr:\t0x%p\n"
"done:\t0x%p\n\n",
- __FUNCTION__, &fn, fn, fn->pgm, fn->init,
- fn->clk, fn->wr, fn->done);
+ __FUNCTION__, &fn, fn, fn->pgm, fn->init,
+ fn->clk, fn->wr, fn->done);
#ifdef CFG_FPGA_PROG_FEEDBACK
printf ("Loading FPGA Device %d...\n", cookie);
#endif
@@ -476,7 +476,7 @@
/* Establish the initial state */
(*fn->pgm) (TRUE, TRUE, cookie); /* Assert the program, commit */
- /* Wait for INIT state (init low) */
+ /* Wait for INIT state (init low) */
ts = get_timer (0); /* get current time */
do {
CONFIG_FPGA_DELAY ();
@@ -485,7 +485,7 @@
return FPGA_FAIL;
}
} while (!(*fn->init) (cookie));
-
+
/* Get ready for the burn */
CONFIG_FPGA_DELAY ();
(*fn->pgm) (FALSE, TRUE, cookie); /* Deassert the program, commit */
@@ -502,29 +502,29 @@
/* Load the data */
while (bytecount < bsize) {
-
- /* Xilinx detects an error if INIT goes low (active)
- while DONE is low (inactive) */
- if ((*fn->done) (cookie) == 0 && (*fn->init) (cookie)) {
- puts ("** CRC error during FPGA load.\n");
- return (FPGA_FAIL);
- }
- val = data [bytecount ++];
- i = 8;
- do {
- /* Deassert the clock */
- (*fn->clk) (FALSE, TRUE, cookie);
- CONFIG_FPGA_DELAY ();
- /* Write data */
- (*fn->wr) ((val < 0), TRUE, cookie);
- CONFIG_FPGA_DELAY ();
- /* Assert the clock */
- (*fn->clk) (TRUE, TRUE, cookie);
- CONFIG_FPGA_DELAY ();
- val <<= 1;
- i --;
- } while (i > 0);
-
+
+ /* Xilinx detects an error if INIT goes low (active)
+ while DONE is low (inactive) */
+ if ((*fn->done) (cookie) == 0 && (*fn->init) (cookie)) {
+ puts ("** CRC error during FPGA load.\n");
+ return (FPGA_FAIL);
+ }
+ val = data [bytecount ++];
+ i = 8;
+ do {
+ /* Deassert the clock */
+ (*fn->clk) (FALSE, TRUE, cookie);
+ CONFIG_FPGA_DELAY ();
+ /* Write data */
+ (*fn->wr) ((val < 0), TRUE, cookie);
+ CONFIG_FPGA_DELAY ();
+ /* Assert the clock */
+ (*fn->clk) (TRUE, TRUE, cookie);
+ CONFIG_FPGA_DELAY ();
+ val <<= 1;
+ i --;
+ } while (i > 0);
+
#ifdef CFG_FPGA_PROG_FEEDBACK
if (bytecount % (bsize / 40) == 0)
putc ('.'); /* let them know we are alive */
@@ -540,7 +540,7 @@
/* now check for done signal */
ts = get_timer (0); /* get current time */
ret_val = FPGA_SUCCESS;
- (*fn->wr) (TRUE, TRUE, cookie);
+ (*fn->wr) (TRUE, TRUE, cookie);
while (! (*fn->done) (cookie)) {
/* XXX - we should have a check in here somewhere to
@@ -551,8 +551,8 @@
CONFIG_FPGA_DELAY ();
(*fn->clk) (TRUE, TRUE, cookie); /* Assert the clock pin */
- putc ('*');
-
+ putc ('*');
+
if (get_timer (ts) > CFG_FPGA_WAIT) { /* check the time */
puts ("** Timeout waiting for DONE to clear.\n");
ret_val = FPGA_FAIL;
@@ -579,8 +579,8 @@
static int Spartan2_ss_dump (Xilinx_desc * desc, void *buf, size_t bsize)
{
- /* Readback is only available through the Slave Parallel and */
- /* boundary-scan interfaces. */
+ /* Readback is only available through the Slave Parallel and */
+ /* boundary-scan interfaces. */
printf ("%s: Slave Serial Dumping is unavailable\n",
__FUNCTION__);
return FPGA_FAIL;
diff --git a/common/usb.c b/common/usb.c
index a5b29a5..9474abe 100644
--- a/common/usb.c
+++ b/common/usb.c
@@ -47,7 +47,6 @@
#endif
-
#undef USB_DEBUG
#ifdef USB_DEBUG
diff --git a/common/usb_kbd.c b/common/usb_kbd.c
index ad7e610..56c2166 100644
--- a/common/usb_kbd.c
+++ b/common/usb_kbd.c
@@ -402,7 +402,6 @@
#define HID_ITEM_TAG_LONG 15
-
static struct usb_hid_descriptor usb_kbd_hid_desc;
void usb_kbd_display_hid(struct usb_hid_descriptor *hid)
@@ -541,7 +540,6 @@
#define HID_LOCAL_ITEM_TAG_DELIMITER 10
-
static void usb_kbd_show_item(struct hid_item *item)
{
switch(item->type) {
@@ -666,7 +664,6 @@
}
-
static int usb_kbd_get_hid_desc(struct usb_device *dev)
{
unsigned char buffer[256];
@@ -729,6 +726,3 @@
#endif
#endif /* CONFIG_USB_KEYBOARD */
-
-/* eof */
-
diff --git a/common/usb_storage.c b/common/usb_storage.c
index b134721..a7944b5 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -32,7 +32,6 @@
*/
-
#include <common.h>
#include <command.h>
#include <asm/processor.h>
@@ -107,16 +106,11 @@
static struct us_data usb_stor[USB_MAX_STOR_DEV];
-
#define USB_STOR_TRANSPORT_GOOD 0
#define USB_STOR_TRANSPORT_FAILED -1
#define USB_STOR_TRANSPORT_ERROR -2
-
-
-
-
int usb_stor_get_info(struct usb_device *dev, struct us_data *us, block_dev_desc_t *dev_desc);
int usb_storage_probe(struct usb_device *dev, unsigned int ifnum,struct us_data *ss);
unsigned long usb_stor_read(int device, unsigned long blknr, unsigned long blkcnt, unsigned long *buffer);
@@ -529,7 +523,6 @@
}
-
static int usb_inquiry(ccb *srb,struct us_data *ss)
{
int retry,i;
@@ -890,6 +883,3 @@
#endif
#endif /* CONFIG_USB_STORAGE */
-
-
-