9
0
Fork 0

Merge branch 'for-next/env'

This commit is contained in:
Sascha Hauer 2014-03-07 09:24:40 +01:00
commit 4df69d0b6e
49 changed files with 649 additions and 265 deletions

2
.gitignore vendored
View File

@ -22,6 +22,8 @@
*.orig
*.dcd
*.dcd.S
*.bbenv
*.bbenv.*
#
# Top-level generic files

View File

@ -493,6 +493,7 @@ all: barebox-flash-image $(KBUILD_DTBS)
endif
common-$(CONFIG_PBL_IMAGE) += pbl/
common-$(CONFIG_DEFAULT_ENVIRONMENT) += defaultenv/
barebox-dirs := $(patsubst %/,%,$(filter %/, $(common-y)))
@ -504,6 +505,23 @@ barebox-alldirs := $(sort $(barebox-dirs) $(patsubst %/,%,$(filter %/, \
pbl-common-y := $(patsubst %/, %/built-in-pbl.o, $(common-y))
common-y := $(patsubst %/, %/built-in.o, $(common-y))
ifeq ($(CONFIG_DEFAULT_COMPRESSION_GZIP),y)
DEFAULT_COMPRESSION_SUFFIX := .gz
endif
ifeq ($(CONFIG_DEFAULT_COMPRESSED_BZIP2),y)
DEFAULT_COMPRESSION_SUFFIX := .bz2
endif
ifeq ($(CONFIG_DEFAULT_COMPRESSION_LZO),y)
DEFAULT_COMPRESSION_SUFFIX := .lzo
endif
ifeq ($(CONFIG_DEFAULT_COMPRESSION_LZ4),y)
DEFAULT_COMPRESSION_SUFFIX := .lz4
endif
ifeq ($(CONFIG_DEFAULT_COMPRESSION_NONE),y)
DEFAULT_COMPRESSION_SUFFIX :=
endif
export DEFAULT_COMPRESSION_SUFFIX
# Build barebox
# ---------------------------------------------------------------------------
# barebox is built from the objects selected by $(barebox-init) and
@ -1005,7 +1023,7 @@ clean: archclean $(clean-dirs)
@find . $(RCS_FIND_IGNORE) \
\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
-o -name '*.symtypes' \) \
-o -name '*.symtypes' -o -name '*.bbenv.*' -o -name "*.bbenv" \) \
-type f -print | xargs rm -f
# mrproper - Delete all generated files, including .config

View File

@ -1,5 +1,4 @@
CONFIG_ARCH_IMX=y
CONFIG_ARCH_IMX6=y
CONFIG_MACH_MX6Q_ARM2=y
CONFIG_IMX_IIM=y
CONFIG_IMX_IIM_FUSE_BLOW=y
@ -16,7 +15,7 @@ CONFIG_HUSH_FANCY_PROMPT=y
CONFIG_CMDLINE_EDITING=y
CONFIG_AUTO_COMPLETE=y
CONFIG_DEFAULT_ENVIRONMENT_GENERIC=y
CONFIG_DEFAULT_ENVIRONMENT_PATH="defaultenv arch/arm/boards/freescale-mx6-arm2/env/"
CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/freescale-mx6-arm2/env/"
CONFIG_DEBUG_INFO=y
CONFIG_CMD_EDIT=y
CONFIG_CMD_SLEEP=y
@ -25,6 +24,7 @@ CONFIG_CMD_EXPORT=y
CONFIG_CMD_PRINTENV=y
CONFIG_CMD_READLINE=y
CONFIG_CMD_TIME=y
CONFIG_CMD_TFTP=y
CONFIG_CMD_ECHO_E=y
CONFIG_CMD_MEMINFO=y
CONFIG_CMD_IOMEM=y
@ -35,7 +35,6 @@ CONFIG_CMD_BOOTM_INITRD=y
CONFIG_CMD_BOOTM_OFTREE=y
CONFIG_CMD_BOOTM_OFTREE_UIMAGE=y
CONFIG_CMD_UIMAGE=y
# CONFIG_CMD_BOOTZ is not set
# CONFIG_CMD_BOOTU is not set
CONFIG_CMD_RESET=y
CONFIG_CMD_GO=y
@ -49,8 +48,6 @@ CONFIG_NET=y
CONFIG_NET_DHCP=y
CONFIG_NET_NFS=y
CONFIG_NET_PING=y
CONFIG_CMD_TFTP=y
CONFIG_FS_TFTP=y
CONFIG_NET_NETCONSOLE=y
CONFIG_DRIVER_NET_FEC_IMX=y
CONFIG_NET_USB=y
@ -63,6 +60,7 @@ CONFIG_USB_STORAGE=y
CONFIG_MCI=y
CONFIG_MCI_STARTUP=y
CONFIG_MCI_IMX_ESDHC=y
CONFIG_FS_TFTP=y
CONFIG_FS_FAT=y
CONFIG_FS_FAT_WRITE=y
CONFIG_FS_FAT_LFN=y

View File

@ -48,6 +48,7 @@ SECTIONS
.rodata : {
*(.rodata);
*(.rodata.*)
*(.bbenv.rodata.*)
} > ram
. = ALIGN(4);

View File

@ -60,11 +60,14 @@ static int dfu_do_parse_one(char *partstr, char **endstr, struct usb_dfu_dev *df
case PARSE_FLAGS:
switch (*partstr) {
case 's':
dfu->flags |= DFU_FLAG_SAVE;
dfu->flags |= DFU_FLAG_SAFE;
break;
case 'r':
dfu->flags |= DFU_FLAG_READBACK;
break;
case 'c':
dfu->flags |= DFU_FLAG_CREATE;
break;
default:
return -EINVAL;
}
@ -170,9 +173,10 @@ BAREBOX_CMD_HELP_OPT ("-p <str>", "product string\n")
BAREBOX_CMD_HELP_OPT ("-V <id>", "vendor id\n")
BAREBOX_CMD_HELP_OPT ("-P <id>", "product id\n")
BAREBOX_CMD_HELP_OPT ("<description>",
"device1(name1)[sr],device2(name2)[sr]\n"
"device1(name1)[sr],device2(name2)[src]\n"
"'s' means 'safe mode' (download the complete image before flashing) and\n"
"'r' that readback of the firmware is allowed.\n")
"'r' that readback of the firmware is allowed.\n"
"'c' if given, the file will be created (for use with regular files)\n")
BAREBOX_CMD_HELP_END
/**

View File

@ -26,15 +26,17 @@
#include <envfs.h>
#include <errno.h>
#include <fs.h>
#include <malloc.h>
static int do_loadenv(int argc, char *argv[])
{
char *filename, *dirname;
char *filename = NULL, *dirname;
unsigned flags = 0;
int opt;
int scrub = 0;
int defaultenv = 0;
while ((opt = getopt(argc, argv, "ns")) > 0) {
while ((opt = getopt(argc, argv, "nsd")) > 0) {
switch (opt) {
case 'n':
flags |= ENV_FLAG_NO_OVERWRITE;
@ -42,6 +44,9 @@ static int do_loadenv(int argc, char *argv[])
case 's':
scrub = 1;
break;
case 'd':
defaultenv = 1;
break;
default:
return COMMAND_ERROR_USAGE;
}
@ -52,10 +57,24 @@ static int do_loadenv(int argc, char *argv[])
else
dirname = argv[optind + 1];
if (argc - optind < 1)
if (argc - optind < 1) {
filename = default_environment_path_get();
else
filename = argv[optind];
} else {
char *str = normalise_path(argv[optind]);
/*
* /dev/defaultenv use to contain the defaultenvironment.
* we do not have this file anymore, but maintain compatibility
* to the 'loadenv -s /dev/defaultenv' command to restore the
* default environment for some time.
*/
if (!strcmp(str, "/dev/defaultenv"))
defaultenv = 1;
else
filename = argv[optind];
free(str);
}
if (scrub) {
int ret;
@ -75,15 +94,19 @@ static int do_loadenv(int argc, char *argv[])
}
}
printf("loading environment from %s\n", filename);
printf("loading environment from %s\n", defaultenv ? "defaultenv" : filename);
return envfs_load(filename, dirname, flags);
if (defaultenv)
return defaultenv_load(dirname, flags);
else
return envfs_load(filename, dirname, flags);
}
BAREBOX_CMD_HELP_START(loadenv)
BAREBOX_CMD_HELP_USAGE("loadenv OPTIONS [ENVFS] [DIRECTORY]\n")
BAREBOX_CMD_HELP_OPT("-n", "do not overwrite existing files\n")
BAREBOX_CMD_HELP_OPT("-s", "scrub old environment\n")
BAREBOX_CMD_HELP_OPT("-d", "load default environment\n")
BAREBOX_CMD_HELP_SHORT("Load environment from ENVFS into DIRECTORY (default: /dev/env0 -> /env).\n")
BAREBOX_CMD_HELP_END

