public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Pedro Falcato" <pedro.falcato@gmail.com>
To: edk2-devel-groups-io <devel@edk2.groups.io>,
	Liming Gao <gaoliming@byosoft.com.cn>
Cc: Michael D Kinney <michael.d.kinney@intel.com>,
	Zhiguang Liu <zhiguang.liu@intel.com>
Subject: Re: [edk2-devel] [PATCH 1/1] MdePkg/BaseLib: Add CRC16-ANSI and CRC32c implementations
Date: Thu, 2 Jun 2022 15:19:41 +0100	[thread overview]
Message-ID: <CAKbZUD3=_Lb5ddtN5dMvzqonsNucqRmUHJwzjw0FH1WJY_7d6w@mail.gmail.com> (raw)
In-Reply-To: <00e601d87628$9005ac90$b01105b0$@byosoft.com.cn>

[-- Attachment #1: Type: text/plain, Size: 11919 bytes --]

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 <gaoliming@byosoft.com.cn> 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 <devel@edk2.groups.io> *代表 *Pedro Falcato
> *发送时间:* 2022年6月1日 5:34
> *收件人:* edk2-devel-groups-io <devel@edk2.groups.io>; Pedro Falcato <
> pedro.falcato@gmail.com>
> *抄送:* Michael D Kinney <michael.d.kinney@intel.com>; Liming Gao <
> gaoliming@byosoft.com.cn>; Zhiguang Liu <zhiguang.liu@intel.com>
> *主题:* 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
> <pedro.falcato=gmail.com@groups.io> wrote:
>
> Ping. Could someone review it?
>
>
>
> On Mon, Apr 25, 2022 at 6:13 PM Pedro Falcato via groups.io
> <pedro.falcato=gmail.com@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 <pedro.falcato@gmail.com>
> 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 <michael.d.kinney@intel.com>
> Cc: Liming Gao <gaoliming@byosoft.com.cn>
> Cc: Zhiguang Liu <zhiguang.liu@intel.com>
>
> Signed-off-by: Pedro Falcato <pedro.falcato@gmail.com>
> ---
>  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.<BR>
> +  Copyright (c) 2022, Pedro Falcato. All rights reserved.<BR>
>    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

[-- Attachment #2: Type: text/html, Size: 17908 bytes --]

      reply	other threads:[~2022-06-02 14:19 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-07 22:02 [PATCH 1/1] MdePkg/BaseLib: Add CRC16-ANSI and CRC32c implementations Pedro Falcato
2022-04-25 17:13 ` Pedro Falcato
     [not found] ` <16E9330567E0FB44.27774@groups.io>
2022-05-11 17:43   ` [edk2-devel] " Pedro Falcato
     [not found]   ` <16EE1DEED159D5A9.620@groups.io>
2022-05-31 21:33     ` Pedro Falcato
2022-06-02  2:29       ` 回复: " gaoliming
2022-06-02 14:19         ` Pedro Falcato [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAKbZUD3=_Lb5ddtN5dMvzqonsNucqRmUHJwzjw0FH1WJY_7d6w@mail.gmail.com' \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox