Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright (C) 2017 Intel Corporation. 3 : : * All rights reserved. 4 : : */ 5 : : 6 : : #include "util_internal.h" 7 : : #include "crc_internal.h" 8 : : #include "spdk/crc32.h" 9 : : 10 : : void 11 : 3415 : crc32_table_init(struct spdk_crc32_table *table, uint32_t polynomial_reflect) 12 : : { 13 : : int i, j; 14 : : uint32_t val; 15 : : 16 [ + + ]: 877655 : for (i = 0; i < 256; i++) { 17 : 874240 : val = i; 18 [ + + ]: 7868160 : for (j = 0; j < 8; j++) { 19 [ + + ]: 6993920 : if (val & 1) { 20 : 3496960 : val = (val >> 1) ^ polynomial_reflect; 21 : : } else { 22 : 3496960 : val = (val >> 1); 23 : : } 24 : : } 25 : 874240 : table->table[i] = val; 26 : : } 27 : 3415 : } 28 : : 29 : : #ifdef SPDK_HAVE_ARM_CRC 30 : : 31 : : uint32_t 32 : : crc32_update(const struct spdk_crc32_table *table, const void *buf, size_t len, uint32_t crc) 33 : : { 34 : : size_t count_pre, count_post, count_mid; 35 : : const uint64_t *dword_buf; 36 : : 37 : : /* process the head and tail bytes seperately to make the buf address 38 : : * passed to crc32_d is 8 byte aligned. This can avoid unaligned loads. 39 : : */ 40 : : count_pre = ((uint64_t)buf & 7) == 0 ? 0 : 8 - ((uint64_t)buf & 7); 41 : : count_post = (uint64_t)(buf + len) & 7; 42 : : count_mid = (len - count_pre - count_post) / 8; 43 : : 44 : : while (count_pre--) { 45 : : crc = __crc32b(crc, *(const uint8_t *)buf); 46 : : buf++; 47 : : } 48 : : 49 : : dword_buf = (const uint64_t *)buf; 50 : : while (count_mid--) { 51 : : crc = __crc32d(crc, *dword_buf); 52 : : dword_buf++; 53 : : } 54 : : 55 : : buf = dword_buf; 56 : : while (count_post--) { 57 : : crc = __crc32b(crc, *(const uint8_t *)buf); 58 : : buf++; 59 : : } 60 : : 61 : : return crc; 62 : : } 63 : : 64 : : #else 65 : : 66 : : uint32_t 67 : 33294 : crc32_update(const struct spdk_crc32_table *table, const void *buf, size_t len, uint32_t crc) 68 : : { 69 : 33294 : const uint8_t *buf_u8 = buf; 70 : : size_t i; 71 : : 72 [ + + ]: 136430226 : for (i = 0; i < len; i++) { 73 : 136396932 : crc = (crc >> 8) ^ table->table[(crc ^ buf_u8[i]) & 0xff]; 74 : : } 75 : : 76 : 33294 : return crc; 77 : : } 78 : : 79 : : #endif