View File

@ -535,35 +535,38 @@ config DEFAULT_ENVIRONMENT
Enabling this option will give you a default environment when
the environment found in the environment sector is invalid
config DEFAULT_ENVIRONMENT_COMPRESSED
bool
depends on DEFAULT_ENVIRONMENT
depends on !IMAGE_COMPRESSION_LZO
depends on !IMAGE_COMPRESSION_GZIP
default y if ZLIB
default y if BZLIB
default y if LZO_DECOMPRESS
if DEFAULT_ENVIRONMENT_COMPRESSED
choice
prompt "compression"
prompt "default compression for in-barebox binaries"
default DEFAULT_COMPRESSION_NONE if PBL_IMAGE
default DEFAULT_COMPRESSION_LZO if LZO_DECOMPRESS
default DEFAULT_COMPRESSION_GZIP if ZLIB
default DEFAULT_COMPRESSION_LZ4 if LZ4_DECOMPRESS
default DEFAULT_COMPRESSION_BZIP2 if BZLIB
help
Select the default compression for in-barebox binary files. Files
compiled into barebox like for example the default environment will
be compressed with this compression type.
config DEFAULT_ENVIRONMENT_COMPRESSED_GZIP
config DEFAULT_COMPRESSION_GZIP
bool "gzip"
depends on ZLIB
config DEFAULT_ENVIRONMENT_COMPRESSED_BZIP2
config DEFAULT_COMPRESSION_BZIP2
bool "bzip2"
depends on BZLIB
config DEFAULT_ENVIRONMENT_COMPRESSED_LZO
config DEFAULT_COMPRESSION_LZO
bool "lzo"
depends on LZO_DECOMPRESS
endchoice
config DEFAULT_COMPRESSION_LZ4
bool "lz4"
depends on LZ4_DECOMPRESS
endif
config DEFAULT_COMPRESSION_NONE
bool "no compression"
endchoice
config HAVE_DEFAULT_ENVIRONMENT_NEW
bool
@ -584,6 +587,18 @@ config DEFAULT_ENVIRONMENT_GENERIC_NEW
select CMD_BOOT
prompt "Generic environment template"
config DEFAULT_ENVIRONMENT_GENERIC_NEW_MENU
bool
depends on DEFAULT_ENVIRONMENT_GENERIC_NEW
depends on CONFIG_CMD_MENU_MANAGEMENT
default y
config DEFAULT_ENVIRONMENT_GENERIC_NEW_DFU
bool
depends on DEFAULT_ENVIRONMENT_GENERIC_NEW
depends on USB_GADGET_DFU
default y
config DEFAULT_ENVIRONMENT_GENERIC
bool
depends on !HAVE_DEFAULT_ENVIRONMENT_NEW

