1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (C) 2023 Intel Corporation. 3 * All rights reserved. 4 */ 5 6 #include "crc_internal.h" 7 #include "spdk/crc64.h" 8 9 static const uint64_t crc64_rocksoft_refl_table[256] = { 10 0x0000000000000000ULL, 0x7f6ef0c830358979ULL, 11 0xfedde190606b12f2ULL, 0x81b31158505e9b8bULL, 12 0xc962e5739841b68fULL, 0xb60c15bba8743ff6ULL, 13 0x37bf04e3f82aa47dULL, 0x48d1f42bc81f2d04ULL, 14 0xa61cecb46814fe75ULL, 0xd9721c7c5821770cULL, 15 0x58c10d24087fec87ULL, 0x27affdec384a65feULL, 16 0x6f7e09c7f05548faULL, 0x1010f90fc060c183ULL, 17 0x91a3e857903e5a08ULL, 0xeecd189fa00bd371ULL, 18 0x78e0ff3b88be6f81ULL, 0x078e0ff3b88be6f8ULL, 19 0x863d1eabe8d57d73ULL, 0xf953ee63d8e0f40aULL, 20 0xb1821a4810ffd90eULL, 0xceecea8020ca5077ULL, 21 0x4f5ffbd87094cbfcULL, 0x30310b1040a14285ULL, 22 0xdefc138fe0aa91f4ULL, 0xa192e347d09f188dULL, 23 0x2021f21f80c18306ULL, 0x5f4f02d7b0f40a7fULL, 24 0x179ef6fc78eb277bULL, 0x68f0063448deae02ULL, 25 0xe943176c18803589ULL, 0x962de7a428b5bcf0ULL, 26 0xf1c1fe77117cdf02ULL, 0x8eaf0ebf2149567bULL, 27 0x0f1c1fe77117cdf0ULL, 0x7072ef2f41224489ULL, 28 0x38a31b04893d698dULL, 0x47cdebccb908e0f4ULL, 29 0xc67efa94e9567b7fULL, 0xb9100a5cd963f206ULL, 30 0x57dd12c379682177ULL, 0x28b3e20b495da80eULL, 31 0xa900f35319033385ULL, 0xd66e039b2936bafcULL, 32 0x9ebff7b0e12997f8ULL, 0xe1d10778d11c1e81ULL, 33 0x606216208142850aULL, 0x1f0ce6e8b1770c73ULL, 34 0x8921014c99c2b083ULL, 0xf64ff184a9f739faULL, 35 0x77fce0dcf9a9a271ULL, 0x08921014c99c2b08ULL, 36 0x4043e43f0183060cULL, 0x3f2d14f731b68f75ULL, 37 0xbe9e05af61e814feULL, 0xc1f0f56751dd9d87ULL, 38 0x2f3dedf8f1d64ef6ULL, 0x50531d30c1e3c78fULL, 39 0xd1e00c6891bd5c04ULL, 0xae8efca0a188d57dULL, 40 0xe65f088b6997f879ULL, 0x9931f84359a27100ULL, 41 0x1882e91b09fcea8bULL, 0x67ec19d339c963f2ULL, 42 0xd75adabd7a6e2d6fULL, 0xa8342a754a5ba416ULL, 43 0x29873b2d1a053f9dULL, 0x56e9cbe52a30b6e4ULL, 44 0x1e383fcee22f9be0ULL, 0x6156cf06d21a1299ULL, 45 0xe0e5de5e82448912ULL, 0x9f8b2e96b271006bULL, 46 0x71463609127ad31aULL, 0x0e28c6c1224f5a63ULL, 47 0x8f9bd7997211c1e8ULL, 0xf0f5275142244891ULL, 48 0xb824d37a8a3b6595ULL, 0xc74a23b2ba0eececULL, 49 0x46f932eaea507767ULL, 0x3997c222da65fe1eULL, 50 0xafba2586f2d042eeULL, 0xd0d4d54ec2e5cb97ULL, 51 0x5167c41692bb501cULL, 0x2e0934dea28ed965ULL, 52 0x66d8c0f56a91f461ULL, 0x19b6303d5aa47d18ULL, 53 0x980521650afae693ULL, 0xe76bd1ad3acf6feaULL, 54 0x09a6c9329ac4bc9bULL, 0x76c839faaaf135e2ULL, 55 0xf77b28a2faafae69ULL, 0x8815d86aca9a2710ULL, 56 0xc0c42c4102850a14ULL, 0xbfaadc8932b0836dULL, 57 0x3e19cdd162ee18e6ULL, 0x41773d1952db919fULL, 58 0x269b24ca6b12f26dULL, 0x59f5d4025b277b14ULL, 59 0xd846c55a0b79e09fULL, 0xa72835923b4c69e6ULL, 60 0xeff9c1b9f35344e2ULL, 0x90973171c366cd9bULL, 61 0x1124202993385610ULL, 0x6e4ad0e1a30ddf69ULL, 62 0x8087c87e03060c18ULL, 0xffe938b633338561ULL, 63 0x7e5a29ee636d1eeaULL, 0x0134d92653589793ULL, 64 0x49e52d0d9b47ba97ULL, 0x368bddc5ab7233eeULL, 65 0xb738cc9dfb2ca865ULL, 0xc8563c55cb19211cULL, 66 0x5e7bdbf1e3ac9decULL, 0x21152b39d3991495ULL, 67 0xa0a63a6183c78f1eULL, 0xdfc8caa9b3f20667ULL, 68 0x97193e827bed2b63ULL, 0xe877ce4a4bd8a21aULL, 69 0x69c4df121b863991ULL, 0x16aa2fda2bb3b0e8ULL, 70 0xf86737458bb86399ULL, 0x8709c78dbb8deae0ULL, 71 0x06bad6d5ebd3716bULL, 0x79d4261ddbe6f812ULL, 72 0x3105d23613f9d516ULL, 0x4e6b22fe23cc5c6fULL, 73 0xcfd833a67392c7e4ULL, 0xb0b6c36e43a74e9dULL, 74 0x9a6c9329ac4bc9b5ULL, 0xe50263e19c7e40ccULL, 75 0x64b172b9cc20db47ULL, 0x1bdf8271fc15523eULL, 76 0x530e765a340a7f3aULL, 0x2c608692043ff643ULL, 77 0xadd397ca54616dc8ULL, 0xd2bd67026454e4b1ULL, 78 0x3c707f9dc45f37c0ULL, 0x431e8f55f46abeb9ULL, 79 0xc2ad9e0da4342532ULL, 0xbdc36ec59401ac4bULL, 80 0xf5129aee5c1e814fULL, 0x8a7c6a266c2b0836ULL, 81 0x0bcf7b7e3c7593bdULL, 0x74a18bb60c401ac4ULL, 82 0xe28c6c1224f5a634ULL, 0x9de29cda14c02f4dULL, 83 0x1c518d82449eb4c6ULL, 0x633f7d4a74ab3dbfULL, 84 0x2bee8961bcb410bbULL, 0x548079a98c8199c2ULL, 85 0xd53368f1dcdf0249ULL, 0xaa5d9839ecea8b30ULL, 86 0x449080a64ce15841ULL, 0x3bfe706e7cd4d138ULL, 87 0xba4d61362c8a4ab3ULL, 0xc52391fe1cbfc3caULL, 88 0x8df265d5d4a0eeceULL, 0xf29c951de49567b7ULL, 89 0x732f8445b4cbfc3cULL, 0x0c41748d84fe7545ULL, 90 0x6bad6d5ebd3716b7ULL, 0x14c39d968d029fceULL, 91 0x95708ccedd5c0445ULL, 0xea1e7c06ed698d3cULL, 92 0xa2cf882d2576a038ULL, 0xdda178e515432941ULL, 93 0x5c1269bd451db2caULL, 0x237c997575283bb3ULL, 94 0xcdb181ead523e8c2ULL, 0xb2df7122e51661bbULL, 95 0x336c607ab548fa30ULL, 0x4c0290b2857d7349ULL, 96 0x04d364994d625e4dULL, 0x7bbd94517d57d734ULL, 97 0xfa0e85092d094cbfULL, 0x856075c11d3cc5c6ULL, 98 0x134d926535897936ULL, 0x6c2362ad05bcf04fULL, 99 0xed9073f555e26bc4ULL, 0x92fe833d65d7e2bdULL, 100 0xda2f7716adc8cfb9ULL, 0xa54187de9dfd46c0ULL, 101 0x24f29686cda3dd4bULL, 0x5b9c664efd965432ULL, 102 0xb5517ed15d9d8743ULL, 0xca3f8e196da80e3aULL, 103 0x4b8c9f413df695b1ULL, 0x34e26f890dc31cc8ULL, 104 0x7c339ba2c5dc31ccULL, 0x035d6b6af5e9b8b5ULL, 105 0x82ee7a32a5b7233eULL, 0xfd808afa9582aa47ULL, 106 0x4d364994d625e4daULL, 0x3258b95ce6106da3ULL, 107 0xb3eba804b64ef628ULL, 0xcc8558cc867b7f51ULL, 108 0x8454ace74e645255ULL, 0xfb3a5c2f7e51db2cULL, 109 0x7a894d772e0f40a7ULL, 0x05e7bdbf1e3ac9deULL, 110 0xeb2aa520be311aafULL, 0x944455e88e0493d6ULL, 111 0x15f744b0de5a085dULL, 0x6a99b478ee6f8124ULL, 112 0x224840532670ac20ULL, 0x5d26b09b16452559ULL, 113 0xdc95a1c3461bbed2ULL, 0xa3fb510b762e37abULL, 114 0x35d6b6af5e9b8b5bULL, 0x4ab846676eae0222ULL, 115 0xcb0b573f3ef099a9ULL, 0xb465a7f70ec510d0ULL, 116 0xfcb453dcc6da3dd4ULL, 0x83daa314f6efb4adULL, 117 0x0269b24ca6b12f26ULL, 0x7d0742849684a65fULL, 118 0x93ca5a1b368f752eULL, 0xeca4aad306bafc57ULL, 119 0x6d17bb8b56e467dcULL, 0x12794b4366d1eea5ULL, 120 0x5aa8bf68aecec3a1ULL, 0x25c64fa09efb4ad8ULL, 121 0xa4755ef8cea5d153ULL, 0xdb1bae30fe90582aULL, 122 0xbcf7b7e3c7593bd8ULL, 0xc399472bf76cb2a1ULL, 123 0x422a5673a732292aULL, 0x3d44a6bb9707a053ULL, 124 0x759552905f188d57ULL, 0x0afba2586f2d042eULL, 125 0x8b48b3003f739fa5ULL, 0xf42643c80f4616dcULL, 126 0x1aeb5b57af4dc5adULL, 0x6585ab9f9f784cd4ULL, 127 0xe436bac7cf26d75fULL, 0x9b584a0fff135e26ULL, 128 0xd389be24370c7322ULL, 0xace74eec0739fa5bULL, 129 0x2d545fb4576761d0ULL, 0x523aaf7c6752e8a9ULL, 130 0xc41748d84fe75459ULL, 0xbb79b8107fd2dd20ULL, 131 0x3acaa9482f8c46abULL, 0x45a459801fb9cfd2ULL, 132 0x0d75adabd7a6e2d6ULL, 0x721b5d63e7936bafULL, 133 0xf3a84c3bb7cdf024ULL, 0x8cc6bcf387f8795dULL, 134 0x620ba46c27f3aa2cULL, 0x1d6554a417c62355ULL, 135 0x9cd645fc4798b8deULL, 0xe3b8b53477ad31a7ULL, 136 0xab69411fbfb21ca3ULL, 0xd407b1d78f8795daULL, 137 0x55b4a08fdfd90e51ULL, 0x2ada5047efec8728ULL 138 }; 139 140 static inline uint64_t 141 crc64_rocksoft_refl_base(uint64_t seed, const uint8_t *buf, uint64_t len) 142 { 143 uint64_t i, crc = ~seed; 144 145 for (i = 0; i < len; i++) { 146 uint8_t byte = buf[i]; 147 crc = crc64_rocksoft_refl_table[(uint8_t) crc ^ byte] ^ (crc >> 8); 148 } 149 150 return ~crc; 151 } 152 153 uint64_t 154 spdk_crc64_nvme(const void *buf, size_t len, uint64_t crc) 155 { 156 return crc64_rocksoft_refl_base(crc, (const uint8_t *)buf, len); 157 } 158