[U-Boot] Two CRC32 implementation in U-Boot, why?

Heinrich Schuchardt xypron.glpk at gmx.de
Wed Aug 1 13:50:06 UTC 2018



On 08/01/2018 02:13 PM, Bin Meng wrote:
> Hi,
> 
> Currently it seems that we have two CRC32 implementation in U-Boot.
> Two headers files are provided.
> 
> 1. include/linux/crc32.h
> The implementation is drivers/mtd/ubi/crc32.c.
> Codes that use this implementation include:
> 
> drivers/mtd/ubi/*
> drivers/mtd/ubispl/*
> fs/ubifs/*
> 
> 2. include/u-boot/crc.h
> The implementation is lib/crc32.c
> Codes that use this implementation include:
> 
> fs/btrfs/hash.c
> tools/*
> common/hash.c
> common/image.c
> common/image-fit.c
> lib/efi_loader/efi_boottime.c
> 
> It looks that include/linux/crc32.h was originally imported from Linux
> kernel's include/linux/crc32.h, but the implementation in Linux
> kernel's lib/crc32.c was not imported to U-Boot's lib/crc32.c but to
> drivers/mtd/ubi/crc32.c. Why?
> 
> Somehow U-Boot lib/crc32.c uses another different implementation from zlib.
> 
> This is a mess. For example if I include both headers in one C file,
> it won't compile.
> 
> Can we clean this up?

Thanks for pointing this out.

The drivers/mtd/ubi/crc32.c is based on an elder version of Linux.

When looking at the function signatures I am not happy with
include/u-boot/crc.h
 uint32_t crc32 (uint32_t, const unsigned char *, uint)
The last parameter should be size_t. Otherwise the CRC may be wrong on
64bit systems.

The two crc32 implementations do not have the same result on a
low-endian system:

crc32_le(0, 'U-Boot', 6) = a289ac17
crc32(0, 'U-Boot', 6) = 134b0db4.

According to the comments in in include/linux/crc32.h the result of
crc32_le is in bit reversed order.

Conflicting definitions could be avoided by removing #define crc32() in
include/linux/crc32.h and adjusting the ubi code accordingly.

Best regards

Heinrich


More information about the U-Boot mailing list