View File

@ -1,119 +1,48 @@
obj-y += memory.o
obj-y += memory_display.o
obj-y += clock.o
obj-y += console_common.o
obj-y += startup.o
obj-y += misc.o
obj-y += memsize.o
obj-y += resource.o
obj-y += bootsource.o
obj-$(CONFIG_AUTO_COMPLETE) += complete.o
obj-$(CONFIG_BANNER) += version.o
obj-$(CONFIG_BAREBOX_UPDATE) += bbu.o
obj-$(CONFIG_BINFMT) += binfmt.o
obj-$(CONFIG_SHELL_HUSH) += hush.o
obj-$(CONFIG_SHELL_SIMPLE) += parser.o
obj-$(CONFIG_BLOCK) += block.o
obj-$(CONFIG_BLSPEC) += blspec.o
obj-$(CONFIG_BOOTM) += bootm.o
obj-$(CONFIG_CMD_LOADS) += s_record.o
obj-$(CONFIG_CMD_MEMTEST) += memtest.o
obj-$(CONFIG_COMMAND_SUPPORT) += command.o
obj-$(CONFIG_CONSOLE_FULL) += console.o
obj-$(CONFIG_CONSOLE_SIMPLE) += console_simple.o
obj-$(CONFIG_DIGEST) += digest.o
obj-$(CONFIG_DDR_SPD) += ddr_spd.o
obj-$(CONFIG_ENV_HANDLING) += environment.o
obj-$(CONFIG_ENVIRONMENT_VARIABLES) += env.o
obj-$(CONFIG_FILETYPE) += filetype.o
obj-$(CONFIG_FLEXIBLE_BOOTARGS) += bootargs.o
obj-$(CONFIG_GLOBALVAR) += globalvar.o
obj-$(CONFIG_GREGORIAN_CALENDER) += date.o
obj-$(CONFIG_KALLSYMS) += kallsyms.o
obj-$(CONFIG_ENV_HANDLING) += environment.o
obj-$(CONFIG_AUTO_COMPLETE) += complete.o
obj-$(CONFIG_POLLER) += poller.o
obj-$(CONFIG_BLOCK) += block.o
obj-$(CONFIG_PARTITION_DISK) += partitions.o partitions/
obj-$(CONFIG_CMD_LOADS) += s_record.o
obj-$(CONFIG_MALLOC_DLMALLOC) += dlmalloc.o
obj-$(CONFIG_MALLOC_TLSF) += tlsf_malloc.o tlsf.o
obj-$(CONFIG_MALLOC_DUMMY) += dummy_malloc.o
obj-$(CONFIG_MEMINFO) += meminfo.o
obj-$(CONFIG_MENU) += menu.o
obj-$(CONFIG_MODULES) += module.o
extra-$(CONFIG_MODULES) += module.lds
obj-$(CONFIG_OFTREE) += oftree.o
obj-$(CONFIG_BLSPEC) += blspec.o
obj-y += memory.o
obj-$(CONFIG_DDR_SPD) += ddr_spd.o
obj-y += memory_display.o
obj-$(CONFIG_MALLOC_DLMALLOC) += dlmalloc.o
obj-$(CONFIG_MALLOC_TLSF) += tlsf_malloc.o
obj-$(CONFIG_MALLOC_TLSF) += tlsf.o
obj-$(CONFIG_MALLOC_DUMMY) += dummy_malloc.o
obj-$(CONFIG_CMD_MEMTEST) += memtest.o
obj-y += clock.o
obj-$(CONFIG_BANNER) += version.o
obj-$(CONFIG_MEMINFO) += meminfo.o
obj-$(CONFIG_COMMAND_SUPPORT) += command.o
obj-$(CONFIG_CONSOLE_FULL) += console.o
obj-$(CONFIG_CONSOLE_SIMPLE) += console_simple.o
obj-y += console_common.o
obj-$(CONFIG_DIGEST) += digest.o
obj-$(CONFIG_ENVIRONMENT_VARIABLES) += env.o
obj-$(CONFIG_UIMAGE) += image.o
obj-$(CONFIG_UIMAGE) += uimage.o
obj-y += startup.o
obj-y += misc.o
obj-y += memsize.o
obj-$(CONFIG_GLOBALVAR) += globalvar.o
obj-$(CONFIG_RESET_SOURCE) += reset_source.o
obj-$(CONFIG_FILETYPE) += filetype.o
obj-y += resource.o
obj-$(CONFIG_MENU) += menu.o
obj-$(CONFIG_PASSWORD) += password.o
obj-$(CONFIG_MODULES) += module.o
obj-$(CONFIG_FLEXIBLE_BOOTARGS) += bootargs.o
obj-$(CONFIG_BAREBOX_UPDATE) += bbu.o
obj-y += bootsource.o
obj-$(CONFIG_BOOTM) += bootm.o
extra-$(CONFIG_MODULES) += module.lds
extra-y += barebox_default_env barebox_default_env.h
ifdef CONFIG_DEFAULT_ENVIRONMENT
$(obj)/startup.o: $(obj)/barebox_default_env.h
$(obj)/env.o: $(obj)/barebox_default_env.h
ifeq ($(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW),y)
DEFAULT_ENVIRONMENT_PATH = "defaultenv-2/base"
ifeq ($(CONFIG_CMD_MENU_MANAGEMENT),y)
DEFAULT_ENVIRONMENT_PATH += "defaultenv-2/menu"
endif
endif
ifeq ($(CONFIG_DEFAULT_ENVIRONMENT_GENERIC),y)
DEFAULT_ENVIRONMENT_PATH = "defaultenv"
endif
ifneq ($(CONFIG_DEFAULT_ENVIRONMENT_PATH),"")
DEFAULT_ENVIRONMENT_PATH += $(CONFIG_DEFAULT_ENVIRONMENT_PATH)
endif
ENV_FILES := $(shell cd $(srctree); for i in $(DEFAULT_ENVIRONMENT_PATH); do find $${i} -type f ; done)
endif # ifdef CONFIG_DEFAULT_ENVIRONMENT
#
# Generate a barebox envfs image.
#
# echo $(ENV_FILES) > /dev/null is just for letting if_changed
# recognize that something has changed when the environment has
# other files,
#
quiet_cmd_env = ENV $@
cmd_env = ($(srctree)/scripts/genenv $(srctree) $(objtree) $@ $(DEFAULT_ENVIRONMENT_PATH)) || \
(echo $(ENV_FILES) > /dev/null; rm -f $@ ; false)
$(obj)/barebox_default_env: $(ENV_FILES) FORCE
$(call if_changed,env)
barebox_default_env_comp =
ifeq ($(CONFIG_DEFAULT_ENVIRONMENT_COMPRESSED_GZIP),y)
barebox_default_env_comp = .gz
endif
ifeq ($(CONFIG_DEFAULT_ENVIRONMENT_COMPRESSED_BZIP2),y)
barebox_default_env_comp = .bz2
endif
ifeq ($(CONFIG_DEFAULT_ENVIRONMENT_COMPRESSED_LZO),y)
barebox_default_env_comp = .lzo
endif
$(obj)/barebox_default_env.gz: $(obj)/barebox_default_env FORCE
$(call if_changed,gzip)
$(obj)/barebox_default_env.bz2: $(obj)/barebox_default_env FORCE
$(call if_changed,bzip2)
$(obj)/barebox_default_env.lzo: $(obj)/barebox_default_env FORCE
$(call if_changed,lzo)
targets += barebox_default_env.lzo barebox_default_env.bz2 barebox_default_env.gz
quiet_cmd_env_h = ENVH $@
cmd_env_h = cat $< | (cd $(obj) && $(objtree)/scripts/bin2c default_environment) > $@; \
echo "static const int default_environment_uncompress_size=`stat -c%s $(obj)/barebox_default_env`;" >> $@
$(obj)/barebox_default_env.h: $(obj)/barebox_default_env$(barebox_default_env_comp) FORCE
$(call if_changed,env_h)
obj-$(CONFIG_PARTITION_DISK) += partitions.o partitions/
obj-$(CONFIG_PASSWORD) += password.o
obj-$(CONFIG_POLLER) += poller.o
obj-$(CONFIG_RESET_SOURCE) += reset_source.o
obj-$(CONFIG_SHELL_HUSH) += hush.o
obj-$(CONFIG_SHELL_SIMPLE) += parser.o
obj-$(CONFIG_UIMAGE) += image.o uimage.o
quiet_cmd_pwd_h = PWDH $@
ifdef CONFIG_PASSWORD

