Hi Liming, No problem. CRC32c is a CRC32 variant with a different polynomial, so unfortunately we can't reuse the current mCrcTable. Note that technically we could further optimize the CRC32c code to detect and use the current Intel and ARM CRC32c extensions' instructions, but I didn't bother as it is rather non-trivial and may have dubious value in firmware, where CRC32 calculation should not be a bottleneck; regardless of this, we still need the lookup table implementation as a fallback as these instructions are optional in both architectures. All the best, Pedro On Thu, Jun 2, 2022 at 3:29 AM gaoliming wrote: > Pedro: > > Sorry for the late response. I am OK to add two new CRC APIs in BaseLib. > > > > For Crc32c, what difference is from current Crc32? Can it reuse current > mCrcTable value? > > > > Thanks > > Liming > > *发件人:* devel@edk2.groups.io *代表 *Pedro Falcato > *发送时间:* 2022年6月1日 5:34 > *收件人:* edk2-devel-groups-io ; Pedro Falcato < > pedro.falcato@gmail.com> > *抄送:* Michael D Kinney ; Liming Gao < > gaoliming@byosoft.com.cn>; Zhiguang Liu > *主题:* Re: [edk2-devel] [PATCH 1/1] MdePkg/BaseLib: Add CRC16-ANSI and > CRC32c implementations > > > > Ping. Please review it now that the freeze is over. > > > > Thanks, > > Pedro > > > > On Wed, May 11, 2022 at 6:44 PM Pedro Falcato via groups.io > wrote: > > Ping. Could someone review it? > > > > On Mon, Apr 25, 2022 at 6:13 PM Pedro Falcato via groups.io > wrote: > > Ping. If someone could take a look, it would be much appreciated. > > > > On Thu, Apr 7, 2022 at 11:02 PM Pedro Falcato > wrote: > > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3871 > > Add the CRC16-ANSI and CRC32C implementations previously found at > Features/Ext4Pkg/Ext4Dxe/Crc{16,32c}.c to BaseLib. > > Cc: Michael D Kinney > Cc: Liming Gao > Cc: Zhiguang Liu > > Signed-off-by: Pedro Falcato > --- > MdePkg/Include/Library/BaseLib.h | 35 +++++++- > MdePkg/Library/BaseLib/CheckSum.c | 144 ++++++++++++++++++++++++++++++ > 2 files changed, 178 insertions(+), 1 deletion(-) > > diff --git a/MdePkg/Include/Library/BaseLib.h > b/MdePkg/Include/Library/BaseLib.h > index 6aa0d972186e..f365de9f74a0 100644 > --- a/MdePkg/Include/Library/BaseLib.h > +++ b/MdePkg/Include/Library/BaseLib.h > @@ -4503,6 +4503,40 @@ CalculateCrc32 ( > IN UINTN Length > ); > > +/** > + Calculates the CRC16-ANSI checksum of the given buffer. > + > + @param[in] Buffer Pointer to the buffer. > + @param[in] Length Length of the buffer, in bytes. > + @param[in] InitialValue Initial value of the CRC. > + > + @return The CRC16-ANSI checksum. > +**/ > +UINT16 > +EFIAPI > +CalculateCrc16Ansi ( > + IN CONST VOID *Buffer, > + IN UINTN Length, > + IN UINT16 InitialValue > + ); > + > +/** > + Calculates the CRC32c checksum of the given buffer. > + > + @param[in] Buffer Pointer to the buffer. > + @param[in] Length Length of the buffer, in bytes. > + @param[in] InitialValue Initial value of the CRC. > + > + @return The CRC32c checksum. > +**/ > +UINT32 > +EFIAPI > +CalculateCrc32c ( > + IN CONST VOID *Buffer, > + IN UINTN Length, > + IN UINT32 InitialValue > + ); > + > // > // Base Library CPU Functions > // > @@ -4512,7 +4546,6 @@ CalculateCrc32 ( > > @param Context1 Context1 parameter passed into SwitchStack(). > @param Context2 Context2 parameter passed into SwitchStack(). > - > **/ > typedef > VOID > diff --git a/MdePkg/Library/BaseLib/CheckSum.c > b/MdePkg/Library/BaseLib/CheckSum.c > index 28dee5ac6a15..b6a076573191 100644 > --- a/MdePkg/Library/BaseLib/CheckSum.c > +++ b/MdePkg/Library/BaseLib/CheckSum.c > @@ -3,6 +3,7 @@ > algorithm. > > Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
> + Copyright (c) 2022, Pedro Falcato. All rights reserved.
> SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > @@ -618,3 +619,146 @@ CalculateCrc32 ( > > return Crc ^ 0xffffffff; > } > + > +GLOBAL_REMOVE_IF_UNREFERENCED STATIC CONST UINT16 mCrc16LookupTable[256] > = > +{ > + 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, > + 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, > + 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, > + 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, > + 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, > + 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, > + 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, > + 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, > + 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, > + 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, > + 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, > + 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, > + 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, > + 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, > + 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, > + 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, > + 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, > + 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, > + 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, > + 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, > + 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, > + 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, > + 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, > + 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, > + 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, > + 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, > + 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, > + 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, > + 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, > + 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, > + 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, > + 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 > +}; > + > +/** > + Calculates the CRC16-ANSI checksum of the given buffer. > + > + @param[in] Buffer Pointer to the buffer. > + @param[in] Length Length of the buffer, in bytes. > + @param[in] InitialValue Initial value of the CRC. > + > + @return The CRC16-ANSI checksum. > +**/ > +UINT16 > +EFIAPI > +CalculateCrc16Ansi ( > + IN CONST VOID *Buffer, > + IN UINTN Length, > + IN UINT16 InitialValue > + ) > +{ > + CONST UINT8 *Buf; > + UINT16 Crc; > + > + Buf = Buffer; > + > + Crc = ~InitialValue; > + > + while (Length-- != 0) { > + Crc = mCrc16LookupTable[(Crc & 0xFF) ^ *(Buf++)] ^ (Crc >> 8); > + } > + > + return ~Crc; > +} > + > +GLOBAL_REMOVE_IF_UNREFERENCED STATIC CONST UINT32 > mCrc32cLookupTable[256] = { > + 0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4, 0xc79a971f, 0x35f1141c, > + 0x26a1e7e8, 0xd4ca64eb, 0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b, > + 0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24, 0x105ec76f, 0xe235446c, > + 0xf165b798, 0x030e349b, 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384, > + 0x9a879fa0, 0x68ec1ca3, 0x7bbcef57, 0x89d76c54, 0x5d1d08bf, 0xaf768bbc, > + 0xbc267848, 0x4e4dfb4b, 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a, > + 0xe72719c1, 0x154c9ac2, 0x061c6936, 0xf477ea35, 0xaa64d611, 0x580f5512, > + 0x4b5fa6e6, 0xb93425e5, 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa, > + 0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45, 0xf779deae, 0x05125dad, > + 0x1642ae59, 0xe4292d5a, 0xba3a117e, 0x4851927d, 0x5b016189, 0xa96ae28a, > + 0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595, 0x417b1dbc, 0xb3109ebf, > + 0xa0406d4b, 0x522bee48, 0x86e18aa3, 0x748a09a0, 0x67dafa54, 0x95b17957, > + 0xcba24573, 0x39c9c670, 0x2a993584, 0xd8f2b687, 0x0c38d26c, 0xfe53516f, > + 0xed03a29b, 0x1f682198, 0x5125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927, > + 0x96bf4dcc, 0x64d4cecf, 0x77843d3b, 0x85efbe38, 0xdbfc821c, 0x2997011f, > + 0x3ac7f2eb, 0xc8ac71e8, 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7, > + 0x61c69362, 0x93ad1061, 0x80fde395, 0x72966096, 0xa65c047d, 0x5437877e, > + 0x4767748a, 0xb50cf789, 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f3859, > + 0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46, 0x7198540d, 0x83f3d70e, > + 0x90a324fa, 0x62c8a7f9, 0xb602c312, 0x44694011, 0x5739b3e5, 0xa55230e6, > + 0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff36, 0x3cdb9bdd, 0xceb018de, > + 0xdde0eb2a, 0x2f8b6829, 0x82f63b78, 0x709db87b, 0x63cd4b8f, 0x91a6c88c, > + 0x456cac67, 0xb7072f64, 0xa457dc90, 0x563c5f93, 0x082f63b7, 0xfa44e0b4, > + 0xe9141340, 0x1b7f9043, 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c, > + 0x92a8fc17, 0x60c37f14, 0x73938ce0, 0x81f80fe3, 0x55326b08, 0xa759e80b, > + 0xb4091bff, 0x466298fc, 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c, > + 0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033, 0xa24bb5a6, 0x502036a5, > + 0x4370c551, 0xb11b4652, 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7681d14d, > + 0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d, 0xef087a76, 0x1d63f975, > + 0x0e330a81, 0xfc588982, 0xb21572c9, 0x407ef1ca, 0x532e023e, 0xa145813d, > + 0x758fe5d6, 0x87e466d5, 0x94b49521, 0x66df1622, 0x38cc2a06, 0xcaa7a905, > + 0xd9f75af1, 0x2b9cd9f2, 0xff56bd19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed, > + 0xc38d26c4, 0x31e6a5c7, 0x22b65633, 0xd0ddd530, 0x0417b1db, 0xf67c32d8, > + 0xe52cc12c, 0x1747422f, 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff, > + 0x8ecee914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0, 0xd3d3e1ab, 0x21b862a8, > + 0x32e8915c, 0xc083125f, 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540, > + 0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90, 0x9e902e7b, 0x6cfbad78, > + 0x7fab5e8c, 0x8dc0dd8f, 0xe330a81a, 0x115b2b19, 0x020bd8ed, 0xf0605bee, > + 0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1, 0x69e9f0d5, 0x9b8273d6, > + 0x88d28022, 0x7ab90321, 0xae7367ca, 0x5c18e4c9, 0x4f48173d, 0xbd23943e, > + 0xf36e6f75, 0x0105ec76, 0x12551f82, 0xe03e9c81, 0x34f4f86a, 0xc69f7b69, > + 0xd5cf889d, 0x27a40b9e, 0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e, > + 0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351 > +}; > + > +/** > + Calculates the CRC32c checksum of the given buffer. > + > + @param[in] Buffer Pointer to the buffer. > + @param[in] Length Length of the buffer, in bytes. > + @param[in] InitialValue Initial value of the CRC. > + > + @return The CRC32c checksum. > +**/ > +UINT32 > +EFIAPI > +CalculateCrc32c ( > + IN CONST VOID *Buffer, > + IN UINTN Length, > + IN UINT32 InitialValue > + ) > +{ > + CONST UINT8 *Buf; > + UINT32 Crc; > + > + Buf = Buffer; > + Crc = ~InitialValue; > + > + while (Length-- != 0) { > + Crc = mCrc32cLookupTable[(Crc & 0xFF) ^ *(Buf++)] ^ (Crc >> 8); > + } > + > + return ~Crc; > +} > -- > 2.35.1 > > > > -- > > Pedro Falcato > > > > -- > > Pedro Falcato > > > > -- > > Pedro Falcato > > > > -- Pedro Falcato