5 #include "sw/device/lib/base/crc32.h"
12 #ifdef OT_PLATFORM_RV32
14 static uint32_t crc32_internal_add8(uint32_t ctx, uint8_t
byte) {
17 ".option arch, +zbr0p93;"
25 static uint32_t crc32_internal_add32(uint32_t ctx, uint32_t word) {
28 ".option arch, +zbr0p93;"
39 kCrc32Poly = 0xedb88320,
51 static uint32_t crc32_internal_add8(uint32_t ctx, uint8_t
byte) {
53 for (
size_t i = 0; i < 8; ++i) {
64 static uint32_t crc32_internal_add32(uint32_t ctx, uint32_t word) {
65 char *bytes = (
char *)&word;
66 for (
size_t i = 0; i <
sizeof(uint32_t); ++i) {
67 ctx = crc32_internal_add8(ctx, bytes[i]);
73 void crc32_init(uint32_t *ctx) { *ctx = UINT32_MAX; }
75 void crc32_add8(uint32_t *ctx, uint8_t
byte) {
76 *ctx = crc32_internal_add8(*ctx,
byte);
79 void crc32_add32(uint32_t *ctx, uint32_t word) {
80 *ctx = crc32_internal_add32(*ctx, word);
83 void crc32_add(uint32_t *ctx,
const void *buf,
size_t len) {
84 const char *data = buf;
85 uint32_t state = *ctx;
87 for (; len > 0 && (uintptr_t)data & 0x3; --len, ++data) {
88 state = crc32_internal_add8(state, *data);
91 for (; len >=
sizeof(uint32_t);
92 len -=
sizeof(uint32_t), data +=
sizeof(uint32_t)) {
93 state = crc32_internal_add32(state,
read_32(data));
96 for (; len > 0; --len, ++data) {
97 state = crc32_internal_add8(state, *data);
102 uint32_t crc32_finish(
const uint32_t *ctx) {
return *ctx ^ UINT32_MAX; }
104 uint32_t crc32(
const void *buf,
size_t len) {
107 crc32_add(&ctx, buf, len);
108 return crc32_finish(&ctx);