View File

@ -162,7 +162,7 @@ out:
* Note: This function will also be used on the host! See note in the header
* of this file.
*/
int envfs_save(const char *filename, char *dirname)
int envfs_save(const char *filename, const char *dirname)
{
struct envfs_super *super;
int envfd, size, ret;
@ -218,79 +218,53 @@ out1:
}
EXPORT_SYMBOL(envfs_save);
/**
* Restore the last environment into the current one
* @param[in] filename from where to restore
* @param[in] dir where to store the last content
* @return 0 on success, anything else in case of failure
*
* Note: This function will also be used on the host! See note in the header
* of this file.
*/
int envfs_load(const char *filename, char *dir, unsigned flags)
static int envfs_check_super(struct envfs_super *super, size_t *size)
{
if (ENVFS_32(super->magic) != ENVFS_MAGIC) {
printf("envfs: wrong magic\n");
return -EIO;
}
if (crc32(0, super, sizeof(*super) - 4) != ENVFS_32(super->sb_crc)) {
printf("wrong crc on env superblock\n");
return -EIO;
}
if (super->major < ENVFS_MAJOR)
printf("envfs version %d.%d loaded into %d.%d\n",
super->major, super->minor,
ENVFS_MAJOR, ENVFS_MINOR);
*size = ENVFS_32(super->size);
return 0;
}
static int envfs_check_data(struct envfs_super *super, const void *buf, size_t size)
{
uint32_t crc;
crc = crc32(0, buf, size);
if (crc != ENVFS_32(super->crc)) {
printf("wrong crc on env\n");
return -EIO;
}
return 0;
}
static int envfs_load_data(void *buf, size_t size, const char *dir, unsigned flags)
{
struct envfs_super super;
void *buf = NULL, *buf_free = NULL;
int envfd;
int fd, ret = 0;
char *str, *tmp;
int headerlen_full;
unsigned long size;
/* for envfs < 1.0 */
struct envfs_inode_end inode_end_dummy;
inode_end_dummy.mode = ENVFS_32(S_IRWXU | S_IRWXG | S_IRWXO);
inode_end_dummy.magic = ENVFS_32(ENVFS_INODE_END_MAGIC);
envfd = open(filename, O_RDONLY);
if (envfd < 0) {
printf("Open %s %s\n", filename, errno_str());
return -1;
}
/* read superblock */
ret = read(envfd, &super, sizeof(struct envfs_super));
if ( ret < sizeof(struct envfs_super)) {
perror("read");
ret = -errno;
goto out;
}
if ( ENVFS_32(super.magic) != ENVFS_MAGIC) {
printf("envfs: wrong magic on %s\n", filename);
ret = -EIO;
goto out;
}
if (crc32(0, (unsigned char *)&super, sizeof(struct envfs_super) - 4)
!= ENVFS_32(super.sb_crc)) {
printf("wrong crc on env superblock\n");
ret = -EIO;
goto out;
}
size = ENVFS_32(super.size);
buf = xmalloc(size);
buf_free = buf;
ret = read(envfd, buf, size);
if (ret < size) {
perror("read");
ret = -errno;
goto out;
}
if (crc32(0, (unsigned char *)buf, size)
!= ENVFS_32(super.crc)) {
printf("wrong crc on env\n");
ret = -EIO;
goto out;
}
if (super.major < ENVFS_MAJOR)
printf("envfs version %d.%d loaded into %d.%d\n",
super.major, super.minor,
ENVFS_MAJOR, ENVFS_MINOR);
while (size) {
struct envfs_inode *inode;
struct envfs_inode_end *inode_end;
@ -300,7 +274,7 @@ int envfs_load(const char *filename, char *dir, unsigned flags)
buf += sizeof(struct envfs_inode);
if (ENVFS_32(inode->magic) != ENVFS_INODE_MAGIC) {
printf("envfs: wrong magic on %s\n", filename);
printf("envfs: wrong magic\n");
ret = -EIO;
goto out;
}
@ -324,7 +298,7 @@ int envfs_load(const char *filename, char *dir, unsigned flags)
buf += headerlen_full;
if (ENVFS_32(inode_end->magic) != ENVFS_INODE_END_MAGIC) {
printf("envfs: wrong inode_end_magic on %s\n", filename);
printf("envfs: wrong inode_end_magic\n");
ret = -EIO;
goto out;
}
@ -368,11 +342,88 @@ skip:
sizeof(struct envfs_inode);
}
ret = 0;
out:
return ret;
}
int envfs_load_from_buf(void *buf, int len, const char *dir, unsigned flags)
{
int ret;
size_t size;
struct envfs_super *super = buf;
buf = super + 1;
ret = envfs_check_super(super, &size);
if (ret)
return ret;
ret = envfs_check_data(super, buf, size);
if (ret)
return ret;
ret = envfs_load_data(buf, size, dir, flags);
return ret;
}
/**
* Restore the last environment into the current one
* @param[in] filename from where to restore
* @param[in] dir where to store the last content
* @return 0 on success, anything else in case of failure
*
* Note: This function will also be used on the host! See note in the header
* of this file.
*/
int envfs_load(const char *filename, const char *dir, unsigned flags)
{
struct envfs_super super;
void *buf = NULL;
int envfd;
int ret = 0;
size_t size;
envfd = open(filename, O_RDONLY);
if (envfd < 0) {
printf("Open %s %s\n", filename, errno_str());
return -1;
}
/* read superblock */
ret = read(envfd, &super, sizeof(struct envfs_super));
if ( ret < sizeof(struct envfs_super)) {
perror("read");
ret = -errno;
goto out;
}
ret = envfs_check_super(&super, &size);
if (ret)
goto out;
buf = xmalloc(size);
ret = read(envfd, buf, size);
if (ret < size) {
perror("read");
ret = -errno;
goto out;
}
ret = envfs_check_data(&super, buf, size);
if (ret)
goto out;
ret = envfs_load_data(buf, size, dir, flags);
if (ret)
goto out;
ret = 0;
out:
close(envfd);
if (buf_free)
free(buf_free);
free(buf);
return ret;
}

