From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-vs1-f52.google.com (mail-vs1-f52.google.com [209.85.217.52]) by mx.groups.io with SMTP id smtpd.web11.7096.1654179593560039485 for ; Thu, 02 Jun 2022 07:19:53 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@gmail.com header.s=20210112 header.b=q1ne8uVl; spf=pass (domain: gmail.com, ip: 209.85.217.52, mailfrom: pedro.falcato@gmail.com) Received: by mail-vs1-f52.google.com with SMTP id i186so4661765vsc.9 for ; Thu, 02 Jun 2022 07:19:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=lrLsEOuxVcry+W/AtV9TClYmWH/SB6MIxsVsioKdKSY=; b=q1ne8uVlkid05g0WNr7286yHrO1ciJImUj2ci+bGEdV/0vaTnpLgNrMYxTSGZ/HEGW Z27wnbLuTRpW7iSmxplKR5qisTdus0HUpOlMcGHg7njwfdSUJRKKbh82VhlRoeLYT3aK +Dhk9gkmr8X6MUy8DM8qkckZ3QNAZmRpImPQ+dbR9OMDHwGVorP1ABvJn21HpthLf46E ZDXA+yj9IvHVtn/EXU9InAh4yuXXOTwFhAxpVmreBOyjn+Y+EYkBLx23Ku1gtAd9s4jq C8SurYyPi3KTEyQHxWH3bLBuVqS9bZCYCsYmHthp+WI0Krj/MtC2VsmS3GI6k0lMLaEN xUPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=lrLsEOuxVcry+W/AtV9TClYmWH/SB6MIxsVsioKdKSY=; b=M9pKKPAdZv0SuSYgM/lRoT9zEmXpJLV/LvpswwZM8NdiGHjxzYP5+brbNgDga4h0Wm iKAL5YE3HTmWgYRAfxpHUSd/HdSwRXSUnVzarWZbqZjnSKFo4HNYGKkAqUciMrMiev6F vhkcphKivZUCi/46jSjKICFB44eUJe6XYy7O2UfwPuunKteGcwbFBnbLYA656O2aFBOm SWcDTHObyrcZYtg57z87eZ6Bq4QP9y0poOuDAc3SuerSANSd2BX6wQgO6orcs6sVztdF aeX80d0sRn3llY0dM8yWg/TU+ghtch/6/LWkZJmkKsClAeaBcL9oOFv55MaHAd+krXPl B/VQ== X-Gm-Message-State: AOAM5301/v3w901Tg7tfA9f9serpMlZZpfNn4qt5TnDxfSSwqX8payxZ Y2TkdIPrOXrDRTsUYiOOnG0zWviPUaNEF900TF0H93hvX4Y= X-Google-Smtp-Source: ABdhPJzLi87IihpENrFRO7mxL3BliyZqn63YJwp3Cawg4R1COd7L8oM8q31WeWBwZrc9sMWCnxVPwJFNP7VpU5bcGns= X-Received: by 2002:a05:6102:3087:b0:349:ceb5:87ac with SMTP id l7-20020a056102308700b00349ceb587acmr6192140vsb.75.1654179592397; Thu, 02 Jun 2022 07:19:52 -0700 (PDT) MIME-Version: 1.0 References: <20220407220200.149601-1-pedro.falcato@gmail.com> <16E9330567E0FB44.27774@groups.io> <16EE1DEED159D5A9.620@groups.io> <00e601d87628$9005ac90$b01105b0$@byosoft.com.cn> In-Reply-To: <00e601d87628$9005ac90$b01105b0$@byosoft.com.cn> From: "Pedro Falcato" Date: Thu, 2 Jun 2022 15:19:41 +0100 Message-ID: Subject: Re: [edk2-devel] [PATCH 1/1] MdePkg/BaseLib: Add CRC16-ANSI and CRC32c implementations To: edk2-devel-groups-io , Liming Gao Cc: Michael D Kinney , Zhiguang Liu Content-Type: multipart/alternative; boundary="000000000000ffe84605e077b2e3" --000000000000ffe84605e077b2e3 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable 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 > > *=E5=8F=91=E4=BB=B6=E4=BA=BA:* devel@edk2.groups.io *=E4=BB=A3=E8=A1=A8 *Pedro Falcato > *=E5=8F=91=E9=80=81=E6=97=B6=E9=97=B4:* 2022=E5=B9=B46=E6=9C=881=E6=97=A5= 5:34 > *=E6=94=B6=E4=BB=B6=E4=BA=BA:* edk2-devel-groups-io ; Pedro Falcato < > pedro.falcato@gmail.com> > *=E6=8A=84=E9=80=81:* Michael D Kinney ; Limi= ng Gao < > gaoliming@byosoft.com.cn>; Zhiguang Liu > *=E4=B8=BB=E9=A2=98:* Re: [edk2-devel] [PATCH 1/1] MdePkg/BaseLib: Add CR= C16-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=3D3871 > > 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= ] > =3D > +{ > + 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 =3D Buffer; > + > + Crc =3D ~InitialValue; > + > + while (Length-- !=3D 0) { > + Crc =3D mCrc16LookupTable[(Crc & 0xFF) ^ *(Buf++)] ^ (Crc >> 8); > + } > + > + return ~Crc; > +} > + > +GLOBAL_REMOVE_IF_UNREFERENCED STATIC CONST UINT32 > mCrc32cLookupTable[256] =3D { > + 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 =3D Buffer; > + Crc =3D ~InitialValue; > + > + while (Length-- !=3D 0) { > + Crc =3D mCrc32cLookupTable[(Crc & 0xFF) ^ *(Buf++)] ^ (Crc >> 8); > + } > + > + return ~Crc; > +} > -- > 2.35.1 > > > > -- > > Pedro Falcato > > > > -- > > Pedro Falcato > > > > -- > > Pedro Falcato > >=20 > > --=20 Pedro Falcato --000000000000ffe84605e077b2e3 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Liming,

