diff options
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | boot/image.c | 1 | ||||
-rw-r--r-- | drivers/ata/ahci-pci.c | 2 | ||||
-rw-r--r-- | drivers/firmware/scmi/scmi_agent-uclass.c | 5 | ||||
-rw-r--r-- | fs/ext4/ext4_common.c | 21 | ||||
-rw-r--r-- | fs/squashfs/sqfs.c | 2 | ||||
-rw-r--r-- | include/image.h | 1 | ||||
-rw-r--r-- | tools/.gitignore | 1 | ||||
-rw-r--r-- | tools/Makefile | 4 | ||||
-rw-r--r-- | tools/default_image.c | 11 | ||||
-rw-r--r-- | tools/env/fw_env.c | 10 | ||||
-rw-r--r-- | tools/fdtgrep.c | 8 | ||||
-rw-r--r-- | tools/ifwitool.c | 46 | ||||
-rw-r--r-- | tools/mkimage.c | 39 | ||||
-rw-r--r-- | tools/printinitialenv.c | 44 |
15 files changed, 142 insertions, 63 deletions
@@ -2439,11 +2439,13 @@ endif $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost quiet_cmd_genenv = GENENV $@ -cmd_genenv = $(OBJCOPY) --dump-section .rodata.default_environment=$@ env/common.o; \ - sed --in-place -e 's/\x00/\x0A/g' $@; sed --in-place -e '/^\s*$$/d' $@; \ - sort --field-separator== -k1,1 --stable $@ -o $@ +cmd_genenv = \ + $(objtree)/tools/printinitialenv | \ + sed -e '/^\s*$$/d' | \ + sort --field-separator== -k1,1 --stable -o $@ -u-boot-initial-env: u-boot.bin +u-boot-initial-env: $(env_h) FORCE + $(Q)$(MAKE) $(build)=tools $(objtree)/tools/printinitialenv $(call if_changed,genenv) # Consistency checks diff --git a/boot/image.c b/boot/image.c index b33d1dfc6b3..958dbf85347 100644 --- a/boot/image.c +++ b/boot/image.c @@ -180,6 +180,7 @@ static const table_entry_t uimage_type[] = { { IH_TYPE_COPRO, "copro", "Coprocessor Image"}, { IH_TYPE_SUNXI_EGON, "sunxi_egon", "Allwinner eGON Boot Image" }, { IH_TYPE_SUNXI_TOC0, "sunxi_toc0", "Allwinner TOC0 Boot Image" }, + { IH_TYPE_FDT_LEGACY, "fdt_legacy", "legacy Image with Flat Device Tree ", }, { -1, "", "", }, }; diff --git a/drivers/ata/ahci-pci.c b/drivers/ata/ahci-pci.c index 797e0d570e8..5356b9d83d3 100644 --- a/drivers/ata/ahci-pci.c +++ b/drivers/ata/ahci-pci.c @@ -37,7 +37,7 @@ U_BOOT_DRIVER(ahci_pci) = { static struct pci_device_id ahci_pci_supported[] = { { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_SATA_AHCI, ~0) }, - { PCI_DEVICE(0x1b21, 0x0611) }, + { PCI_DEVICE(PCI_VENDOR_ID_ASMEDIA, 0x0611) }, { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6121) }, { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x6145) }, {}, diff --git a/drivers/firmware/scmi/scmi_agent-uclass.c b/drivers/firmware/scmi/scmi_agent-uclass.c index 8f48de30c8c..9a32678617d 100644 --- a/drivers/firmware/scmi/scmi_agent-uclass.c +++ b/drivers/firmware/scmi/scmi_agent-uclass.c @@ -60,6 +60,7 @@ static int scmi_bind_protocols(struct udevice *dev) { int ret = 0; ofnode node; + const char *name; dev_for_each_subnode(node, dev) { struct driver *drv = NULL; @@ -71,6 +72,7 @@ static int scmi_bind_protocols(struct udevice *dev) if (ofnode_read_u32(node, "reg", &protocol_id)) continue; + name = ofnode_get_name(node); switch (protocol_id) { case SCMI_PROTOCOL_ID_CLOCK: if (IS_ENABLED(CONFIG_CLK_SCMI)) @@ -100,8 +102,7 @@ static int scmi_bind_protocols(struct udevice *dev) continue; } - ret = device_bind(dev, drv, ofnode_get_name(node), NULL, node, - NULL); + ret = device_bind(dev, drv, name, NULL, node, NULL); if (ret) break; } diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index 1185cb2c046..f50de7c089e 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -850,15 +850,20 @@ end: fail: free(depth_dirname); - free(parse_dirname); - for (i = 0; i < depth; i++) { - if (!ptr[i]) - break; - free(ptr[i]); + if (parse_dirname) + free(parse_dirname); + if (ptr) { + for (i = 0; i < depth; i++) { + if (!ptr[i]) + break; + free(ptr[i]); + } + free(ptr); } - free(ptr); - free(parent_inode); - free(first_inode); + if (parent_inode) + free(parent_inode); + if (first_inode) + free(first_inode); return result_inode_no; } diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c index 74ca70c3ff4..42266219237 100644 --- a/fs/squashfs/sqfs.c +++ b/fs/squashfs/sqfs.c @@ -87,7 +87,7 @@ static int sqfs_calc_n_blks(__le64 start, __le64 end, u64 *offset) u64 start_, table_size; table_size = le64_to_cpu(end) - le64_to_cpu(start); - start_ = le64_to_cpu(start) / ctxt.cur_dev->blksz; + start_ = lldiv(le64_to_cpu(start), ctxt.cur_dev->blksz); *offset = le64_to_cpu(start) - (start_ * ctxt.cur_dev->blksz); return DIV_ROUND_UP(table_size + *offset, ctxt.cur_dev->blksz); diff --git a/include/image.h b/include/image.h index 6f21dafba8c..b6a809834ad 100644 --- a/include/image.h +++ b/include/image.h @@ -229,6 +229,7 @@ enum image_type_t { IH_TYPE_COPRO, /* Coprocessor Image for remoteproc*/ IH_TYPE_SUNXI_EGON, /* Allwinner eGON Boot Image */ IH_TYPE_SUNXI_TOC0, /* Allwinner TOC0 Boot Image */ + IH_TYPE_FDT_LEGACY, /* Binary Flat Device Tree Blob in a Legacy Image */ IH_TYPE_COUNT, /* Number of image types */ }; diff --git a/tools/.gitignore b/tools/.gitignore index d3a93ff294a..28e8ce2a07a 100644 --- a/tools/.gitignore +++ b/tools/.gitignore @@ -28,6 +28,7 @@ /mxsboot /ncb /prelink-riscv +/printinitialenv /proftool /relocate-rela /spl_size_limit diff --git a/tools/Makefile b/tools/Makefile index 26be0a7ba2e..80bc62befcb 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -275,6 +275,10 @@ clean-dirs := lib common always := $(hostprogs-y) +# Host tool to dump the currently configured default environment, +# build it on demand, i.e. not add it to 'always'. +hostprogs-y += printinitialenv + # Generated LCD/video logo LOGO_H = $(objtree)/include/bmp_logo.h LOGO_DATA_H = $(objtree)/include/bmp_logo_data.h diff --git a/tools/default_image.c b/tools/default_image.c index 4a067e65862..0ac3382003d 100644 --- a/tools/default_image.c +++ b/tools/default_image.c @@ -27,7 +27,8 @@ static struct legacy_img_hdr header; static int image_check_image_types(uint8_t type) { if (((type > IH_TYPE_INVALID) && (type < IH_TYPE_FLATDT)) || - (type == IH_TYPE_KERNEL_NOLOAD) || (type == IH_TYPE_FIRMWARE_IVT)) + (type == IH_TYPE_KERNEL_NOLOAD) || (type == IH_TYPE_FIRMWARE_IVT) || + (type == IH_TYPE_FDT_LEGACY)) return EXIT_SUCCESS; else return EXIT_FAILURE; @@ -94,6 +95,7 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd, uint32_t imagesize; uint32_t ep; uint32_t addr; + int type; struct legacy_img_hdr *hdr = (struct legacy_img_hdr *)ptr; checksum = crc32(0, @@ -113,6 +115,11 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd, else imagesize = sbuf->st_size - sizeof(struct legacy_img_hdr); + if (params->type == IH_TYPE_FDT_LEGACY) + type = IH_TYPE_FLATDT; + else + type = params->type; + if (params->os == IH_OS_TEE) { addr = optee_image_get_load_addr(hdr); ep = optee_image_get_entry_point(hdr); @@ -127,7 +134,7 @@ static void image_set_header(void *ptr, struct stat *sbuf, int ifd, image_set_dcrc(hdr, checksum); image_set_os(hdr, params->os); image_set_arch(hdr, params->arch); - image_set_type(hdr, params->type); + image_set_type(hdr, type); image_set_comp(hdr, params->comp); image_set_name(hdr, params->imagename); diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index c251e2e6ba7..c9a8774acef 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -1733,6 +1733,7 @@ static int find_nvmem_device(void) while (!nvmem && (dent = readdir(dir))) { FILE *fp; + size_t size; if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, "..")) { continue; @@ -1748,7 +1749,14 @@ static int find_nvmem_device(void) continue; } - fread(buf, sizeof(buf), 1, fp); + size = fread(buf, sizeof(buf), 1, fp); + if (size != 1) { + fprintf(stderr, + "read failed about %s\n", comp); + fclose(fp); + return -EIO; + } + if (!strcmp(buf, "u-boot,env")) { bytes = asprintf(&nvmem, "%s/%s/nvmem", path, dent->d_name); diff --git a/tools/fdtgrep.c b/tools/fdtgrep.c index 641d6a2e3e0..7eabcab4399 100644 --- a/tools/fdtgrep.c +++ b/tools/fdtgrep.c @@ -712,15 +712,19 @@ int utilfdt_read_err_len(const char *filename, char **buffp, off_t *len) /* Loop until we have read everything */ buf = malloc(bufsize); - if (!buf) + if (!buf) { + close(fd); return -ENOMEM; + } do { /* Expand the buffer to hold the next chunk */ if (offset == bufsize) { bufsize *= 2; buf = realloc(buf, bufsize); - if (!buf) + if (!buf) { + close(fd); return -ENOMEM; + } } ret = read(fd, &buf[offset], bufsize - offset); diff --git a/tools/ifwitool.c b/tools/ifwitool.c index b2b06cc9219..31591863b2e 100644 --- a/tools/ifwitool.c +++ b/tools/ifwitool.c @@ -1441,23 +1441,20 @@ static void bpdt_fixup_write_buffer(struct buffer *buf) size_t offset = 0; - offset = fix_member(&h->signature, offset, sizeof(h->signature)); - offset = fix_member(&h->descriptor_count, offset, - sizeof(h->descriptor_count)); - offset = fix_member(&h->bpdt_version, offset, sizeof(h->bpdt_version)); - offset = fix_member(&h->xor_redundant_block, offset, - sizeof(h->xor_redundant_block)); - offset = fix_member(&h->ifwi_version, offset, sizeof(h->ifwi_version)); - offset = fix_member(&h->fit_tool_version, offset, - sizeof(h->fit_tool_version)); + offset = fix_member(&s, offset, sizeof(h->signature)); + offset = fix_member(&s, offset, sizeof(h->descriptor_count)); + offset = fix_member(&s, offset, sizeof(h->bpdt_version)); + offset = fix_member(&s, offset, sizeof(h->xor_redundant_block)); + offset = fix_member(&s, offset, sizeof(h->ifwi_version)); + offset = fix_member(&s, offset, sizeof(h->fit_tool_version)); uint32_t i; for (i = 0; i < count; i++) { - offset = fix_member(&e[i].type, offset, sizeof(e[i].type)); - offset = fix_member(&e[i].flags, offset, sizeof(e[i].flags)); - offset = fix_member(&e[i].offset, offset, sizeof(e[i].offset)); - offset = fix_member(&e[i].size, offset, sizeof(e[i].size)); + offset = fix_member(&s, offset, sizeof(e[i].type)); + offset = fix_member(&s, offset, sizeof(e[i].flags)); + offset = fix_member(&s, offset, sizeof(e[i].offset)); + offset = fix_member(&s, offset, sizeof(e[i].size)); } } @@ -1628,6 +1625,8 @@ static void init_manifest_header(struct manifest_header *hdr, size_t size) curr_time = time(NULL); local_time = localtime(&curr_time); + assert(local_time != NULL); + strftime(buffer, sizeof(buffer), "0x%Y%m%d", local_time); hdr->date = strtoul(buffer, NULL, 16); @@ -1655,24 +1654,21 @@ static void subpart_dir_fixup_write_buffer(struct buffer *buf) size_t count = h->num_entries; size_t offset = 0; - offset = fix_member(&h->marker, offset, sizeof(h->marker)); - offset = fix_member(&h->num_entries, offset, sizeof(h->num_entries)); - offset = fix_member(&h->header_version, offset, - sizeof(h->header_version)); - offset = fix_member(&h->entry_version, offset, - sizeof(h->entry_version)); - offset = fix_member(&h->header_length, offset, - sizeof(h->header_length)); - offset = fix_member(&h->checksum, offset, sizeof(h->checksum)); + offset = fix_member(&s, offset, sizeof(h->marker)); + offset = fix_member(&s, offset, sizeof(h->num_entries)); + offset = fix_member(&s, offset, sizeof(h->header_version)); + offset = fix_member(&s, offset, sizeof(h->entry_version)); + offset = fix_member(&s, offset, sizeof(h->header_length)); + offset = fix_member(&s, offset, sizeof(h->checksum)); offset += sizeof(h->name); uint32_t i; for (i = 0; i < count; i++) { offset += sizeof(e[i].name); - offset = fix_member(&e[i].offset, offset, sizeof(e[i].offset)); - offset = fix_member(&e[i].length, offset, sizeof(e[i].length)); - offset = fix_member(&e[i].rsvd, offset, sizeof(e[i].rsvd)); + offset = fix_member(&s, offset, sizeof(e[i].offset)); + offset = fix_member(&s, offset, sizeof(e[i].length)); + offset = fix_member(&s, offset, sizeof(e[i].rsvd)); } } diff --git a/tools/mkimage.c b/tools/mkimage.c index 30c6df77081..8306861ce51 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -430,6 +430,25 @@ static void verify_image(const struct image_type_params *tparams) (void)close(ifd); } +void copy_datafile(int ifd, char *file) +{ + if (!file) + return; + for (;;) { + char *sep = strchr(file, ':'); + + if (sep) { + *sep = '\0'; + copy_file(ifd, file, 1); + *sep++ = ':'; + file = sep; + } else { + copy_file(ifd, file, 0); + break; + } + } +} + int main(int argc, char **argv) { int ifd = -1; @@ -647,21 +666,7 @@ int main(int argc, char **argv) file = NULL; } } - - file = params.datafile; - - for (;;) { - char *sep = strchr(file, ':'); - if (sep) { - *sep = '\0'; - copy_file (ifd, file, 1); - *sep++ = ':'; - file = sep; - } else { - copy_file (ifd, file, 0); - break; - } - } + copy_datafile(ifd, params.datafile); } else if (params.type == IH_TYPE_PBLIMAGE) { /* PBL has special Image format, implements its' own */ pbl_load_uboot(ifd, ¶ms); @@ -760,8 +765,8 @@ int main(int argc, char **argv) if (tparams->set_header) tparams->set_header (ptr, &sbuf, ifd, ¶ms); else { - fprintf (stderr, "%s: Can't set header for %s: %s\n", - params.cmdname, tparams->name, strerror(errno)); + fprintf (stderr, "%s: Can't set header for %s\n", + params.cmdname, tparams->name); exit (EXIT_FAILURE); } diff --git a/tools/printinitialenv.c b/tools/printinitialenv.c new file mode 100644 index 00000000000..c58b234d679 --- /dev/null +++ b/tools/printinitialenv.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * (C) Copyright 2022 + * Max Krummenacher, Toradex + * + * Snippets taken from tools/env/fw_env.c + * + * This prints the list of default environment variables as currently + * configured. + * + */ + +#include <stdio.h> + +/* Pull in the current config to define the default environment */ +#include <linux/kconfig.h> + +#ifndef __ASSEMBLY__ +#define __ASSEMBLY__ /* get only #defines from config.h */ +#include <config.h> +#undef __ASSEMBLY__ +#else +#include <config.h> +#endif + +#define DEFAULT_ENV_INSTANCE_STATIC +#include <generated/environment.h> +#include <env_default.h> + +int main(void) +{ + char *env, *nxt; + + for (env = default_environment; *env; env = nxt + 1) { + for (nxt = env; *nxt; ++nxt) { + if (nxt >= &default_environment[sizeof(default_environment)]) { + fprintf(stderr, "## Error: environment not terminated\n"); + return -1; + } + } + printf("%s\n", env); + } + return 0; +} |