View File

@ -23,6 +23,7 @@
#include <fs.h>
#include <malloc.h>
#include <errno.h>
#include <envfs.h>
struct filetype_str {
const char *name; /* human readable filetype */
@ -51,6 +52,7 @@ static const struct filetype_str filetype_str[] = {
[filetype_ext] = { "ext filesystem", "ext" },
[filetype_gpt] = { "GUID Partition Table", "gpt" },
[filetype_bpk] = { "Binary PacKage", "bpk" },
[filetype_barebox_env] = { "barebox environment file", "bbenv" },
};
const char *file_type_to_string(enum filetype f)
@ -188,6 +190,8 @@ enum filetype file_detect_type(const void *_buf, size_t bufsize)
if (strncmp(buf8, "#!/bin/sh", 9) == 0)
return filetype_sh;
if (buf[0] == ENVFS_32(ENVFS_MAGIC))
return filetype_barebox_env;
if (bufsize < 32)
return filetype_unknown;

View File

@ -44,48 +44,6 @@
extern initcall_t __barebox_initcalls_start[], __barebox_early_initcalls_end[],
__barebox_initcalls_end[];
#ifdef CONFIG_DEFAULT_ENVIRONMENT
#include "barebox_default_env.h"
static int register_default_env(void)
{
int ret;
void *defaultenv;
if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_COMPRESSED)) {
void *tmp = malloc(default_environment_size);
if (!tmp)
return -ENOMEM;
memcpy(tmp, default_environment, default_environment_size);
defaultenv = xzalloc(default_environment_uncompress_size);
ret = uncompress(tmp, default_environment_size,
NULL, NULL,
defaultenv, NULL, uncompress_err_stdout);
free(tmp);
if (ret) {
free(defaultenv);
return ret;
}
} else {
defaultenv = (void *)default_environment;
}
add_mem_device("defaultenv", (unsigned long)defaultenv,
default_environment_uncompress_size,
IORESOURCE_MEM_WRITEABLE);
return 0;
}
device_initcall(register_default_env);
#endif
#if defined CONFIG_FS_RAMFS && defined CONFIG_FS_DEVFS
static int mount_root(void)
{
@ -129,7 +87,7 @@ void __noreturn start_barebox(void)
pr_err("no valid environment found on %s. "
"Using default environment\n",
default_environment_path);
envfs_load("/dev/defaultenv", "/env", 0);
defaultenv_load("/env", 0);
}
}

