u-boot/lib
Rasmus Villemoes e7885a48bb lz4: fix decompressor on big-endian powerpc
Booting an lz4-compressed kernel image fails on our powerpc board with
-EPROTONOSUPPORT. Adding a bit of debug prints, we get

  magic: 0x184d2204
  flags: 0x64
  reserved0: 1
  has_content_checksum: 1
  has_content_size: 0
  has_block_checksum: 0
  independent_blocks: 1
  version: 0
  block_descriptor: 70
  reserved1: 7
  max_block_size: 0
  reserved2: 0

So the magic is ok, but the version check fails, also some reserved
bits are apparently set. But that's because the code interprets the
"flags" and "block_descriptor" bytes wrongly:

Using bit-fields to access individual bits of an "on the wire" format
is not portable, not even when restricted to the C flavour implemented
by gcc. Quoting the gcc manual:

   * 'The order of allocation of bit-fields within a unit (C90 6.5.2.1,
     C99 and C11 6.7.2.1).'

     Determined by ABI.

and indeed, the PPC Processor ABI supplement says

   * Bit-fields are allocated from right to left (least to most
     significant) on Little-Endian implementations and from left to
     right (most to least significant) on Big-Endian implementations.

The upstream code (github.com/lz4/lz4) uses explicit shifts and masks
for encoding/decoding:

    /* FLG Byte */
    *dstPtr++ = (BYTE)(((1 & _2BITS) << 6)    /* Version('01') */
        + ((cctxPtr->prefs.frameInfo.blockMode & _1BIT ) << 5)
        + ((cctxPtr->prefs.frameInfo.blockChecksumFlag & _1BIT ) << 4)
        + ((unsigned)(cctxPtr->prefs.frameInfo.contentSize > 0) << 3)
        + ((cctxPtr->prefs.frameInfo.contentChecksumFlag & _1BIT ) << 2)
        +  (cctxPtr->prefs.frameInfo.dictID > 0) );

    /* Flags */
    {   U32 const FLG = srcPtr[4];
        U32 const version = (FLG>>6) & _2BITS;
        blockChecksumFlag = (FLG>>4) & _1BIT;
        blockMode = (FLG>>5) & _1BIT;
        contentSizeFlag = (FLG>>3) & _1BIT;
        contentChecksumFlag = (FLG>>2) & _1BIT;
        dictIDFlag = FLG & _1BIT;
        /* validate */
        if (((FLG>>1)&_1BIT) != 0) return err0r(LZ4F_ERROR_reservedFlag_set); /* Reserved bit */
        if (version != 1) return err0r(LZ4F_ERROR_headerVersion_wrong);        /* Version Number, only supported value */
    }

Do the same here, and while at it, be more careful to use unaligned
accessors to what is most likely unaligned. Also update the comment to
make it clear that it only refers to the lz4.c file, not the following
code of lz4_wrapper.c.

This has been tested partly, of course, by seeing that my
lz4-compressed kernel now boots, partly by running the (de)compression
test-suite in the (x86_64) sandbox - i.e., it should still work just
fine on little-endian hosts.