No problem.
=

CRC32c is a CRC32 variant with a different polynomial, = so unfortunately we can't reuse the current mCrcTable.
Note t= hat technically we could further optimize the CRC32c code to detect and use= the current Intel and ARM CRC32c extensions' instructions, but I didn&= #39;t bother as it is rather non-trivial and may have dubious value in firm= ware, where CRC32 calculation should not be a bottleneck; regardless of thi= s, we still need the lookup table implementation as a fallback as these ins= tructions 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:

=C2=A0Sorry for the late response. I am OK to add two new CRC APIs in = BaseLib.

=C2=A0

=C2=A0For Crc32c, what difference is from current Cr= c32? Can it reuse current mCrcTable value?

=C2=A0

Thanks

Liming=

=E5=8F=91=E4=BB=B6= =E4=BA=BA: devel@edk2.groups.io <devel@edk2.groups.io>= = =E4=BB=A3=E8=A1=A8 Pedro Falcato
=E5=8F=91=E9=80=81=E6=97=B6= =E9=97=B4: 2022=E5=B9=B46=E6=9C=881=E6=97=A5 5:34
=E6=94=B6=E4=BB=B6=E4=BA=BA:= edk2-devel-groups-io <devel@edk2.groups.io>; Pedr= o Falcato <= pedro.falcato@gmail.com>
=E6=8A=84=E9=80=81: Michael D Kinney <michael.d.kinney@i= ntel.com>; Liming Gao <gaoliming@byosoft.com.cn>; Zhiguang Liu <zhiguang.liu@intel.= com>
=E4=B8=BB=E9=A2=98: Re: [edk2-devel] [PATCH 1/1] MdePkg/BaseLib: Add CRC= 16-ANSI and CRC32c implementations

=C2=A0<= /p>

Ping. Please revie= w it now that the freeze is over.

=C2=A0

=

Thanks,

Pedro

= =C2=A0

On Wed, May 11, 2022 at 6:44 PM Pedro Falcato via groups.io <pedro.falcato=3Dgmail.com@groups.io> wr= ote:

Ping. Could someone review it?

=C2=A0

On Mon, Apr 25, 2022 at 6:13 = PM Pedro Falcato via groups.= io <pedro.falcato=3Dgmail.com@groups.io> wrote:

<= blockquote style=3D"border-color:currentcolor currentcolor currentcolor rgb= (204,204,204);border-style:none none none solid;border-width:medium medium = medium 1pt;padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm">

Ping. If someone could take a = look, it would be much appreciated.

=C2=A0

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=3D3871

A= dd the CRC16-ANSI and CRC32C implementations previously found at
Feature= s/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: Z= higuang Liu <zhiguang.liu@intel.com>

