diff options
| author | Tom Rini <[email protected]> | 2023-05-08 14:31:04 -0400 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2023-05-08 14:31:04 -0400 |
| commit | 11910550b65e6072b9542d462c0aa93f4ca81836 (patch) | |
| tree | 8308c98ffad76d9693654a28090b03f270a7d250 /tools | |
| parent | 9876c8c147144db2c120fcc9ffa6de27f6894441 (diff) | |
| parent | f1d33a44ca04fdca241c1d89fd79e2e56c930c7e (diff) | |
Merge branch 'master' into next
Diffstat (limited to 'tools')
49 files changed, 224 insertions, 108 deletions
diff --git a/tools/aisimage.c b/tools/aisimage.c index b8b3ee32070..c5b33b559b0 100644 --- a/tools/aisimage.c +++ b/tools/aisimage.c @@ -113,7 +113,7 @@ static int get_ais_table_id(uint32_t *ptr) return -1; } -static void aisimage_print_header(const void *hdr) +static void aisimage_print_header(const void *hdr, struct image_tool_params *params) { struct ais_header *ais_hdr = (struct ais_header *)hdr; uint32_t *ptr; diff --git a/tools/atmelimage.c b/tools/atmelimage.c index 7b3b243d58b..6a2d9d8feab 100644 --- a/tools/atmelimage.c +++ b/tools/atmelimage.c @@ -182,7 +182,7 @@ static void atmel_print_pmecc_header(const uint32_t word) printf("\t\t====================\n"); } -static void atmel_print_header(const void *ptr) +static void atmel_print_header(const void *ptr, struct image_tool_params *params) { uint32_t *ints = (uint32_t *)ptr; size_t pos; diff --git a/tools/binman/cmdline.py b/tools/binman/cmdline.py index 4b875a9dcda..9632ec115e5 100644 --- a/tools/binman/cmdline.py +++ b/tools/binman/cmdline.py @@ -95,7 +95,7 @@ controlled by a description in the board device tree.''' parser.add_argument('-H', '--full-help', action='store_true', default=False, help='Display the README file') parser.add_argument('--tooldir', type=str, - default=os.path.join(os.getenv('HOME'), '.binman-tools'), + default=os.path.join(os.path.expanduser('~/.binman-tools')), help='Set the directory to store tools') parser.add_argument('--toolpath', type=str, action='append', help='Add a path to the list of directories containing tools') diff --git a/tools/binman/control.py b/tools/binman/control.py index 0febcb79a60..68597c4e779 100644 --- a/tools/binman/control.py +++ b/tools/binman/control.py @@ -7,7 +7,11 @@ from collections import OrderedDict import glob -import importlib.resources +try: + import importlib.resources +except ImportError: + # for Python 3.6 + import importlib_resources import os import pkg_resources import re diff --git a/tools/binman/test/blob_syms.c b/tools/binman/test/blob_syms.c index d652c79aa98..1df8d64353f 100644 --- a/tools/binman/test/blob_syms.c +++ b/tools/binman/test/blob_syms.c @@ -5,8 +5,6 @@ * Simple program to create some binman symbols. This is used by binman tests. */ -typedef unsigned long ulong; - #include <linux/kconfig.h> #include <binman_sym.h> diff --git a/tools/binman/test/u_boot_binman_syms.c b/tools/binman/test/u_boot_binman_syms.c index ed761246aec..147c90230f8 100644 --- a/tools/binman/test/u_boot_binman_syms.c +++ b/tools/binman/test/u_boot_binman_syms.c @@ -5,8 +5,6 @@ * Simple program to create some binman symbols. This is used by binman tests. */ -typedef unsigned long ulong; - #include <linux/kconfig.h> #include <binman_sym.h> diff --git a/tools/binman/test/u_boot_binman_syms_size.c b/tools/binman/test/u_boot_binman_syms_size.c index fa41b3d9a33..f686892a4da 100644 --- a/tools/binman/test/u_boot_binman_syms_size.c +++ b/tools/binman/test/u_boot_binman_syms_size.c @@ -5,8 +5,6 @@ * Simple program to create some binman symbols. This is used by binman tests. */ -typedef unsigned long ulong; - #include <linux/kconfig.h> #include <binman_sym.h> diff --git a/tools/buildman/builderthread.py b/tools/buildman/builderthread.py index 879ff138ad7..635865c21c8 100644 --- a/tools/buildman/builderthread.py +++ b/tools/buildman/builderthread.py @@ -253,6 +253,7 @@ class BuilderThread(threading.Thread): args.extend(['-j', str(self.builder.num_jobs)]) if self.builder.warnings_as_errors: args.append('KCFLAGS=-Werror') + args.append('HOSTCFLAGS=-Werror') if self.builder.allow_missing: args.append('BINMAN_ALLOW_MISSING=1') if self.builder.no_lto: diff --git a/tools/buildman/control.py b/tools/buildman/control.py index 35f44c0cf3d..09a11f25b3f 100644 --- a/tools/buildman/control.py +++ b/tools/buildman/control.py @@ -3,7 +3,11 @@ # import multiprocessing -import importlib.resources +try: + import importlib.resources +except ImportError: + # for Python 3.6 + import importlib_resources import os import shutil import subprocess diff --git a/tools/buildman/toolchain.py b/tools/buildman/toolchain.py index 241e8e69307..0ecd8458b91 100644 --- a/tools/buildman/toolchain.py +++ b/tools/buildman/toolchain.py @@ -421,7 +421,7 @@ class Toolchains: Returns: Resolved string - >>> bsettings.Setup() + >>> bsettings.Setup(None) >>> tcs = Toolchains() >>> tcs.Add('fred', False) >>> var_dict = {'oblique' : 'OBLIQUE', 'first' : 'fi${second}rst', \ diff --git a/tools/default_image.c b/tools/default_image.c index dc429ce9e46..0e49ab33015 100644 --- a/tools/default_image.c +++ b/tools/default_image.c @@ -41,6 +41,11 @@ static int image_check_params(struct image_tool_params *params) (params->lflag && (params->dflag || params->fflag))); } +static void image_print_header(const void *ptr, struct image_tool_params *params) +{ + image_print_contents(ptr); +} + static int image_verify_header(unsigned char *ptr, int image_size, struct image_tool_params *params) { @@ -201,7 +206,7 @@ U_BOOT_IMAGE_TYPE( (void *)&header, image_check_params, image_verify_header, - image_print_contents, + image_print_header, image_set_header, image_extract_subimage, image_check_image_types, diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index bd02531be24..9804b55ddde 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -12,7 +12,7 @@ ENV DEBIAN_FRONTEND=noninteractive # Add LLVM repository RUN apt-get update && apt-get install -y gnupg2 wget xz-utils && rm -rf /var/lib/apt/lists/* RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - -RUN echo deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-14 main | tee /etc/apt/sources.list.d/llvm.list +RUN echo deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-16 main | tee /etc/apt/sources.list.d/llvm.list # Manually install the kernel.org "Crosstool" based toolchains for gcc-12.2.0 RUN wget -O - https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/12.2.0/x86_64-gcc-12.2.0-nolibc-aarch64-linux.tar.xz | tar -C /opt -xJ @@ -39,7 +39,7 @@ RUN apt-get update && apt-get install -y \ binutils-dev \ bison \ build-essential \ - clang-14 \ + clang-16 \ coreutils \ cpio \ cppcheck \ @@ -265,6 +265,17 @@ RUN echo uboot ALL=NOPASSWD: ALL > /etc/sudoers.d/uboot RUN useradd -m -U uboot USER uboot:uboot +# Populate the cache for pip to use. Get these via wget as the +# COPY / ADD directives don't work as we need them to. +RUN wget -O /tmp/pytest-requirements.txt https://source.denx.de/u-boot/u-boot/-/raw/master/test/py/requirements.txt +RUN wget -O /tmp/sphinx-requirements.txt https://source.denx.de/u-boot/u-boot/-/raw/master/doc/sphinx/requirements.txt +RUN virtualenv -p /usr/bin/python3 /tmp/venv && \ + . /tmp/venv/bin/activate && \ + pip install -r /tmp/pytest-requirements.txt \ + -r /tmp/sphinx-requirements.txt && \ + deactivate && \ + rm -rf /tmp/venv /tmp/pytest-requirements.txt /tmp/sphinx-requirements.txt + # Create the buildman config file RUN /bin/echo -e "[toolchain]\nroot = /usr" > ~/.buildman RUN /bin/echo -e "kernelorg = /opt/gcc-12.2.0-nolibc/*" >> ~/.buildman @@ -273,3 +284,7 @@ RUN /bin/echo -e "\n[toolchain-prefix]\nxtensa = /opt/2020.07/xtensa-dc233c-elf/ RUN /bin/echo -e "\n[toolchain-alias]\nsh = sh2" >> ~/.buildman RUN /bin/echo -e "\nsandbox = x86_64" >> ~/.buildman RUN /bin/echo -e "\nx86 = i386" >> ~/.buildman; + +# Add mkbootimg tool +RUN git clone https://android.googlesource.com/platform/system/tools/mkbootimg /home/uboot/mkbootimg +ENV PYTHONPATH "${PYTHONPATH}:/home/uboot/mkbootimg" diff --git a/tools/dtoc/test_fdt.py b/tools/dtoc/test_fdt.py index 32fa69cbb01..4fe8d12c403 100755 --- a/tools/dtoc/test_fdt.py +++ b/tools/dtoc/test_fdt.py @@ -784,8 +784,8 @@ class TestFdtUtil(unittest.TestCase): def test_ensure_compiled_tmpdir(self): """Test providing a temporary directory""" + old_outdir = tools.outdir try: - old_outdir = tools.outdir tools.outdir= None tmpdir = tempfile.mkdtemp(prefix='test_fdt.') dtb = fdt_util.EnsureCompiled(find_dtb_file('dtoc_test_simple.dts'), @@ -793,7 +793,7 @@ class TestFdtUtil(unittest.TestCase): self.assertEqual(tmpdir, os.path.dirname(dtb)) shutil.rmtree(tmpdir) finally: - tools.outdir= old_outdir + tools.outdir = old_outdir def test_get_phandle_name_offset(self): val = fdt_util.GetPhandleNameOffset(self.node, 'missing') diff --git a/tools/env/README b/tools/env/README index 709251383c6..480a893202f 100644 --- a/tools/env/README +++ b/tools/env/README @@ -59,5 +59,5 @@ this environment instance. On NAND this is used to limit the range within which bad blocks are skipped, on NOR it is not used. To prevent losing changes to the environment and to prevent confusing the MTD -drivers, a lock file at /var/lock/fw_printenv.lock is used to serialize access +drivers, a lock file at /run/fw_printenv.lock is used to serialize access to the environment. diff --git a/tools/env/fw_env_main.c b/tools/env/fw_env_main.c index 1d193bd437d..0b201b9e624 100644 --- a/tools/env/fw_env_main.c +++ b/tools/env/fw_env_main.c @@ -73,7 +73,7 @@ void usage_printenv(void) " -c, --config configuration file, default:" CONFIG_FILE "\n" #endif " -n, --noheader do not repeat variable name in output\n" - " -l, --lock lock node, default:/var/lock\n" + " -l, --lock lock node, default:/run\n" "\n"); } @@ -88,7 +88,7 @@ void usage_env_set(void) #ifdef CONFIG_FILE " -c, --config configuration file, default:" CONFIG_FILE "\n" #endif - " -l, --lock lock node, default:/var/lock\n" + " -l, --lock lock node, default:/run\n" " -s, --script batch mode to minimize writes\n" "\n" "Examples:\n" @@ -206,7 +206,7 @@ int parse_setenv_args(int argc, char *argv[]) int main(int argc, char *argv[]) { - char *lockname = "/var/lock/" CMD_PRINTENV ".lock"; + char *lockname = "/run/" CMD_PRINTENV ".lock"; int lockfd = -1; int retval = EXIT_SUCCESS; char *_cmdname; diff --git a/tools/fdt_add_pubkey.c b/tools/fdt_add_pubkey.c index 999f5a7e83b..5582d7a8efe 100644 --- a/tools/fdt_add_pubkey.c +++ b/tools/fdt_add_pubkey.c @@ -10,7 +10,7 @@ static const char *keyname = "key"; /* -n <keyname> */ static const char *require_keys; /* -r <conf|image> */ static const char *keydest; /* argv[n] */ -static void print_usage(const char *msg) +static void __attribute__((__noreturn__)) print_usage(const char *msg) { fprintf(stderr, "Error: %s\n", msg); fprintf(stderr, "Usage: %s [-a <algo>] [-k <keydir>] [-n <keyname>] [-r <conf|image>]" @@ -19,7 +19,7 @@ static void print_usage(const char *msg) exit(EXIT_FAILURE); } -static void print_help(void) +static void __attribute__((__noreturn__)) print_help(void) { fprintf(stderr, "Options:\n" "\t-a <algo> Cryptographic algorithm. Optional parameter, default value: sha1,rsa2048\n" diff --git a/tools/fit_common.c b/tools/fit_common.c index 01649760ac0..2d417d47198 100644 --- a/tools/fit_common.c +++ b/tools/fit_common.c @@ -23,6 +23,11 @@ #include <image.h> #include <u-boot/crc.h> +void fit_print_header(const void *fit, struct image_tool_params *params) +{ + fit_print_contents(fit); +} + int fit_verify_header(unsigned char *ptr, int image_size, struct image_tool_params *params) { diff --git a/tools/fit_common.h b/tools/fit_common.h index 920a16acfdb..2da4b9422d4 100644 --- a/tools/fit_common.h +++ b/tools/fit_common.h @@ -10,6 +10,8 @@ #include "mkimage.h" #include <image.h> +void fit_print_header(const void *fit, struct image_tool_params *params); + /** * Verify the format of FIT header pointed to by ptr * diff --git a/tools/fit_image.c b/tools/fit_image.c index 8763a36d01e..9fe69ea0d9f 100644 --- a/tools/fit_image.c +++ b/tools/fit_image.c @@ -944,7 +944,7 @@ U_BOOT_IMAGE_TYPE( (void *)&header, fit_check_params, fit_verify_header, - fit_print_contents, + fit_print_header, NULL, fit_extract_contents, fit_check_image_types, diff --git a/tools/gpimage.c b/tools/gpimage.c index 27de4cfaed7..d2bc79d46b9 100644 --- a/tools/gpimage.c +++ b/tools/gpimage.c @@ -41,7 +41,7 @@ static int gpimage_verify_header(unsigned char *ptr, int image_size, return gph_verify_header(gph, 1); } -static void gpimage_print_header(const void *ptr) +static void gpimage_print_header(const void *ptr, struct image_tool_params *params) { const struct gp_header *gph = (struct gp_header *)ptr; diff --git a/tools/imagetool.c b/tools/imagetool.c index 87eee4ad04e..b293211cf88 100644 --- a/tools/imagetool.c +++ b/tools/imagetool.c @@ -66,7 +66,7 @@ int imagetool_verify_print_header( */ if ((*curr)->print_header) { if (!params->quiet) - (*curr)->print_header(ptr); + (*curr)->print_header(ptr, params); } else { fprintf(stderr, "%s: print_header undefined for %s\n", @@ -103,7 +103,7 @@ static int imagetool_verify_print_header_by_type( */ if (tparams->print_header) { if (!params->quiet) - tparams->print_header(ptr); + tparams->print_header(ptr, params); } else { fprintf(stderr, "%s: print_header undefined for %s\n", diff --git a/tools/imagetool.h b/tools/imagetool.h index fdceea46c09..a766aa2ae91 100644 --- a/tools/imagetool.h +++ b/tools/imagetool.h @@ -132,7 +132,7 @@ struct image_type_params { */ int (*verify_header) (unsigned char *, int, struct image_tool_params *); /* Prints image information abstracting from image header */ - void (*print_header) (const void *); + void (*print_header) (const void *, struct image_tool_params *); /* * The header or image contents need to be set as per image type to * be generated using this callback function. diff --git a/tools/imx8image.c b/tools/imx8image.c index c25ea84e25c..76d0cd62dcc 100644 --- a/tools/imx8image.c +++ b/tools/imx8image.c @@ -30,7 +30,7 @@ static void imx8image_set_header(void *ptr, struct stat *sbuf, int ifd, { } -static void imx8image_print_header(const void *ptr) +static void imx8image_print_header(const void *ptr, struct image_tool_params *params) { } diff --git a/tools/imx8mimage.c b/tools/imx8mimage.c index 3ca79d865aa..21075c23799 100644 --- a/tools/imx8mimage.c +++ b/tools/imx8mimage.c @@ -60,7 +60,7 @@ static void imx8mimage_set_header(void *ptr, struct stat *sbuf, int ifd, { } -static void imx8mimage_print_header(const void *ptr) +static void imx8mimage_print_header(const void *ptr, struct image_tool_params *params) { } diff --git a/tools/imximage.c b/tools/imximage.c index 354ee34c14a..b3da1f244cd 100644 --- a/tools/imximage.c +++ b/tools/imximage.c @@ -813,7 +813,7 @@ static int imximage_verify_header(unsigned char *ptr, int image_size, return 0; } -static void imximage_print_header(const void *ptr) +static void imximage_print_header(const void *ptr, struct image_tool_params *params) { struct imx_header *imx_hdr = (struct imx_header *) ptr; uint32_t version = detect_imximage_version(imx_hdr); diff --git a/tools/kwbimage.c b/tools/kwbimage.c index 177084adf82..4dce495ff03 100644 --- a/tools/kwbimage.c +++ b/tools/kwbimage.c @@ -116,6 +116,7 @@ enum image_cfg_type { IMAGE_CFG_NAND_BADBLK_LOCATION, IMAGE_CFG_NAND_ECC_MODE, IMAGE_CFG_NAND_PAGESZ, + IMAGE_CFG_SATA_BLKSZ, IMAGE_CFG_CPU, IMAGE_CFG_BINARY, IMAGE_CFG_DATA, @@ -147,6 +148,7 @@ static const char * const id_strs[] = { [IMAGE_CFG_NAND_BADBLK_LOCATION] = "NAND_BADBLK_LOCATION", [IMAGE_CFG_NAND_ECC_MODE] = "NAND_ECC_MODE", [IMAGE_CFG_NAND_PAGESZ] = "NAND_PAGE_SIZE", + [IMAGE_CFG_SATA_BLKSZ] = "SATA_BLKSZ", [IMAGE_CFG_CPU] = "CPU", [IMAGE_CFG_BINARY] = "BINARY", [IMAGE_CFG_DATA] = "DATA", @@ -185,6 +187,7 @@ struct image_cfg_element { unsigned int nandbadblklocation; unsigned int nandeccmode; unsigned int nandpagesz; + unsigned int satablksz; struct ext_hdr_v0_reg regdata; unsigned int regdata_delay; unsigned int baudrate; @@ -992,13 +995,21 @@ static int image_fill_xip_header(void *image, struct image_tool_params *params) return 1; } +static unsigned int image_get_satablksz(void) +{ + struct image_cfg_element *e; + e = image_find_option(IMAGE_CFG_SATA_BLKSZ); + return e ? e->satablksz : 512; +} + static size_t image_headersz_align(size_t headersz, uint8_t blockid) { /* * Header needs to be 4-byte aligned, which is already ensured by code * above. Moreover UART images must have header aligned to 128 bytes * (xmodem block size), NAND images to 256 bytes (ECC calculation), - * and SATA and SDIO images to 512 bytes (storage block size). + * SDIO images to 512 bytes (SDHC/SDXC fixed block size) and SATA + * images to specified storage block size (default 512 bytes). * Note that SPI images do not have to have header size aligned * to 256 bytes because it is possible to read from SPI storage from * any offset (read offset does not have to be aligned to block size). @@ -1007,8 +1018,10 @@ static size_t image_headersz_align(size_t headersz, uint8_t blockid) return ALIGN(headersz, 128); else if (blockid == IBR_HDR_NAND_ID) return ALIGN(headersz, 256); - else if (blockid == IBR_HDR_SATA_ID || blockid == IBR_HDR_SDIO_ID) + else if (blockid == IBR_HDR_SDIO_ID) return ALIGN(headersz, 512); + else if (blockid == IBR_HDR_SATA_ID) + return ALIGN(headersz, image_get_satablksz()); else return headersz; } @@ -1076,12 +1089,11 @@ static void *image_create_v0(size_t *dataoff, struct image_tool_params *params, if (e) main_hdr->nandbadblklocation = e->nandbadblklocation; - /* - * For SATA srcaddr is specified in number of sectors. - * This expects the sector size to be 512 bytes. - */ - if (main_hdr->blockid == IBR_HDR_SATA_ID) - main_hdr->srcaddr = cpu_to_le32(le32_to_cpu(main_hdr->srcaddr) / 512); + /* For SATA srcaddr is specified in number of sectors. */ + if (main_hdr->blockid == IBR_HDR_SATA_ID) { + params->bl_len = image_get_satablksz(); + main_hdr->srcaddr = cpu_to_le32(le32_to_cpu(main_hdr->srcaddr) / params->bl_len); + } /* For PCIe srcaddr is not used and must be set to 0xFFFFFFFF. */ if (main_hdr->blockid == IBR_HDR_PEX_ID) @@ -1533,12 +1545,11 @@ static void *image_create_v1(size_t *dataoff, struct image_tool_params *params, if (e) main_hdr->flags = e->debug ? 0x1 : 0; - /* - * For SATA srcaddr is specified in number of sectors. - * This expects the sector size to be 512 bytes. - */ - if (main_hdr->blockid == IBR_HDR_SATA_ID) - main_hdr->srcaddr = cpu_to_le32(le32_to_cpu(main_hdr->srcaddr) / 512); + /* For SATA srcaddr is specified in number of sectors. */ + if (main_hdr->blockid == IBR_HDR_SATA_ID) { + params->bl_len = image_get_satablksz(); + main_hdr->srcaddr = cpu_to_le32(le32_to_cpu(main_hdr->srcaddr) / params->bl_len); + } /* For PCIe srcaddr is not used and must be set to 0xFFFFFFFF. */ if (main_hdr->blockid == IBR_HDR_PEX_ID) @@ -1702,6 +1713,13 @@ static int image_create_config_parse_oneline(char *line, case IMAGE_CFG_NAND_PAGESZ: el->nandpagesz = strtoul(value1, NULL, 16); break; + case IMAGE_CFG_SATA_BLKSZ: + el->satablksz = strtoul(value1, NULL, 0); + if (el->satablksz & (el->satablksz-1)) { + fprintf(stderr, "Invalid SATA block size '%s'\n", value1); + return -1; + } + break; case IMAGE_CFG_BINARY: argi = 0; @@ -1893,6 +1911,8 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd, struct stat s; int ret; + params->bl_len = 1; + /* * Do not use sbuf->st_size as it contains size with padding. * We need original image data size, so stat original file. @@ -1972,7 +1992,7 @@ static void kwbimage_set_header(void *ptr, struct stat *sbuf, int ifd, free(image); } -static void kwbimage_print_header(const void *ptr) +static void kwbimage_print_header(const void *ptr, struct image_tool_params *params) { struct main_hdr_v0 *mhdr = (struct main_hdr_v0 *)ptr; struct bin_hdr_v0 *bhdr; @@ -2004,10 +2024,11 @@ static void kwbimage_print_header(const void *ptr) genimg_print_size(le32_to_cpu(mhdr->blocksize) - sizeof(uint32_t)); printf("Data Offset: "); if (mhdr->blockid == IBR_HDR_SATA_ID) - printf("%u Sector%s (LBA)\n", le32_to_cpu(mhdr->srcaddr), + printf("%u Sector%s (LBA) = ", le32_to_cpu(mhdr->srcaddr), le32_to_cpu(mhdr->srcaddr) != 1 ? "s" : ""); - else - genimg_print_size(le32_to_cpu(mhdr->srcaddr)); + genimg_print_size(le32_to_cpu(mhdr->srcaddr) * params->bl_len); + if (mhdr->blockid == IBR_HDR_SATA_ID) + printf("Sector Size: %u Bytes\n", params->bl_len); if (mhdr->blockid == IBR_HDR_SPI_ID && le32_to_cpu(mhdr->destaddr) == 0xFFFFFFFF) { printf("Load Address: XIP\n"); printf("Execute Offs: %08x\n", le32_to_cpu(mhdr->execaddr)); @@ -2033,6 +2054,7 @@ static int kwbimage_verify_header(unsigned char *ptr, int image_size, uint32_t offset; uint32_t size; uint8_t csum; + int blksz; if (header_size > 192*1024) return -FDT_ERR_BADSTRUCTURE; @@ -2091,12 +2113,28 @@ static int kwbimage_verify_header(unsigned char *ptr, int image_size, return -FDT_ERR_BADSTRUCTURE; } + if (size < 4 || size % 4 != 0) + return -FDT_ERR_BADSTRUCTURE; + /* * For SATA srcaddr is specified in number of sectors. - * This expects that sector size is 512 bytes. + * Try all possible sector sizes which are power of two, + * at least 512 bytes and up to the 32 kB. */ - if (blockid == IBR_HDR_SATA_ID) - offset *= 512; + if (blockid == IBR_HDR_SATA_ID) { + for (blksz = 512; blksz < 0x10000; blksz *= 2) { + if (offset * blksz > image_size || offset * blksz + size > image_size) + break; + + if (image_checksum32(ptr + offset * blksz, size - 4) == + *(uint32_t *)(ptr + offset * blksz + size - 4)) { + params->bl_len = blksz; + return 0; + } + } + + return -FDT_ERR_BADSTRUCTURE; + } /* * For PCIe srcaddr is always set to 0xFFFFFFFF. @@ -2105,21 +2143,17 @@ static int kwbimage_verify_header(unsigned char *ptr, int image_size, if (blockid == IBR_HDR_PEX_ID && offset == 0xFFFFFFFF) offset = header_size; - if (offset > image_size || offset % 4 != 0) - return -FDT_ERR_BADSTRUCTURE; - - if (size < 4 || offset + size > image_size || size % 4 != 0) + if (offset % 4 != 0 || offset > image_size || offset + size > image_size) return -FDT_ERR_BADSTRUCTURE; if (image_checksum32(ptr + offset, size - 4) != *(uint32_t *)(ptr + offset + size - 4)) return -FDT_ERR_BADSTRUCTURE; + params->bl_len = 1; return 0; } -static int kwbimage_align_size(int bootfrom, int alloc_len, struct stat s); - static int kwbimage_generate(struct image_tool_params *params, struct image_type_params *tparams) { @@ -2130,6 +2164,8 @@ static int kwbimage_generate(struct image_tool_params *params, int version; void *hdr; int ret; + int align, size; + unsigned int satablksz; fcfg = fopen(params->imagename, "r"); if (!fcfg) { @@ -2167,6 +2203,7 @@ static int kwbimage_generate(struct image_tool_params *params, bootfrom = image_get_bootfrom(); version = image_get_version(); + satablksz = image_get_satablksz(); switch (version) { /* * Fallback to version 0 if no version is provided in the @@ -2212,39 +2249,43 @@ static int kwbimage_generate(struct image_tool_params *params, tparams->hdr = hdr; /* + * Final SATA images must be aligned to disk block size. + * Final SDIO images must be aligned to 512 bytes. + * Final SPI and NAND images must be aligned to 256 bytes. + * Final UART image must be aligned to 128 bytes. + */ + if (bootfrom == IBR_HDR_SATA_ID) + align = satablksz; + else if (bootfrom == IBR_HDR_SDIO_ID) + align = 512; + else if (bootfrom == IBR_HDR_SPI_ID || bootfrom == IBR_HDR_NAND_ID) + align = 256; + else if (bootfrom == IBR_HDR_UART_ID) + align = 128; + else + align = 4; + + /* + * The resulting image needs to be 4-byte aligned. At least + * the Marvell hdrparser tool complains if its unaligned. + * After the image data is stored 4-byte checksum. + */ + size = 4 + (align - (alloc_len + s.st_size + 4) % align) % align; + + /* * This function should return aligned size of the datafile. * When skipcpy is set (datafile is skipped) then return value of this * function is ignored, so we have to put required kwbimage aligning * into the preallocated header size. */ if (params->skipcpy) { - tparams->header_size += kwbimage_align_size(bootfrom, alloc_len, s); + tparams->header_size += size; return 0; } else { - return kwbimage_align_size(bootfrom, alloc_len, s); + return size; } } -static int kwbimage_align_size(int bootfrom, int alloc_len, struct stat s) -{ - /* - * The resulting image needs to be 4-byte aligned. At least - * the Marvell hdrparser tool complains if its unaligned. - * After the image data is stored 4-byte checksum. - * Final UART image must be aligned to 128 bytes. - * Final SPI and NAND images must be aligned to 256 bytes. - * Final SATA and SDIO images must be aligned to 512 bytes. - */ - if (bootfrom == IBR_HDR_SPI_ID || bootfrom == IBR_HDR_NAND_ID) - return 4 + (256 - (alloc_len + s.st_size + 4) % 256) % 256; - else if (bootfrom == IBR_HDR_SATA_ID || bootfrom == IBR_HDR_SDIO_ID) - return 4 + (512 - (alloc_len + s.st_size + 4) % 512) % 512; - else if (bootfrom == IBR_HDR_UART_ID) - return 4 + (128 - (alloc_len + s.st_size + 4) % 128) % 128; - else - return 4 + (4 - s.st_size % 4) % 4; -} - static int kwbimage_generate_config(void *ptr, struct image_tool_params *params) { struct main_hdr_v0 *mhdr0 = (struct main_hdr_v0 *)ptr; @@ -2306,6 +2347,9 @@ static int kwbimage_generate_config(void *ptr, struct image_tool_params *params) if (version == 0 && mhdr->blockid == IBR_HDR_SATA_ID) fprintf(f, "SATA_PIO_MODE %u\n", (unsigned)mhdr0->satapiomode); + if (mhdr->blockid == IBR_HDR_SATA_ID) + fprintf(f, "SATA_BLKSZ %u\n", params->bl_len); + /* * Addresses and sizes which are specified by mkimage command line * arguments and not in kwbimage config file @@ -2486,7 +2530,7 @@ static int kwbimage_extract_subimage(void *ptr, struct image_tool_params *params offset = le32_to_cpu(mhdr->srcaddr); if (mhdr->blockid == IBR_HDR_SATA_ID) - offset *= 512; + offset *= params->bl_len; if (mhdr->blockid == IBR_HDR_PEX_ID && offset == 0xFFFFFFFF) offset = header_size; diff --git a/tools/kwboot.c b/tools/kwboot.c index 348a3203d60..6bef4610ff8 100644 --- a/tools/kwboot.c +++ b/tools/kwboot.c @@ -1991,6 +1991,39 @@ _inject_baudrate_change_code(void *img, size_t *size, int for_data, } } +static int +kwboot_img_guess_sata_blksz(void *img, uint32_t blkoff, uint32_t data_size, size_t total_size) +{ + uint32_t sum, *ptr, *end; + int blksz; + + /* + * Try all possible sector sizes which are power of two, + * at least 512 bytes and up to the 32 kB. + */ + for (blksz = 512; blksz < 0x10000; blksz *= 2) { + if (blkoff * blksz > total_size || + blkoff * blksz + data_size > total_size || + data_size % 4) + break; + + /* + * Calculate data checksum and if it matches + * then tried blksz should be correct. + */ + ptr = img + blkoff * blksz; + end = (void *)ptr + data_size - 4; + for (sum = 0; ptr < end; ptr++) + sum += *ptr; + + if (sum == *end) + return blksz; + } + + /* Fallback to 512 bytes */ + return 512; +} + static const char * kwboot_img_type(uint8_t blockid) { @@ -2049,7 +2082,7 @@ kwboot_img_patch(void *img, size_t *size, int baudrate) switch (hdr->blockid) { case IBR_HDR_SATA_ID: - hdr->srcaddr = cpu_to_le32(srcaddr * 512); + hdr->srcaddr = cpu_to_le32(srcaddr * kwboot_img_guess_sata_blksz(img, srcaddr, le32_to_cpu(hdr->blocksize), *size)); break; case IBR_HDR_PEX_ID: diff --git a/tools/lpc32xximage.c b/tools/lpc32xximage.c index 37931f91840..715a55a5b5b 100644 --- a/tools/lpc32xximage.c +++ b/tools/lpc32xximage.c @@ -125,7 +125,7 @@ static void print_hdr_byte(struct nand_page_0_boot_header *hdr, int ofs) printf("header[%d] = %02x\n", ofs, hdr->data[ofs]); } -static void lpc32xximage_print_header(const void *ptr) +static void lpc32xximage_print_header(const void *ptr, struct image_tool_params *params) { struct nand_page_0_boot_header *hdr = (struct nand_page_0_boot_header *)ptr; diff --git a/tools/mkimage.c b/tools/mkimage.c index a92d9d5ca57..6dfe3e1d42d 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -790,7 +790,7 @@ int main(int argc, char **argv) /* Print the image information by processing image header */ if (tparams->print_header) - tparams->print_header (ptr); + tparams->print_header (ptr, ¶ms); else { fprintf (stderr, "%s: Can't print header for %s\n", params.cmdname, tparams->name); diff --git a/tools/mtk_image.c b/tools/mtk_image.c index 5ef9334163d..30f54c8e8d8 100644 --- a/tools/mtk_image.c +++ b/tools/mtk_image.c @@ -510,7 +510,7 @@ static int mtk_image_verify_header(unsigned char *ptr, int image_size, return -1; } -static void mtk_image_print_header(const void *ptr) +static void mtk_image_print_header(const void *ptr, struct image_tool_params *params) { struct legacy_img_hdr *hdr = (struct legacy_img_hdr *)ptr; union lk_hdr *lk = (union lk_hdr *)ptr; diff --git a/tools/mxsimage.c b/tools/mxsimage.c index fbe46c47fae..ead61d0cd63 100644 --- a/tools/mxsimage.c +++ b/tools/mxsimage.c @@ -2239,7 +2239,7 @@ static int mxsimage_verify_header(unsigned char *ptr, int image_size, return mxsimage_verify_print_header(params->imagefile, 1); } -static void mxsimage_print_header(const void *hdr) +static void mxsimage_print_header(const void *hdr, struct image_tool_params *params) { if (imagefile) mxsimage_verify_print_header(imagefile, 0); diff --git a/tools/omapimage.c b/tools/omapimage.c index c59cdcc79b3..b79c1c3b648 100644 --- a/tools/omapimage.c +++ b/tools/omapimage.c @@ -85,7 +85,7 @@ static void omapimage_print_section(struct ch_settings *chs) chs->flags); } -static void omapimage_print_header(const void *ptr) +static void omapimage_print_header(const void *ptr, struct image_tool_params *params) { const struct ch_toc *toc = (struct ch_toc *)ptr; const struct gp_header *gph = diff --git a/tools/patman/__main__.py b/tools/patman/__main__.py index 48ffbc8eadf..8eba5d34864 100755 --- a/tools/patman/__main__.py +++ b/tools/patman/__main__.py @@ -7,7 +7,11 @@ """See README for more information""" from argparse import ArgumentParser -import importlib.resources +try: + import importlib.resources +except ImportError: + # for Python 3.6 + import importlib_resources import os import re import sys diff --git a/tools/patman/commit.py b/tools/patman/commit.py index 9537de43d39..684225c0e60 100644 --- a/tools/patman/commit.py +++ b/tools/patman/commit.py @@ -29,6 +29,8 @@ class Commit: value: Set of people who gave that rtag, each a name/email string warn: List of warnings for this commit, each a str patch (str): Filename of the patch file for this commit + future (concurrent.futures.Future): Future object for processing this + commit, or None """ def __init__(self, hash): self.hash = hash @@ -42,6 +44,7 @@ class Commit: self.rtags = collections.defaultdict(set) self.warn = [] self.patch = '' + self.future = None def __str__(self): return self.subject diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 42ac4ed77b7..e3918497cf4 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -489,8 +489,8 @@ complicated as possible''') # pylint: disable=E1101 self.repo.checkout(target, strategy=pygit2.GIT_CHECKOUT_FORCE) control.setup() + orig_dir = os.getcwd() try: - orig_dir = os.getcwd() os.chdir(self.gitdir) # Check that it can detect the current branch @@ -679,8 +679,8 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c self.repo.checkout(target, strategy=pygit2.GIT_CHECKOUT_FORCE) # Check that it can detect the current branch + orig_dir = os.getcwd() try: - orig_dir = os.getcwd() os.chdir(self.gitdir) with self.assertRaises(ValueError) as exc: gitutil.count_commits_to_branch(None) diff --git a/tools/pblimage.c b/tools/pblimage.c index bd639c276f9..6c4d360e469 100644 --- a/tools/pblimage.c +++ b/tools/pblimage.c @@ -254,7 +254,7 @@ static int pblimage_verify_header(unsigned char *ptr, int image_size, return 0; } -static void pblimage_print_header(const void *ptr) +static void pblimage_print_header(const void *ptr, struct image_tool_params *params) { printf("Image Type: Freescale PBL Boot Image\n"); } diff --git a/tools/prelink-riscv.c b/tools/prelink-riscv.c index b0467949ebe..43d6412ee9b 100644 --- a/tools/prelink-riscv.c +++ b/tools/prelink-riscv.c @@ -118,5 +118,7 @@ int main(int argc, const char *const *argv) prelink_le32(data); } + munmap(data, st.st_size); + return 0; } diff --git a/tools/prelink-riscv.inc b/tools/prelink-riscv.inc index f2b5467f5b3..57c0f655d45 100644 --- a/tools/prelink-riscv.inc +++ b/tools/prelink-riscv.inc @@ -30,7 +30,7 @@ #define cpu_to_target32 CONCAT3(cpu_to_, PRELINK_BYTEORDER, 32) #define cpu_to_target64 CONCAT3(cpu_to_, PRELINK_BYTEORDER, 64) -static void* get_offset_bonn (void* data, Elf_Phdr* phdrs, size_t phnum, Elf_Addr addr) +static void *get_offset_bonn(void *data, Elf_Phdr *phdrs, size_t phnum, Elf_Addr addr) { Elf_Phdr *p; @@ -67,13 +67,13 @@ static void prelink_bonn(void *data) Elf_Rela *rela_dyn = NULL; size_t rela_count = 0; Elf_Sym *dynsym = NULL; - for (dyn = dyns;; ++dyn) { + for (dyn = dyns; ; ++dyn) { if (targetnn_to_cpu(dyn->d_tag) == DT_NULL) break; else if (targetnn_to_cpu(dyn->d_tag) == DT_RELA) rela_dyn = get_offset_bonn(data, phdrs, target16_to_cpu(ehdr->e_phnum), + targetnn_to_cpu(dyn->d_un.d_ptr)); else if (targetnn_to_cpu(dyn->d_tag) == DT_RELASZ) - rela_count = targetnn_to_cpu(dyn->d_un.d_val) / sizeof(Elf_Rela); + rela_count = targetnn_to_cpu(dyn->d_un.d_val) / sizeof(Elf_Rela); else if (targetnn_to_cpu(dyn->d_tag) == DT_SYMTAB) dynsym = get_offset_bonn(data, phdrs, target16_to_cpu(ehdr->e_phnum), + targetnn_to_cpu(dyn->d_un.d_ptr)); @@ -92,11 +92,11 @@ static void prelink_bonn(void *data) continue; if (ELF_R_TYPE(targetnn_to_cpu(r->r_info)) == R_RISCV_RELATIVE) - *((uintnn_t*) buf) = r->r_addend; + *((uintnn_t *)buf) = r->r_addend; else if (ELF_R_TYPE(targetnn_to_cpu(r->r_info)) == R_RISCV_32) - *((uint32_t*) buf) = cpu_to_target32(targetnn_to_cpu(dynsym[ELF_R_SYM(targetnn_to_cpu(r->r_info))].st_value) + targetnn_to_cpu(r->r_addend)); + *((uint32_t *)buf) = cpu_to_target32(targetnn_to_cpu(dynsym[ELF_R_SYM(targetnn_to_cpu(r->r_info))].st_value) + targetnn_to_cpu(r->r_addend)); else if (ELF_R_TYPE(targetnn_to_cpu(r->r_info)) == R_RISCV_64) - *((uint64_t*) buf) = cpu_to_target64(targetnn_to_cpu(dynsym[ELF_R_SYM(targetnn_to_cpu(r->r_info))].st_value) + targetnn_to_cpu(r->r_addend)); + *((uint64_t *)buf) = cpu_to_target64(targetnn_to_cpu(dynsym[ELF_R_SYM(targetnn_to_cpu(r->r_info))].st_value) + targetnn_to_cpu(r->r_addend)); } } diff --git a/tools/rkcommon.c b/tools/rkcommon.c index 96efc1192cb..12c27b34eaa 100644 --- a/tools/rkcommon.c +++ b/tools/rkcommon.c @@ -481,7 +481,7 @@ int rkcommon_verify_header(unsigned char *buf, int size, return -ENOENT; } -void rkcommon_print_header(const void *buf) +void rkcommon_print_header(const void *buf, struct image_tool_params *params) { struct header0_info header0; struct header0_info_v2 header0_v2; diff --git a/tools/rkcommon.h b/tools/rkcommon.h index 49b6df31850..5d2770a80f1 100644 --- a/tools/rkcommon.h +++ b/tools/rkcommon.h @@ -68,7 +68,7 @@ int rkcommon_verify_header(unsigned char *buf, int size, * * @buf: Pointer to the image (can be a read-only file-mapping) */ -void rkcommon_print_header(const void *buf); +void rkcommon_print_header(const void *buf, struct image_tool_params *params); /** * rkcommon_need_rc4_spl() - check if rc4 encoded spl is required diff --git a/tools/socfpgaimage.c b/tools/socfpgaimage.c index eba812fec96..953dfeed4d5 100644 --- a/tools/socfpgaimage.c +++ b/tools/socfpgaimage.c @@ -313,7 +313,7 @@ static void socfpgaimage_print_header_v1(struct socfpga_header_v1 *header) le16_to_cpu(header->checksum)); } -static void socfpgaimage_print_header(const void *ptr) +static void socfpgaimage_print_header(const void *ptr, struct image_tool_params *params) { const void *header = ptr + HEADER_OFFSET; struct socfpga_header_v0 *header_v0; diff --git a/tools/stm32image.c b/tools/stm32image.c index 18357c05182..5c6991f35de 100644 --- a/tools/stm32image.c +++ b/tools/stm32image.c @@ -99,7 +99,7 @@ static int stm32image_verify_header(unsigned char *ptr, int image_size, return 0; } -static void stm32image_print_header(const void *ptr) +static void stm32image_print_header(const void *ptr, struct image_tool_params *params) { struct stm32_header *stm32hdr = (struct stm32_header *)ptr; diff --git a/tools/sunxi_egon.c b/tools/sunxi_egon.c index d45b6f5e435..a514427809a 100644 --- a/tools/sunxi_egon.c +++ b/tools/sunxi_egon.c @@ -82,7 +82,7 @@ static int egon_verify_header(unsigned char *ptr, int image_size, return EXIT_SUCCESS; } -static void egon_print_header(const void *buf) +static void egon_print_header(const void *buf, struct image_tool_params *params) { const struct boot_file_head *header = buf; diff --git a/tools/sunxi_toc0.c b/tools/sunxi_toc0.c index 7a8d74bb8e4..292649fe90f 100644 --- a/tools/sunxi_toc0.c +++ b/tools/sunxi_toc0.c @@ -757,7 +757,7 @@ static const char *toc0_item_name(uint32_t name) return "(unknown)"; } -static void toc0_print_header(const void *buf) +static void toc0_print_header(const void *buf, struct image_tool_params *params) { const struct toc0_main_info *main_info = buf; const struct toc0_item_info *item_info = (void *)(main_info + 1); diff --git a/tools/ublimage.c b/tools/ublimage.c index 1d2e897f6b3..8f9b58c7983 100644 --- a/tools/ublimage.c +++ b/tools/ublimage.c @@ -202,7 +202,7 @@ static int ublimage_verify_header(unsigned char *ptr, int image_size, return 0; } -static void ublimage_print_header(const void *ptr) +static void ublimage_print_header(const void *ptr, struct image_tool_params *params) { struct ubl_header *ubl_hdr = (struct ubl_header *) ptr; diff --git a/tools/vybridimage.c b/tools/vybridimage.c index 94a6684c19b..c38886fa903 100644 --- a/tools/vybridimage.c +++ b/tools/vybridimage.c @@ -134,7 +134,7 @@ static void vybridimage_print_hdr_field(struct nand_page_0_boot_header *hdr, printf("header.fcb[%d] = %08x\n", idx, hdr->fcb[idx]); } -static void vybridimage_print_header(const void *ptr) +static void vybridimage_print_header(const void *ptr, struct image_tool_params *params) { struct nand_page_0_boot_header *hdr = (struct nand_page_0_boot_header *)ptr; diff --git a/tools/zynqimage.c b/tools/zynqimage.c index d3f418b0612..359c93d1acd 100644 --- a/tools/zynqimage.c +++ b/tools/zynqimage.c @@ -163,7 +163,7 @@ static int zynqimage_verify_header(unsigned char *ptr, int image_size, return 0; } -static void zynqimage_print_header(const void *ptr) +static void zynqimage_print_header(const void *ptr, struct image_tool_params *params) { struct zynq_header *zynqhdr = (struct zynq_header *)ptr; int i; diff --git a/tools/zynqmpimage.c b/tools/zynqmpimage.c index 19b2f02ff15..5113ba895f0 100644 --- a/tools/zynqmpimage.c +++ b/tools/zynqmpimage.c @@ -209,7 +209,7 @@ static void print_partition(const void *ptr, const struct partition_header *ph) printf(" Checksum : 0x%08x\n", le32_to_cpu(ph->checksum)); } -void zynqmpimage_print_header(const void *ptr) +void zynqmpimage_print_header(const void *ptr, struct image_tool_params *params) { struct zynqmp_header *zynqhdr = (struct zynqmp_header *)ptr; int i; diff --git a/tools/zynqmpimage.h b/tools/zynqmpimage.h index a1db819aa36..9d526a17cdd 100644 --- a/tools/zynqmpimage.h +++ b/tools/zynqmpimage.h @@ -133,6 +133,6 @@ struct zynqmp_header { }; void zynqmpimage_default_header(struct zynqmp_header *ptr); -void zynqmpimage_print_header(const void *ptr); +void zynqmpimage_print_header(const void *ptr, struct image_tool_params *params); #endif /* _ZYNQMPIMAGE_H_ */ |
