Merge branch 'mem' of git://git.denx.de/u-boot-x86

This commit is contained in:
Tom Rini 2013-03-04 11:14:27 -05:00
commit 1c9f47ab2a
38 changed files with 784 additions and 606 deletions

9
README
View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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;
}

View File

@ -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)
{
}

View File

@ -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

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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");

View File

@ -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

View File

@ -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);
}

View File

@ -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;
}

File diff suppressed because it is too large Load Diff

View File

@ -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;

View File

@ -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,

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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

View File

@ -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, &reg->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, &reg->muram);
fm_init_qmi(&reg->fm_qmi_common);

View File

@ -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 = {

View File

@ -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;
}

View File

@ -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");
}

View File

@ -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

View File

@ -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" \

View File

@ -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

View File

@ -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
*

View File

@ -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 */

View File

@ -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));
}

View File

@ -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 {

View File

@ -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();