Merge branch 'mem' of git://git.denx.de/u-boot-x86
This commit is contained in:
commit
1c9f47ab2a
38 changed files with 784 additions and 606 deletions
9
README
9
README
|
@ -3811,6 +3811,15 @@ Low Level (hardware related) configuration options:
|
|||
that is executed before the actual U-Boot. E.g. when
|
||||
compiling a NAND SPL.
|
||||
|
||||
- CONFIG_ARCH_MAP_SYSMEM
|
||||
Generally U-Boot (and in particular the md command) uses
|
||||
effective address. It is therefore not necessary to regard
|
||||
U-Boot address as virtual addresses that need to be translated
|
||||
to physical addresses. However, sandbox requires this, since
|
||||
it maintains its own little RAM buffer which contains all
|
||||
addressable memory. This option causes some memory accesses
|
||||
to be mapped through map_sysmem() / unmap_sysmem().
|
||||
|
||||
- CONFIG_USE_ARCH_MEMCPY
|
||||
CONFIG_USE_ARCH_MEMSET
|
||||
If these options are used a optimized version of memcpy/memset will
|
||||
|
|
|
@ -18,4 +18,5 @@
|
|||
# MA 02111-1307 USA
|
||||
|
||||
PLATFORM_CPPFLAGS += -DCONFIG_SANDBOX -D__SANDBOX__ -U_FORTIFY_SOURCE
|
||||
PLATFORM_CPPFLAGS += -DCONFIG_ARCH_MAP_SYSMEM
|
||||
PLATFORM_LIBS += -lrt
|
||||
|
|
|
@ -44,6 +44,14 @@ ssize_t os_read(int fd, void *buf, size_t count)
|
|||
return read(fd, buf, count);
|
||||
}
|
||||
|
||||
ssize_t os_read_no_block(int fd, void *buf, size_t count)
|
||||
{
|
||||
const int flags = fcntl(fd, F_GETFL, 0);
|
||||
|
||||
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
|
||||
return os_read(fd, buf, count);
|
||||
}
|
||||
|
||||
ssize_t os_write(int fd, const void *buf, size_t count)
|
||||
{
|
||||
return write(fd, buf, count);
|
||||
|
|
|
@ -122,4 +122,7 @@ int main(int argc, char *argv[])
|
|||
* never return.
|
||||
*/
|
||||
board_init_f(0);
|
||||
|
||||
/* NOTREACHED - board_init_f() does not return */
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -39,3 +39,13 @@ static inline void unmap_physmem(void *vaddr, unsigned long flags)
|
|||
{
|
||||
|
||||
}
|
||||
|
||||
/* For sandbox, we want addresses to point into our RAM buffer */
|
||||
static inline void *map_sysmem(phys_addr_t paddr, unsigned long len)
|
||||
{
|
||||
return map_physmem(paddr, len, MAP_WRBACK);
|
||||
}
|
||||
|
||||
static inline void unmap_sysmem(const void *vaddr)
|
||||
{
|
||||
}
|
||||
|
|
|
@ -452,9 +452,7 @@ static int bootm_start_standalone(ulong iflag, int argc, char * const argv[])
|
|||
|
||||
/* Don't start if "autostart" is set to "no" */
|
||||
if (((s = getenv("autostart")) != NULL) && (strcmp(s, "no") == 0)) {
|
||||
char buf[32];
|
||||
sprintf(buf, "%lX", images.os.image_len);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", images.os.image_len);
|
||||
return 0;
|
||||
}
|
||||
appl = (int (*)(int, char * const []))(ulong)ntohl(images.ep);
|
||||
|
@ -529,17 +527,14 @@ static int do_bootm_subcommand(cmd_tbl_t *cmdtp, int flag, int argc,
|
|||
case BOOTM_STATE_RAMDISK:
|
||||
{
|
||||
ulong rd_len = images.rd_end - images.rd_start;
|
||||
char str[17];
|
||||
|
||||
ret = boot_ramdisk_high(&images.lmb, images.rd_start,
|
||||
rd_len, &images.initrd_start, &images.initrd_end);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
sprintf(str, "%lx", images.initrd_start);
|
||||
setenv("initrd_start", str);
|
||||
sprintf(str, "%lx", images.initrd_end);
|
||||
setenv("initrd_end", str);
|
||||
setenv_hex("initrd_start", images.initrd_start);
|
||||
setenv_hex("initrd_end", images.initrd_end);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
|
|
@ -65,7 +65,6 @@ int do_cbfs_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
|||
const struct cbfs_cachenode *file;
|
||||
unsigned long offset;
|
||||
unsigned long count;
|
||||
char buf[12];
|
||||
long size;
|
||||
|
||||
if (argc < 3) {
|
||||
|
@ -95,8 +94,7 @@ int do_cbfs_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
|
|||
|
||||
printf("\n%ld bytes read\n", size);
|
||||
|
||||
sprintf(buf, "%lX", size);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -146,11 +146,9 @@ int do_cramfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
size = cramfs_load ((char *) offset, &part, filename);
|
||||
|
||||
if (size > 0) {
|
||||
char buf[10];
|
||||
printf("### CRAMFS load complete: %d bytes loaded to 0x%lx\n",
|
||||
size, offset);
|
||||
sprintf(buf, "%x", size);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", size);
|
||||
} else {
|
||||
printf("### CRAMFS LOAD ERROR<%x> for %s!\n", size, filename);
|
||||
}
|
||||
|
|
|
@ -40,7 +40,6 @@ int do_fdosboot(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
char *name;
|
||||
char *ep;
|
||||
int size;
|
||||
char buf [12];
|
||||
int drive = CONFIG_SYS_FDC_DRIVE_NUMBER;
|
||||
|
||||
/* pre-set load_addr */
|
||||
|
@ -91,8 +90,7 @@ int do_fdosboot(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
}
|
||||
flush_cache (load_addr, size);
|
||||
|
||||
sprintf(buf, "%x", size);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", size);
|
||||
|
||||
printf("Floppy DOS load complete: %d bytes loaded to 0x%lx\n",
|
||||
size, load_addr);
|
||||
|
|
|
@ -55,12 +55,8 @@ struct fdt_header *working_fdt;
|
|||
|
||||
void set_working_fdt_addr(void *addr)
|
||||
{
|
||||
char buf[17];
|
||||
|
||||
working_fdt = addr;
|
||||
|
||||
sprintf(buf, "%lx", (unsigned long)addr);
|
||||
setenv("fdtaddr", buf);
|
||||
setenv_addr("fdtaddr", addr);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -347,10 +343,7 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
}
|
||||
if (subcmd[0] == 's') {
|
||||
/* get the num nodes at this level */
|
||||
char buf[11];
|
||||
|
||||
sprintf(buf, "%d", curIndex + 1);
|
||||
setenv(var, buf);
|
||||
setenv_ulong(var, curIndex + 1);
|
||||
} else {
|
||||
/* node index not found */
|
||||
printf("libfdt node not found\n");
|
||||
|
|
|
@ -26,22 +26,30 @@
|
|||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <hash.h>
|
||||
#include <linux/ctype.h>
|
||||
|
||||
static int do_hash(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
char *s;
|
||||
#ifdef CONFIG_HASH_VERIFY
|
||||
int verify = 0;
|
||||
int flags = HASH_FLAG_ENV;
|
||||
|
||||
if (argc < 4)
|
||||
return CMD_RET_USAGE;
|
||||
if (!strcmp(argv[1], "-v")) {
|
||||
verify = 1;
|
||||
flags |= HASH_FLAG_VERIFY;
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
#else
|
||||
const int flags = HASH_FLAG_ENV;
|
||||
#endif
|
||||
/* Move forward to 'algorithm' parameter */
|
||||
argc--;
|
||||
argv++;
|
||||
return hash_command(*argv, verify, cmdtp, flag, argc - 1, argv + 1);
|
||||
for (s = *argv; *s; s++)
|
||||
*s = tolower(*s);
|
||||
return hash_command(*argv, flags, cmdtp, flag, argc - 1, argv + 1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HASH_VERIFY
|
||||
|
|
|
@ -525,11 +525,9 @@ int do_jffs2_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
}
|
||||
|
||||
if (size > 0) {
|
||||
char buf[10];
|
||||
printf("### %s load complete: %d bytes loaded to 0x%lx\n",
|
||||
fsname, size, offset);
|
||||
sprintf(buf, "%x", size);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", size);
|
||||
} else {
|
||||
printf("### %s LOAD ERROR<%x> for %s!\n", fsname, size, filename);
|
||||
}
|
||||
|
|
|
@ -149,7 +149,6 @@ static ulong load_serial(long offset)
|
|||
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;
|
||||
|
@ -198,8 +197,7 @@ static ulong load_serial(long offset)
|
|||
start_addr, end_addr, size, size
|
||||
);
|
||||
flush_cache(start_addr, size);
|
||||
sprintf(buf, "%lX", size);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", size);
|
||||
return (addr);
|
||||
case SREC_START:
|
||||
break;
|
||||
|
@ -519,7 +517,6 @@ static int do_load_serial_bin(cmd_tbl_t *cmdtp, int flag, int argc,
|
|||
static ulong load_serial_bin(ulong offset)
|
||||
{
|
||||
int size, i;
|
||||
char buf[32];
|
||||
|
||||
set_kerm_bin_mode((ulong *) offset);
|
||||
size = k_recv();
|
||||
|
@ -539,8 +536,7 @@ static ulong load_serial_bin(ulong offset)
|
|||
flush_cache(offset, size);
|
||||
|
||||
printf("## Total Size = 0x%08x = %d Bytes\n", size, size);
|
||||
sprintf(buf, "%X", size);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", size);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
@ -965,7 +961,6 @@ static int getcxmodem(void) {
|
|||
static ulong load_serial_ymodem(ulong offset)
|
||||
{
|
||||
int size;
|
||||
char buf[32];
|
||||
int err;
|
||||
int res;
|
||||
connection_info_t info;
|
||||
|
@ -1012,8 +1007,7 @@ static ulong load_serial_ymodem(ulong offset)
|
|||
flush_cache(offset, size);
|
||||
|
||||
printf("## Total Size = 0x%08x = %d Bytes\n", size, size);
|
||||
sprintf(buf, "%X", size);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", size);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
|
847
common/cmd_mem.c
847
common/cmd_mem.c
File diff suppressed because it is too large
Load diff
|
@ -230,7 +230,6 @@ static void memsize_format(char *buf, u32 size)
|
|||
*/
|
||||
static void index_partitions(void)
|
||||
{
|
||||
char buf[16];
|
||||
u16 mtddevnum;
|
||||
struct part_info *part;
|
||||
struct list_head *dentry;
|
||||
|
@ -244,8 +243,7 @@ static void index_partitions(void)
|
|||
dev = list_entry(dentry, struct mtd_device, link);
|
||||
if (dev == current_mtd_dev) {
|
||||
mtddevnum += current_mtd_partnum;
|
||||
sprintf(buf, "%d", mtddevnum);
|
||||
setenv("mtddevnum", buf);
|
||||
setenv_ulong("mtddevnum", mtddevnum);
|
||||
break;
|
||||
}
|
||||
mtddevnum += dev->num_parts;
|
||||
|
|
|
@ -373,7 +373,6 @@ static void nand_print_and_set_info(int idx)
|
|||
{
|
||||
nand_info_t *nand = &nand_info[idx];
|
||||
struct nand_chip *chip = nand->priv;
|
||||
char buf[32];
|
||||
|
||||
printf("Device %d: ", idx);
|
||||
if (chip->numchips > 1)
|
||||
|
@ -385,14 +384,9 @@ static void nand_print_and_set_info(int idx)
|
|||
printf(" Erase size %8d b\n", nand->erasesize);
|
||||
|
||||
/* Set geometry info */
|
||||
sprintf(buf, "%x", nand->writesize);
|
||||
setenv("nand_writesize", buf);
|
||||
|
||||
sprintf(buf, "%x", nand->oobsize);
|
||||
setenv("nand_oobsize", buf);
|
||||
|
||||
sprintf(buf, "%x", nand->erasesize);
|
||||
setenv("nand_erasesize", buf);
|
||||
setenv_hex("nand_writesize", nand->writesize);
|
||||
setenv_hex("nand_oobsize", nand->oobsize);
|
||||
setenv_hex("nand_erasesize", nand->erasesize);
|
||||
}
|
||||
|
||||
static int raw_access(nand_info_t *nand, ulong addr, loff_t off, ulong count,
|
||||
|
|
|
@ -295,17 +295,17 @@ int setenv_ulong(const char *varname, ulong value)
|
|||
}
|
||||
|
||||
/**
|
||||
* Set an environment variable to an address in hex
|
||||
* Set an environment variable to an value in hex
|
||||
*
|
||||
* @param varname Environmet variable to set
|
||||
* @param addr Value to set it to
|
||||
* @param value Value to set it to
|
||||
* @return 0 if ok, 1 on error
|
||||
*/
|
||||
int setenv_addr(const char *varname, const void *addr)
|
||||
int setenv_hex(const char *varname, ulong value)
|
||||
{
|
||||
char str[17];
|
||||
|
||||
sprintf(str, "%lx", (uintptr_t)addr);
|
||||
sprintf(str, "%lx", value);
|
||||
return setenv(varname, str);
|
||||
}
|
||||
|
||||
|
@ -891,8 +891,7 @@ NXTARG: ;
|
|||
envp->flags = ACTIVE_FLAG;
|
||||
#endif
|
||||
}
|
||||
sprintf(buf, "%zX", (size_t)(len + offsetof(env_t, data)));
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", len + offsetof(env_t, data));
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -100,7 +100,6 @@ int do_reiserload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
ulong addr = 0, filelen;
|
||||
disk_partition_t info;
|
||||
block_dev_desc_t *dev_desc = NULL;
|
||||
char buf [12];
|
||||
unsigned long count;
|
||||
char *addr_str;
|
||||
|
||||
|
@ -175,8 +174,7 @@ int do_reiserload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
load_addr = addr;
|
||||
|
||||
printf ("\n%ld bytes read\n", filelen);
|
||||
sprintf(buf, "%lX", filelen);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", filelen);
|
||||
|
||||
return filelen;
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@ static ulong get_arg(char *s, int w)
|
|||
static int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
ulong a, b;
|
||||
char buf[16];
|
||||
ulong value;
|
||||
int w;
|
||||
|
||||
/* Validate arguments */
|
||||
|
@ -67,8 +67,7 @@ static int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
a = get_arg(argv[2], w);
|
||||
|
||||
if (argc == 3) {
|
||||
sprintf(buf, "%lx", a);
|
||||
setenv(argv[1], buf);
|
||||
setenv_hex(argv[1], a);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -76,20 +75,36 @@ static int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
b = get_arg(argv[4], w);
|
||||
|
||||
switch (argv[3][0]) {
|
||||
case '|': sprintf(buf, "%lx", (a | b)); break;
|
||||
case '&': sprintf(buf, "%lx", (a & b)); break;
|
||||
case '+': sprintf(buf, "%lx", (a + b)); break;
|
||||
case '^': sprintf(buf, "%lx", (a ^ b)); break;
|
||||
case '-': sprintf(buf, "%lx", (a - b)); break;
|
||||
case '*': sprintf(buf, "%lx", (a * b)); break;
|
||||
case '/': sprintf(buf, "%lx", (a / b)); break;
|
||||
case '%': sprintf(buf, "%lx", (a % b)); break;
|
||||
case '|':
|
||||
value = a | b;
|
||||
break;
|
||||
case '&':
|
||||
value = a & b;
|
||||
break;
|
||||
case '+':
|
||||
value = a + b;
|
||||
break;
|
||||
case '^':
|
||||
value = a ^ b;
|
||||
break;
|
||||
case '-':
|
||||
value = a - b;
|
||||
break;
|
||||
case '*':
|
||||
value = a * b;
|
||||
break;
|
||||
case '/':
|
||||
value = a / b;
|
||||
break;
|
||||
case '%':
|
||||
value = a % b;
|
||||
break;
|
||||
default:
|
||||
printf("invalid op\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
setenv(argv[1], buf);
|
||||
setenv_hex(argv[1], value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
int do_sha1sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
int verify = 0;
|
||||
int flags = HASH_FLAG_ENV;
|
||||
int ac;
|
||||
char * const *av;
|
||||
|
||||
|
@ -42,13 +42,13 @@ int do_sha1sum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
ac = argc - 1;
|
||||
#ifdef CONFIG_SHA1SUM_VERIFY
|
||||
if (strcmp(*av, "-v") == 0) {
|
||||
verify = 1;
|
||||
flags |= HASH_FLAG_VERIFY;
|
||||
av++;
|
||||
ac--;
|
||||
}
|
||||
#endif
|
||||
|
||||
return hash_command("sha1", verify, cmdtp, flag, ac, av);
|
||||
return hash_command("sha1", flags, cmdtp, flag, ac, av);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SHA1SUM_VERIFY
|
||||
|
|
|
@ -28,7 +28,6 @@ static int do_unzip(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
{
|
||||
unsigned long src, dst;
|
||||
unsigned long src_len = ~0UL, dst_len = ~0UL;
|
||||
char buf[32];
|
||||
|
||||
switch (argc) {
|
||||
case 4:
|
||||
|
@ -46,8 +45,7 @@ static int do_unzip(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
return 1;
|
||||
|
||||
printf("Uncompressed size: %ld = 0x%lX\n", src_len, src_len);
|
||||
sprintf(buf, "%lX", src_len);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", src_len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -50,7 +50,6 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
|||
ulong data, len, count;
|
||||
int verify;
|
||||
int part = 0;
|
||||
char pbuf[10];
|
||||
image_header_t *hdr;
|
||||
#if defined(CONFIG_FIT)
|
||||
const char *uname = NULL;
|
||||
|
@ -256,10 +255,8 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
|||
puts("OK\n");
|
||||
}
|
||||
|
||||
sprintf(pbuf, "%8lx", data);
|
||||
setenv("fileaddr", pbuf);
|
||||
sprintf(pbuf, "%8lx", len);
|
||||
setenv("filesize", pbuf);
|
||||
setenv_hex("fileaddr", data);
|
||||
setenv_hex("filesize", len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -129,8 +129,7 @@ static int do_zfs_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]
|
|||
load_addr = addr;
|
||||
|
||||
printf("%llu bytes read\n", zfile.size);
|
||||
sprintf(buf, "%llX", zfile.size);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", zfile.size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,6 @@ static int do_zip(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
{
|
||||
unsigned long src, dst;
|
||||
unsigned long src_len, dst_len = ~0UL;
|
||||
char buf[32];
|
||||
|
||||
switch (argc) {
|
||||
case 5:
|
||||
|
@ -47,8 +46,7 @@ static int do_zip(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
return 1;
|
||||
|
||||
printf("Compressed size: %ld = 0x%lX\n", dst_len, dst_len);
|
||||
sprintf(buf, "%lX", dst_len);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", dst_len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
200
common/hash.c
200
common/hash.c
|
@ -28,49 +28,87 @@
|
|||
#include <hash.h>
|
||||
#include <sha1.h>
|
||||
#include <sha256.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
/*
|
||||
* These are the hash algorithms we support. Chips which support accelerated
|
||||
* crypto could perhaps add named version of these algorithms here.
|
||||
* crypto could perhaps add named version of these algorithms here. Note that
|
||||
* algorithm names must be in lower case.
|
||||
*/
|
||||
static struct hash_algo hash_algo[] = {
|
||||
#ifdef CONFIG_SHA1
|
||||
/*
|
||||
* This is CONFIG_CMD_SHA1SUM instead of CONFIG_SHA1 since otherwise
|
||||
* it bloats the code for boards which use SHA1 but not the 'hash'
|
||||
* or 'sha1sum' commands.
|
||||
*/
|
||||
#ifdef CONFIG_CMD_SHA1SUM
|
||||
{
|
||||
"SHA1",
|
||||
"sha1",
|
||||
SHA1_SUM_LEN,
|
||||
sha1_csum_wd,
|
||||
CHUNKSZ_SHA1,
|
||||
},
|
||||
#define MULTI_HASH
|
||||
#endif
|
||||
#ifdef CONFIG_SHA256
|
||||
{
|
||||
"SHA256",
|
||||
"sha256",
|
||||
SHA256_SUM_LEN,
|
||||
sha256_csum_wd,
|
||||
CHUNKSZ_SHA256,
|
||||
},
|
||||
#define MULTI_HASH
|
||||
#endif
|
||||
{
|
||||
"crc32",
|
||||
4,
|
||||
crc32_wd_buf,
|
||||
CHUNKSZ_CRC32,
|
||||
},
|
||||
};
|
||||
|
||||
#if defined(CONFIG_HASH_VERIFY) || defined(CONFIG_CMD_HASH)
|
||||
#define MULTI_HASH
|
||||
#endif
|
||||
|
||||
/* Try to minimize code size for boards that don't want much hashing */
|
||||
#ifdef MULTI_HASH
|
||||
#define multi_hash() 1
|
||||
#else
|
||||
#define multi_hash() 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* store_result: Store the resulting sum to an address or variable
|
||||
*
|
||||
* @algo: Hash algorithm being used
|
||||
* @sum: Hash digest (algo->digest_size bytes)
|
||||
* @dest: Destination, interpreted as a hex address if it starts
|
||||
* with * or otherwise as an environment variable.
|
||||
* with * (or allow_env_vars is 0) or otherwise as an
|
||||
* environment variable.
|
||||
* @allow_env_vars: non-zero to permit storing the result to an
|
||||
* variable environment
|
||||
*/
|
||||
static void store_result(struct hash_algo *algo, const u8 *sum,
|
||||
const char *dest)
|
||||
const char *dest, int allow_env_vars)
|
||||
{
|
||||
unsigned int i;
|
||||
int env_var = 0;
|
||||
|
||||
if (*dest == '*') {
|
||||
u8 *ptr;
|
||||
/*
|
||||
* If environment variables are allowed, then we assume that 'dest'
|
||||
* is an environment variable, unless it starts with *, in which
|
||||
* case we assume it is an address. If not allowed, it is always an
|
||||
* address. This is to support the crc32 command.
|
||||
*/
|
||||
if (allow_env_vars) {
|
||||
if (*dest == '*')
|
||||
dest++;
|
||||
else
|
||||
env_var = 1;
|
||||
}
|
||||
|
||||
ptr = (u8 *)simple_strtoul(dest + 1, NULL, 16);
|
||||
memcpy(ptr, sum, algo->digest_size);
|
||||
} else {
|
||||
if (env_var) {
|
||||
char str_output[HASH_MAX_DIGEST_SIZE * 2 + 1];
|
||||
char *str_ptr = str_output;
|
||||
|
||||
|
@ -80,6 +118,14 @@ static void store_result(struct hash_algo *algo, const u8 *sum,
|
|||
}
|
||||
str_ptr = '\0';
|
||||
setenv(dest, str_output);
|
||||
} else {
|
||||
ulong addr;
|
||||
void *buf;
|
||||
|
||||
addr = simple_strtoul(dest, NULL, 16);
|
||||
buf = map_sysmem(addr, algo->digest_size);
|
||||
memcpy(buf, sum, algo->digest_size);
|
||||
unmap_sysmem(buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -94,15 +140,31 @@ static void store_result(struct hash_algo *algo, const u8 *sum,
|
|||
* Otherwise we assume it is an environment variable, and
|
||||
* look up its value (it must contain a hex digest).
|
||||
* @vsum: Returns binary digest value (algo->digest_size bytes)
|
||||
* @allow_env_vars: non-zero to permit storing the result to an environment
|
||||
* variable. If 0 then verify_str is assumed to be an
|
||||
* address, and the * prefix is not expected.
|
||||
* @return 0 if ok, non-zero on error
|
||||
*/
|
||||
static int parse_verify_sum(struct hash_algo *algo, char *verify_str, u8 *vsum)
|
||||
static int parse_verify_sum(struct hash_algo *algo, char *verify_str, u8 *vsum,
|
||||
int allow_env_vars)
|
||||
{
|
||||
if (*verify_str == '*') {
|
||||
u8 *ptr;
|
||||
int env_var = 0;
|
||||
|
||||
ptr = (u8 *)simple_strtoul(verify_str + 1, NULL, 16);
|
||||
memcpy(vsum, ptr, algo->digest_size);
|
||||
/* See comment above in store_result() */
|
||||
if (allow_env_vars) {
|
||||
if (*verify_str == '*')
|
||||
verify_str++;
|
||||
else
|
||||
env_var = 1;
|
||||
}
|
||||
|
||||
if (env_var) {
|
||||
ulong addr;
|
||||
void *buf;
|
||||
|
||||
addr = simple_strtoul(verify_str, NULL, 16);
|
||||
buf = map_sysmem(addr, algo->digest_size);
|
||||
memcpy(vsum, buf, algo->digest_size);
|
||||
} else {
|
||||
unsigned int i;
|
||||
char *vsum_str;
|
||||
|
@ -141,7 +203,7 @@ static struct hash_algo *find_hash_algo(const char *name)
|
|||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(hash_algo); i++) {
|
||||
if (!strcasecmp(name, hash_algo[i].name))
|
||||
if (!strcmp(name, hash_algo[i].name))
|
||||
return &hash_algo[i];
|
||||
}
|
||||
|
||||
|
@ -158,63 +220,87 @@ static void show_hash(struct hash_algo *algo, ulong addr, ulong len,
|
|||
printf("%02x", output[i]);
|
||||
}
|
||||
|
||||
int hash_command(const char *algo_name, int verify, cmd_tbl_t *cmdtp, int flag,
|
||||
int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
|
||||
int argc, char * const argv[])
|
||||
{
|
||||
struct hash_algo *algo;
|
||||
ulong addr, len;
|
||||
u8 output[HASH_MAX_DIGEST_SIZE];
|
||||
u8 vsum[HASH_MAX_DIGEST_SIZE];
|
||||
|
||||
if (argc < 2)
|
||||
return CMD_RET_USAGE;
|
||||
|
||||
algo = find_hash_algo(algo_name);
|
||||
if (!algo) {
|
||||
printf("Unknown hash algorithm '%s'\n", algo_name);
|
||||
return CMD_RET_USAGE;
|
||||
}
|
||||
addr = simple_strtoul(*argv++, NULL, 16);
|
||||
len = simple_strtoul(*argv++, NULL, 16);
|
||||
argc -= 2;
|
||||
|
||||
if (algo->digest_size > HASH_MAX_DIGEST_SIZE) {
|
||||
puts("HASH_MAX_DIGEST_SIZE exceeded\n");
|
||||
return 1;
|
||||
}
|
||||
if (multi_hash()) {
|
||||
struct hash_algo *algo;
|
||||
u8 output[HASH_MAX_DIGEST_SIZE];
|
||||
u8 vsum[HASH_MAX_DIGEST_SIZE];
|
||||
void *buf;
|
||||
|
||||
algo->hash_func_ws((const unsigned char *)addr, len, output,
|
||||
algo->chunk_size);
|
||||
|
||||
/* Try to avoid code bloat when verify is not needed */
|
||||
#ifdef CONFIG_HASH_VERIFY
|
||||
if (verify) {
|
||||
#else
|
||||
if (0) {
|
||||
#endif
|
||||
if (!argc)
|
||||
algo = find_hash_algo(algo_name);
|
||||
if (!algo) {
|
||||
printf("Unknown hash algorithm '%s'\n", algo_name);
|
||||
return CMD_RET_USAGE;
|
||||
if (parse_verify_sum(algo, *argv, vsum)) {
|
||||
printf("ERROR: %s does not contain a valid %s sum\n",
|
||||
*argv, algo->name);
|
||||
}
|
||||
argc -= 2;
|
||||
|
||||
if (algo->digest_size > HASH_MAX_DIGEST_SIZE) {
|
||||
puts("HASH_MAX_DIGEST_SIZE exceeded\n");
|
||||
return 1;
|
||||
}
|
||||
if (memcmp(output, vsum, algo->digest_size) != 0) {
|
||||
int i;
|
||||
|
||||
buf = map_sysmem(addr, len);
|
||||
algo->hash_func_ws(buf, len, output, algo->chunk_size);
|
||||
unmap_sysmem(buf);
|
||||
|
||||
/* Try to avoid code bloat when verify is not needed */
|
||||
#ifdef CONFIG_HASH_VERIFY
|
||||
if (flags & HASH_FLAG_VERIFY) {
|
||||
#else
|
||||
if (0) {
|
||||
#endif
|
||||
if (!argc)
|
||||
return CMD_RET_USAGE;
|
||||
if (parse_verify_sum(algo, *argv, vsum,
|
||||
flags & HASH_FLAG_ENV)) {
|
||||
printf("ERROR: %s does not contain a valid "
|
||||
"%s sum\n", *argv, algo->name);
|
||||
return 1;
|
||||
}
|
||||
if (memcmp(output, vsum, algo->digest_size) != 0) {
|
||||
int i;
|
||||
|
||||
show_hash(algo, addr, len, output);
|
||||
printf(" != ");
|
||||
for (i = 0; i < algo->digest_size; i++)
|
||||
printf("%02x", vsum[i]);
|
||||
puts(" ** ERROR **\n");
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
show_hash(algo, addr, len, output);
|
||||
printf(" != ");
|
||||
for (i = 0; i < algo->digest_size; i++)
|
||||
printf("%02x", vsum[i]);
|
||||
puts(" ** ERROR **\n");
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
show_hash(algo, addr, len, output);
|
||||
printf("\n");
|
||||
printf("\n");
|
||||
|
||||
if (argc)
|
||||
store_result(algo, output, *argv);
|
||||
if (argc) {
|
||||
store_result(algo, output, *argv,
|
||||
flags & HASH_FLAG_ENV);
|
||||
}
|
||||
}
|
||||
|
||||
/* Horrible code size hack for boards that just want crc32 */
|
||||
} else {
|
||||
ulong crc;
|
||||
ulong *ptr;
|
||||
|
||||
crc = crc32_wd(0, (const uchar *)addr, len, CHUNKSZ_CRC32);
|
||||
|
||||
printf("CRC32 for %08lx ... %08lx ==> %08lx\n",
|
||||
addr, addr + len - 1, crc);
|
||||
|
||||
if (argc > 3) {
|
||||
ptr = (ulong *)simple_strtoul(argv[3], NULL, 16);
|
||||
*ptr = crc;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -74,6 +74,8 @@ static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
|
|||
#include <image.h>
|
||||
#endif /* !USE_HOSTCC*/
|
||||
|
||||
#include <u-boot/crc.h>
|
||||
|
||||
static const table_entry_t uimage_arch[] = {
|
||||
{ IH_ARCH_INVALID, NULL, "Invalid ARCH", },
|
||||
{ IH_ARCH_ALPHA, "alpha", "Alpha", },
|
||||
|
@ -160,8 +162,6 @@ static const table_entry_t uimage_comp[] = {
|
|||
{ -1, "", "", },
|
||||
};
|
||||
|
||||
uint32_t crc32(uint32_t, const unsigned char *, uint);
|
||||
uint32_t crc32_wd(uint32_t, const unsigned char *, uint, uint);
|
||||
#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC)
|
||||
static void genimg_print_time(time_t timestamp);
|
||||
#endif
|
||||
|
|
|
@ -362,7 +362,6 @@ static void fm_init_qmi(struct fm_qmi_common *qmi)
|
|||
int fm_init_common(int index, struct ccsr_fman *reg)
|
||||
{
|
||||
int rc;
|
||||
char env_addr[32];
|
||||
#if defined(CONFIG_SYS_QE_FMAN_FW_IN_NOR)
|
||||
void *addr = (void *)CONFIG_SYS_QE_FMAN_FW_ADDR;
|
||||
#elif defined(CONFIG_SYS_QE_FMAN_FW_IN_NAND)
|
||||
|
@ -416,8 +415,7 @@ int fm_init_common(int index, struct ccsr_fman *reg)
|
|||
rc = fman_upload_firmware(index, ®->fm_imem, addr);
|
||||
if (rc)
|
||||
return rc;
|
||||
sprintf(env_addr, "0x%lx", (long unsigned int)addr);
|
||||
setenv("fman_ucode", env_addr);
|
||||
setenv_addr("fman_ucode", addr);
|
||||
|
||||
fm_init_muram(index, ®->muram);
|
||||
fm_init_qmi(®->fm_qmi_common);
|
||||
|
|
|
@ -30,6 +30,19 @@
|
|||
#include <serial.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
/*
|
||||
*
|
||||
* serial_buf: A buffer that holds keyboard characters for the
|
||||
* Sandbox U-boot.
|
||||
*
|
||||
* invariants:
|
||||
* serial_buf_write == serial_buf_read -> empty buffer
|
||||
* (serial_buf_write + 1) % 16 == serial_buf_read -> full buffer
|
||||
*/
|
||||
static char serial_buf[16];
|
||||
static unsigned int serial_buf_write;
|
||||
static unsigned int serial_buf_read;
|
||||
|
||||
static int sandbox_serial_init(void)
|
||||
{
|
||||
os_tty_raw(0);
|
||||
|
@ -50,18 +63,37 @@ static void sandbox_serial_puts(const char *str)
|
|||
os_write(1, str, strlen(str));
|
||||
}
|
||||
|
||||
static int sandbox_serial_getc(void)
|
||||
static unsigned int increment_buffer_index(unsigned int index)
|
||||
{
|
||||
char buf;
|
||||
ssize_t count;
|
||||
|
||||
count = os_read(0, &buf, 1);
|
||||
return count == 1 ? buf : 0;
|
||||
return (index + 1) % ARRAY_SIZE(serial_buf);
|
||||
}
|
||||
|
||||
static int sandbox_serial_tstc(void)
|
||||
{
|
||||
return 0;
|
||||
const unsigned int next_index =
|
||||
increment_buffer_index(serial_buf_write);
|
||||
ssize_t count;
|
||||
|
||||
os_usleep(100);
|
||||
if (next_index == serial_buf_read)
|
||||
return 1; /* buffer full */
|
||||
|
||||
count = os_read_no_block(0, &serial_buf[serial_buf_write], 1);
|
||||
if (count == 1)
|
||||
serial_buf_write = next_index;
|
||||
return serial_buf_write != serial_buf_read;
|
||||
}
|
||||
|
||||
static int sandbox_serial_getc(void)
|
||||
{
|
||||
int result;
|
||||
|
||||
while (!sandbox_serial_tstc())
|
||||
; /* buffer empty */
|
||||
|
||||
result = serial_buf[serial_buf_read];
|
||||
serial_buf_read = increment_buffer_index(serial_buf_read);
|
||||
return result;
|
||||
}
|
||||
|
||||
static struct serial_device sandbox_serial_drv = {
|
||||
|
|
4
fs/fs.c
4
fs/fs.c
|
@ -256,7 +256,6 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
|||
unsigned long bytes;
|
||||
unsigned long pos;
|
||||
int len_read;
|
||||
char buf[12];
|
||||
unsigned long time;
|
||||
|
||||
if (argc < 2)
|
||||
|
@ -308,8 +307,7 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
|
|||
}
|
||||
puts("\n");
|
||||
|
||||
sprintf(buf, "0x%x", len_read);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", len_read);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -687,7 +687,6 @@ int ubifs_load(char *filename, u32 addr, u32 size)
|
|||
int i;
|
||||
int count;
|
||||
int last_block_size = 0;
|
||||
char buf [10];
|
||||
|
||||
c->ubi = ubi_open_volume(c->vi.ubi_num, c->vi.vol_id, UBI_READONLY);
|
||||
/* ubifs_findfile will resolve symlinks, so we know that we get
|
||||
|
@ -740,8 +739,7 @@ int ubifs_load(char *filename, u32 addr, u32 size)
|
|||
if (err)
|
||||
printf("Error reading file '%s'\n", filename);
|
||||
else {
|
||||
sprintf(buf, "%X", size);
|
||||
setenv("filesize", buf);
|
||||
setenv_hex("filesize", size);
|
||||
printf("Done\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -270,7 +270,8 @@ int cpu_init(void);
|
|||
phys_size_t initdram (int);
|
||||
int display_options (void);
|
||||
void print_size(unsigned long long, const char *);
|
||||
int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen);
|
||||
int print_buffer(ulong addr, const void *data, uint width, uint count,
|
||||
uint linelen);
|
||||
|
||||
/* common/main.c */
|
||||
void main_loop (void);
|
||||
|
@ -357,7 +358,19 @@ int getenv_yesno(const char *var);
|
|||
int saveenv (void);
|
||||
int setenv (const char *, const char *);
|
||||
int setenv_ulong(const char *varname, ulong value);
|
||||
int setenv_addr(const char *varname, const void *addr);
|
||||
int setenv_hex(const char *varname, ulong value);
|
||||
/**
|
||||
* setenv_addr - Set an environment variable to an address in hex
|
||||
*
|
||||
* @varname: Environmet variable to set
|
||||
* @addr: Value to set it to
|
||||
* @return 0 if ok, 1 on error
|
||||
*/
|
||||
static inline int setenv_addr(const char *varname, const void *addr)
|
||||
{
|
||||
return setenv_hex(varname, (ulong)addr);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARM
|
||||
# include <asm/mach-types.h>
|
||||
# include <asm/setup.h>
|
||||
|
@ -869,6 +882,18 @@ int cpu_disable(int nr);
|
|||
int cpu_release(int nr, int argc, char * const argv[]);
|
||||
#endif
|
||||
|
||||
/* Define a null map_sysmem() if the architecture doesn't use it */
|
||||
# ifndef CONFIG_ARCH_MAP_SYSMEM
|
||||
static inline void *map_sysmem(phys_addr_t paddr, unsigned long len)
|
||||
{
|
||||
return (void *)(uintptr_t)paddr;
|
||||
}
|
||||
|
||||
static inline void unmap_sysmem(const void *vaddr)
|
||||
{
|
||||
}
|
||||
# endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#ifdef CONFIG_PPC
|
||||
|
|
|
@ -63,8 +63,8 @@
|
|||
#define CONFIG_SYS_HZ 1000
|
||||
|
||||
/* Memory things - we don't really want a memory test */
|
||||
#define CONFIG_SYS_LOAD_ADDR 0x10000000
|
||||
#define CONFIG_SYS_MEMTEST_START 0x10000000
|
||||
#define CONFIG_SYS_LOAD_ADDR 0x00000000
|
||||
#define CONFIG_SYS_MEMTEST_START 0x00100000
|
||||
#define CONFIG_SYS_MEMTEST_END (CONFIG_SYS_MEMTEST_START + 0x1000)
|
||||
#define CONFIG_PHYS_64BIT
|
||||
|
||||
|
@ -85,6 +85,11 @@
|
|||
#undef CONFIG_CMD_NET
|
||||
#undef CONFIG_CMD_NFS
|
||||
|
||||
#define CONFIG_CMD_HASH
|
||||
#define CONFIG_HASH_VERIFY
|
||||
#define CONFIG_SHA1
|
||||
#define CONFIG_SHA256
|
||||
|
||||
#define CONFIG_BOOTARGS ""
|
||||
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS "stdin=serial\0" \
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#ifndef _HASH_H
|
||||
#define _HASH_H
|
||||
|
||||
#ifdef CONFIG_SHA1SUM_VERIFY
|
||||
#if defined(CONFIG_SHA1SUM_VERIFY) || defined(CONFIG_CRC32_VERIFY)
|
||||
#define CONFIG_HASH_VERIFY
|
||||
#endif
|
||||
|
||||
|
@ -51,19 +51,24 @@ struct hash_algo {
|
|||
*/
|
||||
#define HASH_MAX_DIGEST_SIZE 32
|
||||
|
||||
enum {
|
||||
HASH_FLAG_VERIFY = 1 << 0, /* Enable verify mode */
|
||||
HASH_FLAG_ENV = 1 << 1, /* Allow env vars */
|
||||
};
|
||||
|
||||
/**
|
||||
* hash_command: Process a hash command for a particular algorithm
|
||||
*
|
||||
* This common function is used to implement specific hash commands.
|
||||
*
|
||||
* @algo_name: Hash algorithm being used
|
||||
* @verify: Non-zero to enable verify mode
|
||||
* @algo_name: Hash algorithm being used (lower case!)
|
||||
* @flags: Flags value (HASH_FLAG_...)
|
||||
* @cmdtp: Pointer to command table entry
|
||||
* @flag: Some flags normally 0 (see CMD_FLAG_.. above)
|
||||
* @argc: Number of arguments (arg 0 must be the command text)
|
||||
* @argv: Arguments
|
||||
*/
|
||||
int hash_command(const char *algo_name, int verify, cmd_tbl_t *cmdtp, int flag,
|
||||
int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
|
||||
int argc, char * const argv[]);
|
||||
|
||||
#endif
|
||||
|
|
10
include/os.h
10
include/os.h
|
@ -39,6 +39,16 @@ struct sandbox_state;
|
|||
*/
|
||||
ssize_t os_read(int fd, void *buf, size_t count);
|
||||
|
||||
/**
|
||||
* Access to the OS read() system call with non-blocking access
|
||||
*
|
||||
* \param fd File descriptor as returned by os_open()
|
||||
* \param buf Buffer to place data
|
||||
* \param count Number of bytes to read
|
||||
* \return number of bytes read, or -1 on error
|
||||
*/
|
||||
ssize_t os_read_no_block(int fd, void *buf, size_t count);
|
||||
|
||||
/**
|
||||
* Access to the OS write() system call
|
||||
*
|
||||
|
|
|
@ -30,4 +30,15 @@ uint32_t crc32 (uint32_t, const unsigned char *, uint);
|
|||
uint32_t crc32_wd (uint32_t, const unsigned char *, uint, uint);
|
||||
uint32_t crc32_no_comp (uint32_t, const unsigned char *, uint);
|
||||
|
||||
/**
|
||||
* crc32_wd_buf - Perform CRC32 on a buffer and return result in buffer
|
||||
*
|
||||
* @input: Input buffer
|
||||
* @ilen: Input buffer length
|
||||
* @output: Place to put checksum result (4 bytes)
|
||||
* @chunk_sz: Trigger watchdog after processing this many bytes
|
||||
*/
|
||||
void crc32_wd_buf(const unsigned char *input, uint ilen,
|
||||
unsigned char *output, uint chunk_sz);
|
||||
|
||||
#endif /* _UBOOT_CRC_H */
|
||||
|
|
|
@ -249,3 +249,12 @@ uint32_t ZEXPORT crc32_wd (uint32_t crc,
|
|||
|
||||
return crc;
|
||||
}
|
||||
|
||||
void crc32_wd_buf(const unsigned char *input, unsigned int ilen,
|
||||
unsigned char *output, unsigned int chunk_sz)
|
||||
{
|
||||
uint32_t crc;
|
||||
|
||||
crc = crc32_wd(0, input, ilen, chunk_sz);
|
||||
memcpy(output, &crc, sizeof(crc));
|
||||
}
|
||||
|
|
|
@ -98,7 +98,8 @@ void print_size(unsigned long long size, const char *s)
|
|||
*/
|
||||
#define MAX_LINE_LENGTH_BYTES (64)
|
||||
#define DEFAULT_LINE_LENGTH_BYTES (16)
|
||||
int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen)
|
||||
int print_buffer(ulong addr, const void *data, uint width, uint count,
|
||||
uint linelen)
|
||||
{
|
||||
/* linebuf as a union causes proper alignment */
|
||||
union linebuf {
|
||||
|
|
|
@ -528,15 +528,11 @@ restart:
|
|||
case NETLOOP_SUCCESS:
|
||||
net_cleanup_loop();
|
||||
if (NetBootFileXferSize > 0) {
|
||||
char buf[20];
|
||||
printf("Bytes transferred = %ld (%lx hex)\n",
|
||||
NetBootFileXferSize,
|
||||
NetBootFileXferSize);
|
||||
sprintf(buf, "%lX", NetBootFileXferSize);
|
||||
setenv("filesize", buf);
|
||||
|
||||
sprintf(buf, "%lX", (unsigned long)load_addr);
|
||||
setenv("fileaddr", buf);
|
||||
setenv_hex("filesize", NetBootFileXferSize);
|
||||
setenv_hex("fileaddr", load_addr);
|
||||
}
|
||||
if (protocol != NETCONS)
|
||||
eth_halt();
|
||||
|
|
Loading…
Reference in a new issue