[PATCH v1 11/54] crypto: crc32: implement position independent CRC32
Ahmad Fatoum
a.fatoum at pengutronix.de
Thu Dec 18 02:37:31 PST 2025
For use in the barebox EFI runtime, implement a self-contained CRC32
that will be placed into the .efi_runtime section.
The code is in the public domain.
Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
crypto/crc32.c | 24 ++++++++++++++++++++++++
include/crc.h | 2 ++
2 files changed, 26 insertions(+)
diff --git a/crypto/crc32.c b/crypto/crc32.c
index 5013556c0bea..bcfc8e99ee39 100644
--- a/crypto/crc32.c
+++ b/crypto/crc32.c
@@ -17,9 +17,11 @@
#include <malloc.h>
#include <linux/ctype.h>
#include <errno.h>
+#include <efi/attributes.h>
#define STATIC
#else
#define STATIC static inline
+#define __efi_runtime
#endif
static uint32_t crc_table[sizeof(uint32_t) * 256];
@@ -107,6 +109,28 @@ STATIC uint32_t crc32(uint32_t crc, const void *buf, unsigned int len)
EXPORT_SYMBOL(crc32);
#endif
+/* Taken from Hacker's Delight 2nd Edition by Henry S. Warren */
+STATIC __efi_runtime uint32_t __pi_crc32(uint32_t crc, const void *_buf, unsigned int len)
+{
+ const unsigned char *buf = _buf;
+ uint32_t mask;
+
+ crc = ~crc;
+ for (int i = 0; i < len; i++) {
+ crc = crc ^ buf[i];
+ for (int j = 7; j >= 0; j--) {
+ mask = -(crc & 1);
+ crc = (crc >> 1) ^ (0xEDB88320 & mask);
+ }
+ }
+
+ return ~crc;
+}
+
+#ifdef __BAREBOX__
+EXPORT_SYMBOL(__pi_crc32);
+#endif
+
STATIC uint32_t crc32_be(uint32_t crc, const void *_buf, unsigned int len)
{
const unsigned char *buf = _buf;
diff --git a/include/crc.h b/include/crc.h
index 3eba635dbaa4..c7d52f7cd078 100644
--- a/include/crc.h
+++ b/include/crc.h
@@ -18,4 +18,6 @@ uint32_t crc32_no_comp(uint32_t, const void *, unsigned int);
int file_crc(char *filename, unsigned long start, unsigned long size,
unsigned long *crc, unsigned long *total);
+uint32_t __pi_crc32(uint32_t, const void *, unsigned int);
+
#endif /* __INCLUDE_CRC_H */
--
2.47.3
More information about the barebox
mailing list