[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