24
defaultenv/Makefile Normal file
View File

@ -0,0 +1,24 @@
bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW) += defaultenv-2-base
bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_MENU) += defaultenv-2-menu
bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_DFU) += defaultenv-2-dfu
bbenv-$(CONFIG_DEFAULT_ENVIRONMENT_GENERIC) += defaultenv-1
obj-$(CONFIG_DEFAULT_ENVIRONMENT) += defaultenv.o
extra-y += barebox_default_env barebox_default_env.h barebox_default_env$(DEFAULT_COMPRESSION_SUFFIX)
$(obj)/defaultenv.o: $(obj)/barebox_default_env.h
#
# Generate a barebox envfs image.
#
quiet_cmd_env_default = ENV $@
cmd_env_default = ($(srctree)/scripts/genenv $(srctree) $(objtree) $@ $(CONFIG_DEFAULT_ENVIRONMENT_PATH))
$(obj)/barebox_default_env: FORCE
$(call cmd,env_default)
quiet_cmd_env_h = ENVH $@
cmd_env_h = cat $< | (cd $(obj) && $(objtree)/scripts/bin2c "__aligned(4) default_environment") > $@; \
echo "static const int default_environment_uncompress_size=`stat -c%s $(obj)/barebox_default_env`;" >> $@
$(obj)/barebox_default_env.h: $(obj)/barebox_default_env$(DEFAULT_COMPRESSION_SUFFIX) FORCE
$(call if_changed,env_h)

View File

@ -0,0 +1,39 @@
#!/bin/sh
if [ "$1" = menu ]; then
boot-menu-add-entry "$0" "Device Firmware upgrade (DFU)"
exit
fi
if [ -d /dfutmp ]; then
rm -r /dfutmp
fi
mkdir -p /dfutmp
kernel="/dfutmp/kernel"
dtb="/dfutmp/dtb"
cmdline="/dfutmp/cmdline"
global.bootm.image="$kernel"
dfu $kernel(kernel)c,$dtb(dtb)c,$cmdline(cmdline)c
if [ $? != 0 ]; then
exit 1
fi
if [ ! -f "$kernel" ]; then
echo "No kernel uploaded. Aborting"
exit 1
fi
if [ -f "$cmdline" ]; then
global linux.bootargs.dyn.dfu
readf $cmdline global.linux.bootargs.dyn.dfu
fi
if [ -f "$dtb" ]; then
global.bootm.oftree="$dtb"
fi
true

151
defaultenv/defaultenv.c Normal file
View File

@ -0,0 +1,151 @@
/*
* Copyright (C) 2014 Sascha Hauer, Pengutronix
*
* 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.
*
*/
#include <common.h>
#include <envfs.h>
#include <filetype.h>
#include <uncompress.h>
#include <malloc.h>
#include <init.h>
#include <asm/unaligned.h>
#include "barebox_default_env.h"
static LIST_HEAD(defaultenv_list);
struct defaultenv {
struct list_head list;
const char *name;
void *buf;
size_t size;
};
static void defaultenv_add_base(void)
{
static int base_added;
if (base_added)
return;
base_added = 1;
if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW))
defaultenv_append_directory(defaultenv_2_base);
if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_MENU))
defaultenv_append_directory(defaultenv_2_menu);
if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW_DFU))
defaultenv_append_directory(defaultenv_2_dfu);
if (IS_ENABLED(CONFIG_DEFAULT_ENVIRONMENT_GENERIC))
defaultenv_append_directory(defaultenv_1);
/*
* The traditional environment given with CONFIG_DEFAULT_ENVIRONMENT_PATH.
* Once all users are converted to bbenv-y this can go.
*/
defaultenv_append((void *)default_environment,
default_environment_size, "defaultenv");
}
/*
* defaultenv_append - append a envfs buffer to the default environment
* @buf: The buffer containing the binary environment. If it is
* not a plain buffer it is assumed to be a compressed buffer.
* @size: The length of the buffer
*
* This adds an overlay to the default environment. New files will be created,
* existing files will be overwritten with the overlay.
*/
void defaultenv_append(void *buf, unsigned int size, const char *name)
{
struct defaultenv *df;
defaultenv_add_base();
df = xzalloc(sizeof(*df));
df->buf = buf;
df->size = size;
df->name = name;
list_add_tail(&df->list, &defaultenv_list);
}
static int defaultenv_load_one(struct defaultenv *df, const char *dir,
unsigned flags)
{
void *freep = NULL;
void *buf;
enum filetype ft = file_detect_type(df->buf, df->size);
uint32_t size;
int ret;
pr_debug("loading %s\n", df->name);
if (!IS_ENABLED(CONFIG_DEFAULT_COMPRESSION_NONE) &&
ft != filetype_barebox_env) {
size = get_unaligned_le32(df->buf + df->size - 4);
freep = malloc(size);
if (!freep)
return -ENOMEM;
ret = uncompress(df->buf, df->size,
NULL, NULL,
freep, NULL, uncompress_err_stdout);
if (ret) {
free(freep);
pr_err("Failed to uncompress: %s\n", strerror(-ret));
return ret;
}
buf = freep;
} else {
buf = df->buf;
size = df->size;
}
ret = envfs_load_from_buf(buf, size, dir, flags);
free(freep);
if (ret)
pr_err("Failed to load defaultenv: %s\n", strerror(-ret));
return ret;
}
/*
* defaultenv_load - load the default environment
* @dir: The directory the default environment should be loaded to.
*
* This loads all environment snippets previously registered with
* defaultenv_append to the directory given with @dir.
*
* Return: 0 for success, negative error code otherwise.
*/
int defaultenv_load(const char *dir, unsigned flags)
{
struct defaultenv *df;
int ret;
defaultenv_add_base();
list_for_each_entry(df, &defaultenv_list, list) {
ret = defaultenv_load_one(df, dir, flags);
if (ret)
return ret;
}
return 0;
}

