From 94212b4e3853b7b09acf0e2e1ec2b895bbbb2948 Mon Sep 17 00:00:00 2001 From: Mateusz Michalek Date: Fri, 4 Oct 2024 13:36:52 +0200 Subject: [PATCH] [nrf fromlist] scripts: imgtool: compression ARM thumb filter Adds ARM thumb filter to imgtool's LZMA2 compression. Upstream PR: https://github.com/mcu-tools/mcuboot/pull/2084 Signed-off-by: Mateusz Michalek --- scripts/imgtool/image.py | 5 ++++- scripts/imgtool/main.py | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/scripts/imgtool/image.py b/scripts/imgtool/image.py index 10de2a33f..84811806d 100644 --- a/scripts/imgtool/image.py +++ b/scripts/imgtool/image.py @@ -70,6 +70,7 @@ 'ROM_FIXED': 0x0000100, 'COMPRESSED_LZMA1': 0x0000200, 'COMPRESSED_LZMA2': 0x0000400, + 'COMPRESSED_ARM_THUMB': 0x0000800, } TLV_VALUES = { @@ -532,8 +533,10 @@ def create(self, key, public_key_format, enckey, dependencies=None, compression_flags = 0x0 if compression_tlvs is not None: - if compression_type == "lzma2": + if compression_type in ["lzma2", "lzma2armthumb"]: compression_flags = IMAGE_F['COMPRESSED_LZMA2'] + if compression_type == "lzma2armthumb": + compression_flags |= IMAGE_F['COMPRESSED_ARM_THUMB'] # This adds the header to the payload as well if encrypt_keylen == 256: self.add_header(enckey, protected_tlv_size, compression_flags, 256) diff --git a/scripts/imgtool/main.py b/scripts/imgtool/main.py index 03bb565c5..94952a838 100755 --- a/scripts/imgtool/main.py +++ b/scripts/imgtool/main.py @@ -363,7 +363,7 @@ def convert(self, value, param, ctx): help='When encrypting the image using AES, select a 128 bit or ' '256 bit key len.') @click.option('--compression', default='disabled', - type=click.Choice(['disabled', 'lzma2']), + type=click.Choice(['disabled', 'lzma2', 'lzma2armthumb']), help='Enable image compression using specified type. ' 'Will fall back without image compression automatically ' 'if the compression increases the image size.') @@ -513,7 +513,7 @@ def sign(key, public_key_format, align, version, pad_sig, header_size, custom_tlvs, compression_tlvs, int(encrypt_keylen), clear, baked_signature, pub_key, vector_to_sign, user_sha) - if compression == "lzma2": + if compression in ["lzma2", "lzma2armthumb"]: compressed_img = image.Image(version=decode_version(version), header_size=header_size, pad_header=pad_header, pad=pad, confirm=confirm, align=int(align), @@ -527,6 +527,8 @@ def sign(key, public_key_format, align, version, pad_sig, header_size, "dict_size": comp_default_dictsize, "lp": comp_default_lp, "lc": comp_default_lc} ] + if compression == "lzma2armthumb": + compression_filters.insert(0, {"id":lzma.FILTER_ARMTHUMB}) compressed_data = lzma.compress(img.get_infile_data(),filters=compression_filters, format=lzma.FORMAT_RAW) uncompressed_size = len(img.get_infile_data())