5#include "sw/device/lib/base/crc32.h"
12#ifdef OT_PLATFORM_RV32
29static uint32_t crc32_internal_add8(uint32_t ctx, uint8_t
byte) {
37 ".insn i 0x13, 0x01, %0, %1, 0x610;"
43static uint32_t crc32_internal_add32(uint32_t ctx, uint32_t word) {
51 ".insn i 0x13, 0x01, %0, %1, 0x612;"
60 kCrc32Poly = 0xedb88320,
72static uint32_t crc32_internal_add8(uint32_t ctx, uint8_t
byte) {
74 for (
size_t i = 0; i < 8; ++i) {
85static uint32_t crc32_internal_add32(uint32_t ctx, uint32_t word) {
86 char *bytes = (
char *)&word;
87 for (
size_t i = 0; i <
sizeof(uint32_t); ++i) {
88 ctx = crc32_internal_add8(ctx, bytes[i]);
94void crc32_init(uint32_t *ctx) { *ctx = UINT32_MAX; }
96void crc32_add8(uint32_t *ctx, uint8_t
byte) {
97 *ctx = crc32_internal_add8(*ctx,
byte);
100void crc32_add32(uint32_t *ctx, uint32_t word) {
101 *ctx = crc32_internal_add32(*ctx, word);
104void crc32_add(uint32_t *ctx,
const void *buf,
size_t len) {
105 const char *data = buf;
106 uint32_t state = *ctx;
108 for (; len > 0 && (uintptr_t)data & 0x3; --len, ++data) {
109 state = crc32_internal_add8(state, *data);
112 for (; len >=
sizeof(uint32_t);
113 len -=
sizeof(uint32_t), data +=
sizeof(uint32_t)) {
114 state = crc32_internal_add32(state, read_32(data));
117 for (; len > 0; --len, ++data) {
118 state = crc32_internal_add8(state, *data);
123uint32_t crc32_finish(
const uint32_t *ctx) {
return *ctx ^ UINT32_MAX; }
125uint32_t crc32(
const void *buf,
size_t len) {
128 crc32_add(&ctx, buf, len);
129 return crc32_finish(&ctx);