Signed-off-by: Pedro Falcato <pedro.falcato@gma= il.com>
---
=C2=A0MdePkg/Include/Library/BaseLib.h=C2=A0 |=C2= =A0 35 +++++++-
=C2=A0MdePkg/Library/BaseLib/CheckSum.c | 144 ++++++++++= ++++++++++++++++++++
=C2=A02 files changed, 178 insertions(+), 1 deletio= n(-)

diff --git a/MdePkg/Include/Library/BaseLib.h b/MdePkg/Include/= Library/BaseLib.h
index 6aa0d972186e..f365de9f74a0 100644
--- a/MdePk= g/Include/Library/BaseLib.h
+++ b/MdePkg/Include/Library/BaseLib.h
@@= -4503,6 +4503,40 @@ CalculateCrc32 (
=C2=A0 =C2=A0IN=C2=A0 UINTN=C2=A0 = Length
=C2=A0 =C2=A0);

+/**
+=C2=A0 =C2=A0Calculates the CRC16= -ANSI checksum of the given buffer.
+
+=C2=A0 =C2=A0@param[in]=C2=A0 = =C2=A0 =C2=A0 Buffer=C2=A0 =C2=A0 =C2=A0 =C2=A0 Pointer to the buffer.
+= =C2=A0 =C2=A0@param[in]=C2=A0 =C2=A0 =C2=A0 Length=C2=A0 =C2=A0 =C2=A0 =C2= =A0 Length of the buffer, in bytes.
+=C2=A0 =C2=A0@param[in]=C2=A0 =C2= =A0 =C2=A0 InitialValue=C2=A0 Initial value of the CRC.
+
+=C2=A0 =C2= =A0@return The CRC16-ANSI checksum.
+**/
+UINT16
+EFIAPI
+Calcu= lateCrc16Ansi (
+=C2=A0 IN=C2=A0 CONST VOID=C2=A0 *Buffer,
+=C2=A0 IN= =C2=A0 UINTN=C2=A0 =C2=A0 =C2=A0 =C2=A0Length,
+=C2=A0 IN=C2=A0 UINT16= =C2=A0 =C2=A0 =C2=A0 InitialValue
+=C2=A0 );
+
+/**
+=C2=A0 =C2= =A0Calculates the CRC32c checksum of the given buffer.
+
+=C2=A0 =C2= =A0@param[in]=C2=A0 =C2=A0 =C2=A0 Buffer=C2=A0 =C2=A0 =C2=A0 =C2=A0 Pointer= to the buffer.
+=C2=A0 =C2=A0@param[in]=C2=A0 =C2=A0 =C2=A0 Length=C2= =A0 =C2=A0 =C2=A0 =C2=A0 Length of the buffer, in bytes.
+=C2=A0 =C2=A0@= param[in]=C2=A0 =C2=A0 =C2=A0 InitialValue=C2=A0 Initial value of the CRC.<= br>+
+=C2=A0 =C2=A0@return The CRC32c checksum.
+**/
+UINT32
+E= FIAPI
+CalculateCrc32c (
+=C2=A0 IN CONST VOID=C2=A0 *Buffer,
+=C2= =A0 IN UINTN=C2=A0 =C2=A0 =C2=A0 =C2=A0Length,
+=C2=A0 IN UINT32=C2=A0 = =C2=A0 =C2=A0 InitialValue
+=C2=A0 );
+
=C2=A0//
=C2=A0// Base = Library CPU Functions
=C2=A0//
@@ -4512,7 +4546,6 @@ CalculateCrc32 (=

=C2=A0 =C2=A0@param=C2=A0 Context1=C2=A0 =C2=A0 =C2=A0 =C2=A0 Conte= xt1 parameter passed into SwitchStack().
=C2=A0 =C2=A0@param=C2=A0 Conte= xt2=C2=A0 =C2=A0 =C2=A0 =C2=A0 Context2 parameter passed into SwitchStack()= .
-
=C2=A0**/
=C2=A0typedef
=C2=A0VOID
diff --git a/MdePkg/L= ibrary/BaseLib/CheckSum.c b/MdePkg/Library/BaseLib/CheckSum.c
index 28de= e5ac6a15..b6a076573191 100644
--- a/MdePkg/Library/BaseLib/CheckSum.c+++ b/MdePkg/Library/BaseLib/CheckSum.c
@@ -3,6 +3,7 @@
=C2=A0 =C2= =A0algorithm.

=C2=A0 =C2=A0Copyright (c) 2007 - 2018, Intel Corporat= ion. All rights reserved.<BR>
+=C2=A0 Copyright (c) 2022, Pedro Fa= lcato. All rights reserved.<BR>
=C2=A0 =C2=A0SPDX-License-Identifi= er: BSD-2-Clause-Patent

=C2=A0**/
@@ -618,3 +619,146 @@ Calculate= Crc32 (

=C2=A0 =C2=A0return Crc ^ 0xffffffff;
=C2=A0}
+
+GL= OBAL_REMOVE_IF_UNREFERENCED STATIC CONST UINT16=C2=A0 mCrc16LookupTable[256= ] =3D
+{
+=C2=A0 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x02= 80, 0xC241,
+=C2=A0 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC4= 81, 0x0440,
+=C2=A0 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE= 81, 0x0E40,
+=C2=A0 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x08= 80, 0xC841,
+=C2=A0 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA= 81, 0x1A40,
+=C2=A0 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C= 80, 0xDC41,
+=C2=A0 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x16= 80, 0xD641,
+=C2=A0 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD0= 81, 0x1040,
+=C2=A0 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF2= 81, 0x3240,
+=C2=A0 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x34= 80, 0xF441,
+=C2=A0 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E= 80, 0xFE41,
+=C2=A0 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF8= 81, 0x3840,
+=C2=A0 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A= 80, 0xEA41,
+=C2=A0 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC= 81, 0x2C40,
+=C2=A0 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE6= 81, 0x2640,
+=C2=A0 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x20= 80, 0xE041,
+=C2=A0 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA2= 81, 0x6240,
+=C2=A0 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x64= 80, 0xA441,
+=C2=A0 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E= 80, 0xAE41,
+=C2=A0 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA8= 81, 0x6840,
+=C2=A0 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A= 80, 0xBA41,
+=C2=A0 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC= 81, 0x7C40,
+=C2=A0 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB6= 81, 0x7640,
+=C2=A0 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x70= 80, 0xB041,
+=C2=A0 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x52= 80, 0x9241,
+=C2=A0 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x94= 81, 0x5440,
+=C2=A0 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E= 81, 0x5E40,
+=C2=A0 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x58= 80, 0x9841,
+=C2=A0 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A= 81, 0x4A40,
+=C2=A0 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C= 80, 0x8C41,
+=C2=A0 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x46= 80, 0x8641,
+=C2=A0 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x80= 81, 0x4040
+};
+
+/**
+=C2=A0 =C2=A0Calculates the CRC16-ANSI c= hecksum of the given buffer.
+
+=C2=A0 =C2=A0@param[in]=C2=A0 =C2=A0 = =C2=A0 Buffer=C2=A0 =C2=A0 =C2=A0 =C2=A0 Pointer to the buffer.
+=C2=A0 = =C2=A0@param[in]=C2=A0 =C2=A0 =C2=A0 Length=C2=A0 =C2=A0 =C2=A0 =C2=A0 Leng= th of the buffer, in bytes.
+=C2=A0 =C2=A0@param[in]=C2=A0 =C2=A0 =C2=A0= InitialValue=C2=A0 Initial value of the CRC.
+
+=C2=A0 =C2=A0@return= The CRC16-ANSI checksum.
+**/
+UINT16
+EFIAPI
+CalculateCrc16A= nsi (
+=C2=A0 IN CONST VOID=C2=A0 *Buffer,
+=C2=A0 IN UINTN=C2=A0 =C2= =A0 =C2=A0 =C2=A0Length,
+=C2=A0 IN UINT16=C2=A0 =C2=A0 =C2=A0 InitialVa= lue
+=C2=A0 )
+{
+=C2=A0 CONST UINT8=C2=A0 *Buf;
+=C2=A0 UINT16= =C2=A0 =C2=A0 =C2=A0 =C2=A0Crc;
+
+=C2=A0 Buf =3D Buffer;
+
+= =C2=A0 Crc =3D ~InitialValue;
+
+=C2=A0 while (Length-- !=3D 0) {
= +=C2=A0 =C2=A0 Crc =3D mCrc16LookupTable[(Crc & 0xFF) ^ *(Buf++)] ^ (Cr= c >> 8);
+=C2=A0 }
+
+=C2=A0 return ~Crc;
+}
+
+GLO= BAL_REMOVE_IF_UNREFERENCED STATIC CONST UINT32=C2=A0 mCrc32cLookupTable[256= ] =3D {
+=C2=A0 0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4, 0xc79a97= 1f, 0x35f1141c,
+=C2=A0 0x26a1e7e8, 0xd4ca64eb, 0x8ad958cf, 0x78b2dbcc, = 0x6be22838, 0x9989ab3b,
+=C2=A0 0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e= 133c24, 0x105ec76f, 0xe235446c,
+=C2=A0 0xf165b798, 0x030e349b, 0xd7c450= 70, 0x25afd373, 0x36ff2087, 0xc494a384,
+=C2=A0 0x9a879fa0, 0x68ec1ca3, = 0x7bbcef57, 0x89d76c54, 0x5d1d08bf, 0xaf768bbc,
+=C2=A0 0xbc267848, 0x4e= 4dfb4b, 0x20bd8ede, 0xd2d60ddd, 0xc186fe29, 0x33ed7d2a,
+=C2=A0 0xe72719= c1, 0x154c9ac2, 0x061c6936, 0xf477ea35, 0xaa64d611, 0x580f5512,
+=C2=A0 = 0x4b5fa6e6, 0xb93425e5, 0x6dfe410e, 0x9f95c20d, 0x8cc531f9, 0x7eaeb2fa,
= +=C2=A0 0x30e349b1, 0xc288cab2, 0xd1d83946, 0x23b3ba45, 0xf779deae, 0x05125= dad,
+=C2=A0 0x1642ae59, 0xe4292d5a, 0xba3a117e, 0x4851927d, 0x5b016189,= 0xa96ae28a,
+=C2=A0 0x7da08661, 0x8fcb0562, 0x9c9bf696, 0x6ef07595, 0x4= 17b1dbc, 0xb3109ebf,
+=C2=A0 0xa0406d4b, 0x522bee48, 0x86e18aa3, 0x748a0= 9a0, 0x67dafa54, 0x95b17957,
+=C2=A0 0xcba24573, 0x39c9c670, 0x2a993584,= 0xd8f2b687, 0x0c38d26c, 0xfe53516f,
+=C2=A0 0xed03a29b, 0x1f682198, 0x5= 125dad3, 0xa34e59d0, 0xb01eaa24, 0x42752927,
+=C2=A0 0x96bf4dcc, 0x64d4c= ecf, 0x77843d3b, 0x85efbe38, 0xdbfc821c, 0x2997011f,
+=C2=A0 0x3ac7f2eb,= 0xc8ac71e8, 0x1c661503, 0xee0d9600, 0xfd5d65f4, 0x0f36e6f7,
+=C2=A0 0x6= 1c69362, 0x93ad1061, 0x80fde395, 0x72966096, 0xa65c047d, 0x5437877e,
+= =C2=A0 0x4767748a, 0xb50cf789, 0xeb1fcbad, 0x197448ae, 0x0a24bb5a, 0xf84f38= 59,
+=C2=A0 0x2c855cb2, 0xdeeedfb1, 0xcdbe2c45, 0x3fd5af46, 0x7198540d, = 0x83f3d70e,
+=C2=A0 0x90a324fa, 0x62c8a7f9, 0xb602c312, 0x44694011, 0x57= 39b3e5, 0xa55230e6,
+=C2=A0 0xfb410cc2, 0x092a8fc1, 0x1a7a7c35, 0xe811ff= 36, 0x3cdb9bdd, 0xceb018de,
+=C2=A0 0xdde0eb2a, 0x2f8b6829, 0x82f63b78, = 0x709db87b, 0x63cd4b8f, 0x91a6c88c,
+=C2=A0 0x456cac67, 0xb7072f64, 0xa4= 57dc90, 0x563c5f93, 0x082f63b7, 0xfa44e0b4,
+=C2=A0 0xe9141340, 0x1b7f90= 43, 0xcfb5f4a8, 0x3dde77ab, 0x2e8e845f, 0xdce5075c,
+=C2=A0 0x92a8fc17, = 0x60c37f14, 0x73938ce0, 0x81f80fe3, 0x55326b08, 0xa759e80b,
+=C2=A0 0xb4= 091bff, 0x466298fc, 0x1871a4d8, 0xea1a27db, 0xf94ad42f, 0x0b21572c,
+=C2= =A0 0xdfeb33c7, 0x2d80b0c4, 0x3ed04330, 0xccbbc033, 0xa24bb5a6, 0x502036a5,=
+=C2=A0 0x4370c551, 0xb11b4652, 0x65d122b9, 0x97baa1ba, 0x84ea524e, 0x7= 681d14d,
+=C2=A0 0x2892ed69, 0xdaf96e6a, 0xc9a99d9e, 0x3bc21e9d, 0xef087= a76, 0x1d63f975,
+=C2=A0 0x0e330a81, 0xfc588982, 0xb21572c9, 0x407ef1ca,= 0x532e023e, 0xa145813d,
+=C2=A0 0x758fe5d6, 0x87e466d5, 0x94b49521, 0x6= 6df1622, 0x38cc2a06, 0xcaa7a905,
+=C2=A0 0xd9f75af1, 0x2b9cd9f2, 0xff56b= d19, 0x0d3d3e1a, 0x1e6dcdee, 0xec064eed,
+=C2=A0 0xc38d26c4, 0x31e6a5c7,= 0x22b65633, 0xd0ddd530, 0x0417b1db, 0xf67c32d8,
+=C2=A0 0xe52cc12c, 0x1= 747422f, 0x49547e0b, 0xbb3ffd08, 0xa86f0efc, 0x5a048dff,
+=C2=A0 0x8ecee= 914, 0x7ca56a17, 0x6ff599e3, 0x9d9e1ae0, 0xd3d3e1ab, 0x21b862a8,
+=C2=A0= 0x32e8915c, 0xc083125f, 0x144976b4, 0xe622f5b7, 0xf5720643, 0x07198540,+=C2=A0 0x590ab964, 0xab613a67, 0xb831c993, 0x4a5a4a90, 0x9e902e7b, 0x6cfb= ad78,
+=C2=A0 0x7fab5e8c, 0x8dc0dd8f, 0xe330a81a, 0x115b2b19, 0x020bd8ed= , 0xf0605bee,
+=C2=A0 0x24aa3f05, 0xd6c1bc06, 0xc5914ff2, 0x37faccf1, 0x= 69e9f0d5, 0x9b8273d6,
+=C2=A0 0x88d28022, 0x7ab90321, 0xae7367ca, 0x5c18= e4c9, 0x4f48173d, 0xbd23943e,
+=C2=A0 0xf36e6f75, 0x0105ec76, 0x12551f82= , 0xe03e9c81, 0x34f4f86a, 0xc69f7b69,
+=C2=A0 0xd5cf889d, 0x27a40b9e, 0x= 79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e,
+=C2=A0 0xbe2da0a5, 0x4c46= 23a6, 0x5f16d052, 0xad7d5351
+};
+
+/**
+=C2=A0 =C2=A0Calculate= s the CRC32c checksum of the given buffer.
+
+=C2=A0 =C2=A0@param[in]= =C2=A0 =C2=A0 =C2=A0 Buffer=C2=A0 =C2=A0 =C2=A0 =C2=A0 Pointer to the buffe= r.
+=C2=A0 =C2=A0@param[in]=C2=A0 =C2=A0 =C2=A0 Length=C2=A0 =C2=A0 =C2= =A0 =C2=A0 Length of the buffer, in bytes.
+=C2=A0 =C2=A0@param[in]=C2= =A0 =C2=A0 =C2=A0 InitialValue=C2=A0 Initial value of the CRC.
+
+=C2= =A0 =C2=A0@return The CRC32c checksum.
+**/
+UINT32
+EFIAPI
+Ca= lculateCrc32c (
+=C2=A0 IN CONST VOID=C2=A0 *Buffer,
+=C2=A0 IN UINTN= =C2=A0 =C2=A0 =C2=A0 =C2=A0Length,
+=C2=A0 IN UINT32=C2=A0 =C2=A0 =C2=A0= InitialValue
+=C2=A0 )
+{
+=C2=A0 CONST UINT8=C2=A0 *Buf;
+=C2= =A0 UINT32=C2=A0 =C2=A0 =C2=A0 =C2=A0Crc;
+
+=C2=A0 Buf =3D Buffer;+=C2=A0 Crc =3D ~InitialValue;
+
+=C2=A0 while (Length-- !=3D 0) {<= br>+=C2=A0 =C2=A0 Crc =3D mCrc32cLookupTable[(Crc & 0xFF) ^ *(Buf++)] ^= (Crc >> 8);
+=C2=A0 }
+
+=C2=A0 return ~Crc;
+}
-- 2.35.1

=

--

Pedro Falcato



--

Pedro Falcato



--

Pedro Falcato

<= /div>

=20



--
Pedro Falcato
--000000000000ffe84605e077b2e3--