View File

@ -244,10 +244,14 @@ static int handle_dnload(struct usb_function *f, const struct usb_ctrlrequest *c
if (w_length == 0) {
dfu->dfu_state = DFU_STATE_dfuIDLE;
if (dfu_devs[dfualt].flags & DFU_FLAG_SAVE) {
if (dfu_devs[dfualt].flags & DFU_FLAG_SAFE) {
int fd;
unsigned flags = O_WRONLY;
fd = open(dfu_devs[dfualt].dev, O_WRONLY);
if (dfu_devs[dfualt].flags & DFU_FLAG_CREATE)
flags |= O_CREAT | O_TRUNC;
fd = open(dfu_devs[dfualt].dev, flags);
if (fd < 0) {
perror("open");
ret = -EINVAL;
@ -376,10 +380,16 @@ static int dfu_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
goto out;
}
debug("dfu: starting download to %s\n", dfu_devs[dfualt].dev);
if (dfu_devs[dfualt].flags & DFU_FLAG_SAVE)
if (dfu_devs[dfualt].flags & DFU_FLAG_SAFE) {
dfufd = open(DFU_TEMPFILE, O_WRONLY | O_CREAT);
else
dfufd = open(dfu_devs[dfualt].dev, O_WRONLY);
} else {
unsigned flags = O_WRONLY;
if (dfu_devs[dfualt].flags & DFU_FLAG_CREATE)
flags |= O_CREAT | O_TRUNC;
dfufd = open(dfu_devs[dfualt].dev, flags);
}
if (dfufd < 0) {
dfu->dfu_state = DFU_STATE_dfuERROR;

View File

@ -3,6 +3,7 @@
#ifdef __BAREBOX__
#include <asm/byteorder.h>
#include <linux/stringify.h>
#endif
#define ENVFS_MAJOR 1
@ -90,8 +91,9 @@ struct envfs_super {
#endif
#define ENV_FLAG_NO_OVERWRITE (1 << 0)
int envfs_load(const char *filename, char *dirname, unsigned flags);
int envfs_save(const char *filename, char *dirname);
int envfs_load(const char *filename, const char *dirname, unsigned flags);
int envfs_save(const char *filename, const char *dirname);
int envfs_load_from_buf(void *buf, int len, const char *dir, unsigned flags);
/* defaults to /dev/env0 */
#ifdef CONFIG_ENV_HANDLING
@ -110,4 +112,34 @@ static inline char *default_environment_path_get(void)
int envfs_register_partition(const char *devname, unsigned int partnr);
#ifdef CONFIG_DEFAULT_ENVIRONMENT
void defaultenv_append(void *buf, unsigned int size, const char *name);
int defaultenv_load(const char *dir, unsigned flags);
#else
static inline void defaultenv_append(void *buf, unsigned int size, const char *name)
{
}
static inline int defaultenv_load(const char *dir, unsigned flags)
{
return -ENOSYS;
}
#endif
/*
* Append environment directory compiled into barebox with bbenv-y
* to the default environment. The symbol is generated from the filename
* during the build process. Replace '-' with '_' to get the name
* from the filename.
*/
#define defaultenv_append_directory(name) \
{ \
extern char __bbenv_##name##_start[]; \
extern char __bbenv_##name##_end[]; \
defaultenv_append(__bbenv_##name##_start, \
__bbenv_##name##_end - \
__bbenv_##name##_start, \
__stringify(name)); \
}
#endif /* _ENVFS_H */

View File

@ -29,6 +29,7 @@ enum filetype {
filetype_gpt,
filetype_ubifs,
filetype_bpk,
filetype_barebox_env,
filetype_max,
};

View File

@ -22,8 +22,9 @@
#include <linux/types.h>
#define DFU_FLAG_SAVE (1 << 0)
#define DFU_FLAG_SAFE (1 << 0)
#define DFU_FLAG_READBACK (1 << 1)
#define DFU_FLAG_CREATE (1 << 2)
struct usb_dfu_dev {
char *name;

View File

@ -98,6 +98,7 @@ multi-objs-y := $(addprefix $(obj)/,$(multi-objs-y))
multi-objs-m := $(addprefix $(obj)/,$(multi-objs-m))
subdir-ym := $(addprefix $(obj)/,$(subdir-ym))
obj-dirs := $(addprefix $(obj)/,$(obj-dirs))
bbenv-y := $(addprefix $(obj)/,$(bbenv-y))
# These flags are needed for modversions and compiling, so we define them here
# already
@ -193,6 +194,9 @@ quiet_cmd_gzip = GZIP $@
cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -n -f -9 > $@) || \
(rm -f $@ ; false)
%.gz: %
$(call if_changed,gzip)
# DTC
# ---------------------------------------------------------------------------
@ -226,6 +230,34 @@ $(obj)/%.dtb: $(src)/%.dts FORCE
dtc-tmp = $(subst $(comma),_,$(dot-target).dts)
obj-y += $(patsubst %,%.bbenv$(DEFAULT_COMPRESSION_SUFFIX).o,$(bbenv-y))
extra-y += $(patsubst %,%.bbenv$(DEFAULT_COMPRESSION_SUFFIX),$(bbenv-y))
extra-y += $(patsubst %,%.bbenv$(DEFAULT_COMPRESSION_SUFFIX).S,$(bbenv-y))
extra-y += $(patsubst %,%.bbenv$(DEFAULT_COMPRESSION_SUFFIX).o,$(bbenv-y))
quiet_cmd_env_S = ENV.S $@
cmd_env_S = \
( \
echo '\#include <asm-generic/barebox.lds.h>'; \
echo '.section .bbenv.rodata.$(subst -,_,$(*F)),"a"'; \
echo '.balign STRUCT_ALIGNMENT'; \
echo '.global __bbenv_$(subst -,_,$(*F))_start'; \
echo '__bbenv_$(subst -,_,$(*F))_start:'; \
echo '.incbin "$<" '; \
echo '__bbenv_$(subst -,_,$(*F))_end:'; \
echo '.global __bbenv_$(subst -,_,$(*F))_end'; \
echo '.balign STRUCT_ALIGNMENT'; \
) > $@
$(obj)/%.bbenv$(DEFAULT_COMPRESSION_SUFFIX).S: $(src)/%.bbenv$(DEFAULT_COMPRESSION_SUFFIX) FORCE
$(call if_changed,env_S)
quiet_cmd_env = ENV $@
cmd_env=$(srctree)/scripts/genenv $(srctree) $(objtree) $@ $<
%.bbenv$(DEFAULT_COMPRESSION_SUFFIX): % FORCE
$(call cmd,env)
# Bzip2
# ---------------------------------------------------------------------------
@ -251,6 +283,9 @@ cmd_bzip2 = (cat $(filter-out FORCE,$^) | \
bzip2 -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
(rm -f $@ ; false)
%.bz2: %
$(call if_changed,bzip2)
# Lzma
# ---------------------------------------------------------------------------
@ -259,11 +294,17 @@ cmd_lzma = (cat $(filter-out FORCE,$^) | \
lzma -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
(rm -f $@ ; false)
%.lzma: %
$(call if_changed,lzma)
quiet_cmd_lzo = LZO $@
cmd_lzo = (cat $(filter-out FORCE,$^) | \
lzop -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
(rm -f $@ ; false)
%.lzo: %
$(call if_changed,lzo)
# XZ
# ---------------------------------------------------------------------------
# Use xzkern to compress the kernel image and xzmisc to compress other things.
@ -292,11 +333,17 @@ cmd_xzmisc = (cat $(filter-out FORCE,$^) | \
xz --check=crc32 --lzma2=dict=1MiB) > $@ || \
(rm -f $@ ; false)
# lz4
# ---------------------------------------------------------------------------
quiet_cmd_lz4 = LZ4 $@
cmd_lz4 = (cat $(filter-out FORCE,$^) | \
lz4c -l -c1 stdin stdout && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
(rm -f $@ ; false)
%.lz4: %
$(call if_changed,lz4)
quiet_cmd_disasm = DISASM $@
cmd_disasm = $(OBJDUMP) -d $< > $@

68
scripts/dfuboot.sh Executable file
View File

@ -0,0 +1,68 @@
#!/bin/bash
DEVICETREE=
KERNEL=
CMDLINE=
usage() {
echo "usage: $0 [OPTIONS]"
echo "This script uploads a kernel and optionally a devicetree"
echo "and a kernel commandline to barebox via DFU running the"
echo "'boot dfu' command."
echo "OPTIONS:"
echo " -k <kernel> kernelimage to upload"
echo " -d <dtb> devicetree binary blob to upload"
echo " -c \"cmdline\" kernel commandline"
echo " -h This help text"
exit 0
}
while getopts "k:d:c:h" opt
do
case "$opt" in
h)
usage
;;
d)
DEVICETREE="$OPTARG"
;;
k)
KERNEL="$OPTARG"
;;
c)
CMDLINE="$OPTARG"
;;
esac
done
dfu-util -D "${KERNEL}" -a kernel
if [ $? != 0 ]; then
echo "Failed to upload kernel"
exit 1
fi
if [ -n "$DEVICETREE" ]; then
dfu-util -D "${DEVICETREE}" -a dtb
if [ $? != 0 ]; then
echo "Failed to upload devicetree"
exit 1
fi
fi
if [ -n "$CMDLINE" ]; then
cmdlinefile=$(mktemp)
echo -e "$CMDLINE" > "${cmdlinefile}"
dfu-util -D "${cmdlinefile}" -a cmdline -R
result=$?
rm -f "${cmdlinefile}"
if [ $result != 0 ]; then
echo "Failed to upload cmdline"
exit 1
fi
fi

View File

@ -10,7 +10,8 @@ basedir=$1
target=$3
shift 3
tempdir="$objtree/.barebox_default_env"
tempdir="${target}.genenv.tmp"
tmpfile="$(mktemp)"
mkdir -p "$tempdir"
@ -26,6 +27,13 @@ done
find $tempdir -name '.svn' -o -name '*~' -delete
$objtree/scripts/bareboxenv -s $tempdir $target
$objtree/scripts/bareboxenv -s $tempdir ${tmpfile}
diff "${tmpfile}" "${target}" >/dev/null 2>/dev/null
if [ $? != 0 ]; then
mv "${tmpfile}" "${target}"
else
rm ${tmpfile}
fi
rm -r $tempdir