Reviewed-by: Julius Werner <jwerner@chromium.org>
Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
2020-07-17 08:45:29 -04:00
..
acpi acpi: Support writing named values 2020-07-17 14:32:24 +08:00
aes u-boot: fit: add support to decrypt fit with aes 2020-01-17 10:16:29 -05:00
at91 SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
bzip2 common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
crypto common: Drop linux/bug.h from common header 2020-05-18 21:19:23 -04:00
dhry command: Remove the cmd_tbl_t typedef 2020-05-18 18:36:55 -04:00
efi common: Drop init.h from common header 2020-05-18 17:33:33 -04:00
efi_driver common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
efi_loader efi_loader: pre-seed UEFI variables 2020-07-16 12:37:02 +02:00
efi_selftest efi_selftest: adjust runtime test for variables 2020-07-11 23:14:17 +02:00
libavb common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
libfdt fdt_region: move fdt_region.c to common/ from lib/libfdt/ 2020-04-26 14:23:55 -06:00
lzma common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
lzo SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
optee optee: fix copy of optee reserved-memory node 2020-06-15 11:23:40 -04:00
rsa lib: rsa: export rsa_verify_with_pkey() 2020-07-11 23:14:16 +02:00
tizen SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
zlib lib: zlib: fix formatting, reference 2020-04-27 14:55:29 -04:00
zstd dm: core: Create a new header file for 'compat' features 2020-02-05 19:33:46 -07:00
.gitignore lib: ignore oid_registry_data.c file 2020-01-22 17:47:57 -05:00
addr_map.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
aes.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
asm-offsets.c common: Drop asm_offsets.h from common header 2020-05-18 21:19:23 -04:00
asn1_decoder.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
bch.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
binman.c binman: Add way to locate an entry in memory 2020-07-17 14:32:24 +08:00
bitrev.c lib: bitrev: Sync with Linux kernel v4.17 2018-09-18 00:01:18 -06:00
charset.c charset: Add support for calculating bytes occupied by a u16 string 2020-05-09 09:30:28 +02:00
circbuf.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
crc7.c lib: add crc7 from Linux 2011-01-18 23:38:08 +01:00
crc8.c common: Drop linux/crc8.h 2019-12-02 18:23:07 -05:00
crc16.c Roll CRC16-CCITT into the hash infrastructure 2018-12-08 20:18:44 -05:00
crc32.c crc32: Use the crc.h header for crc functions 2019-12-02 18:23:08 -05:00
crc32c.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
ctype.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
date.c lib: add mktime64() for linux compatibility 2019-12-06 16:44:19 -05:00
display_options.c display_options: Drop #ifdef for MEM_SUPPORT_64BIT_DATA 2020-07-08 17:21:46 -04:00
div64.c common: Drop linux/bitops.h from common header 2020-05-18 21:19:23 -04:00
elf.c lib: elf: Move the generic elf loading/validating functions to lib 2020-03-03 13:08:14 +05:30
errno.c Add basic errno support. 2010-09-19 19:29:47 +02:00
errno_str.c lib: errno: sync error codes 2019-10-31 07:22:53 -04:00
fdtdec.c fdtdec: Honor #address-cells and #size-cells in fdtdec_add_reserved_memory() 2020-06-11 20:52:11 -06:00
fdtdec_common.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
fdtdec_test.c command: Remove the cmd_tbl_t typedef 2020-05-18 18:36:55 -04:00
gunzip.c common: Drop part.h from common header 2020-05-18 17:33:33 -04:00
gzip.c common: Move gzip functions into a new gzip header 2019-08-11 16:43:41 -04:00
hang.c common: Move hang() to the same header as panic() 2020-01-17 17:53:40 -05:00
hashtable.c lib: Always set errno in hcreate_r 2020-07-01 15:01:21 +08:00
hexdump.c lib: do not provide hexdump in SPL 2020-04-24 10:51:32 -04:00
image-sparse.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
Kconfig powerpc: move ADDR_MAP to Kconfig 2020-07-10 14:10:43 -04:00
ldiv.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
linux_compat.c common: Drop net.h from common header 2020-05-18 17:33:31 -04:00
linux_string.c Make linux kernel string funcs available to tools 2012-12-13 11:46:07 -07:00
list_sort.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
lmb.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
lz4.c SPDX: Convert a few files that were missed before 2018-05-10 20:38:35 -04:00
lz4_wrapper.c lz4: fix decompressor on big-endian powerpc 2020-07-17 08:45:29 -04:00
Makefile Add support for SHA384 and SHA512 2020-06-12 13:14:07 -04:00
md5.c GCC47: Fix warning in md5.c 2012-04-29 14:14:08 +02:00
membuff.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
net_utils.c common: Drop net.h from common header 2020-05-18 17:33:31 -04:00
of_live.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
oid_registry.c lib: add oid registry utility 2019-12-06 16:44:20 -05:00
panic.c common: Drop linux/delay.h from common header 2020-05-18 21:19:23 -04:00
physmem.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
qsort.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
rand.c common: Move random-number functions into their own header 2019-12-02 18:23:07 -05:00
rbtree.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
rc4.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
sha1.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
sha256.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
sha512.c Add support for SHA384 and SHA512 2020-06-12 13:14:07 -04:00
slre.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
smbios.c smbios: empty strings in smbios_add_string() 2020-06-05 04:04:41 +02:00
string.c string: Allow arch override of strndup() also 2020-02-05 19:33:46 -07:00
strto.c Revert "lib: Improve _parse_integer_fixup_radix base 16 detection" 2020-06-15 11:23:41 -04:00
tables_csum.c SPDX: Convert all of our single license tags to Linux Kernel style 2018-05-07 09:34:12 -04:00
time.c timer: Allow delays with a 32-bit microsecond timer 2020-07-17 14:32:24 +08:00
tiny-printf.c tiny-printf: Support %i 2020-05-01 11:03:24 -04:00
tpm-common.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
tpm-utils.h tpm: Convert to use a device parameter 2018-11-29 09:30:06 -07:00
tpm-v1.c common: Drop log.h from common header 2020-05-18 21:19:18 -04:00
tpm-v2.c tpm: add TPM2_GetRandom command support 2020-07-08 15:38:32 -04:00
trace.c trace: clang compatible handling of gd register 2020-07-07 18:23:48 -04:00
uuid.c command: Remove the cmd_tbl_t typedef 2020-05-18 18:36:55 -04:00
vsprintf.c compiler*.h: sync include/linux/compiler*.h with Linux 5.7-rc5 2020-07-01 11:48:05 -04:00
xxhash.c lib: Add xxhash support 2019-05-05 08:48:50 -04:00